@effect-gql/core 0.1.0 → 1.1.0
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 +100 -0
- package/builder/index.cjs +1446 -0
- package/builder/index.cjs.map +1 -0
- package/builder/index.d.cts +260 -0
- package/{dist/builder/pipe-api.d.ts → builder/index.d.ts} +50 -21
- package/builder/index.js +1405 -0
- package/builder/index.js.map +1 -0
- package/index.cjs +3469 -0
- package/index.cjs.map +1 -0
- package/index.d.cts +529 -0
- package/index.d.ts +529 -0
- package/index.js +3292 -0
- package/index.js.map +1 -0
- package/package.json +19 -28
- package/schema-builder-DKvkzU_M.d.cts +965 -0
- package/schema-builder-DKvkzU_M.d.ts +965 -0
- package/server/index.cjs +1579 -0
- package/server/index.cjs.map +1 -0
- package/server/index.d.cts +682 -0
- package/server/index.d.ts +682 -0
- package/server/index.js +1548 -0
- package/server/index.js.map +1 -0
- package/dist/analyzer-extension.d.ts +0 -105
- package/dist/analyzer-extension.d.ts.map +0 -1
- package/dist/analyzer-extension.js +0 -137
- package/dist/analyzer-extension.js.map +0 -1
- package/dist/builder/execute.d.ts +0 -26
- package/dist/builder/execute.d.ts.map +0 -1
- package/dist/builder/execute.js +0 -104
- package/dist/builder/execute.js.map +0 -1
- package/dist/builder/field-builders.d.ts +0 -30
- package/dist/builder/field-builders.d.ts.map +0 -1
- package/dist/builder/field-builders.js +0 -200
- package/dist/builder/field-builders.js.map +0 -1
- package/dist/builder/index.d.ts +0 -7
- package/dist/builder/index.d.ts.map +0 -1
- package/dist/builder/index.js +0 -31
- package/dist/builder/index.js.map +0 -1
- package/dist/builder/pipe-api.d.ts.map +0 -1
- package/dist/builder/pipe-api.js +0 -151
- package/dist/builder/pipe-api.js.map +0 -1
- package/dist/builder/schema-builder.d.ts +0 -301
- package/dist/builder/schema-builder.d.ts.map +0 -1
- package/dist/builder/schema-builder.js +0 -566
- package/dist/builder/schema-builder.js.map +0 -1
- package/dist/builder/type-registry.d.ts +0 -80
- package/dist/builder/type-registry.d.ts.map +0 -1
- package/dist/builder/type-registry.js +0 -505
- package/dist/builder/type-registry.js.map +0 -1
- package/dist/builder/types.d.ts +0 -283
- package/dist/builder/types.d.ts.map +0 -1
- package/dist/builder/types.js +0 -3
- package/dist/builder/types.js.map +0 -1
- package/dist/cli/generate-schema.d.ts +0 -29
- package/dist/cli/generate-schema.d.ts.map +0 -1
- package/dist/cli/generate-schema.js +0 -233
- package/dist/cli/generate-schema.js.map +0 -1
- package/dist/cli/index.d.ts +0 -19
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -24
- package/dist/cli/index.js.map +0 -1
- package/dist/context.d.ts +0 -18
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -11
- package/dist/context.js.map +0 -1
- package/dist/error.d.ts +0 -45
- package/dist/error.d.ts.map +0 -1
- package/dist/error.js +0 -29
- package/dist/error.js.map +0 -1
- package/dist/extensions.d.ts +0 -130
- package/dist/extensions.d.ts.map +0 -1
- package/dist/extensions.js +0 -78
- package/dist/extensions.js.map +0 -1
- package/dist/index.d.ts +0 -12
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -47
- package/dist/index.js.map +0 -1
- package/dist/loader.d.ts +0 -169
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -237
- package/dist/loader.js.map +0 -1
- package/dist/resolver-context.d.ts +0 -154
- package/dist/resolver-context.d.ts.map +0 -1
- package/dist/resolver-context.js +0 -184
- package/dist/resolver-context.js.map +0 -1
- package/dist/schema-mapping.d.ts +0 -30
- package/dist/schema-mapping.d.ts.map +0 -1
- package/dist/schema-mapping.js +0 -280
- package/dist/schema-mapping.js.map +0 -1
- package/dist/server/cache-control.d.ts +0 -96
- package/dist/server/cache-control.d.ts.map +0 -1
- package/dist/server/cache-control.js +0 -308
- package/dist/server/cache-control.js.map +0 -1
- package/dist/server/complexity.d.ts +0 -165
- package/dist/server/complexity.d.ts.map +0 -1
- package/dist/server/complexity.js +0 -433
- package/dist/server/complexity.js.map +0 -1
- package/dist/server/config.d.ts +0 -66
- package/dist/server/config.d.ts.map +0 -1
- package/dist/server/config.js +0 -104
- package/dist/server/config.js.map +0 -1
- package/dist/server/graphiql.d.ts +0 -5
- package/dist/server/graphiql.d.ts.map +0 -1
- package/dist/server/graphiql.js +0 -43
- package/dist/server/graphiql.js.map +0 -1
- package/dist/server/index.d.ts +0 -18
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js +0 -48
- package/dist/server/index.js.map +0 -1
- package/dist/server/router.d.ts +0 -79
- package/dist/server/router.d.ts.map +0 -1
- package/dist/server/router.js +0 -232
- package/dist/server/router.js.map +0 -1
- package/dist/server/schema-builder-extensions.d.ts +0 -42
- package/dist/server/schema-builder-extensions.d.ts.map +0 -1
- package/dist/server/schema-builder-extensions.js +0 -48
- package/dist/server/schema-builder-extensions.js.map +0 -1
- package/dist/server/sse-adapter.d.ts +0 -64
- package/dist/server/sse-adapter.d.ts.map +0 -1
- package/dist/server/sse-adapter.js +0 -227
- package/dist/server/sse-adapter.js.map +0 -1
- package/dist/server/sse-types.d.ts +0 -192
- package/dist/server/sse-types.d.ts.map +0 -1
- package/dist/server/sse-types.js +0 -63
- package/dist/server/sse-types.js.map +0 -1
- package/dist/server/ws-adapter.d.ts +0 -39
- package/dist/server/ws-adapter.d.ts.map +0 -1
- package/dist/server/ws-adapter.js +0 -247
- package/dist/server/ws-adapter.js.map +0 -1
- package/dist/server/ws-types.d.ts +0 -169
- package/dist/server/ws-types.d.ts.map +0 -1
- package/dist/server/ws-types.js +0 -11
- package/dist/server/ws-types.js.map +0 -1
- package/dist/server/ws-utils.d.ts +0 -42
- package/dist/server/ws-utils.d.ts.map +0 -1
- package/dist/server/ws-utils.js +0 -99
- package/dist/server/ws-utils.js.map +0 -1
- package/src/analyzer-extension.ts +0 -254
- package/src/builder/execute.ts +0 -153
- package/src/builder/field-builders.ts +0 -322
- package/src/builder/index.ts +0 -48
- package/src/builder/pipe-api.ts +0 -312
- package/src/builder/schema-builder.ts +0 -970
- package/src/builder/type-registry.ts +0 -670
- package/src/builder/types.ts +0 -305
- package/src/context.ts +0 -23
- package/src/error.ts +0 -32
- package/src/extensions.ts +0 -240
- package/src/index.ts +0 -32
- package/src/loader.ts +0 -363
- package/src/resolver-context.ts +0 -253
- package/src/schema-mapping.ts +0 -307
- package/src/server/cache-control.ts +0 -590
- package/src/server/complexity.ts +0 -774
- package/src/server/config.ts +0 -174
- package/src/server/graphiql.ts +0 -38
- package/src/server/index.ts +0 -96
- package/src/server/router.ts +0 -432
- package/src/server/schema-builder-extensions.ts +0 -51
- package/src/server/sse-adapter.ts +0 -327
- package/src/server/sse-types.ts +0 -234
- package/src/server/ws-adapter.ts +0 -355
- package/src/server/ws-types.ts +0 -192
- package/src/server/ws-utils.ts +0 -136
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.makeGraphQLSSEHandler = exports.makeSSESubscriptionStream = void 0;
|
|
4
|
-
const effect_1 = require("effect");
|
|
5
|
-
const graphql_1 = require("graphql");
|
|
6
|
-
const sse_types_1 = require("./sse-types");
|
|
7
|
-
const complexity_1 = require("./complexity");
|
|
8
|
-
/**
|
|
9
|
-
* Create a subscription event stream for SSE.
|
|
10
|
-
*
|
|
11
|
-
* This function handles the GraphQL subscription lifecycle:
|
|
12
|
-
* 1. Parse and validate the query
|
|
13
|
-
* 2. Check complexity limits if configured
|
|
14
|
-
* 3. Execute the subscription
|
|
15
|
-
* 4. Stream results as SSE events
|
|
16
|
-
*
|
|
17
|
-
* @param schema - The GraphQL schema with subscription definitions
|
|
18
|
-
* @param layer - Effect layer providing services required by resolvers
|
|
19
|
-
* @param request - The subscription request (query, variables, operationName)
|
|
20
|
-
* @param headers - HTTP headers from the request (for auth)
|
|
21
|
-
* @param options - Optional lifecycle hooks and configuration
|
|
22
|
-
* @returns A Stream of SSE events to send to the client
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```typescript
|
|
26
|
-
* const eventStream = makeSSESubscriptionStream(
|
|
27
|
-
* schema,
|
|
28
|
-
* serviceLayer,
|
|
29
|
-
* { query: "subscription { tick { count } }" },
|
|
30
|
-
* new Headers(),
|
|
31
|
-
* { onConnect: (req, headers) => Effect.succeed({ user: "alice" }) }
|
|
32
|
-
* )
|
|
33
|
-
*
|
|
34
|
-
* // In platform-specific code, consume and send events:
|
|
35
|
-
* Stream.runForEach(eventStream, (event) =>
|
|
36
|
-
* Effect.sync(() => res.write(formatSSEMessage(event)))
|
|
37
|
-
* )
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
const makeSSESubscriptionStream = (schema, layer, request, headers, options) => {
|
|
41
|
-
const complexityConfig = options?.complexity;
|
|
42
|
-
const fieldComplexities = options?.fieldComplexities ?? new Map();
|
|
43
|
-
return effect_1.Stream.unwrap(effect_1.Effect.gen(function* () {
|
|
44
|
-
// Create a runtime from the layer
|
|
45
|
-
const runtime = yield* effect_1.Effect.provide(effect_1.Effect.runtime(), layer);
|
|
46
|
-
// Run onConnect hook if provided
|
|
47
|
-
let connectionContext = {};
|
|
48
|
-
if (options?.onConnect) {
|
|
49
|
-
try {
|
|
50
|
-
connectionContext = yield* effect_1.Effect.provide(options.onConnect(request, headers), layer);
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
// Connection rejected
|
|
54
|
-
return effect_1.Stream.make((0, sse_types_1.formatErrorEvent)([
|
|
55
|
-
new graphql_1.GraphQLError("Subscription connection rejected", {
|
|
56
|
-
extensions: { code: "CONNECTION_REJECTED" },
|
|
57
|
-
}),
|
|
58
|
-
]), (0, sse_types_1.formatCompleteEvent)());
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
// Parse the query
|
|
62
|
-
let document;
|
|
63
|
-
try {
|
|
64
|
-
document = (0, graphql_1.parse)(request.query);
|
|
65
|
-
}
|
|
66
|
-
catch (syntaxError) {
|
|
67
|
-
return effect_1.Stream.make((0, sse_types_1.formatErrorEvent)([syntaxError]), (0, sse_types_1.formatCompleteEvent)());
|
|
68
|
-
}
|
|
69
|
-
// Validate the query
|
|
70
|
-
const validationErrors = (0, graphql_1.validate)(schema, document);
|
|
71
|
-
if (validationErrors.length > 0) {
|
|
72
|
-
return effect_1.Stream.make((0, sse_types_1.formatErrorEvent)(validationErrors), (0, sse_types_1.formatCompleteEvent)());
|
|
73
|
-
}
|
|
74
|
-
// Find the subscription operation
|
|
75
|
-
const operations = document.definitions.filter((d) => d.kind === graphql_1.Kind.OPERATION_DEFINITION);
|
|
76
|
-
const operation = request.operationName
|
|
77
|
-
? operations.find((o) => o.name?.value === request.operationName)
|
|
78
|
-
: operations[0];
|
|
79
|
-
if (!operation) {
|
|
80
|
-
return effect_1.Stream.make((0, sse_types_1.formatErrorEvent)([new graphql_1.GraphQLError("No operation found in query")]), (0, sse_types_1.formatCompleteEvent)());
|
|
81
|
-
}
|
|
82
|
-
if (operation.operation !== "subscription") {
|
|
83
|
-
return effect_1.Stream.make((0, sse_types_1.formatErrorEvent)([
|
|
84
|
-
new graphql_1.GraphQLError(`SSE endpoint only supports subscriptions, received: ${operation.operation}`, { extensions: { code: "OPERATION_NOT_SUPPORTED" } }),
|
|
85
|
-
]), (0, sse_types_1.formatCompleteEvent)());
|
|
86
|
-
}
|
|
87
|
-
// Validate complexity if configured
|
|
88
|
-
if (complexityConfig) {
|
|
89
|
-
const complexityResult = yield* (0, complexity_1.validateComplexity)(request.query, request.operationName, request.variables, schema, fieldComplexities, complexityConfig).pipe(effect_1.Effect.map(() => null), effect_1.Effect.catchAll((error) => {
|
|
90
|
-
if (error._tag === "ComplexityLimitExceededError") {
|
|
91
|
-
return effect_1.Effect.succeed(new graphql_1.GraphQLError(error.message, {
|
|
92
|
-
extensions: {
|
|
93
|
-
code: "COMPLEXITY_LIMIT_EXCEEDED",
|
|
94
|
-
limitType: error.limitType,
|
|
95
|
-
limit: error.limit,
|
|
96
|
-
actual: error.actual,
|
|
97
|
-
},
|
|
98
|
-
}));
|
|
99
|
-
}
|
|
100
|
-
// Log analysis errors but don't block (fail open)
|
|
101
|
-
return effect_1.Effect.logWarning("Complexity analysis failed for SSE subscription", error).pipe(effect_1.Effect.map(() => null));
|
|
102
|
-
}));
|
|
103
|
-
if (complexityResult) {
|
|
104
|
-
return effect_1.Stream.make((0, sse_types_1.formatErrorEvent)([complexityResult]), (0, sse_types_1.formatCompleteEvent)());
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
// Build the context for the subscription
|
|
108
|
-
const ctx = {
|
|
109
|
-
runtime,
|
|
110
|
-
request,
|
|
111
|
-
connectionContext,
|
|
112
|
-
};
|
|
113
|
-
// Call onSubscribe hook if provided
|
|
114
|
-
if (options?.onSubscribe) {
|
|
115
|
-
yield* effect_1.Effect.provide(options.onSubscribe(ctx), layer).pipe(effect_1.Effect.catchAll(() => effect_1.Effect.void));
|
|
116
|
-
}
|
|
117
|
-
// Execute the subscription
|
|
118
|
-
const graphqlContext = {
|
|
119
|
-
runtime,
|
|
120
|
-
...connectionContext,
|
|
121
|
-
};
|
|
122
|
-
const subscriptionResult = yield* effect_1.Effect.tryPromise({
|
|
123
|
-
try: () => (0, graphql_1.subscribe)({
|
|
124
|
-
schema,
|
|
125
|
-
document,
|
|
126
|
-
variableValues: request.variables,
|
|
127
|
-
operationName: request.operationName ?? undefined,
|
|
128
|
-
contextValue: graphqlContext,
|
|
129
|
-
}),
|
|
130
|
-
catch: (error) => new sse_types_1.SSEError({ cause: error }),
|
|
131
|
-
});
|
|
132
|
-
// Check if subscribe returned an error result instead of async iterator
|
|
133
|
-
if (!isAsyncIterable(subscriptionResult)) {
|
|
134
|
-
// It's an ExecutionResult with errors
|
|
135
|
-
const result = subscriptionResult;
|
|
136
|
-
if (result.errors) {
|
|
137
|
-
return effect_1.Stream.make((0, sse_types_1.formatErrorEvent)(result.errors), (0, sse_types_1.formatCompleteEvent)());
|
|
138
|
-
}
|
|
139
|
-
// Shouldn't happen, but handle gracefully
|
|
140
|
-
return effect_1.Stream.make((0, sse_types_1.formatNextEvent)(result), (0, sse_types_1.formatCompleteEvent)());
|
|
141
|
-
}
|
|
142
|
-
// Create a stream from the async iterator
|
|
143
|
-
const asyncIterator = subscriptionResult[Symbol.asyncIterator]();
|
|
144
|
-
const eventStream = effect_1.Stream.async((emit) => {
|
|
145
|
-
let done = false;
|
|
146
|
-
const iterate = async () => {
|
|
147
|
-
try {
|
|
148
|
-
while (!done) {
|
|
149
|
-
const result = await asyncIterator.next();
|
|
150
|
-
if (result.done) {
|
|
151
|
-
emit.end();
|
|
152
|
-
break;
|
|
153
|
-
}
|
|
154
|
-
emit.single((0, sse_types_1.formatNextEvent)(result.value));
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
catch (error) {
|
|
158
|
-
if (!done) {
|
|
159
|
-
emit.single((0, sse_types_1.formatErrorEvent)([
|
|
160
|
-
error instanceof graphql_1.GraphQLError
|
|
161
|
-
? error
|
|
162
|
-
: new graphql_1.GraphQLError(error instanceof Error ? error.message : "Subscription error", { extensions: { code: "SUBSCRIPTION_ERROR" } }),
|
|
163
|
-
]));
|
|
164
|
-
emit.end();
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
iterate();
|
|
169
|
-
// Return cleanup function
|
|
170
|
-
return effect_1.Effect.sync(() => {
|
|
171
|
-
done = true;
|
|
172
|
-
asyncIterator.return?.();
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
// Add complete event at the end and handle cleanup
|
|
176
|
-
return eventStream.pipe(effect_1.Stream.onDone(() => effect_1.Effect.gen(function* () {
|
|
177
|
-
yield* effect_1.Effect.sync(() => { });
|
|
178
|
-
}).pipe(effect_1.Effect.asVoid)), effect_1.Stream.concat(effect_1.Stream.make((0, sse_types_1.formatCompleteEvent)())), effect_1.Stream.onDone(() => {
|
|
179
|
-
if (options?.onComplete) {
|
|
180
|
-
return effect_1.Effect.provide(options.onComplete(ctx), layer).pipe(effect_1.Effect.catchAll(() => effect_1.Effect.void));
|
|
181
|
-
}
|
|
182
|
-
return effect_1.Effect.void;
|
|
183
|
-
}));
|
|
184
|
-
}).pipe(effect_1.Effect.catchAll((error) => effect_1.Effect.succeed(effect_1.Stream.make((0, sse_types_1.formatErrorEvent)([
|
|
185
|
-
new graphql_1.GraphQLError(error instanceof Error ? error.message : "Internal error", {
|
|
186
|
-
extensions: { code: "INTERNAL_ERROR" },
|
|
187
|
-
}),
|
|
188
|
-
]), (0, sse_types_1.formatCompleteEvent)())))));
|
|
189
|
-
};
|
|
190
|
-
exports.makeSSESubscriptionStream = makeSSESubscriptionStream;
|
|
191
|
-
/**
|
|
192
|
-
* Create an SSE subscription handler that can be used with platform-specific servers.
|
|
193
|
-
*
|
|
194
|
-
* This is a higher-level API that returns a handler function. The handler
|
|
195
|
-
* takes a request and headers, and returns a Stream of SSE events.
|
|
196
|
-
*
|
|
197
|
-
* @param schema - The GraphQL schema with subscription definitions
|
|
198
|
-
* @param layer - Effect layer providing services required by resolvers
|
|
199
|
-
* @param options - Optional lifecycle hooks and configuration
|
|
200
|
-
* @returns A handler function for SSE subscription requests
|
|
201
|
-
*
|
|
202
|
-
* @example
|
|
203
|
-
* ```typescript
|
|
204
|
-
* const handler = makeGraphQLSSEHandler(schema, serviceLayer, {
|
|
205
|
-
* onConnect: (request, headers) => Effect.gen(function* () {
|
|
206
|
-
* const token = headers.get("authorization")
|
|
207
|
-
* const user = yield* AuthService.validateToken(token)
|
|
208
|
-
* return { user }
|
|
209
|
-
* }),
|
|
210
|
-
* })
|
|
211
|
-
*
|
|
212
|
-
* // In platform-specific code:
|
|
213
|
-
* const events = handler(request, headers)
|
|
214
|
-
* // Stream events to client...
|
|
215
|
-
* ```
|
|
216
|
-
*/
|
|
217
|
-
const makeGraphQLSSEHandler = (schema, layer, options) => {
|
|
218
|
-
return (request, headers) => (0, exports.makeSSESubscriptionStream)(schema, layer, request, headers, options);
|
|
219
|
-
};
|
|
220
|
-
exports.makeGraphQLSSEHandler = makeGraphQLSSEHandler;
|
|
221
|
-
/**
|
|
222
|
-
* Type guard to check if a value is an AsyncIterable (subscription result)
|
|
223
|
-
*/
|
|
224
|
-
function isAsyncIterable(value) {
|
|
225
|
-
return typeof value === "object" && value !== null && Symbol.asyncIterator in value;
|
|
226
|
-
}
|
|
227
|
-
//# sourceMappingURL=sse-adapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sse-adapter.js","sourceRoot":"","sources":["../../src/server/sse-adapter.ts"],"names":[],"mappings":";;;AAAA,mCAA8C;AAC9C,qCAUgB;AAEhB,2CASoB;AACpB,6CAA0E;AAE1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACI,MAAM,yBAAyB,GAAG,CACvC,MAAqB,EACrB,KAAqB,EACrB,OAA+B,EAC/B,OAAgB,EAChB,OAA8B,EACK,EAAE;IACrC,MAAM,gBAAgB,GAAG,OAAO,EAAE,UAAU,CAAA;IAC5C,MAAM,iBAAiB,GAAuB,OAAO,EAAE,iBAAiB,IAAI,IAAI,GAAG,EAAE,CAAA;IAErF,OAAO,eAAM,CAAC,MAAM,CAClB,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,kCAAkC;QAClC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,OAAO,CAAC,eAAM,CAAC,OAAO,EAAK,EAAE,KAAK,CAAC,CAAA;QAEjE,iCAAiC;QACjC,IAAI,iBAAiB,GAA4B,EAAE,CAAA;QACnD,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,iBAAiB,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAA;YACvF,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;gBACtB,OAAO,eAAM,CAAC,IAAI,CAChB,IAAA,4BAAgB,EAAC;oBACf,IAAI,sBAAY,CAAC,kCAAkC,EAAE;wBACnD,UAAU,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE;qBAC5C,CAAC;iBACH,CAAC,EACF,IAAA,+BAAmB,GAAE,CACtB,CAAA;YACH,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,QAAsB,CAAA;QAC1B,IAAI,CAAC;YACH,QAAQ,GAAG,IAAA,eAAK,EAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;QAAC,OAAO,WAAW,EAAE,CAAC;YACrB,OAAO,eAAM,CAAC,IAAI,CAAC,IAAA,4BAAgB,EAAC,CAAC,WAAW,CAAC,CAAC,EAAE,IAAA,+BAAmB,GAAE,CAAC,CAAA;QAC5E,CAAC;QAED,qBAAqB;QACrB,MAAM,gBAAgB,GAAG,IAAA,kBAAQ,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QACnD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,eAAM,CAAC,IAAI,CAAC,IAAA,4BAAgB,EAAC,gBAAgB,CAAC,EAAE,IAAA,+BAAmB,GAAE,CAAC,CAAA;QAC/E,CAAC;QAED,kCAAkC;QAClC,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAC5C,CAAC,CAAC,EAAgC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAI,CAAC,oBAAoB,CAC1E,CAAA;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa;YACrC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,aAAa,CAAC;YACjE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAEjB,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,eAAM,CAAC,IAAI,CAChB,IAAA,4BAAgB,EAAC,CAAC,IAAI,sBAAY,CAAC,6BAA6B,CAAC,CAAC,CAAC,EACnE,IAAA,+BAAmB,GAAE,CACtB,CAAA;QACH,CAAC;QAED,IAAI,SAAS,CAAC,SAAS,KAAK,cAAc,EAAE,CAAC;YAC3C,OAAO,eAAM,CAAC,IAAI,CAChB,IAAA,4BAAgB,EAAC;gBACf,IAAI,sBAAY,CACd,uDAAuD,SAAS,CAAC,SAAS,EAAE,EAC5E,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,EAAE,CACpD;aACF,CAAC,EACF,IAAA,+BAAmB,GAAE,CACtB,CAAA;QACH,CAAC;QAED,oCAAoC;QACpC,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,IAAA,+BAAkB,EAChD,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,SAAS,EACjB,MAAM,EACN,iBAAiB,EACjB,gBAAgB,CACjB,CAAC,IAAI,CACJ,eAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EACtB,eAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;gBACxB,IAAI,KAAK,CAAC,IAAI,KAAK,8BAA8B,EAAE,CAAC;oBAClD,OAAO,eAAM,CAAC,OAAO,CACnB,IAAI,sBAAY,CAAC,KAAK,CAAC,OAAO,EAAE;wBAC9B,UAAU,EAAE;4BACV,IAAI,EAAE,2BAA2B;4BACjC,SAAS,EAAE,KAAK,CAAC,SAAS;4BAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;4BAClB,MAAM,EAAE,KAAK,CAAC,MAAM;yBACrB;qBACF,CAAC,CACH,CAAA;gBACH,CAAC;gBACD,kDAAkD;gBAClD,OAAO,eAAM,CAAC,UAAU,CAAC,iDAAiD,EAAE,KAAK,CAAC,CAAC,IAAI,CACrF,eAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CACvB,CAAA;YACH,CAAC,CAAC,CACH,CAAA;YAED,IAAI,gBAAgB,EAAE,CAAC;gBACrB,OAAO,eAAM,CAAC,IAAI,CAAC,IAAA,4BAAgB,EAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAA,+BAAmB,GAAE,CAAC,CAAA;YACjF,CAAC;QACH,CAAC;QAED,yCAAyC;QACzC,MAAM,GAAG,GAA4B;YACnC,OAAO;YACP,OAAO;YACP,iBAAiB;SAClB,CAAA;QAED,oCAAoC;QACpC,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;YACzB,KAAK,CAAC,CAAC,eAAM,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CACzD,eAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,IAAI,CAAC,CACnC,CAAA;QACH,CAAC;QAED,2BAA2B;QAC3B,MAAM,cAAc,GAAsD;YACxE,OAAO;YACP,GAAG,iBAAiB;SACrB,CAAA;QAED,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,UAAU,CAAC;YAClD,GAAG,EAAE,GAAG,EAAE,CACR,IAAA,mBAAS,EAAC;gBACR,MAAM;gBACN,QAAQ;gBACR,cAAc,EAAE,OAAO,CAAC,SAAS;gBACjC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,SAAS;gBACjD,YAAY,EAAE,cAAc;aAC7B,CAAC;YACJ,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,oBAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;SACjD,CAAC,CAAA;QAEF,wEAAwE;QACxE,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACzC,sCAAsC;YACtC,MAAM,MAAM,GAAG,kBAAqC,CAAA;YACpD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO,eAAM,CAAC,IAAI,CAAC,IAAA,4BAAgB,EAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAA,+BAAmB,GAAE,CAAC,CAAA;YAC5E,CAAC;YACD,0CAA0C;YAC1C,OAAO,eAAM,CAAC,IAAI,CAAC,IAAA,2BAAe,EAAC,MAAM,CAAC,EAAE,IAAA,+BAAmB,GAAE,CAAC,CAAA;QACpE,CAAC;QAED,0CAA0C;QAC1C,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAA;QAEhE,MAAM,WAAW,GAAG,eAAM,CAAC,KAAK,CAAqB,CAAC,IAAI,EAAE,EAAE;YAC5D,IAAI,IAAI,GAAG,KAAK,CAAA;YAEhB,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;gBACzB,IAAI,CAAC;oBACH,OAAO,CAAC,IAAI,EAAE,CAAC;wBACb,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAA;wBACzC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;4BAChB,IAAI,CAAC,GAAG,EAAE,CAAA;4BACV,MAAK;wBACP,CAAC;wBACD,IAAI,CAAC,MAAM,CAAC,IAAA,2BAAe,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;oBAC5C,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,IAAI,CAAC,MAAM,CACT,IAAA,4BAAgB,EAAC;4BACf,KAAK,YAAY,sBAAY;gCAC3B,CAAC,CAAC,KAAK;gCACP,CAAC,CAAC,IAAI,sBAAY,CACd,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,EAC7D,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE,CAC/C;yBACN,CAAC,CACH,CAAA;wBACD,IAAI,CAAC,GAAG,EAAE,CAAA;oBACZ,CAAC;gBACH,CAAC;YACH,CAAC,CAAA;YAED,OAAO,EAAE,CAAA;YAET,0BAA0B;YAC1B,OAAO,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE;gBACtB,IAAI,GAAG,IAAI,CAAA;gBACX,aAAa,CAAC,MAAM,EAAE,EAAE,CAAA;YAC1B,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,mDAAmD;QACnD,OAAO,WAAW,CAAC,IAAI,CACrB,eAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CACjB,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAC9B,CAAC,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,MAAM,CAAC,CACvB,EACD,eAAM,CAAC,MAAM,CAAC,eAAM,CAAC,IAAI,CAAC,IAAA,+BAAmB,GAAE,CAAC,CAAC,EACjD,eAAM,CAAC,MAAM,CAAC,GAAG,EAAE;YACjB,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;gBACxB,OAAO,eAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CACxD,eAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,IAAI,CAAC,CACnC,CAAA;YACH,CAAC;YACD,OAAO,eAAM,CAAC,IAAI,CAAA;QACpB,CAAC,CAAC,CACH,CAAA;IACH,CAAC,CAAC,CAAC,IAAI,CACL,eAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,eAAM,CAAC,OAAO,CACZ,eAAM,CAAC,IAAI,CACT,IAAA,4BAAgB,EAAC;QACf,IAAI,sBAAY,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE;YAC1E,UAAU,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;SACvC,CAAC;KACH,CAAC,EACF,IAAA,+BAAmB,GAAE,CACtB,CACF,CACF,CACF,CACF,CAAA;AACH,CAAC,CAAA;AApOY,QAAA,yBAAyB,6BAoOrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACI,MAAM,qBAAqB,GAAG,CACnC,MAAqB,EACrB,KAAqB,EACrB,OAA8B,EAC8D,EAAE;IAC9F,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,IAAA,iCAAyB,EAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AAClG,CAAC,CAAA;AANY,QAAA,qBAAqB,yBAMjC;AAED;;GAEG;AACH,SAAS,eAAe,CAAI,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,aAAa,IAAI,KAAK,CAAA;AACrF,CAAC"}
|
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
import { Effect, Runtime, Stream } from "effect";
|
|
2
|
-
import type { ExecutionResult } from "graphql";
|
|
3
|
-
import type { ComplexityConfig, FieldComplexityMap } from "./complexity";
|
|
4
|
-
/**
|
|
5
|
-
* Standard SSE response headers following the graphql-sse protocol.
|
|
6
|
-
* Use these headers when writing SSE responses in platform adapters.
|
|
7
|
-
*/
|
|
8
|
-
export declare const SSE_HEADERS: Record<string, string>;
|
|
9
|
-
declare const SSEError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
|
|
10
|
-
readonly _tag: "SSEError";
|
|
11
|
-
} & Readonly<A>;
|
|
12
|
-
/**
|
|
13
|
-
* Error type for SSE operations
|
|
14
|
-
*/
|
|
15
|
-
export declare class SSEError extends SSEError_base<{
|
|
16
|
-
readonly cause: unknown;
|
|
17
|
-
}> {
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* SSE event types following the graphql-sse protocol (distinct connections mode).
|
|
21
|
-
* @see https://github.com/enisdenjo/graphql-sse/blob/master/PROTOCOL.md
|
|
22
|
-
*/
|
|
23
|
-
export type SSEEventType = "next" | "error" | "complete";
|
|
24
|
-
/**
|
|
25
|
-
* An SSE event to be sent to the client.
|
|
26
|
-
*/
|
|
27
|
-
export interface SSEEvent {
|
|
28
|
-
readonly event: SSEEventType;
|
|
29
|
-
readonly data: string;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Platform-neutral SSE response interface using Effect types.
|
|
33
|
-
*
|
|
34
|
-
* This interface abstracts SSE operations across different platforms
|
|
35
|
-
* (Node.js, Bun, Deno, Workers). Platform packages implement this
|
|
36
|
-
* interface to bridge their specific HTTP response implementations.
|
|
37
|
-
*
|
|
38
|
-
* Unlike WebSocket which is bidirectional, SSE is unidirectional
|
|
39
|
-
* (server to client only). The subscription query is provided
|
|
40
|
-
* upfront when creating the SSE connection.
|
|
41
|
-
*/
|
|
42
|
-
export interface EffectSSE {
|
|
43
|
-
/**
|
|
44
|
-
* Send an SSE event to the client.
|
|
45
|
-
* The platform adapter formats this as proper SSE format:
|
|
46
|
-
* ```
|
|
47
|
-
* event: next
|
|
48
|
-
* data: {"data":{"field":"value"}}
|
|
49
|
-
*
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
readonly sendEvent: (event: SSEEvent) => Effect.Effect<void, SSEError>;
|
|
53
|
-
/**
|
|
54
|
-
* Effect that completes when the client disconnects.
|
|
55
|
-
* Use this to detect client disconnection and cleanup.
|
|
56
|
-
*/
|
|
57
|
-
readonly closed: Effect.Effect<void, SSEError>;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* The GraphQL request payload for SSE subscriptions.
|
|
61
|
-
* Same as a regular GraphQL HTTP request.
|
|
62
|
-
*/
|
|
63
|
-
export interface SSESubscriptionRequest {
|
|
64
|
-
readonly query: string;
|
|
65
|
-
readonly variables?: Record<string, unknown>;
|
|
66
|
-
readonly operationName?: string;
|
|
67
|
-
readonly extensions?: Record<string, unknown>;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Context available during an SSE subscription.
|
|
71
|
-
* This is passed to lifecycle hooks.
|
|
72
|
-
*/
|
|
73
|
-
export interface SSEConnectionContext<R> {
|
|
74
|
-
/**
|
|
75
|
-
* The Effect runtime for this connection.
|
|
76
|
-
* Use this to run Effects within the connection scope.
|
|
77
|
-
*/
|
|
78
|
-
readonly runtime: Runtime.Runtime<R>;
|
|
79
|
-
/**
|
|
80
|
-
* The original subscription request.
|
|
81
|
-
*/
|
|
82
|
-
readonly request: SSESubscriptionRequest;
|
|
83
|
-
/**
|
|
84
|
-
* Optional authentication/authorization context.
|
|
85
|
-
* Populated by the onConnect hook.
|
|
86
|
-
*/
|
|
87
|
-
readonly connectionContext: Record<string, unknown>;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Options for configuring the GraphQL SSE handler.
|
|
91
|
-
*
|
|
92
|
-
* @template R - Service requirements for lifecycle hooks
|
|
93
|
-
*/
|
|
94
|
-
export interface GraphQLSSEOptions<R> {
|
|
95
|
-
/**
|
|
96
|
-
* Query complexity limiting configuration.
|
|
97
|
-
* When provided, subscriptions are validated against complexity limits
|
|
98
|
-
* before execution begins.
|
|
99
|
-
*/
|
|
100
|
-
readonly complexity?: ComplexityConfig;
|
|
101
|
-
/**
|
|
102
|
-
* Field complexity definitions from the schema builder.
|
|
103
|
-
* If using the platform serve() functions, this is typically
|
|
104
|
-
* passed automatically.
|
|
105
|
-
*/
|
|
106
|
-
readonly fieldComplexities?: FieldComplexityMap;
|
|
107
|
-
/**
|
|
108
|
-
* Called before a subscription starts.
|
|
109
|
-
*
|
|
110
|
-
* Use this for authentication/authorization. Return:
|
|
111
|
-
* - A context object to accept the subscription
|
|
112
|
-
* - Throw/fail to reject the subscription
|
|
113
|
-
*
|
|
114
|
-
* The returned object is available in the GraphQL context.
|
|
115
|
-
*
|
|
116
|
-
* @example
|
|
117
|
-
* ```typescript
|
|
118
|
-
* onConnect: (request, headers) => Effect.gen(function* () {
|
|
119
|
-
* const token = headers.get("authorization")
|
|
120
|
-
* const user = yield* AuthService.validateToken(token)
|
|
121
|
-
* return { user } // Available in GraphQL context
|
|
122
|
-
* })
|
|
123
|
-
* ```
|
|
124
|
-
*/
|
|
125
|
-
readonly onConnect?: (request: SSESubscriptionRequest, headers: Headers) => Effect.Effect<Record<string, unknown>, unknown, R>;
|
|
126
|
-
/**
|
|
127
|
-
* Called when the subscription starts streaming.
|
|
128
|
-
*/
|
|
129
|
-
readonly onSubscribe?: (ctx: SSEConnectionContext<R>) => Effect.Effect<void, never, R>;
|
|
130
|
-
/**
|
|
131
|
-
* Called when the subscription completes (normally or due to error).
|
|
132
|
-
*/
|
|
133
|
-
readonly onComplete?: (ctx: SSEConnectionContext<R>) => Effect.Effect<void, never, R>;
|
|
134
|
-
/**
|
|
135
|
-
* Called when the client disconnects.
|
|
136
|
-
*/
|
|
137
|
-
readonly onDisconnect?: (ctx: SSEConnectionContext<R>) => Effect.Effect<void, never, R>;
|
|
138
|
-
/**
|
|
139
|
-
* Called when an error occurs during subscription execution.
|
|
140
|
-
*/
|
|
141
|
-
readonly onError?: (ctx: SSEConnectionContext<R>, error: unknown) => Effect.Effect<void, never, R>;
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Configuration for the SSE endpoint
|
|
145
|
-
*/
|
|
146
|
-
export interface GraphQLSSEConfig {
|
|
147
|
-
/**
|
|
148
|
-
* Path for SSE connections.
|
|
149
|
-
* @default "/graphql/stream"
|
|
150
|
-
*/
|
|
151
|
-
readonly path?: string;
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Result of SSE subscription handler creation.
|
|
155
|
-
* This is used by platform packages to implement their SSE response.
|
|
156
|
-
*/
|
|
157
|
-
export interface SSESubscriptionResult {
|
|
158
|
-
/**
|
|
159
|
-
* Stream of SSE events to send to the client.
|
|
160
|
-
* The platform adapter should consume this stream and send events.
|
|
161
|
-
*/
|
|
162
|
-
readonly events: Stream.Stream<SSEEvent, SSEError>;
|
|
163
|
-
/**
|
|
164
|
-
* Effect that should be run when client disconnects.
|
|
165
|
-
* This allows cleanup of resources.
|
|
166
|
-
*/
|
|
167
|
-
readonly cleanup: Effect.Effect<void, never, never>;
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Format an ExecutionResult as an SSE "next" event.
|
|
171
|
-
*/
|
|
172
|
-
export declare const formatNextEvent: (result: ExecutionResult) => SSEEvent;
|
|
173
|
-
/**
|
|
174
|
-
* Format errors as an SSE "error" event.
|
|
175
|
-
*/
|
|
176
|
-
export declare const formatErrorEvent: (errors: readonly unknown[]) => SSEEvent;
|
|
177
|
-
/**
|
|
178
|
-
* Format a "complete" event.
|
|
179
|
-
*/
|
|
180
|
-
export declare const formatCompleteEvent: () => SSEEvent;
|
|
181
|
-
/**
|
|
182
|
-
* Format an SSE event to the wire format.
|
|
183
|
-
* Each event is formatted as:
|
|
184
|
-
* ```
|
|
185
|
-
* event: <type>
|
|
186
|
-
* data: <json>
|
|
187
|
-
*
|
|
188
|
-
* ```
|
|
189
|
-
*/
|
|
190
|
-
export declare const formatSSEMessage: (event: SSEEvent) => string;
|
|
191
|
-
export {};
|
|
192
|
-
//# sourceMappingURL=sse-types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sse-types.d.ts","sourceRoot":"","sources":["../../src/server/sse-types.ts"],"names":[],"mappings":"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"}
|
package/dist/server/sse-types.js
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.formatSSEMessage = exports.formatCompleteEvent = exports.formatErrorEvent = exports.formatNextEvent = exports.SSEError = exports.SSE_HEADERS = void 0;
|
|
4
|
-
const effect_1 = require("effect");
|
|
5
|
-
/**
|
|
6
|
-
* Standard SSE response headers following the graphql-sse protocol.
|
|
7
|
-
* Use these headers when writing SSE responses in platform adapters.
|
|
8
|
-
*/
|
|
9
|
-
exports.SSE_HEADERS = {
|
|
10
|
-
"Content-Type": "text/event-stream",
|
|
11
|
-
"Cache-Control": "no-cache",
|
|
12
|
-
Connection: "keep-alive",
|
|
13
|
-
"X-Accel-Buffering": "no", // Disable nginx buffering
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* Error type for SSE operations
|
|
17
|
-
*/
|
|
18
|
-
class SSEError extends effect_1.Data.TaggedError("SSEError") {
|
|
19
|
-
}
|
|
20
|
-
exports.SSEError = SSEError;
|
|
21
|
-
/**
|
|
22
|
-
* Format an ExecutionResult as an SSE "next" event.
|
|
23
|
-
*/
|
|
24
|
-
const formatNextEvent = (result) => ({
|
|
25
|
-
event: "next",
|
|
26
|
-
data: JSON.stringify(result),
|
|
27
|
-
});
|
|
28
|
-
exports.formatNextEvent = formatNextEvent;
|
|
29
|
-
/**
|
|
30
|
-
* Format errors as an SSE "error" event.
|
|
31
|
-
*/
|
|
32
|
-
const formatErrorEvent = (errors) => ({
|
|
33
|
-
event: "error",
|
|
34
|
-
data: JSON.stringify({ errors }),
|
|
35
|
-
});
|
|
36
|
-
exports.formatErrorEvent = formatErrorEvent;
|
|
37
|
-
/**
|
|
38
|
-
* Format a "complete" event.
|
|
39
|
-
*/
|
|
40
|
-
const formatCompleteEvent = () => ({
|
|
41
|
-
event: "complete",
|
|
42
|
-
data: "",
|
|
43
|
-
});
|
|
44
|
-
exports.formatCompleteEvent = formatCompleteEvent;
|
|
45
|
-
/**
|
|
46
|
-
* Format an SSE event to the wire format.
|
|
47
|
-
* Each event is formatted as:
|
|
48
|
-
* ```
|
|
49
|
-
* event: <type>
|
|
50
|
-
* data: <json>
|
|
51
|
-
*
|
|
52
|
-
* ```
|
|
53
|
-
*/
|
|
54
|
-
const formatSSEMessage = (event) => {
|
|
55
|
-
const lines = [`event: ${event.event}`];
|
|
56
|
-
if (event.data) {
|
|
57
|
-
lines.push(`data: ${event.data}`);
|
|
58
|
-
}
|
|
59
|
-
lines.push("", ""); // Two newlines to end the event
|
|
60
|
-
return lines.join("\n");
|
|
61
|
-
};
|
|
62
|
-
exports.formatSSEMessage = formatSSEMessage;
|
|
63
|
-
//# sourceMappingURL=sse-types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sse-types.js","sourceRoot":"","sources":["../../src/server/sse-types.ts"],"names":[],"mappings":";;;AAAA,mCAAsD;AAItD;;;GAGG;AACU,QAAA,WAAW,GAA2B;IACjD,cAAc,EAAE,mBAAmB;IACnC,eAAe,EAAE,UAAU;IAC3B,UAAU,EAAE,YAAY;IACxB,mBAAmB,EAAE,IAAI,EAAE,0BAA0B;CAC7C,CAAA;AAEV;;GAEG;AACH,MAAa,QAAS,SAAQ,aAAI,CAAC,WAAW,CAAC,UAAU,CAEvD;CAAG;AAFL,4BAEK;AA6KL;;GAEG;AACI,MAAM,eAAe,GAAG,CAAC,MAAuB,EAAY,EAAE,CAAC,CAAC;IACrE,KAAK,EAAE,MAAM;IACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;CAC7B,CAAC,CAAA;AAHW,QAAA,eAAe,mBAG1B;AAEF;;GAEG;AACI,MAAM,gBAAgB,GAAG,CAAC,MAA0B,EAAY,EAAE,CAAC,CAAC;IACzE,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC,CAAC,CAAA;AAHW,QAAA,gBAAgB,oBAG3B;AAEF;;GAEG;AACI,MAAM,mBAAmB,GAAG,GAAa,EAAE,CAAC,CAAC;IAClD,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,EAAE;CACT,CAAC,CAAA;AAHW,QAAA,mBAAmB,uBAG9B;AAEF;;;;;;;;GAQG;AACI,MAAM,gBAAgB,GAAG,CAAC,KAAe,EAAU,EAAE;IAC1D,MAAM,KAAK,GAAG,CAAC,UAAU,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;IACvC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IACnC,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA,CAAC,gCAAgC;IACnD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC,CAAA;AAPY,QAAA,gBAAgB,oBAO5B"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { Effect, Layer } from "effect";
|
|
2
|
-
import { GraphQLSchema } from "graphql";
|
|
3
|
-
import type { EffectWebSocket, GraphQLWSOptions } from "./ws-types";
|
|
4
|
-
/**
|
|
5
|
-
* Create a WebSocket handler for GraphQL subscriptions using the graphql-ws protocol.
|
|
6
|
-
*
|
|
7
|
-
* This function creates a handler that can be used with any WebSocket implementation
|
|
8
|
-
* that conforms to the EffectWebSocket interface. Platform packages (node, bun, express)
|
|
9
|
-
* provide adapters that convert their native WebSocket to EffectWebSocket.
|
|
10
|
-
*
|
|
11
|
-
* The handler:
|
|
12
|
-
* - Uses the graphql-ws protocol for client communication
|
|
13
|
-
* - Creates an Effect runtime from the provided layer for each connection
|
|
14
|
-
* - Executes subscriptions using GraphQL's subscribe() function
|
|
15
|
-
* - Properly cleans up resources when connections close
|
|
16
|
-
*
|
|
17
|
-
* @param schema - The GraphQL schema with subscription definitions
|
|
18
|
-
* @param layer - Effect layer providing services required by resolvers
|
|
19
|
-
* @param options - Optional lifecycle hooks for connection/subscription events
|
|
20
|
-
* @returns A function that handles individual WebSocket connections
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```typescript
|
|
24
|
-
* import { makeGraphQLWSHandler } from "@effect-gql/core"
|
|
25
|
-
*
|
|
26
|
-
* const handler = makeGraphQLWSHandler(schema, serviceLayer, {
|
|
27
|
-
* onConnect: (params) => Effect.gen(function* () {
|
|
28
|
-
* const user = yield* AuthService.validateToken(params.authToken)
|
|
29
|
-
* return { user }
|
|
30
|
-
* }),
|
|
31
|
-
* })
|
|
32
|
-
*
|
|
33
|
-
* // In platform-specific code:
|
|
34
|
-
* const effectSocket = toEffectWebSocket(rawWebSocket)
|
|
35
|
-
* await Effect.runPromise(handler(effectSocket))
|
|
36
|
-
* ```
|
|
37
|
-
*/
|
|
38
|
-
export declare const makeGraphQLWSHandler: <R>(schema: GraphQLSchema, layer: Layer.Layer<R>, options?: GraphQLWSOptions<R>) => ((socket: EffectWebSocket) => Effect.Effect<void, never, never>);
|
|
39
|
-
//# sourceMappingURL=ws-adapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ws-adapter.d.ts","sourceRoot":"","sources":["../../src/server/ws-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAA2C,MAAM,QAAQ,CAAA;AAC/E,OAAO,EAAE,aAAa,EAA2B,MAAM,SAAS,CAAA;AAGhE,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAIjB,MAAM,YAAY,CAAA;AAuQnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,EACpC,QAAQ,aAAa,EACrB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EACrB,UAAU,gBAAgB,CAAC,CAAC,CAAC,KAC5B,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CA2CjE,CAAA"}
|