/
githubmirror
/
nest
Обзор
Документация
Войти
/
githubmirror
/
nest
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
packages/microservices/module/clients.module.ts
117 строк
3 KB
Kamil Myśliwiec
build: use strict null checks part 2
26 ноя 2024, 15:36
Не верифицирован
26 ноя 2024, 15:36
2200897
Код
Авторство
О чём код?
import { DynamicModule, ForwardReference, Module, OnApplicationShutdown, Provider, Type, } from '@nestjs/common'; import { ClientProxy, ClientProxyFactory } from '../client'; import { ClientsModuleAsyncOptions, ClientsModuleOptions, ClientsModuleOptionsFactory, ClientsProviderAsyncOptions, } from './interfaces'; @Module({}) export class ClientsModule { static register(options: ClientsModuleOptions): DynamicModule { const clientsOptions = !Array.isArray(options) ? options.clients : options; const clients = (clientsOptions || []).map(item => { return { provide: item.name, useValue: this.assignOnAppShutdownHook(ClientProxyFactory.create(item)), }; }); return { module: ClientsModule, global: !Array.isArray(options) && options.isGlobal, providers: clients, exports: clients, }; } static registerAsync(options: ClientsModuleAsyncOptions): DynamicModule { const clientsOptions = !Array.isArray(options) ? options.clients : options; const providers: Provider[] = clientsOptions.reduce( (accProviders: Provider[], item) => accProviders .concat(this.createAsyncProviders(item)) .concat(item.extraProviders || []), [], ); const imports = clientsOptions.reduce( (accImports, option) => { if (!option.imports) { return accImports; } const toInsert = option.imports.filter( item => !accImports.includes(item), ); return accImports.concat(toInsert); }, [] as Array< DynamicModule | Promise<DynamicModule> | ForwardReference | Type >, ); return { module: ClientsModule, global: !Array.isArray(options) && options.isGlobal, imports, providers: providers, exports: providers, }; } private static createAsyncProviders( options: ClientsProviderAsyncOptions, ): Provider[] { if (options.useExisting || options.useFactory) { return [this.createAsyncOptionsProvider(options)]; } return [ this.createAsyncOptionsProvider(options), { provide: options.useClass!, useClass: options.useClass!, }, ]; } private static createAsyncOptionsProvider( options: ClientsProviderAsyncOptions, ): Provider { if (options.useFactory) { return { provide: options.name, useFactory: this.createFactoryWrapper(options.useFactory), inject: options.inject || [], }; } return { provide: options.name, useFactory: this.createFactoryWrapper( (optionsFactory: ClientsModuleOptionsFactory) => optionsFactory.createClientOptions(), ), inject: [options.useExisting || options.useClass!], }; } private static createFactoryWrapper( useFactory: ClientsProviderAsyncOptions['useFactory'], ) { return async (...args: any[]) => { const clientOptions = await useFactory!(...args); const clientProxyRef = ClientProxyFactory.create(clientOptions); return this.assignOnAppShutdownHook(clientProxyRef); }; } private static assignOnAppShutdownHook(client: ClientProxy) { (client as unknown as OnApplicationShutdown).onApplicationShutdown = client.close; return client; } }