@powerhousedao/reactor-api 6.0.0-dev.107 → 6.0.0-dev.109
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/src/graphql/base-subgraph.d.ts +2 -3
- package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/base-subgraph.js.map +1 -1
- package/dist/src/graphql/gateway/adapter-gateway-apollo.d.ts +23 -0
- package/dist/src/graphql/gateway/adapter-gateway-apollo.d.ts.map +1 -0
- package/dist/src/graphql/gateway/adapter-gateway-apollo.js +156 -0
- package/dist/src/graphql/gateway/adapter-gateway-apollo.js.map +1 -0
- package/dist/src/graphql/gateway/adapter-http-express.d.ts +23 -0
- package/dist/src/graphql/gateway/adapter-http-express.d.ts.map +1 -0
- package/dist/src/graphql/gateway/adapter-http-express.js +155 -0
- package/dist/src/graphql/gateway/adapter-http-express.js.map +1 -0
- package/dist/src/graphql/gateway/auth-middleware.d.ts +7 -0
- package/dist/src/graphql/gateway/auth-middleware.d.ts.map +1 -0
- package/dist/src/graphql/gateway/auth-middleware.js +15 -0
- package/dist/src/graphql/gateway/auth-middleware.js.map +1 -0
- package/dist/src/graphql/gateway/factory.d.ts +11 -0
- package/dist/src/graphql/gateway/factory.d.ts.map +1 -0
- package/dist/src/graphql/gateway/factory.js +15 -0
- package/dist/src/graphql/gateway/factory.js.map +1 -0
- package/dist/src/graphql/gateway/types.d.ts +84 -0
- package/dist/src/graphql/gateway/types.d.ts.map +1 -0
- package/dist/src/graphql/gateway/types.js +2 -0
- package/dist/src/graphql/gateway/types.js.map +1 -0
- package/dist/src/graphql/graphql-manager.d.ts +10 -14
- package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
- package/dist/src/graphql/graphql-manager.js +117 -221
- package/dist/src/graphql/graphql-manager.js.map +1 -1
- package/dist/src/graphql/index.d.ts +3 -0
- package/dist/src/graphql/index.d.ts.map +1 -1
- package/dist/src/graphql/index.js +3 -0
- package/dist/src/graphql/index.js.map +1 -1
- package/dist/src/graphql/sse.d.ts.map +1 -1
- package/dist/src/graphql/sse.js.map +1 -1
- package/dist/src/graphql/types.d.ts +3 -4
- package/dist/src/graphql/types.d.ts.map +1 -1
- package/dist/src/packages/import-loader.d.ts +2 -3
- package/dist/src/packages/import-loader.d.ts.map +1 -1
- package/dist/src/packages/import-loader.js.map +1 -1
- package/dist/src/packages/package-manager.d.ts +2 -3
- package/dist/src/packages/package-manager.d.ts.map +1 -1
- package/dist/src/packages/package-manager.js.map +1 -1
- package/dist/src/packages/types.d.ts +4 -5
- package/dist/src/packages/types.d.ts.map +1 -1
- package/dist/src/packages/util.d.ts +3 -4
- package/dist/src/packages/util.d.ts.map +1 -1
- package/dist/src/packages/util.js.map +1 -1
- package/dist/src/packages/vite-loader.d.ts +3 -4
- package/dist/src/packages/vite-loader.d.ts.map +1 -1
- package/dist/src/packages/vite-loader.js +2 -0
- package/dist/src/packages/vite-loader.js.map +1 -1
- package/dist/src/server.d.ts +5 -4
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +54 -84
- package/dist/src/server.js.map +1 -1
- package/dist/src/services/auth.service.d.ts +11 -3
- package/dist/src/services/auth.service.d.ts.map +1 -1
- package/dist/src/services/auth.service.js +48 -0
- package/dist/src/services/auth.service.js.map +1 -1
- package/dist/src/types.d.ts +14 -5
- package/dist/src/types.d.ts.map +1 -1
- package/dist/test/auth.service.test.d.ts +10 -0
- package/dist/test/auth.service.test.d.ts.map +1 -0
- package/dist/test/auth.service.test.js +141 -0
- package/dist/test/auth.service.test.js.map +1 -0
- package/dist/test/document-drive-subgraph.test.js +8 -13
- package/dist/test/document-drive-subgraph.test.js.map +1 -1
- package/dist/test/gateway/adapter-gateway-apollo.test.d.ts +2 -0
- package/dist/test/gateway/adapter-gateway-apollo.test.d.ts.map +1 -0
- package/dist/test/gateway/adapter-gateway-apollo.test.js +206 -0
- package/dist/test/gateway/adapter-gateway-apollo.test.js.map +1 -0
- package/dist/test/gateway/adapter-http-express.test.d.ts +2 -0
- package/dist/test/gateway/adapter-http-express.test.d.ts.map +1 -0
- package/dist/test/gateway/adapter-http-express.test.js +17 -0
- package/dist/test/gateway/adapter-http-express.test.js.map +1 -0
- package/dist/test/gateway/auth-middleware.test.d.ts +8 -0
- package/dist/test/gateway/auth-middleware.test.d.ts.map +1 -0
- package/dist/test/gateway/auth-middleware.test.js +73 -0
- package/dist/test/gateway/auth-middleware.test.js.map +1 -0
- package/dist/test/gateway/gateway-adapter-contract.d.ts +30 -0
- package/dist/test/gateway/gateway-adapter-contract.d.ts.map +1 -0
- package/dist/test/gateway/gateway-adapter-contract.js +347 -0
- package/dist/test/gateway/gateway-adapter-contract.js.map +1 -0
- package/dist/test/gateway/http-adapter-contract.d.ts +30 -0
- package/dist/test/gateway/http-adapter-contract.d.ts.map +1 -0
- package/dist/test/gateway/http-adapter-contract.js +226 -0
- package/dist/test/gateway/http-adapter-contract.js.map +1 -0
- package/dist/test/graphql-manager.test.d.ts +12 -0
- package/dist/test/graphql-manager.test.d.ts.map +1 -0
- package/dist/test/graphql-manager.test.js +488 -0
- package/dist/test/graphql-manager.test.js.map +1 -0
- package/dist/test/utils.d.ts +0 -4
- package/dist/test/utils.d.ts.map +1 -1
- package/dist/test/utils.js +0 -11
- package/dist/test/utils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -11
- package/dist/src/utils/auth.d.ts +0 -3
- package/dist/src/utils/auth.d.ts.map +0 -1
- package/dist/src/utils/auth.js +0 -12
- package/dist/src/utils/auth.js.map +0 -1
package/README.md
CHANGED
|
@@ -49,6 +49,12 @@ Manages document models, subgraphs, and processors through a flexible loading sy
|
|
|
49
49
|
|
|
50
50
|
Handles GraphQL operations, subgraph management, and schema composition using Apollo Server.
|
|
51
51
|
|
|
52
|
+
The GraphQL and HTTP layers are decoupled behind `IGatewayAdapter` and `IHttpAdapter`
|
|
53
|
+
interfaces, making it straightforward to swap the underlying HTTP framework or GraphQL
|
|
54
|
+
engine without touching application logic. See
|
|
55
|
+
[ARCHITECTURE.md](ARCHITECTURE.md) for a full
|
|
56
|
+
explanation of the interfaces, auth threading pattern, and how to add new adapters.
|
|
57
|
+
|
|
52
58
|
### Processor Manager
|
|
53
59
|
|
|
54
60
|
Manages document processors and their lifecycle, including registration and event handling.
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type { IReactorClient, ISyncManager } from "@powerhousedao/reactor";
|
|
1
|
+
import type { IReactorClient, IRelationalDb, ISyncManager } from "@powerhousedao/reactor";
|
|
2
2
|
import type { GraphQLManager, ISubgraph, SubgraphArgs } from "@powerhousedao/reactor-api";
|
|
3
|
-
import type { IRelationalDbLegacy } from "document-drive";
|
|
4
3
|
import type { DocumentNode } from "graphql";
|
|
5
4
|
import type { AuthorizationService } from "../services/authorization.service.js";
|
|
6
5
|
import type { DocumentPermissionService, GetParentIdsFn } from "../services/document-permission.service.js";
|
|
@@ -12,7 +11,7 @@ export declare class BaseSubgraph implements ISubgraph {
|
|
|
12
11
|
typeDefs: DocumentNode;
|
|
13
12
|
reactorClient: IReactorClient;
|
|
14
13
|
graphqlManager: GraphQLManager;
|
|
15
|
-
relationalDb:
|
|
14
|
+
relationalDb: IRelationalDb;
|
|
16
15
|
syncManager: ISyncManager;
|
|
17
16
|
documentPermissionService?: DocumentPermissionService;
|
|
18
17
|
authorizationService?: AuthorizationService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-subgraph.d.ts","sourceRoot":"","sources":["../../../src/graphql/base-subgraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"base-subgraph.d.ts","sourceRoot":"","sources":["../../../src/graphql/base-subgraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,YAAY,EACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,YAAY,EACb,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,KAAK,EACV,yBAAyB,EACzB,cAAc,EACf,MAAM,4CAA4C,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,qBAAa,YAAa,YAAW,SAAS;IAC5C,IAAI,SAAa;IACjB,IAAI,SAAM;IACV,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAI5B;IACF,QAAQ,EAAE,YAAY,CAIpB;IACF,aAAa,EAAE,cAAc,CAAC;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,aAAa,CAAC;IAC5B,WAAW,EAAE,YAAY,CAAC;IAC1B,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;IACtD,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;gBAEhC,IAAI,EAAE,YAAY;IAUxB,OAAO;IAQb,SAAS,CAAC,cAAc,IAAI,cAAc;IAW1C,SAAS,CAAC,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;cAIrC,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,OAAO,CAAC;cAmBH,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,IAAI,CAAC;cAmCA,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,IAAI,CAAC;cAmCA,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,IAAI,CAAC;CAqCjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-subgraph.js","sourceRoot":"","sources":["../../../src/graphql/base-subgraph.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base-subgraph.js","sourceRoot":"","sources":["../../../src/graphql/base-subgraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ApolloServer } from "@apollo/server";
|
|
2
|
+
import type { ILogger } from "document-model";
|
|
3
|
+
import type { GraphQLSchema } from "graphql";
|
|
4
|
+
import type http from "node:http";
|
|
5
|
+
import type { WebSocketServer } from "ws";
|
|
6
|
+
import type { Context } from "../types.js";
|
|
7
|
+
import type { FetchHandler, GatewayContextFactory, IGatewayAdapter, SubgraphDefinition, WsContextFactory, WsDisposer } from "./types.js";
|
|
8
|
+
export declare class ApolloGatewayAdapter implements IGatewayAdapter<Context> {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(logger: ILogger);
|
|
11
|
+
start(_httpServer: http.Server): Promise<void>;
|
|
12
|
+
createHandler(schema: GraphQLSchema, contextFactory: GatewayContextFactory<Context>): Promise<FetchHandler>;
|
|
13
|
+
createSupergraphHandler(getSubgraphs: () => SubgraphDefinition[], httpServer: http.Server, contextFactory: GatewayContextFactory<Context>): Promise<FetchHandler>;
|
|
14
|
+
updateSupergraph(): Promise<void>;
|
|
15
|
+
attachWebSocket(wsServer: WebSocketServer, schema: GraphQLSchema, contextFactory: WsContextFactory<Context>): WsDisposer;
|
|
16
|
+
stop(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Wrap an existing ApolloServer as a Fetch API handler.
|
|
20
|
+
* Does not manage server lifecycle; caller is responsible for start/stop.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createApolloFetchHandler(server: ApolloServer<Context>, contextFactory: GatewayContextFactory<Context>): FetchHandler;
|
|
23
|
+
//# sourceMappingURL=adapter-gateway-apollo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-gateway-apollo.d.ts","sourceRoot":"","sources":["../../../../src/graphql/gateway/adapter-gateway-apollo.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,YAAY,EAAa,MAAM,gBAAgB,CAAC;AAIzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EACV,YAAY,EACZ,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,UAAU,EACX,MAAM,YAAY,CAAC;AAcpB,qBAAa,oBAAqB,YAAW,eAAe,CAAC,OAAO,CAAC;;gBAYvD,MAAM,EAAE,OAAO;IAIrB,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C,aAAa,CACjB,MAAM,EAAE,aAAa,EACrB,cAAc,EAAE,qBAAqB,CAAC,OAAO,CAAC,GAC7C,OAAO,CAAC,YAAY,CAAC;IAelB,uBAAuB,CAC3B,YAAY,EAAE,MAAM,kBAAkB,EAAE,EACxC,UAAU,EAAE,IAAI,CAAC,MAAM,EACvB,cAAc,EAAE,qBAAqB,CAAC,OAAO,CAAC,GAC7C,OAAO,CAAC,YAAY,CAAC;IA+BlB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBvC,eAAe,CACb,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,aAAa,EACrB,cAAc,EAAE,gBAAgB,CAAC,OAAO,CAAC,GACxC,UAAU;IAkBP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAW5B;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAC7B,cAAc,EAAE,qBAAqB,CAAC,OAAO,CAAC,GAC7C,YAAY,CA8Cd"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { ApolloGateway, LocalCompose, RemoteGraphQLDataSource, } from "@apollo/gateway";
|
|
2
|
+
import { ApolloServer, HeaderMap } from "@apollo/server";
|
|
3
|
+
import { ApolloServerPluginInlineTraceDisabled } from "@apollo/server/plugin/disabled";
|
|
4
|
+
import { ApolloServerPluginDrainHttpServer } from "@apollo/server/plugin/drainHttpServer";
|
|
5
|
+
import { ApolloServerPluginLandingPageLocalDefault } from "@apollo/server/plugin/landingPage/default";
|
|
6
|
+
import { useServer } from "../websocket.js";
|
|
7
|
+
// Forwards the incoming authorization header to federated subgraph requests.
|
|
8
|
+
class AuthenticatedDataSource extends RemoteGraphQLDataSource {
|
|
9
|
+
willSendRequest(options) {
|
|
10
|
+
const { authorization } = options.context.headers;
|
|
11
|
+
if (authorization && options?.request.http) {
|
|
12
|
+
options.request.http.headers.set("authorization", authorization);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class ApolloGatewayAdapter {
|
|
17
|
+
#logger;
|
|
18
|
+
#servers = [];
|
|
19
|
+
#supergraphServer = null;
|
|
20
|
+
#gatewayOptions = null;
|
|
21
|
+
#getSubgraphs = null;
|
|
22
|
+
constructor(logger) {
|
|
23
|
+
this.#logger = logger;
|
|
24
|
+
}
|
|
25
|
+
async start(_httpServer) {
|
|
26
|
+
// Per-subgraph Apollo servers start lazily in createHandler.
|
|
27
|
+
// Nothing to do here.
|
|
28
|
+
}
|
|
29
|
+
async createHandler(schema, contextFactory) {
|
|
30
|
+
const server = new ApolloServer({
|
|
31
|
+
schema,
|
|
32
|
+
logger: this.#logger,
|
|
33
|
+
introspection: true,
|
|
34
|
+
plugins: [
|
|
35
|
+
ApolloServerPluginInlineTraceDisabled(),
|
|
36
|
+
ApolloServerPluginLandingPageLocalDefault(),
|
|
37
|
+
],
|
|
38
|
+
});
|
|
39
|
+
await server.start();
|
|
40
|
+
this.#servers.push(server);
|
|
41
|
+
return createApolloFetchHandler(server, contextFactory);
|
|
42
|
+
}
|
|
43
|
+
async createSupergraphHandler(getSubgraphs, httpServer, contextFactory) {
|
|
44
|
+
if (this.#supergraphServer) {
|
|
45
|
+
throw new Error("Supergraph server is already running");
|
|
46
|
+
}
|
|
47
|
+
this.#getSubgraphs = getSubgraphs;
|
|
48
|
+
const gateway = new ApolloGateway({
|
|
49
|
+
supergraphSdl: async (options) => {
|
|
50
|
+
this.#gatewayOptions = options;
|
|
51
|
+
return await this.#buildSupergraphSdl();
|
|
52
|
+
},
|
|
53
|
+
buildService: (serviceConfig) => new AuthenticatedDataSource(serviceConfig),
|
|
54
|
+
});
|
|
55
|
+
this.#supergraphServer = new ApolloServer({
|
|
56
|
+
gateway,
|
|
57
|
+
logger: this.#logger,
|
|
58
|
+
introspection: true,
|
|
59
|
+
plugins: [
|
|
60
|
+
ApolloServerPluginDrainHttpServer({ httpServer }),
|
|
61
|
+
ApolloServerPluginInlineTraceDisabled(),
|
|
62
|
+
ApolloServerPluginLandingPageLocalDefault(),
|
|
63
|
+
],
|
|
64
|
+
});
|
|
65
|
+
await this.#supergraphServer.start();
|
|
66
|
+
return createApolloFetchHandler(this.#supergraphServer, contextFactory);
|
|
67
|
+
}
|
|
68
|
+
async updateSupergraph() {
|
|
69
|
+
if (!this.#gatewayOptions || !this.#getSubgraphs) {
|
|
70
|
+
// Not yet initialized - no-op.
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const { supergraphSdl } = await this.#buildSupergraphSdl();
|
|
74
|
+
this.#gatewayOptions.update(supergraphSdl);
|
|
75
|
+
}
|
|
76
|
+
async #buildSupergraphSdl() {
|
|
77
|
+
if (!this.#gatewayOptions || !this.#getSubgraphs) {
|
|
78
|
+
throw new Error("Gateway is not ready");
|
|
79
|
+
}
|
|
80
|
+
const serviceList = this.#getSubgraphs().map((s) => ({
|
|
81
|
+
name: s.name,
|
|
82
|
+
typeDefs: s.typeDefs,
|
|
83
|
+
url: s.url,
|
|
84
|
+
}));
|
|
85
|
+
const localCompose = new LocalCompose({ localServiceList: serviceList });
|
|
86
|
+
return localCompose.initialize(this.#gatewayOptions);
|
|
87
|
+
}
|
|
88
|
+
attachWebSocket(wsServer, schema, contextFactory) {
|
|
89
|
+
return useServer({
|
|
90
|
+
schema,
|
|
91
|
+
context: async (ctx) => {
|
|
92
|
+
const connectionParams = (ctx.connectionParams ?? {});
|
|
93
|
+
return contextFactory(connectionParams);
|
|
94
|
+
},
|
|
95
|
+
}, wsServer);
|
|
96
|
+
}
|
|
97
|
+
async stop() {
|
|
98
|
+
await Promise.all(this.#servers.map((s) => s.stop()));
|
|
99
|
+
this.#servers.length = 0;
|
|
100
|
+
if (this.#supergraphServer) {
|
|
101
|
+
await this.#supergraphServer.stop();
|
|
102
|
+
this.#supergraphServer = null;
|
|
103
|
+
}
|
|
104
|
+
this.#gatewayOptions = null;
|
|
105
|
+
this.#getSubgraphs = null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Wrap an existing ApolloServer as a Fetch API handler.
|
|
110
|
+
* Does not manage server lifecycle; caller is responsible for start/stop.
|
|
111
|
+
*/
|
|
112
|
+
export function createApolloFetchHandler(server, contextFactory) {
|
|
113
|
+
return async (request) => {
|
|
114
|
+
const url = new URL(request.url);
|
|
115
|
+
const headers = new HeaderMap();
|
|
116
|
+
request.headers.forEach((value, key) => headers.set(key, value));
|
|
117
|
+
let body = undefined;
|
|
118
|
+
if (request.method !== "GET" && request.method !== "HEAD") {
|
|
119
|
+
try {
|
|
120
|
+
body = (await request.json());
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// body may be empty for some requests
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const result = await server.executeHTTPGraphQLRequest({
|
|
127
|
+
httpGraphQLRequest: {
|
|
128
|
+
method: request.method.toUpperCase(),
|
|
129
|
+
headers,
|
|
130
|
+
search: url.search,
|
|
131
|
+
body,
|
|
132
|
+
},
|
|
133
|
+
context: () => contextFactory(request),
|
|
134
|
+
});
|
|
135
|
+
const responseHeaders = new Headers();
|
|
136
|
+
for (const [key, value] of result.headers) {
|
|
137
|
+
responseHeaders.set(key, value);
|
|
138
|
+
}
|
|
139
|
+
let responseBody;
|
|
140
|
+
if (result.body.kind === "complete") {
|
|
141
|
+
responseBody = result.body.string;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
const chunks = [];
|
|
145
|
+
for await (const chunk of result.body.asyncIterator) {
|
|
146
|
+
chunks.push(chunk);
|
|
147
|
+
}
|
|
148
|
+
responseBody = chunks.join("");
|
|
149
|
+
}
|
|
150
|
+
return new Response(responseBody, {
|
|
151
|
+
status: result.status ?? 200,
|
|
152
|
+
headers: responseHeaders,
|
|
153
|
+
});
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=adapter-gateway-apollo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-gateway-apollo.js","sourceRoot":"","sources":["../../../../src/graphql/gateway/adapter-gateway-apollo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { CorsOptions } from "cors";
|
|
2
|
+
import expressLib from "express";
|
|
3
|
+
import http from "node:http";
|
|
4
|
+
import type { FetchHandler, IHttpAdapter, TlsOptions } from "./types.js";
|
|
5
|
+
export declare class ExpressHttpAdapter implements IHttpAdapter {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(existingApp?: ReturnType<typeof expressLib>);
|
|
8
|
+
get handle(): unknown;
|
|
9
|
+
mountRawMiddleware(middleware: unknown): void;
|
|
10
|
+
setupMiddleware({ corsOptions, bodyLimit, }: {
|
|
11
|
+
corsOptions?: CorsOptions;
|
|
12
|
+
bodyLimit?: string;
|
|
13
|
+
}): void;
|
|
14
|
+
mount(path: string, handler: FetchHandler, { exact }?: {
|
|
15
|
+
exact?: boolean;
|
|
16
|
+
}): void;
|
|
17
|
+
getRoute(routePath: string, handler: (request: Request) => Response | Promise<Response>): void;
|
|
18
|
+
listen(port: number, tls?: TlsOptions): Promise<http.Server>;
|
|
19
|
+
}
|
|
20
|
+
export declare function createExpressHttpAdapter(existingApp?: ReturnType<typeof expressLib>): {
|
|
21
|
+
adapter: IHttpAdapter;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=adapter-http-express.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-http-express.d.ts","sourceRoot":"","sources":["../../../../src/graphql/gateway/adapter-http-express.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAIxC,OAAO,UAAU,MAAM,SAAS,CAAC;AAGjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzE,qBAAa,kBAAmB,YAAW,YAAY;;gBAQzC,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC;IAMvD,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,kBAAkB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAK7C,eAAe,CAAC,EACd,WAAW,EACX,SAAkB,GACnB,EAAE;QACD,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI;IAmBR,KAAK,CACH,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,EACrB,EAAE,KAAa,EAAE,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAC1C,IAAI;IAcP,QAAQ,CACN,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAC1D,IAAI;IA4BD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;CAqFnE;AAED,wBAAgB,wBAAwB,CACtC,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAC1C;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,CAE3B"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import bodyParser from "body-parser";
|
|
2
|
+
import cors from "cors";
|
|
3
|
+
import devcert from "devcert";
|
|
4
|
+
import { Router } from "express";
|
|
5
|
+
import expressLib from "express";
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import http from "node:http";
|
|
8
|
+
import https from "node:https";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import { match } from "path-to-regexp";
|
|
11
|
+
export class ExpressHttpAdapter {
|
|
12
|
+
#app;
|
|
13
|
+
#router;
|
|
14
|
+
#handlers = new Map();
|
|
15
|
+
constructor(existingApp) {
|
|
16
|
+
this.#app = existingApp ?? expressLib();
|
|
17
|
+
this.#router = Router();
|
|
18
|
+
this.#app.use(this.#router);
|
|
19
|
+
}
|
|
20
|
+
get handle() {
|
|
21
|
+
return this.#app;
|
|
22
|
+
}
|
|
23
|
+
mountRawMiddleware(middleware) {
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
|
+
this.#app.use(middleware);
|
|
26
|
+
}
|
|
27
|
+
setupMiddleware({ corsOptions, bodyLimit = "50mb", }) {
|
|
28
|
+
this.#router.use(cors(corsOptions));
|
|
29
|
+
this.#router.use(bodyParser.json({ limit: bodyLimit }));
|
|
30
|
+
this.#router.use(bodyParser.urlencoded({ extended: true, limit: bodyLimit }));
|
|
31
|
+
// Dispatcher registered AFTER bodyParser so req.body is populated when it fires.
|
|
32
|
+
this.#router.use((req, res, next) => {
|
|
33
|
+
for (const { handler, matcher } of this.#handlers.values()) {
|
|
34
|
+
if (matcher(req.path)) {
|
|
35
|
+
this.#serveFetchHandler(handler, req, res, next);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
next();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
mount(path, handler, { exact = false } = {}) {
|
|
43
|
+
if (exact) {
|
|
44
|
+
this.#router.use(path, (req, res, next) => this.#serveFetchHandler(handler, req, res, next));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Exact match - stored in the internal dispatch map
|
|
48
|
+
this.#handlers.set(path, {
|
|
49
|
+
handler,
|
|
50
|
+
matcher: match(path),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
getRoute(routePath, handler) {
|
|
55
|
+
this.#app.get(routePath, (req, res) => {
|
|
56
|
+
const protocol = req.protocol;
|
|
57
|
+
const host = req.get("host") ?? "localhost";
|
|
58
|
+
const url = `${protocol}://${host}${req.originalUrl}`;
|
|
59
|
+
const headers = new Headers();
|
|
60
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
61
|
+
if (typeof value === "string") {
|
|
62
|
+
headers.set(key, value);
|
|
63
|
+
}
|
|
64
|
+
else if (Array.isArray(value)) {
|
|
65
|
+
headers.set(key, value.join(", "));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const fetchRequest = new Request(url, { method: "GET", headers });
|
|
69
|
+
Promise.resolve(handler(fetchRequest))
|
|
70
|
+
.then(async (response) => {
|
|
71
|
+
res.status(response.status);
|
|
72
|
+
response.headers.forEach((value, key) => {
|
|
73
|
+
res.setHeader(key, value);
|
|
74
|
+
});
|
|
75
|
+
res.send(await response.text());
|
|
76
|
+
})
|
|
77
|
+
.catch((err) => {
|
|
78
|
+
res.status(500).send(String(err));
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async listen(port, tls) {
|
|
83
|
+
let server;
|
|
84
|
+
if (tls === true) {
|
|
85
|
+
const { cert, key } = (await devcert.certificateFor("localhost"));
|
|
86
|
+
if (!cert || !key) {
|
|
87
|
+
throw new Error("Invalid certificate generated");
|
|
88
|
+
}
|
|
89
|
+
server = https.createServer({ cert, key }, this.#app);
|
|
90
|
+
}
|
|
91
|
+
else if (tls && "keyPath" in tls) {
|
|
92
|
+
const currentDir = process.cwd();
|
|
93
|
+
server = https.createServer({
|
|
94
|
+
key: fs.readFileSync(path.join(currentDir, tls.keyPath)),
|
|
95
|
+
cert: fs.readFileSync(path.join(currentDir, tls.certPath)),
|
|
96
|
+
}, this.#app);
|
|
97
|
+
}
|
|
98
|
+
else if (tls && "cert" in tls) {
|
|
99
|
+
server = https.createServer({ cert: tls.cert, key: tls.key }, this.#app);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
server = http.createServer(this.#app);
|
|
103
|
+
}
|
|
104
|
+
return new Promise((resolve, reject) => {
|
|
105
|
+
server.once("error", reject);
|
|
106
|
+
server.listen(port, () => {
|
|
107
|
+
server.off("error", reject);
|
|
108
|
+
resolve(server);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
#serveFetchHandler(handler, req, res, next) {
|
|
113
|
+
// Build the full URL for the Fetch Request
|
|
114
|
+
const protocol = req.protocol;
|
|
115
|
+
const host = req.get("host") ?? "localhost";
|
|
116
|
+
const url = `${protocol}://${host}${req.originalUrl}`;
|
|
117
|
+
// Convert Node.js incoming headers to Fetch Headers
|
|
118
|
+
const headers = new Headers();
|
|
119
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
120
|
+
if (typeof value === "string") {
|
|
121
|
+
headers.set(key, value);
|
|
122
|
+
}
|
|
123
|
+
else if (Array.isArray(value)) {
|
|
124
|
+
headers.set(key, value.join(", "));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// bodyParser has already run, so req.body is a parsed JS value.
|
|
128
|
+
// Re-serialize it so the Fetch Request body stream is readable.
|
|
129
|
+
let body;
|
|
130
|
+
if (req.method !== "GET" &&
|
|
131
|
+
req.method !== "HEAD" &&
|
|
132
|
+
req.body !== undefined) {
|
|
133
|
+
body = JSON.stringify(req.body);
|
|
134
|
+
}
|
|
135
|
+
const fetchRequest = new Request(url, {
|
|
136
|
+
method: req.method,
|
|
137
|
+
headers,
|
|
138
|
+
body,
|
|
139
|
+
});
|
|
140
|
+
Promise.resolve(handler(fetchRequest))
|
|
141
|
+
.then(async (response) => {
|
|
142
|
+
res.status(response.status);
|
|
143
|
+
response.headers.forEach((value, key) => {
|
|
144
|
+
res.setHeader(key, value);
|
|
145
|
+
});
|
|
146
|
+
const responseBody = await response.text();
|
|
147
|
+
res.send(responseBody);
|
|
148
|
+
})
|
|
149
|
+
.catch(next);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
export function createExpressHttpAdapter(existingApp) {
|
|
153
|
+
return { adapter: new ExpressHttpAdapter(existingApp) };
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=adapter-http-express.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-http-express.js","sourceRoot":"","sources":["../../../../src/graphql/gateway/adapter-http-express.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AuthContext, AuthService } from "../../services/auth.service.js";
|
|
2
|
+
import type { FetchHandler } from "./types.js";
|
|
3
|
+
export type AuthFetchMiddleware = (handler: FetchHandler) => FetchHandler;
|
|
4
|
+
/** Internal — only `graphql-manager.ts` should call this. */
|
|
5
|
+
export declare function getAuthContext(request: globalThis.Request): AuthContext | undefined;
|
|
6
|
+
export declare function createAuthFetchMiddleware(authService: AuthService): AuthFetchMiddleware;
|
|
7
|
+
//# sourceMappingURL=auth-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-middleware.d.ts","sourceRoot":"","sources":["../../../../src/graphql/gateway/auth-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,YAAY,KAAK,YAAY,CAAC;AAI1E,6DAA6D;AAC7D,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,CAAC,OAAO,GAC1B,WAAW,GAAG,SAAS,CAEzB;AAED,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,WAAW,GACvB,mBAAmB,CAQrB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const authContextMap = new WeakMap();
|
|
2
|
+
/** Internal — only `graphql-manager.ts` should call this. */
|
|
3
|
+
export function getAuthContext(request) {
|
|
4
|
+
return authContextMap.get(request);
|
|
5
|
+
}
|
|
6
|
+
export function createAuthFetchMiddleware(authService) {
|
|
7
|
+
return (next) => async (request) => {
|
|
8
|
+
const result = await authService.authenticateRequest(request);
|
|
9
|
+
if (result instanceof globalThis.Response)
|
|
10
|
+
return result;
|
|
11
|
+
authContextMap.set(request, result);
|
|
12
|
+
return next(request);
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=auth-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-middleware.js","sourceRoot":"","sources":["../../../../src/graphql/gateway/auth-middleware.ts"],"names":[],"mappings":"AAKA,MAAM,cAAc,GAAG,IAAI,OAAO,EAAmC,CAAC;AAEtE,6DAA6D;AAC7D,MAAM,UAAU,cAAc,CAC5B,OAA2B;IAE3B,OAAO,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,WAAwB;IAExB,OAAO,CAAC,IAAkB,EAAgB,EAAE,CAC1C,KAAK,EAAE,OAA2B,EAAgC,EAAE;QAClE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC9D,IAAI,MAAM,YAAY,UAAU,CAAC,QAAQ;YAAE,OAAO,MAAM,CAAC;QACzD,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ILogger } from "document-model";
|
|
2
|
+
import type { Context } from "../types.js";
|
|
3
|
+
import type { IGatewayAdapter, IHttpAdapter } from "./types.js";
|
|
4
|
+
export type GatewayAdapterType = "apollo";
|
|
5
|
+
export type HttpAdapterType = "express";
|
|
6
|
+
export declare function createGatewayAdapter(type: GatewayAdapterType, logger: ILogger): IGatewayAdapter<Context>;
|
|
7
|
+
export type HttpAdapterSetup = {
|
|
8
|
+
adapter: IHttpAdapter;
|
|
9
|
+
};
|
|
10
|
+
export declare function createHttpAdapter(type: HttpAdapterType, existingApp?: unknown): HttpAdapterSetup;
|
|
11
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../../src/graphql/gateway/factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;AAC1C,MAAM,MAAM,eAAe,GAAG,SAAS,CAAC;AAExC,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,OAAO,GACd,eAAe,CAAC,OAAO,CAAC,CAK1B;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,eAAe,EACrB,WAAW,CAAC,EAAE,OAAO,GACpB,gBAAgB,CAKlB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ApolloGatewayAdapter } from "./adapter-gateway-apollo.js";
|
|
2
|
+
import { createExpressHttpAdapter } from "./adapter-http-express.js";
|
|
3
|
+
export function createGatewayAdapter(type, logger) {
|
|
4
|
+
switch (type) {
|
|
5
|
+
case "apollo":
|
|
6
|
+
return new ApolloGatewayAdapter(logger);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function createHttpAdapter(type, existingApp) {
|
|
10
|
+
switch (type) {
|
|
11
|
+
case "express":
|
|
12
|
+
return createExpressHttpAdapter(existingApp);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../../src/graphql/gateway/factory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAMrE,MAAM,UAAU,oBAAoB,CAClC,IAAwB,EACxB,MAAe;IAEf,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAMD,MAAM,UAAU,iBAAiB,CAC/B,IAAqB,EACrB,WAAqB;IAErB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,wBAAwB,CAAC,WAAkC,CAAC,CAAC;IACxE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { CorsOptions } from "cors";
|
|
2
|
+
import type { DocumentNode, GraphQLSchema } from "graphql";
|
|
3
|
+
import type http from "node:http";
|
|
4
|
+
import type { WebSocketServer } from "ws";
|
|
5
|
+
export type TlsOptions = {
|
|
6
|
+
keyPath: string;
|
|
7
|
+
certPath: string;
|
|
8
|
+
} | {
|
|
9
|
+
cert: Buffer | string;
|
|
10
|
+
key: Buffer | string;
|
|
11
|
+
} | true;
|
|
12
|
+
export type GatewayContextFactory<TContext = unknown> = (request: Request) => Promise<TContext>;
|
|
13
|
+
export type WsContextFactory<TContext = unknown> = (connectionParams: Record<string, unknown>) => Promise<TContext>;
|
|
14
|
+
export type WsDisposer = {
|
|
15
|
+
dispose: () => void | Promise<void>;
|
|
16
|
+
};
|
|
17
|
+
export type FetchHandler = (request: Request) => Promise<Response>;
|
|
18
|
+
/**
|
|
19
|
+
* A framework-agnostic description of a federated subgraph service.
|
|
20
|
+
* Used by IGatewayAdapter.createSupergraphHandler() to compose the supergraph SDL.
|
|
21
|
+
*/
|
|
22
|
+
export type SubgraphDefinition = {
|
|
23
|
+
name: string;
|
|
24
|
+
typeDefs: DocumentNode;
|
|
25
|
+
url: string;
|
|
26
|
+
};
|
|
27
|
+
export interface IGatewayAdapter<TContext = unknown> {
|
|
28
|
+
/** One-time startup. */
|
|
29
|
+
start(httpServer: http.Server): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Returns a Fetch API handler for the given schema.
|
|
32
|
+
* Caller (IHttpAdapter) is responsible for mounting it at a path.
|
|
33
|
+
*/
|
|
34
|
+
createHandler(schema: GraphQLSchema, contextFactory: GatewayContextFactory<TContext>): Promise<FetchHandler>;
|
|
35
|
+
/**
|
|
36
|
+
* Create a federation gateway handler that composes all subgraphs into a supergraph.
|
|
37
|
+
* getSubgraphs is called eagerly (during setup) and again on every updateSupergraph() call.
|
|
38
|
+
*/
|
|
39
|
+
createSupergraphHandler(getSubgraphs: () => SubgraphDefinition[], httpServer: http.Server, contextFactory: GatewayContextFactory<TContext>): Promise<FetchHandler>;
|
|
40
|
+
/**
|
|
41
|
+
* Recompose the supergraph SDL from the current subgraph list and push the update
|
|
42
|
+
* to the running federation gateway. No-op if createSupergraphHandler() has not
|
|
43
|
+
* been called yet.
|
|
44
|
+
*/
|
|
45
|
+
updateSupergraph(): Promise<void>;
|
|
46
|
+
/** Attach WebSocket subscriptions. Returns a disposer. */
|
|
47
|
+
attachWebSocket(wsServer: WebSocketServer, schema: GraphQLSchema, contextFactory: WsContextFactory<TContext>): WsDisposer;
|
|
48
|
+
stop(): Promise<void>;
|
|
49
|
+
}
|
|
50
|
+
export interface IHttpAdapter {
|
|
51
|
+
/** Set up CORS and body-parser equivalent middleware. */
|
|
52
|
+
setupMiddleware(config: {
|
|
53
|
+
corsOptions?: CorsOptions;
|
|
54
|
+
bodyLimit?: string;
|
|
55
|
+
}): void;
|
|
56
|
+
/**
|
|
57
|
+
* Mount a Fetch API handler.
|
|
58
|
+
* - exact = false (default): exact path match via internal dispatch map.
|
|
59
|
+
* - exact = true: prefix match - handler also receives all sub-paths
|
|
60
|
+
* (uses framework router.use() semantics).
|
|
61
|
+
*/
|
|
62
|
+
mount(path: string, handler: FetchHandler, options?: {
|
|
63
|
+
exact?: boolean;
|
|
64
|
+
}): void;
|
|
65
|
+
/**
|
|
66
|
+
* Register a GET route that returns a Fetch Response (for health, explorer, etc.).
|
|
67
|
+
* Registered directly on the underlying framework app, bypassing the sub-router.
|
|
68
|
+
*/
|
|
69
|
+
getRoute(path: string, handler: (request: Request) => Response | Promise<Response>): void;
|
|
70
|
+
/**
|
|
71
|
+
* Start listening on the given port. Returns the underlying http.Server
|
|
72
|
+
* so callers can attach WebSocket servers.
|
|
73
|
+
*/
|
|
74
|
+
listen(port: number, tls?: TlsOptions): Promise<http.Server>;
|
|
75
|
+
/**
|
|
76
|
+
* Mount a raw Connect/Express-compatible middleware function (e.g. Vite dev
|
|
77
|
+
* server middleware). The implementation is adapter-specific; for Express this
|
|
78
|
+
* is equivalent to `app.use(middleware)`.
|
|
79
|
+
*/
|
|
80
|
+
mountRawMiddleware(middleware: unknown): void;
|
|
81
|
+
/** The raw framework handle (e.g. Express app). Cast as needed at call sites. */
|
|
82
|
+
readonly handle: unknown;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/graphql/gateway/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/graphql/gateway/types.ts"],"names":[],"mappings":""}
|