1 | import { useSofa as createSofaHandler } from 'sofa-api';
|
2 | export { OpenAPI } from 'sofa-api';
|
3 | export 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 | }
|