UNPKG

1.94 kBJavaScriptView Raw
1import { useSofa as createSofaHandler } from 'sofa-api';
2export { OpenAPI } from 'sofa-api';
3export function useSofa(config) {
4 let sofaHandler;
5 let getEnveloped;
6 const envelopedByContext = new WeakMap();
7 const requestByContext = new WeakMap();
8 return {
9 onYogaInit({ yoga }) {
10 getEnveloped = yoga.getEnveloped;
11 },
12 onSchemaChange(onSchemaChangeEventPayload) {
13 sofaHandler = createSofaHandler({
14 ...config,
15 schema: onSchemaChangeEventPayload.schema,
16 async context(serverContext) {
17 const enveloped = getEnveloped(serverContext);
18 const request = requestByContext.get(serverContext);
19 const contextValue = await enveloped.contextFactory({ request });
20 envelopedByContext.set(contextValue, enveloped);
21 return contextValue;
22 },
23 execute(args) {
24 const enveloped = envelopedByContext.get(args.contextValue);
25 if (!enveloped) {
26 throw new TypeError('Illegal invocation.');
27 }
28 return enveloped.execute(args);
29 },
30 subscribe(args) {
31 const enveloped = envelopedByContext.get(args.contextValue);
32 if (!enveloped) {
33 throw new TypeError('Illegal invocation.');
34 }
35 return enveloped.subscribe(args);
36 },
37 });
38 },
39 async onRequest({ request, serverContext, endResponse }) {
40 requestByContext.set(serverContext, request);
41 const response = await sofaHandler.handle(request, serverContext);
42 if (response != null && response.status !== 404) {
43 endResponse(response);
44 }
45 },
46 };
47}