UNPKG

@nestjs/graphql

Version:

Nest - modern, fast, powerful node.js web framework (@graphql)

163 lines (162 loc) 6.7 kB
"use strict"; 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;