0

AppModule

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: !!ENV ? `.env.${ENV}` : '.env',
    }),
    AedesModule.forRootAsync({
      useFactory: (configService: ConfigService) => ({
        port: 1883,
      }),
      inject: [ConfigService],
    }),
    AuthModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

My AEDES MODULE:

import { DynamicModule, Global, Module, Provider } from '@nestjs/common';
import { AedesModuleAsyncOptions, AedesModuleOptions } from './@types/package';
import { AedesService } from './aedes.service';

@Global()
@Module({
  providers: [AedesService],
  exports: [AedesService],
})
export class AedesModule {
  public static forRootAsync(options: AedesModuleAsyncOptions): DynamicModule {
    const customOptions = this.getCustomOptions(options);

    return {
      module: AedesModule,
      imports: options.imports || [],
      providers: [customOptions, this.aedesProvider],
      exports: [customOptions, this.aedesProvider],
    };
  }

  private static getCustomOptions(options: AedesModuleAsyncOptions): Provider {
    return {
      provide: 'AEDES_OPTIONS',
      useFactory: options.useFactory,
      inject: options.inject || [],
    };
  }

  private static aedesProvider: Provider = {
    provide: AedesService,
    useFactory: async (options: AedesModuleOptions) => {
      const aedes = new AedesService(options);
      aedes.init();
      return aedes;
    },
    inject: ['AEDES_OPTIONS'],
  };

  private static getOptionsProvider(options: AedesModuleOptions): Provider {
    return {
      provide: 'AEDES_OPTIONS',
      useValue: options,
    };
  }
}

type definitions:

import { ModuleMetadata } from '@nestjs/common';

export interface AedesModuleAsyncOptions
  extends Pick<ModuleMetadata, 'imports'> {
  inject?: any[];
  useFactory: (
    ...args: any[]
  ) => Promise<AedesModuleOptions> | AedesModuleOptions;
}

export interface AedesModuleOptions {
  port: number;
}

My Service:

export class AedesService {
  public broker: aedes;
  private port: number;

  constructor(options: AedesModuleOptions) {
    this.port = options.port;
  }
  init() {
    this.broker = new aedes({
      authenticate: async (client, username, password, done) => {
        console.log(username, password);
        const decoded: any =
          await this.authService.manualAccessTokenVerification(
            password.toString(),
          ); // I can't inject or import the existing authService which importing from another module.
        console.log(decoded);
        return done(null, true);
      },
    });
    const mqttServer = createServer(this.broker);
    mqttServer.listen(this.port, () => {
      Logger.log(`MQTT server listening on ${this.port}`);
    });
  }
}

I can't inject or import the existing authService which importing from another module. Is it possible?

Vahid Alimohamadi
  • 4,900
  • 2
  • 22
  • 37

0 Answers0