@nestjs/graphql
Version:
Nest - modern, fast, powerful node.js web framework (@graphql)
163 lines (162 loc) • 6.7 kB
JavaScript
;
var GraphQLGatewayModule_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.GraphQLGatewayModule = void 0;
const tslib_1 = require("tslib");
const common_1 = require("@nestjs/common");
const load_package_util_1 = require("@nestjs/common/utils/load-package.util");
const core_1 = require("@nestjs/core");
const _1 = require(".");
const graphql_constants_1 = require("../graphql.constants");
const utils_1 = require("../utils");
const federation_constants_1 = require("./federation.constants");
let GraphQLGatewayModule = GraphQLGatewayModule_1 = class GraphQLGatewayModule {
constructor(httpAdapterHost, buildService, options, applicationConfig) {
this.httpAdapterHost = httpAdapterHost;
this.buildService = buildService;
this.options = options;
this.applicationConfig = applicationConfig;
}
get apolloServer() {
return this._apolloServer;
}
static forRoot(options) {
return {
module: GraphQLGatewayModule_1,
providers: [
{
provide: federation_constants_1.GRAPHQL_GATEWAY_MODULE_OPTIONS,
useValue: options,
},
],
};
}
static forRootAsync(options) {
return {
module: GraphQLGatewayModule_1,
imports: options.imports,
providers: [
...this.createAsyncProviders(options),
{
provide: graphql_constants_1.GRAPHQL_MODULE_ID,
useValue: (0, utils_1.generateString)(),
},
],
};
}
static createAsyncProviders(options) {
if (options.useExisting || options.useFactory) {
return [this.createAsyncOptionsProvider(options)];
}
return [
this.createAsyncOptionsProvider(options),
{
provide: options.useClass,
useClass: options.useClass,
},
];
}
static createAsyncOptionsProvider(options) {
if (options.useFactory) {
return {
provide: federation_constants_1.GRAPHQL_GATEWAY_MODULE_OPTIONS,
useFactory: options.useFactory,
inject: options.inject || [],
};
}
return {
provide: federation_constants_1.GRAPHQL_GATEWAY_MODULE_OPTIONS,
useFactory: (optionsFactory) => optionsFactory.createGatewayOptions(),
inject: [options.useExisting || options.useClass],
};
}
async onModuleInit() {
const { httpAdapter } = this.httpAdapterHost || {};
if (!httpAdapter) {
return;
}
const { ApolloGateway } = (0, load_package_util_1.loadPackage)('@apollo/gateway', 'ApolloGateway', () => require('@apollo/gateway'));
const { options: { server: serverOpts = {}, gateway: gatewayOpts = {} }, buildService, } = this;
const gateway = new ApolloGateway({
...gatewayOpts,
buildService,
});
await this.registerGqlServer({
...serverOpts,
gateway,
subscriptions: undefined,
});
if (serverOpts.installSubscriptionHandlers) {
throw new Error('No support for subscriptions yet when using Apollo Federation');
}
}
async onModuleDestroy() {
var _a;
await ((_a = this._apolloServer) === null || _a === void 0 ? void 0 : _a.stop());
}
async registerGqlServer(apolloOptions) {
const httpAdapter = this.httpAdapterHost.httpAdapter;
const adapterName = httpAdapter.constructor && httpAdapter.constructor.name;
if (adapterName === 'ExpressAdapter') {
await this.registerExpress(apolloOptions);
}
else if (adapterName === 'FastifyAdapter') {
await this.registerFastify(apolloOptions);
}
else {
throw new Error(`No support for current HttpAdapter: ${adapterName}`);
}
}
async registerExpress(apolloOptions) {
const { ApolloServer } = (0, load_package_util_1.loadPackage)('apollo-server-express', 'GraphQLModule', () => require('apollo-server-express'));
const { disableHealthCheck, onHealthCheck, cors, bodyParserConfig } = apolloOptions;
const app = this.httpAdapterHost.httpAdapter.getInstance();
const path = this.getNormalizedPath(apolloOptions);
const apolloServer = new ApolloServer(apolloOptions);
await apolloServer.start();
apolloServer.applyMiddleware({
app,
path,
disableHealthCheck,
onHealthCheck,
cors,
bodyParserConfig,
});
this._apolloServer = apolloServer;
}
async registerFastify(apolloOptions) {
const { ApolloServer } = (0, load_package_util_1.loadPackage)('apollo-server-fastify', 'GraphQLModule', () => require('apollo-server-fastify'));
const httpAdapter = this.httpAdapterHost.httpAdapter;
const app = httpAdapter.getInstance();
const path = this.getNormalizedPath(apolloOptions);
const apolloServer = new ApolloServer(apolloOptions);
await apolloServer.start();
const { disableHealthCheck, onHealthCheck, cors, bodyParserConfig } = apolloOptions;
await app.register(apolloServer.createHandler({
disableHealthCheck,
onHealthCheck,
cors,
bodyParserConfig,
path,
}));
this._apolloServer = apolloServer;
}
getNormalizedPath(apolloOptions) {
var _a;
const prefix = this.applicationConfig.getGlobalPrefix();
const useGlobalPrefix = prefix && ((_a = this.options.server) === null || _a === void 0 ? void 0 : _a.useGlobalPrefix);
const gqlOptionsPath = (0, utils_1.normalizeRoutePath)(apolloOptions.path);
return useGlobalPrefix
? (0, utils_1.normalizeRoutePath)(prefix) + gqlOptionsPath
: gqlOptionsPath;
}
};
GraphQLGatewayModule = GraphQLGatewayModule_1 = (0, tslib_1.__decorate)([
(0, common_1.Module)({}),
(0, tslib_1.__param)(0, (0, common_1.Optional)()),
(0, tslib_1.__param)(1, (0, common_1.Optional)()),
(0, tslib_1.__param)(1, (0, common_1.Inject)(_1.GATEWAY_BUILD_SERVICE)),
(0, tslib_1.__param)(2, (0, common_1.Inject)(federation_constants_1.GRAPHQL_GATEWAY_MODULE_OPTIONS)),
(0, tslib_1.__metadata)("design:paramtypes", [core_1.HttpAdapterHost, Function, Object, core_1.ApplicationConfig])
], GraphQLGatewayModule);
exports.GraphQLGatewayModule = GraphQLGatewayModule;