@graphql-mesh/serve-runtime
Version:
108 lines (107 loc) • 4.51 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createServeRuntime = void 0;
const graphql_yoga_1 = require("graphql-yoga");
const fusion_federation_1 = require("@graphql-mesh/fusion-federation");
const fusion_runtime_1 = require("@graphql-mesh/fusion-runtime");
// eslint-disable-next-line import/no-extraneous-dependencies
const utils_1 = require("@graphql-mesh/utils");
const executor_http_1 = require("@graphql-tools/executor-http");
const executor_yoga_1 = require("@graphql-tools/executor-yoga");
const utils_2 = require("@graphql-tools/utils");
const handleUnifiedGraphConfig_js_1 = require("./handleUnifiedGraphConfig.js");
function createServeRuntime(config) {
let fetchAPI = config.fetchAPI;
// eslint-disable-next-line prefer-const
let logger;
let wrappedFetchFn;
const configContext = {
get fetch() {
return wrappedFetchFn;
},
get logger() {
return logger;
},
cwd: globalThis.process?.cwd(),
cache: 'cache' in config ? config.cache : undefined,
pubsub: 'pubsub' in config ? config.pubsub : undefined,
};
let supergraphYogaPlugin;
if ('fusiongraph' in config) {
supergraphYogaPlugin = (0, fusion_runtime_1.useFusiongraph)({
getFusiongraph: () => (0, handleUnifiedGraphConfig_js_1.handleUnifiedGraphConfig)(config.fusiongraph, configContext),
transports: config.transports,
polling: config.polling,
additionalResolvers: config.additionalResolvers,
transportBaseContext: configContext,
});
}
else if ('supergraph' in config) {
supergraphYogaPlugin = (0, fusion_runtime_1.useFusiongraph)({
getFusiongraph() {
const supergraph$ = (0, handleUnifiedGraphConfig_js_1.handleUnifiedGraphConfig)(config.supergraph, configContext);
configContext.logger?.info?.(`Converting Federation Supergraph to Fusiongraph`);
if ((0, utils_2.isPromise)(supergraph$)) {
return supergraph$.then(supergraph => (0, fusion_federation_1.convertSupergraphToFusiongraph)(supergraph));
}
return (0, fusion_federation_1.convertSupergraphToFusiongraph)(supergraph$);
},
transports: config.transports,
polling: config.polling,
additionalResolvers: config.additionalResolvers,
transportBaseContext: configContext,
});
}
else if ('proxy' in config) {
const executor = (0, executor_http_1.buildHTTPExecutor)({
fetch: fetchAPI?.fetch,
...config.proxy,
});
supergraphYogaPlugin = (0, executor_yoga_1.useExecutor)(executor);
}
const defaultFetchPlugin = {
onFetch({ setFetchFn }) {
setFetchFn(fetchAPI.fetch);
},
onYogaInit({ yoga }) {
const onFetchHooks = [];
for (const plugin of yoga.getEnveloped._plugins) {
if (plugin.onFetch) {
onFetchHooks.push(plugin.onFetch);
}
}
wrappedFetchFn = (0, utils_1.wrapFetchWithHooks)(onFetchHooks);
},
};
const yoga = (0, graphql_yoga_1.createYoga)({
fetchAPI: config.fetchAPI,
logging: config.logging == null ? new utils_1.DefaultLogger() : config.logging,
plugins: [defaultFetchPlugin, supergraphYogaPlugin, ...(config.plugins?.(configContext) || [])],
context: ({ request, req, connectionParams }) => ({
...configContext,
headers:
// Maybe Node-like environment
req?.headers
? (0, utils_1.getHeadersObj)(req.headers)
: // Fetch environment
request?.headers
? (0, utils_1.getHeadersObj)(request.headers)
: // Unknown environment
{},
connectionParams,
}),
cors: config.cors,
graphiql: config.graphiql,
batching: config.batching,
graphqlEndpoint: config.graphqlEndpoint,
maskedErrors: config.maskedErrors,
});
fetchAPI ||= yoga.fetchAPI;
logger = yoga.logger;
Object.defineProperty(yoga, 'invalidateUnifiedGraph', {
value: supergraphYogaPlugin.invalidateUnifiedGraph,
configurable: true,
});
return yoga;
}
exports.createServeRuntime = createServeRuntime;