@graphql-yoga/plugin-sofa
Version:
112 lines (111 loc) • 4.3 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.useSofa = exports.useSofaWithSwaggerUI = exports.OpenAPI = void 0;
const sofa_api_1 = require("sofa-api");
const swagger_ui_js_1 = require("./swagger-ui.js");
var sofa_api_2 = require("sofa-api");
Object.defineProperty(exports, "OpenAPI", { enumerable: true, get: function () { return sofa_api_2.OpenAPI; } });
function useSofaWithSwaggerUI(config) {
const swaggerUIEndpoint = config.swaggerUIEndpoint || '/swagger';
let openApi;
const onRoute = (route) => {
openApi.addRoute(route, { basePath: config.basePath });
if (config.onRoute) {
config.onRoute(route);
}
};
let swaggerJsonPattern;
let swaggerUIPattern;
return {
onPluginInit({ addPlugin }) {
addPlugin(useSofa({ ...config, onRoute }));
},
onSchemaChange({ schema }) {
openApi = (0, sofa_api_1.OpenAPI)({
schema,
info: config.info,
servers: config.servers,
components: config.components,
security: config.security,
tags: config.tags,
customScalars: config.customScalars,
});
},
onYogaInit({ yoga }) {
swaggerJsonPattern = new yoga.fetchAPI.URLPattern({
pathname: '/swagger.json',
});
swaggerUIPattern = new yoga.fetchAPI.URLPattern({
pathname: swaggerUIEndpoint,
});
},
onRequest({ url, fetchAPI, endResponse }) {
if (swaggerUIPattern.test(url)) {
const swaggerUIHTML = (0, swagger_ui_js_1.getSwaggerUIHTMLForSofa)(openApi);
const response = new fetchAPI.Response(swaggerUIHTML, {
status: 200,
headers: {
'Content-Type': 'text/html',
},
});
endResponse(response);
}
if (swaggerJsonPattern.test(url)) {
const response = new fetchAPI.Response(JSON.stringify(openApi.get()), {
status: 200,
headers: {
'Content-Type': 'application/json',
},
});
endResponse(response);
}
},
};
}
exports.useSofaWithSwaggerUI = useSofaWithSwaggerUI;
function useSofa(config) {
let sofaHandler;
let getEnveloped;
const envelopedByContext = new WeakMap();
const requestByContext = new WeakMap();
return {
onYogaInit({ yoga }) {
getEnveloped = yoga.getEnveloped;
},
onSchemaChange(onSchemaChangeEventPayload) {
sofaHandler = (0, sofa_api_1.useSofa)({
...config,
schema: onSchemaChangeEventPayload.schema,
async context(serverContext) {
const enveloped = getEnveloped(serverContext);
const request = requestByContext.get(serverContext);
const contextValue = await enveloped.contextFactory({ request });
envelopedByContext.set(contextValue, enveloped);
return contextValue;
},
execute(args) {
const enveloped = envelopedByContext.get(args.contextValue);
if (!enveloped) {
throw new TypeError('Illegal invocation.');
}
return enveloped.execute(args);
},
subscribe(args) {
const enveloped = envelopedByContext.get(args.contextValue);
if (!enveloped) {
throw new TypeError('Illegal invocation.');
}
return enveloped.subscribe(args);
},
});
},
async onRequest({ request, serverContext, endResponse }) {
requestByContext.set(serverContext, request);
const response = await sofaHandler.handle(request, serverContext);
if (response) {
endResponse(response);
}
},
};
}
exports.useSofa = useSofa;
;