@effect-gql/core 0.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.
Files changed (145) hide show
  1. package/LICENSE +7 -0
  2. package/dist/analyzer-extension.d.ts +105 -0
  3. package/dist/analyzer-extension.d.ts.map +1 -0
  4. package/dist/analyzer-extension.js +137 -0
  5. package/dist/analyzer-extension.js.map +1 -0
  6. package/dist/builder/execute.d.ts +26 -0
  7. package/dist/builder/execute.d.ts.map +1 -0
  8. package/dist/builder/execute.js +104 -0
  9. package/dist/builder/execute.js.map +1 -0
  10. package/dist/builder/field-builders.d.ts +30 -0
  11. package/dist/builder/field-builders.d.ts.map +1 -0
  12. package/dist/builder/field-builders.js +200 -0
  13. package/dist/builder/field-builders.js.map +1 -0
  14. package/dist/builder/index.d.ts +7 -0
  15. package/dist/builder/index.d.ts.map +1 -0
  16. package/dist/builder/index.js +31 -0
  17. package/dist/builder/index.js.map +1 -0
  18. package/dist/builder/pipe-api.d.ts +231 -0
  19. package/dist/builder/pipe-api.d.ts.map +1 -0
  20. package/dist/builder/pipe-api.js +151 -0
  21. package/dist/builder/pipe-api.js.map +1 -0
  22. package/dist/builder/schema-builder.d.ts +301 -0
  23. package/dist/builder/schema-builder.d.ts.map +1 -0
  24. package/dist/builder/schema-builder.js +566 -0
  25. package/dist/builder/schema-builder.js.map +1 -0
  26. package/dist/builder/type-registry.d.ts +80 -0
  27. package/dist/builder/type-registry.d.ts.map +1 -0
  28. package/dist/builder/type-registry.js +505 -0
  29. package/dist/builder/type-registry.js.map +1 -0
  30. package/dist/builder/types.d.ts +283 -0
  31. package/dist/builder/types.d.ts.map +1 -0
  32. package/dist/builder/types.js +3 -0
  33. package/dist/builder/types.js.map +1 -0
  34. package/dist/cli/generate-schema.d.ts +29 -0
  35. package/dist/cli/generate-schema.d.ts.map +1 -0
  36. package/dist/cli/generate-schema.js +233 -0
  37. package/dist/cli/generate-schema.js.map +1 -0
  38. package/dist/cli/index.d.ts +19 -0
  39. package/dist/cli/index.d.ts.map +1 -0
  40. package/dist/cli/index.js +24 -0
  41. package/dist/cli/index.js.map +1 -0
  42. package/dist/context.d.ts +18 -0
  43. package/dist/context.d.ts.map +1 -0
  44. package/dist/context.js +11 -0
  45. package/dist/context.js.map +1 -0
  46. package/dist/error.d.ts +45 -0
  47. package/dist/error.d.ts.map +1 -0
  48. package/dist/error.js +29 -0
  49. package/dist/error.js.map +1 -0
  50. package/dist/extensions.d.ts +130 -0
  51. package/dist/extensions.d.ts.map +1 -0
  52. package/dist/extensions.js +78 -0
  53. package/dist/extensions.js.map +1 -0
  54. package/dist/index.d.ts +12 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +47 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/loader.d.ts +169 -0
  59. package/dist/loader.d.ts.map +1 -0
  60. package/dist/loader.js +237 -0
  61. package/dist/loader.js.map +1 -0
  62. package/dist/resolver-context.d.ts +154 -0
  63. package/dist/resolver-context.d.ts.map +1 -0
  64. package/dist/resolver-context.js +184 -0
  65. package/dist/resolver-context.js.map +1 -0
  66. package/dist/schema-mapping.d.ts +30 -0
  67. package/dist/schema-mapping.d.ts.map +1 -0
  68. package/dist/schema-mapping.js +280 -0
  69. package/dist/schema-mapping.js.map +1 -0
  70. package/dist/server/cache-control.d.ts +96 -0
  71. package/dist/server/cache-control.d.ts.map +1 -0
  72. package/dist/server/cache-control.js +308 -0
  73. package/dist/server/cache-control.js.map +1 -0
  74. package/dist/server/complexity.d.ts +165 -0
  75. package/dist/server/complexity.d.ts.map +1 -0
  76. package/dist/server/complexity.js +433 -0
  77. package/dist/server/complexity.js.map +1 -0
  78. package/dist/server/config.d.ts +66 -0
  79. package/dist/server/config.d.ts.map +1 -0
  80. package/dist/server/config.js +104 -0
  81. package/dist/server/config.js.map +1 -0
  82. package/dist/server/graphiql.d.ts +5 -0
  83. package/dist/server/graphiql.d.ts.map +1 -0
  84. package/dist/server/graphiql.js +43 -0
  85. package/dist/server/graphiql.js.map +1 -0
  86. package/dist/server/index.d.ts +18 -0
  87. package/dist/server/index.d.ts.map +1 -0
  88. package/dist/server/index.js +48 -0
  89. package/dist/server/index.js.map +1 -0
  90. package/dist/server/router.d.ts +79 -0
  91. package/dist/server/router.d.ts.map +1 -0
  92. package/dist/server/router.js +232 -0
  93. package/dist/server/router.js.map +1 -0
  94. package/dist/server/schema-builder-extensions.d.ts +42 -0
  95. package/dist/server/schema-builder-extensions.d.ts.map +1 -0
  96. package/dist/server/schema-builder-extensions.js +48 -0
  97. package/dist/server/schema-builder-extensions.js.map +1 -0
  98. package/dist/server/sse-adapter.d.ts +64 -0
  99. package/dist/server/sse-adapter.d.ts.map +1 -0
  100. package/dist/server/sse-adapter.js +227 -0
  101. package/dist/server/sse-adapter.js.map +1 -0
  102. package/dist/server/sse-types.d.ts +192 -0
  103. package/dist/server/sse-types.d.ts.map +1 -0
  104. package/dist/server/sse-types.js +63 -0
  105. package/dist/server/sse-types.js.map +1 -0
  106. package/dist/server/ws-adapter.d.ts +39 -0
  107. package/dist/server/ws-adapter.d.ts.map +1 -0
  108. package/dist/server/ws-adapter.js +247 -0
  109. package/dist/server/ws-adapter.js.map +1 -0
  110. package/dist/server/ws-types.d.ts +169 -0
  111. package/dist/server/ws-types.d.ts.map +1 -0
  112. package/dist/server/ws-types.js +11 -0
  113. package/dist/server/ws-types.js.map +1 -0
  114. package/dist/server/ws-utils.d.ts +42 -0
  115. package/dist/server/ws-utils.d.ts.map +1 -0
  116. package/dist/server/ws-utils.js +99 -0
  117. package/dist/server/ws-utils.js.map +1 -0
  118. package/package.json +61 -0
  119. package/src/analyzer-extension.ts +254 -0
  120. package/src/builder/execute.ts +153 -0
  121. package/src/builder/field-builders.ts +322 -0
  122. package/src/builder/index.ts +48 -0
  123. package/src/builder/pipe-api.ts +312 -0
  124. package/src/builder/schema-builder.ts +970 -0
  125. package/src/builder/type-registry.ts +670 -0
  126. package/src/builder/types.ts +305 -0
  127. package/src/context.ts +23 -0
  128. package/src/error.ts +32 -0
  129. package/src/extensions.ts +240 -0
  130. package/src/index.ts +32 -0
  131. package/src/loader.ts +363 -0
  132. package/src/resolver-context.ts +253 -0
  133. package/src/schema-mapping.ts +307 -0
  134. package/src/server/cache-control.ts +590 -0
  135. package/src/server/complexity.ts +774 -0
  136. package/src/server/config.ts +174 -0
  137. package/src/server/graphiql.ts +38 -0
  138. package/src/server/index.ts +96 -0
  139. package/src/server/router.ts +432 -0
  140. package/src/server/schema-builder-extensions.ts +51 -0
  141. package/src/server/sse-adapter.ts +327 -0
  142. package/src/server/sse-types.ts +234 -0
  143. package/src/server/ws-adapter.ts +355 -0
  144. package/src/server/ws-types.ts +192 -0
  145. package/src/server/ws-utils.ts +136 -0
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.graphiqlHtml = void 0;
4
+ /**
5
+ * Generate HTML for GraphiQL IDE, loading dependencies from CDN
6
+ */
7
+ const graphiqlHtml = (endpoint) => `<!DOCTYPE html>
8
+ <html lang="en">
9
+ <head>
10
+ <meta charset="utf-8" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <title>GraphiQL</title>
13
+ <link
14
+ rel="stylesheet"
15
+ href="https://unpkg.com/graphiql@3/graphiql.min.css"
16
+ />
17
+ </head>
18
+ <body style="margin: 0; overflow: hidden;">
19
+ <div id="graphiql" style="height: 100vh;"></div>
20
+ <script
21
+ crossorigin
22
+ src="https://unpkg.com/react@18/umd/react.production.min.js"
23
+ ></script>
24
+ <script
25
+ crossorigin
26
+ src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"
27
+ ></script>
28
+ <script
29
+ crossorigin
30
+ src="https://unpkg.com/graphiql@3/graphiql.min.js"
31
+ ></script>
32
+ <script>
33
+ const fetcher = GraphiQL.createFetcher({
34
+ url: ${JSON.stringify(endpoint)},
35
+ });
36
+ ReactDOM.createRoot(document.getElementById('graphiql')).render(
37
+ React.createElement(GraphiQL, { fetcher })
38
+ );
39
+ </script>
40
+ </body>
41
+ </html>`;
42
+ exports.graphiqlHtml = graphiqlHtml;
43
+ //# sourceMappingURL=graphiql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphiql.js","sourceRoot":"","sources":["../../src/server/graphiql.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACI,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;eA2B3C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;;;;;;;QAO/B,CAAA;AAlCK,QAAA,YAAY,gBAkCjB"}
@@ -0,0 +1,18 @@
1
+ export type { GraphiQLConfig, GraphQLRouterConfig, GraphQLRouterConfigInput } from "./config";
2
+ export { defaultConfig, normalizeConfig, GraphQLRouterConfigFromEnv } from "./config";
3
+ export { graphiqlHtml } from "./graphiql";
4
+ export { makeGraphQLRouter, defaultErrorHandler, type MakeGraphQLRouterOptions, type ErrorHandler, } from "./router";
5
+ export { toRouter } from "./schema-builder-extensions";
6
+ export type { ComplexityConfig, ComplexityResult, ComplexityAnalysisInfo, ComplexityExceededInfo, ComplexityCalculator, FieldComplexity, FieldComplexityMap, } from "./complexity";
7
+ export { ComplexityLimitExceededError, ComplexityAnalysisError, validateComplexity, defaultComplexityCalculator, depthOnlyCalculator, combineCalculators, ComplexityConfigFromEnv, } from "./complexity";
8
+ export type { CacheHintMap, CachePolicy, CacheControlConfig, CachePolicyAnalysisInfo, } from "./cache-control";
9
+ export { computeCachePolicy, computeCachePolicyFromQuery, toCacheControlHeader, CacheControlConfigFromEnv, } from "./cache-control";
10
+ export type { EffectWebSocket, CloseEvent, ConnectionContext, GraphQLWSOptions, GraphQLWSConfig, SubscribeMessage, CompleteMessage, } from "./ws-types";
11
+ export { WebSocketError } from "./ws-types";
12
+ export { makeGraphQLWSHandler } from "./ws-adapter";
13
+ export type { WsWebSocket } from "./ws-utils";
14
+ export { toEffectWebSocketFromWs, WS_CLOSED } from "./ws-utils";
15
+ export type { EffectSSE, SSEEvent, SSEEventType, SSESubscriptionRequest, SSEConnectionContext, GraphQLSSEOptions, GraphQLSSEConfig, SSESubscriptionResult, } from "./sse-types";
16
+ export { SSEError, SSE_HEADERS, formatNextEvent, formatErrorEvent, formatCompleteEvent, formatSSEMessage, } from "./sse-types";
17
+ export { makeSSESubscriptionStream, makeGraphQLSSEHandler } from "./sse-adapter";
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAE7F,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAA;AAGrF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAGzC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,YAAY,GAClB,MAAM,UAAU,CAAA;AAGjB,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAGtD,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,kBAAkB,EAClB,2BAA2B,EAC3B,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,cAAc,CAAA;AAGrB,YAAY,EACV,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,kBAAkB,EAClB,2BAA2B,EAC3B,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,iBAAiB,CAAA;AAGxB,YAAY,EACV,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAGnD,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAG/D,YAAY,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeGraphQLSSEHandler = exports.makeSSESubscriptionStream = exports.formatSSEMessage = exports.formatCompleteEvent = exports.formatErrorEvent = exports.formatNextEvent = exports.SSE_HEADERS = exports.SSEError = exports.WS_CLOSED = exports.toEffectWebSocketFromWs = exports.makeGraphQLWSHandler = exports.WebSocketError = exports.CacheControlConfigFromEnv = exports.toCacheControlHeader = exports.computeCachePolicyFromQuery = exports.computeCachePolicy = exports.ComplexityConfigFromEnv = exports.combineCalculators = exports.depthOnlyCalculator = exports.defaultComplexityCalculator = exports.validateComplexity = exports.ComplexityAnalysisError = exports.ComplexityLimitExceededError = exports.toRouter = exports.defaultErrorHandler = exports.makeGraphQLRouter = exports.graphiqlHtml = exports.GraphQLRouterConfigFromEnv = exports.normalizeConfig = exports.defaultConfig = void 0;
4
+ var config_1 = require("./config");
5
+ Object.defineProperty(exports, "defaultConfig", { enumerable: true, get: function () { return config_1.defaultConfig; } });
6
+ Object.defineProperty(exports, "normalizeConfig", { enumerable: true, get: function () { return config_1.normalizeConfig; } });
7
+ Object.defineProperty(exports, "GraphQLRouterConfigFromEnv", { enumerable: true, get: function () { return config_1.GraphQLRouterConfigFromEnv; } });
8
+ // GraphiQL HTML generator
9
+ var graphiql_1 = require("./graphiql");
10
+ Object.defineProperty(exports, "graphiqlHtml", { enumerable: true, get: function () { return graphiql_1.graphiqlHtml; } });
11
+ // Router factory
12
+ var router_1 = require("./router");
13
+ Object.defineProperty(exports, "makeGraphQLRouter", { enumerable: true, get: function () { return router_1.makeGraphQLRouter; } });
14
+ Object.defineProperty(exports, "defaultErrorHandler", { enumerable: true, get: function () { return router_1.defaultErrorHandler; } });
15
+ // Schema builder extension
16
+ var schema_builder_extensions_1 = require("./schema-builder-extensions");
17
+ Object.defineProperty(exports, "toRouter", { enumerable: true, get: function () { return schema_builder_extensions_1.toRouter; } });
18
+ var complexity_1 = require("./complexity");
19
+ Object.defineProperty(exports, "ComplexityLimitExceededError", { enumerable: true, get: function () { return complexity_1.ComplexityLimitExceededError; } });
20
+ Object.defineProperty(exports, "ComplexityAnalysisError", { enumerable: true, get: function () { return complexity_1.ComplexityAnalysisError; } });
21
+ Object.defineProperty(exports, "validateComplexity", { enumerable: true, get: function () { return complexity_1.validateComplexity; } });
22
+ Object.defineProperty(exports, "defaultComplexityCalculator", { enumerable: true, get: function () { return complexity_1.defaultComplexityCalculator; } });
23
+ Object.defineProperty(exports, "depthOnlyCalculator", { enumerable: true, get: function () { return complexity_1.depthOnlyCalculator; } });
24
+ Object.defineProperty(exports, "combineCalculators", { enumerable: true, get: function () { return complexity_1.combineCalculators; } });
25
+ Object.defineProperty(exports, "ComplexityConfigFromEnv", { enumerable: true, get: function () { return complexity_1.ComplexityConfigFromEnv; } });
26
+ var cache_control_1 = require("./cache-control");
27
+ Object.defineProperty(exports, "computeCachePolicy", { enumerable: true, get: function () { return cache_control_1.computeCachePolicy; } });
28
+ Object.defineProperty(exports, "computeCachePolicyFromQuery", { enumerable: true, get: function () { return cache_control_1.computeCachePolicyFromQuery; } });
29
+ Object.defineProperty(exports, "toCacheControlHeader", { enumerable: true, get: function () { return cache_control_1.toCacheControlHeader; } });
30
+ Object.defineProperty(exports, "CacheControlConfigFromEnv", { enumerable: true, get: function () { return cache_control_1.CacheControlConfigFromEnv; } });
31
+ var ws_types_1 = require("./ws-types");
32
+ Object.defineProperty(exports, "WebSocketError", { enumerable: true, get: function () { return ws_types_1.WebSocketError; } });
33
+ var ws_adapter_1 = require("./ws-adapter");
34
+ Object.defineProperty(exports, "makeGraphQLWSHandler", { enumerable: true, get: function () { return ws_adapter_1.makeGraphQLWSHandler; } });
35
+ var ws_utils_1 = require("./ws-utils");
36
+ Object.defineProperty(exports, "toEffectWebSocketFromWs", { enumerable: true, get: function () { return ws_utils_1.toEffectWebSocketFromWs; } });
37
+ Object.defineProperty(exports, "WS_CLOSED", { enumerable: true, get: function () { return ws_utils_1.WS_CLOSED; } });
38
+ var sse_types_1 = require("./sse-types");
39
+ Object.defineProperty(exports, "SSEError", { enumerable: true, get: function () { return sse_types_1.SSEError; } });
40
+ Object.defineProperty(exports, "SSE_HEADERS", { enumerable: true, get: function () { return sse_types_1.SSE_HEADERS; } });
41
+ Object.defineProperty(exports, "formatNextEvent", { enumerable: true, get: function () { return sse_types_1.formatNextEvent; } });
42
+ Object.defineProperty(exports, "formatErrorEvent", { enumerable: true, get: function () { return sse_types_1.formatErrorEvent; } });
43
+ Object.defineProperty(exports, "formatCompleteEvent", { enumerable: true, get: function () { return sse_types_1.formatCompleteEvent; } });
44
+ Object.defineProperty(exports, "formatSSEMessage", { enumerable: true, get: function () { return sse_types_1.formatSSEMessage; } });
45
+ var sse_adapter_1 = require("./sse-adapter");
46
+ Object.defineProperty(exports, "makeSSESubscriptionStream", { enumerable: true, get: function () { return sse_adapter_1.makeSSESubscriptionStream; } });
47
+ Object.defineProperty(exports, "makeGraphQLSSEHandler", { enumerable: true, get: function () { return sse_adapter_1.makeGraphQLSSEHandler; } });
48
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;AAGA,mCAAqF;AAA5E,uGAAA,aAAa,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,oHAAA,0BAA0B,OAAA;AAEnE,0BAA0B;AAC1B,uCAAyC;AAAhC,wGAAA,YAAY,OAAA;AAErB,iBAAiB;AACjB,mCAKiB;AAJf,2GAAA,iBAAiB,OAAA;AACjB,6GAAA,mBAAmB,OAAA;AAKrB,2BAA2B;AAC3B,yEAAsD;AAA7C,qHAAA,QAAQ,OAAA;AAajB,2CAQqB;AAPnB,0HAAA,4BAA4B,OAAA;AAC5B,qHAAA,uBAAuB,OAAA;AACvB,gHAAA,kBAAkB,OAAA;AAClB,yHAAA,2BAA2B,OAAA;AAC3B,iHAAA,mBAAmB,OAAA;AACnB,gHAAA,kBAAkB,OAAA;AAClB,qHAAA,uBAAuB,OAAA;AAWzB,iDAKwB;AAJtB,mHAAA,kBAAkB,OAAA;AAClB,4HAAA,2BAA2B,OAAA;AAC3B,qHAAA,oBAAoB,OAAA;AACpB,0HAAA,yBAAyB,OAAA;AAc3B,uCAA2C;AAAlC,0GAAA,cAAc,OAAA;AAEvB,2CAAmD;AAA1C,kHAAA,oBAAoB,OAAA;AAI7B,uCAA+D;AAAtD,mHAAA,uBAAuB,OAAA;AAAE,qGAAA,SAAS,OAAA;AAc3C,yCAOoB;AANlB,qGAAA,QAAQ,OAAA;AACR,wGAAA,WAAW,OAAA;AACX,4GAAA,eAAe,OAAA;AACf,6GAAA,gBAAgB,OAAA;AAChB,gHAAA,mBAAmB,OAAA;AACnB,6GAAA,gBAAgB,OAAA;AAGlB,6CAAgF;AAAvE,wHAAA,yBAAyB,OAAA;AAAE,oHAAA,qBAAqB,OAAA"}
@@ -0,0 +1,79 @@
1
+ import { HttpRouter, HttpServerResponse } from "@effect/platform";
2
+ import { Cause, Effect, Layer } from "effect";
3
+ import { GraphQLSchema } from "graphql";
4
+ import { type GraphQLRouterConfigInput } from "./config";
5
+ import { type FieldComplexityMap } from "./complexity";
6
+ import { type CacheHintMap } from "./cache-control";
7
+ import { type GraphQLExtension } from "../extensions";
8
+ /**
9
+ * Error handler function type for handling uncaught errors during GraphQL execution.
10
+ * Receives the error cause and should return an HTTP response.
11
+ */
12
+ export type ErrorHandler = (cause: Cause.Cause<unknown>) => Effect.Effect<HttpServerResponse.HttpServerResponse, never, never>;
13
+ /**
14
+ * Default error handler that returns a 500 Internal Server Error.
15
+ * In non-production environments, it logs the full error for debugging.
16
+ */
17
+ export declare const defaultErrorHandler: ErrorHandler;
18
+ /**
19
+ * Options for makeGraphQLRouter
20
+ */
21
+ export interface MakeGraphQLRouterOptions extends GraphQLRouterConfigInput {
22
+ /**
23
+ * Field complexity definitions from the schema builder.
24
+ * If using toRouter(), this is automatically extracted from the builder.
25
+ * If using makeGraphQLRouter() directly, call builder.getFieldComplexities().
26
+ */
27
+ readonly fieldComplexities?: FieldComplexityMap;
28
+ /**
29
+ * Cache hint definitions from the schema builder.
30
+ * If using toRouter(), this is automatically extracted from the builder.
31
+ * If using makeGraphQLRouter() directly, call builder.getCacheHints().
32
+ */
33
+ readonly cacheHints?: CacheHintMap;
34
+ /**
35
+ * GraphQL extensions for lifecycle hooks.
36
+ * If using toRouter(), this is automatically extracted from the builder.
37
+ * If using makeGraphQLRouter() directly, call builder.getExtensions().
38
+ */
39
+ readonly extensions?: readonly GraphQLExtension<any>[];
40
+ /**
41
+ * Custom error handler for uncaught errors during GraphQL execution.
42
+ * Receives the error cause and should return an HTTP response.
43
+ * Defaults to returning a 500 Internal Server Error with a generic message.
44
+ */
45
+ readonly errorHandler?: ErrorHandler;
46
+ }
47
+ /**
48
+ * Create an HttpRouter configured for GraphQL
49
+ *
50
+ * The router handles:
51
+ * - POST requests to the GraphQL endpoint
52
+ * - GET requests to the GraphiQL UI (if enabled)
53
+ * - Query complexity validation (if configured)
54
+ * - Extension lifecycle hooks (onParse, onValidate, onExecuteStart, onExecuteEnd)
55
+ *
56
+ * @param schema - The GraphQL schema
57
+ * @param layer - Effect layer providing services required by resolvers
58
+ * @param options - Optional configuration for paths, GraphiQL, complexity, and extensions
59
+ * @returns An HttpRouter that can be composed with other routes
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const router = makeGraphQLRouter(schema, Layer.empty, {
64
+ * path: "/graphql",
65
+ * graphiql: { path: "/graphiql" },
66
+ * complexity: { maxDepth: 10, maxComplexity: 1000 },
67
+ * fieldComplexities: builder.getFieldComplexities(),
68
+ * extensions: builder.getExtensions()
69
+ * })
70
+ *
71
+ * // Compose with other routes
72
+ * const app = HttpRouter.empty.pipe(
73
+ * HttpRouter.get("/health", HttpServerResponse.json({ status: "ok" })),
74
+ * HttpRouter.concat(router)
75
+ * )
76
+ * ```
77
+ */
78
+ export declare const makeGraphQLRouter: <R>(schema: GraphQLSchema, layer: Layer.Layer<R>, options?: MakeGraphQLRouterOptions) => HttpRouter.HttpRouter<never, never>;
79
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/server/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAqB,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACpF,OAAO,EAAE,KAAK,EAAW,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACtD,OAAO,EACL,aAAa,EASd,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAmB,KAAK,wBAAwB,EAAE,MAAM,UAAU,CAAA;AACzE,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAA;AACrB,OAAO,EAA4C,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC7F,OAAO,EACL,KAAK,gBAAgB,EAOtB,MAAM,eAAe,CAAA;AAEtB;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KACxB,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AAEvE;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,YAiB/B,CAAA;AA8LH;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,wBAAwB;IACxE;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,kBAAkB,CAAA;IAE/C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,YAAY,CAAA;IAElC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAA;IAEtD;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,EACjC,QAAQ,aAAa,EACrB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EACrB,UAAS,wBAA6B,KACrC,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAgHpC,CAAA"}
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeGraphQLRouter = exports.defaultErrorHandler = void 0;
4
+ const platform_1 = require("@effect/platform");
5
+ const effect_1 = require("effect");
6
+ const graphql_1 = require("graphql");
7
+ const graphiql_1 = require("./graphiql");
8
+ const config_1 = require("./config");
9
+ const complexity_1 = require("./complexity");
10
+ const cache_control_1 = require("./cache-control");
11
+ const extensions_1 = require("../extensions");
12
+ /**
13
+ * Default error handler that returns a 500 Internal Server Error.
14
+ * In non-production environments, it logs the full error for debugging.
15
+ */
16
+ const defaultErrorHandler = (cause) => (process.env.NODE_ENV !== "production"
17
+ ? effect_1.Effect.logError("GraphQL error", cause)
18
+ : effect_1.Effect.void).pipe(effect_1.Effect.andThen(platform_1.HttpServerResponse.json({
19
+ errors: [
20
+ {
21
+ message: "An error occurred processing your request",
22
+ },
23
+ ],
24
+ }, { status: 500 }).pipe(effect_1.Effect.orDie)));
25
+ exports.defaultErrorHandler = defaultErrorHandler;
26
+ /**
27
+ * Parse a GraphQL query string into a DocumentNode.
28
+ * Returns the document or an error response if parsing fails.
29
+ */
30
+ const parseGraphQLQuery = (query, extensionsService) => effect_1.Effect.gen(function* () {
31
+ try {
32
+ const document = (0, graphql_1.parse)(query);
33
+ return { ok: true, document };
34
+ }
35
+ catch (parseError) {
36
+ const extensionData = yield* extensionsService.get();
37
+ const response = yield* platform_1.HttpServerResponse.json({
38
+ errors: [{ message: String(parseError) }],
39
+ extensions: Object.keys(extensionData).length > 0 ? extensionData : undefined,
40
+ }).pipe(effect_1.Effect.orDie);
41
+ return { ok: false, response };
42
+ }
43
+ });
44
+ /**
45
+ * Run complexity validation if configured.
46
+ * Logs warnings for analysis errors but doesn't block execution.
47
+ */
48
+ const runComplexityValidation = (body, schema, fieldComplexities, complexityConfig) => {
49
+ if (!complexityConfig) {
50
+ return effect_1.Effect.void;
51
+ }
52
+ return (0, complexity_1.validateComplexity)(body.query, body.operationName, body.variables, schema, fieldComplexities, complexityConfig).pipe(effect_1.Effect.catchTag("ComplexityLimitExceededError", (error) => effect_1.Effect.fail(error)), effect_1.Effect.catchTag("ComplexityAnalysisError", (error) => effect_1.Effect.logWarning("Complexity analysis failed", error)));
53
+ };
54
+ /**
55
+ * Execute a GraphQL query and handle async results.
56
+ */
57
+ const executeGraphQLQuery = (schema, document, variables, operationName, runtime) => effect_1.Effect.gen(function* () {
58
+ const executeResult = yield* effect_1.Effect.try({
59
+ try: () => (0, graphql_1.execute)({
60
+ schema,
61
+ document,
62
+ variableValues: variables,
63
+ operationName,
64
+ contextValue: { runtime },
65
+ }),
66
+ catch: (error) => new Error(String(error)),
67
+ });
68
+ // Await result if it's a promise
69
+ if (executeResult && typeof executeResult === "object" && "then" in executeResult) {
70
+ return yield* effect_1.Effect.promise(() => executeResult);
71
+ }
72
+ return executeResult;
73
+ });
74
+ /**
75
+ * Compute cache control header for the response if applicable.
76
+ */
77
+ const computeCacheControlHeader = (document, operationName, schema, cacheHints, cacheControlConfig) => effect_1.Effect.gen(function* () {
78
+ if (cacheControlConfig?.enabled === false ||
79
+ cacheControlConfig?.calculateHttpHeaders === false) {
80
+ return undefined;
81
+ }
82
+ // Find the operation from the document
83
+ const operations = document.definitions.filter((d) => d.kind === graphql_1.Kind.OPERATION_DEFINITION);
84
+ const operation = operationName
85
+ ? operations.find((o) => o.name?.value === operationName)
86
+ : operations[0];
87
+ if (!operation || operation.operation === "mutation") {
88
+ // Mutations should not be cached
89
+ return undefined;
90
+ }
91
+ const cachePolicy = yield* (0, cache_control_1.computeCachePolicy)({
92
+ document,
93
+ operation,
94
+ schema,
95
+ cacheHints,
96
+ config: cacheControlConfig ?? {},
97
+ });
98
+ return (0, cache_control_1.toCacheControlHeader)(cachePolicy);
99
+ });
100
+ /**
101
+ * Build the final GraphQL response with extensions merged in.
102
+ */
103
+ const buildGraphQLResponse = (result, extensionData, cacheControlHeader) => {
104
+ const finalResult = Object.keys(extensionData).length > 0
105
+ ? {
106
+ ...result,
107
+ extensions: {
108
+ ...result.extensions,
109
+ ...extensionData,
110
+ },
111
+ }
112
+ : result;
113
+ const responseHeaders = cacheControlHeader ? { "cache-control": cacheControlHeader } : undefined;
114
+ return platform_1.HttpServerResponse.json(finalResult, { headers: responseHeaders }).pipe(effect_1.Effect.orDie);
115
+ };
116
+ /**
117
+ * Handle complexity limit exceeded error, returning appropriate response.
118
+ */
119
+ const handleComplexityError = (error) => platform_1.HttpServerResponse.json({
120
+ errors: [
121
+ {
122
+ message: error.message,
123
+ extensions: {
124
+ code: "COMPLEXITY_LIMIT_EXCEEDED",
125
+ limitType: error.limitType,
126
+ limit: error.limit,
127
+ actual: error.actual,
128
+ },
129
+ },
130
+ ],
131
+ }, { status: 400 }).pipe(effect_1.Effect.orDie);
132
+ /**
133
+ * Create an HttpRouter configured for GraphQL
134
+ *
135
+ * The router handles:
136
+ * - POST requests to the GraphQL endpoint
137
+ * - GET requests to the GraphiQL UI (if enabled)
138
+ * - Query complexity validation (if configured)
139
+ * - Extension lifecycle hooks (onParse, onValidate, onExecuteStart, onExecuteEnd)
140
+ *
141
+ * @param schema - The GraphQL schema
142
+ * @param layer - Effect layer providing services required by resolvers
143
+ * @param options - Optional configuration for paths, GraphiQL, complexity, and extensions
144
+ * @returns An HttpRouter that can be composed with other routes
145
+ *
146
+ * @example
147
+ * ```typescript
148
+ * const router = makeGraphQLRouter(schema, Layer.empty, {
149
+ * path: "/graphql",
150
+ * graphiql: { path: "/graphiql" },
151
+ * complexity: { maxDepth: 10, maxComplexity: 1000 },
152
+ * fieldComplexities: builder.getFieldComplexities(),
153
+ * extensions: builder.getExtensions()
154
+ * })
155
+ *
156
+ * // Compose with other routes
157
+ * const app = HttpRouter.empty.pipe(
158
+ * HttpRouter.get("/health", HttpServerResponse.json({ status: "ok" })),
159
+ * HttpRouter.concat(router)
160
+ * )
161
+ * ```
162
+ */
163
+ const makeGraphQLRouter = (schema, layer, options = {}) => {
164
+ const resolvedConfig = (0, config_1.normalizeConfig)(options);
165
+ const fieldComplexities = options.fieldComplexities ?? new Map();
166
+ const cacheHints = options.cacheHints ?? new Map();
167
+ const extensions = options.extensions ?? [];
168
+ const errorHandler = options.errorHandler ?? exports.defaultErrorHandler;
169
+ // GraphQL POST handler
170
+ const graphqlHandler = effect_1.Effect.gen(function* () {
171
+ const extensionsService = yield* (0, extensions_1.makeExtensionsService)();
172
+ const runtime = yield* effect_1.Effect.runtime();
173
+ // Parse request body
174
+ const request = yield* platform_1.HttpServerRequest.HttpServerRequest;
175
+ const body = yield* request.json;
176
+ // Phase 1: Parse
177
+ const parseResult = yield* parseGraphQLQuery(body.query, extensionsService);
178
+ if (!parseResult.ok) {
179
+ return parseResult.response;
180
+ }
181
+ const document = parseResult.document;
182
+ yield* (0, extensions_1.runParseHooks)(extensions, body.query, document).pipe(effect_1.Effect.provideService(extensions_1.ExtensionsService, extensionsService));
183
+ // Phase 2: Validate
184
+ const validationRules = resolvedConfig.introspection
185
+ ? undefined
186
+ : [...graphql_1.specifiedRules, graphql_1.NoSchemaIntrospectionCustomRule];
187
+ const validationErrors = (0, graphql_1.validate)(schema, document, validationRules);
188
+ yield* (0, extensions_1.runValidateHooks)(extensions, document, validationErrors).pipe(effect_1.Effect.provideService(extensions_1.ExtensionsService, extensionsService));
189
+ if (validationErrors.length > 0) {
190
+ const extensionData = yield* extensionsService.get();
191
+ return yield* platform_1.HttpServerResponse.json({
192
+ errors: validationErrors.map((e) => ({
193
+ message: e.message,
194
+ locations: e.locations,
195
+ path: e.path,
196
+ })),
197
+ extensions: Object.keys(extensionData).length > 0 ? extensionData : undefined,
198
+ }, { status: 400 });
199
+ }
200
+ // Complexity validation
201
+ yield* runComplexityValidation(body, schema, fieldComplexities, resolvedConfig.complexity);
202
+ // Phase 3: Execute
203
+ yield* (0, extensions_1.runExecuteStartHooks)(extensions, {
204
+ source: body.query,
205
+ document,
206
+ variableValues: body.variables,
207
+ operationName: body.operationName,
208
+ schema,
209
+ fieldComplexities,
210
+ }).pipe(effect_1.Effect.provideService(extensions_1.ExtensionsService, extensionsService));
211
+ const result = yield* executeGraphQLQuery(schema, document, body.variables, body.operationName, runtime);
212
+ yield* (0, extensions_1.runExecuteEndHooks)(extensions, result).pipe(effect_1.Effect.provideService(extensions_1.ExtensionsService, extensionsService));
213
+ // Build response
214
+ const extensionData = yield* extensionsService.get();
215
+ const cacheControlHeader = yield* computeCacheControlHeader(document, body.operationName, schema, cacheHints, resolvedConfig.cacheControl);
216
+ return yield* buildGraphQLResponse(result, extensionData, cacheControlHeader);
217
+ }).pipe(effect_1.Effect.provide(layer), effect_1.Effect.catchAll((error) => {
218
+ if (error instanceof complexity_1.ComplexityLimitExceededError) {
219
+ return handleComplexityError(error);
220
+ }
221
+ return effect_1.Effect.fail(error);
222
+ }), effect_1.Effect.catchAllCause(errorHandler));
223
+ // Build router
224
+ let router = platform_1.HttpRouter.empty.pipe(platform_1.HttpRouter.post(resolvedConfig.path, graphqlHandler));
225
+ if (resolvedConfig.graphiql) {
226
+ const { path, endpoint } = resolvedConfig.graphiql;
227
+ router = router.pipe(platform_1.HttpRouter.get(path, platform_1.HttpServerResponse.html((0, graphiql_1.graphiqlHtml)(endpoint))));
228
+ }
229
+ return router;
230
+ };
231
+ exports.makeGraphQLRouter = makeGraphQLRouter;
232
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/server/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { Layer } from "effect";
2
+ import { HttpRouter } from "@effect/platform";
3
+ import { GraphQLSchemaBuilder } from "../builder/schema-builder";
4
+ import { type MakeGraphQLRouterOptions } from "./router";
5
+ /**
6
+ * Convert a GraphQLSchemaBuilder to an HttpRouter.
7
+ *
8
+ * This bridges the GraphQL schema builder with the @effect/platform HTTP server.
9
+ * Field complexities and cache hints are automatically extracted from the builder.
10
+ *
11
+ * @param builder - The GraphQL schema builder
12
+ * @param layer - Effect layer providing services required by resolvers
13
+ * @param options - Optional configuration for paths, GraphiQL, complexity, and caching
14
+ * @returns An HttpRouter that can be composed with other routes
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { GraphQLSchemaBuilder, query, toRouter } from "@effect-gql/core"
19
+ * import { Layer, Effect } from "effect"
20
+ * import * as S from "effect/Schema"
21
+ *
22
+ * const builder = GraphQLSchemaBuilder.empty.pipe(
23
+ * query("hello", { type: S.String, resolve: () => Effect.succeed("world") })
24
+ * )
25
+ *
26
+ * // Basic usage
27
+ * const router = toRouter(builder, Layer.empty, { graphiql: true })
28
+ *
29
+ * // With complexity limiting
30
+ * const routerWithLimits = toRouter(builder, Layer.empty, {
31
+ * graphiql: true,
32
+ * complexity: { maxDepth: 10, maxComplexity: 1000 }
33
+ * })
34
+ *
35
+ * // With cache control
36
+ * const routerWithCaching = toRouter(builder, Layer.empty, {
37
+ * cacheControl: { enabled: true, defaultMaxAge: 0 }
38
+ * })
39
+ * ```
40
+ */
41
+ export declare const toRouter: <R, R2>(builder: GraphQLSchemaBuilder<R>, layer: Layer.Layer<R2>, options?: Omit<MakeGraphQLRouterOptions, "fieldComplexities" | "cacheHints">) => HttpRouter.HttpRouter<never, never>;
42
+ //# sourceMappingURL=schema-builder-extensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-builder-extensions.d.ts","sourceRoot":"","sources":["../../src/server/schema-builder-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAqB,KAAK,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,EAAE,EAC5B,SAAS,oBAAoB,CAAC,CAAC,CAAC,EAChC,OAAO,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EACtB,UAAU,IAAI,CAAC,wBAAwB,EAAE,mBAAmB,GAAG,YAAY,CAAC,KAC3E,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAKpC,CAAA"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toRouter = void 0;
4
+ const router_1 = require("./router");
5
+ /**
6
+ * Convert a GraphQLSchemaBuilder to an HttpRouter.
7
+ *
8
+ * This bridges the GraphQL schema builder with the @effect/platform HTTP server.
9
+ * Field complexities and cache hints are automatically extracted from the builder.
10
+ *
11
+ * @param builder - The GraphQL schema builder
12
+ * @param layer - Effect layer providing services required by resolvers
13
+ * @param options - Optional configuration for paths, GraphiQL, complexity, and caching
14
+ * @returns An HttpRouter that can be composed with other routes
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { GraphQLSchemaBuilder, query, toRouter } from "@effect-gql/core"
19
+ * import { Layer, Effect } from "effect"
20
+ * import * as S from "effect/Schema"
21
+ *
22
+ * const builder = GraphQLSchemaBuilder.empty.pipe(
23
+ * query("hello", { type: S.String, resolve: () => Effect.succeed("world") })
24
+ * )
25
+ *
26
+ * // Basic usage
27
+ * const router = toRouter(builder, Layer.empty, { graphiql: true })
28
+ *
29
+ * // With complexity limiting
30
+ * const routerWithLimits = toRouter(builder, Layer.empty, {
31
+ * graphiql: true,
32
+ * complexity: { maxDepth: 10, maxComplexity: 1000 }
33
+ * })
34
+ *
35
+ * // With cache control
36
+ * const routerWithCaching = toRouter(builder, Layer.empty, {
37
+ * cacheControl: { enabled: true, defaultMaxAge: 0 }
38
+ * })
39
+ * ```
40
+ */
41
+ const toRouter = (builder, layer, options) => {
42
+ const schema = builder.buildSchema();
43
+ const fieldComplexities = builder.getFieldComplexities();
44
+ const cacheHints = builder.getCacheHints();
45
+ return (0, router_1.makeGraphQLRouter)(schema, layer, { ...options, fieldComplexities, cacheHints });
46
+ };
47
+ exports.toRouter = toRouter;
48
+ //# sourceMappingURL=schema-builder-extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-builder-extensions.js","sourceRoot":"","sources":["../../src/server/schema-builder-extensions.ts"],"names":[],"mappings":";;;AAGA,qCAA2E;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACI,MAAM,QAAQ,GAAG,CACtB,OAAgC,EAChC,KAAsB,EACtB,OAA4E,EACvC,EAAE;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;IACpC,MAAM,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAA;IACxD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAA;IAC1C,OAAO,IAAA,0BAAiB,EAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC,CAAA;AACxF,CAAC,CAAA;AATY,QAAA,QAAQ,YASpB"}
@@ -0,0 +1,64 @@
1
+ import { Layer, Stream } from "effect";
2
+ import { GraphQLSchema } from "graphql";
3
+ import { SSEError, type GraphQLSSEOptions, type SSESubscriptionRequest, type SSEEvent } from "./sse-types";
4
+ /**
5
+ * Create a subscription event stream for SSE.
6
+ *
7
+ * This function handles the GraphQL subscription lifecycle:
8
+ * 1. Parse and validate the query
9
+ * 2. Check complexity limits if configured
10
+ * 3. Execute the subscription
11
+ * 4. Stream results as SSE events
12
+ *
13
+ * @param schema - The GraphQL schema with subscription definitions
14
+ * @param layer - Effect layer providing services required by resolvers
15
+ * @param request - The subscription request (query, variables, operationName)
16
+ * @param headers - HTTP headers from the request (for auth)
17
+ * @param options - Optional lifecycle hooks and configuration
18
+ * @returns A Stream of SSE events to send to the client
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const eventStream = makeSSESubscriptionStream(
23
+ * schema,
24
+ * serviceLayer,
25
+ * { query: "subscription { tick { count } }" },
26
+ * new Headers(),
27
+ * { onConnect: (req, headers) => Effect.succeed({ user: "alice" }) }
28
+ * )
29
+ *
30
+ * // In platform-specific code, consume and send events:
31
+ * Stream.runForEach(eventStream, (event) =>
32
+ * Effect.sync(() => res.write(formatSSEMessage(event)))
33
+ * )
34
+ * ```
35
+ */
36
+ export declare const makeSSESubscriptionStream: <R>(schema: GraphQLSchema, layer: Layer.Layer<R>, request: SSESubscriptionRequest, headers: Headers, options?: GraphQLSSEOptions<R>) => Stream.Stream<SSEEvent, SSEError>;
37
+ /**
38
+ * Create an SSE subscription handler that can be used with platform-specific servers.
39
+ *
40
+ * This is a higher-level API that returns a handler function. The handler
41
+ * takes a request and headers, and returns a Stream of SSE events.
42
+ *
43
+ * @param schema - The GraphQL schema with subscription definitions
44
+ * @param layer - Effect layer providing services required by resolvers
45
+ * @param options - Optional lifecycle hooks and configuration
46
+ * @returns A handler function for SSE subscription requests
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const handler = makeGraphQLSSEHandler(schema, serviceLayer, {
51
+ * onConnect: (request, headers) => Effect.gen(function* () {
52
+ * const token = headers.get("authorization")
53
+ * const user = yield* AuthService.validateToken(token)
54
+ * return { user }
55
+ * }),
56
+ * })
57
+ *
58
+ * // In platform-specific code:
59
+ * const events = handler(request, headers)
60
+ * // Stream events to client...
61
+ * ```
62
+ */
63
+ export declare const makeGraphQLSSEHandler: <R>(schema: GraphQLSchema, layer: Layer.Layer<R>, options?: GraphQLSSEOptions<R>) => ((request: SSESubscriptionRequest, headers: Headers) => Stream.Stream<SSEEvent, SSEError>);
64
+ //# sourceMappingURL=sse-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-adapter.d.ts","sourceRoot":"","sources":["../../src/server/sse-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,EACL,aAAa,EASd,MAAM,SAAS,CAAA;AAEhB,OAAO,EACL,QAAQ,EACR,KAAK,iBAAiB,EAEtB,KAAK,sBAAsB,EAC3B,KAAK,QAAQ,EAId,MAAM,aAAa,CAAA;AAGpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,yBAAyB,GAAI,CAAC,EACzC,QAAQ,aAAa,EACrB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EACrB,SAAS,sBAAsB,EAC/B,SAAS,OAAO,EAChB,UAAU,iBAAiB,CAAC,CAAC,CAAC,KAC7B,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CA8NlC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,qBAAqB,GAAI,CAAC,EACrC,QAAQ,aAAa,EACrB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EACrB,UAAU,iBAAiB,CAAC,CAAC,CAAC,KAC7B,CAAC,CAAC,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAE3F,CAAA"}