nestjs-http-promise/lib/http.module.ts

103 lines
2.9 KiB
TypeScript
Raw Normal View History

import { DynamicModule, Module, Provider } from '@nestjs/common';
import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util';
import Axios from 'axios';
2023-07-05 22:37:57 +00:00
import { AXIOS_INSTANCE_TOKEN, HTTP_MODULE_ID, HTTP_MODULE_OPTIONS } from './http.constants';
import { HttpService } from './http.service';
2023-07-05 22:37:57 +00:00
import { HttpModuleAsyncOptions, HttpModuleOptions, HttpModuleOptionsFactory } from './interfaces';
import axiosRetry from 'axios-retry';
2021-12-23 18:09:52 +00:00
import axiosBetterStacktrace from 'axios-better-stacktrace';
const createAxiosInstance = (config?: HttpModuleOptions) => {
const axiosInstance = Axios.create(config);
axiosRetry(axiosInstance, config);
2023-07-05 22:37:57 +00:00
if (config?.isBetterStackTraceEnabled === undefined || config?.isBetterStackTraceEnabled) {
axiosBetterStacktrace(axiosInstance);
}
return axiosInstance;
2023-07-05 22:37:57 +00:00
};
@Module({
providers: [
HttpService,
{
provide: AXIOS_INSTANCE_TOKEN,
useValue: createAxiosInstance(),
},
],
exports: [HttpService],
})
export class HttpModule {
static register(config: HttpModuleOptions): DynamicModule {
return {
module: HttpModule,
providers: [
{
provide: AXIOS_INSTANCE_TOKEN,
2021-12-23 18:09:52 +00:00
useValue: createAxiosInstance(config),
},
{
provide: HTTP_MODULE_ID,
useValue: randomStringGenerator(),
},
],
};
}
static registerAsync(options: HttpModuleAsyncOptions): DynamicModule {
return {
module: HttpModule,
imports: options.imports,
providers: [
...this.createAsyncProviders(options),
{
provide: AXIOS_INSTANCE_TOKEN,
2021-12-23 18:09:52 +00:00
useFactory: (config: HttpModuleOptions) => createAxiosInstance(config),
inject: [HTTP_MODULE_OPTIONS],
},
{
provide: HTTP_MODULE_ID,
useValue: randomStringGenerator(),
},
...(options.extraProviders || []),
],
};
}
2023-07-05 22:37:57 +00:00
private static createAsyncProviders(options: HttpModuleAsyncOptions): Provider[] {
if (options.useExisting || options.useFactory) {
return [this.createAsyncOptionsProvider(options)];
}
2023-07-05 22:37:57 +00:00
const providers = [this.createAsyncOptionsProvider(options)];
2023-07-05 22:37:57 +00:00
if (options.useClass)
providers.push({
provide: options.useClass,
useClass: options.useClass,
2023-07-05 22:37:57 +00:00
});
return providers;
}
2023-07-05 22:37:57 +00:00
private static createAsyncOptionsProvider(options: HttpModuleAsyncOptions): Provider {
if (options.useFactory) {
return {
provide: HTTP_MODULE_OPTIONS,
useFactory: options.useFactory,
inject: options.inject || [],
};
}
let inject;
2023-07-05 22:37:57 +00:00
if (options.useExisting) inject = [options.useExisting];
else if (options.useClass) inject = [options.useClass];
return {
provide: HTTP_MODULE_OPTIONS,
useFactory: async (optionsFactory: HttpModuleOptionsFactory) =>
2023-07-05 22:37:57 +00:00
optionsFactory.createHttpOptions(),
inject,
};
}
2023-07-05 22:37:57 +00:00
}