@nifrajs/graphql 4.0.2 → 5.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Nifra Authors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -65,6 +65,15 @@ Resolvers read it as their third argument.
65
65
 
66
66
  Subscriptions run over the same route via `graphql-transport-ws`. Bring a subscription source - the bundled in-memory `createPubSub` is the reference implementation; swap in a durable bus (Redis, a Durable Object, NATS) that exposes the same `{ publish, subscribe }` shape for multi-instance deploys.
67
67
 
68
+ Each reference subscriber queues at most 1024 events by default. If publication outruns consumption,
69
+ the overloaded iterator detaches, clears its queued values, and its next pull rejects with
70
+ `GraphqlPubSubOverflowError` (`code: "graphql_pubsub_overflow"`). Configure
71
+ `createPubSub({ maxQueuedEvents: 256, overflow: "error" })` to change the finite limit. Explicit
72
+ `"drop-oldest"` and `"drop-newest"` policies support consumers that accept missing events. Returning or
73
+ throwing into an iterator clears its queue and terminates delivery. This is an event-count bound;
74
+ publishers remain responsible for payload sizes. Synchronous `publish` does not provide producer
75
+ backpressure or cross-instance delivery.
76
+
68
77
  ```ts
69
78
  import { server } from "@nifrajs/core"
70
79
  import { websocket } from "@nifrajs/core/ws"
@@ -87,6 +96,8 @@ pubsub.publish("count", 1)
87
96
 
88
97
  The route must negotiate the `graphql-transport-ws` subprotocol at the WebSocket layer for a browser `graphql-ws` client to connect.
89
98
 
99
+ With `subscriptions: true`, a socket is admitted only when `authorize` accepts its upgrade request, and operations over it get the same query limits as HTTP. A browser cannot set headers on a WebSocket upgrade, so cookie auth carries over and bearer-header auth does not; for a token sent in `connection_init`, pass WS options with `onConnect` instead. When `authorize` is set, WS options must have their own `authorize` or `onConnect` (`onConnect: () => true` admits every socket on purpose), or `mountGraphql` throws.
100
+
90
101
  ## Options
91
102
 
92
103
  | Option | Default | Purpose |
@@ -99,12 +110,13 @@ The route must negotiate the `graphql-transport-ws` subprotocol at the WebSocket
99
110
  | `allowedOrigins` | reflect `*` | CORS origin allowlist. |
100
111
  | `authorize` | - | Per-request guard; return `false` for 401. |
101
112
  | `enableGet` | `true` | Serve `GET /graphql` (queries only). |
102
- | `subscriptions` | `false` | `true` (reuse schema/context) or explicit WS options. |
113
+ | `introspection` | `true` | `false` refuses `__schema` and `__type` as a validation error (400 over HTTP, an `error` frame over WS); `__typename` still resolves. Subscriptions inherit it unless their own options set it. |
114
+ | `subscriptions` | `false` | `true` (reuse schema, context, `authorize` and limits) or explicit WS options. |
103
115
  | `legacyJsonResponse` | `false` | Old always-200 `application/json` shape. |
104
116
 
105
117
  ## Responses
106
118
 
107
- By default responses use the `application/graphql-response+json` media type with spec status codes: `200` for an executed result (including field errors in `errors`), `400` for a parse or validation failure, `401` for a rejected `authorize`, `405` for a mutation attempted over GET. Set `legacyJsonResponse: true` for the older always-`200` `application/json` behavior some clients expect.
119
+ By default responses use the `application/graphql-response+json` media type with spec status codes: `200` for an executed result (including field errors in `errors`), `400` for a parse or validation failure, `401` for a rejected `authorize`, `405` for a mutation attempted over GET, `415` for a POST whose body is not `application/json` (or another `+json` type). The last keeps a cross-site HTML form, which can send only urlencoded, multipart or plain-text bodies, from posting a mutation with the visitor's cookies. Set `legacyJsonResponse: true` for the older always-`200` `application/json` behavior some clients expect.
108
120
 
109
121
  ## License
110
122
 
package/dist/http.d.ts CHANGED
@@ -6,7 +6,8 @@
6
6
  * (`@nifrajs/core/edge-kit`'s {@link readBodyFramed}).
7
7
  *
8
8
  * Spec: https://graphql.github.io/graphql-over-http/draft/. POST carries `{query, operationName?,
9
- * variables?, extensions?}` as `application/json`; GET carries them as query-string params and may run
9
+ * variables?, extensions?}` as `application/json` (any other media type answers 415, so a cross-site
10
+ * form cannot post a mutation); GET carries them as query-string params and may run
10
11
  * **queries only** (never a mutation) so it stays a safe, cacheable idempotent method. Responses use the
11
12
  * `application/graphql-response+json` media type with spec status codes by default; set
12
13
  * `legacyJsonResponse` for the old always-200 `application/json` shape older clients expect.
@@ -39,10 +40,24 @@ export interface GraphqlHttpOptions<Context = unknown, Env = unknown> {
39
40
  readonly maxComplexity?: number;
40
41
  /** Maximum operation definitions in one document. Default 10. */
41
42
  readonly maxOperations?: number;
42
- /** Maximum asynchronous resolver execution time. Default 10 seconds. */
43
+ /**
44
+ * Maximum pairs of fields sharing a response name in one selection set, counted through fragments.
45
+ * Validation compares every such pair, so this bounds its cost. Default 2,000.
46
+ */
47
+ readonly maxFieldOverlaps?: number;
48
+ /**
49
+ * Maximum asynchronous resolver execution time. Default 10 seconds. The execution's abort signal,
50
+ * which a resolver reads through `info.getAbortSignal()`, is aborted at this deadline and when the
51
+ * request itself is aborted.
52
+ */
43
53
  readonly executionTimeoutMs?: number;
44
54
  /** Prototype-pollution policy for the parsed JSON body. Default `"reject"`. */
45
55
  readonly protoPoisoning?: ProtoPoisoning;
56
+ /**
57
+ * Answer introspection queries (`__schema`, `__type`). Default `true`. Set `false` to refuse them
58
+ * as a validation error (400); `__typename` still resolves. Shared with `subscriptions`.
59
+ */
60
+ readonly introspection?: boolean;
46
61
  /** Optional root value passed to the executor. */
47
62
  readonly rootValue?: unknown;
48
63
  /**
@@ -51,8 +66,8 @@ export interface GraphqlHttpOptions<Context = unknown, Env = unknown> {
51
66
  */
52
67
  readonly allowedOrigins?: readonly string[];
53
68
  /**
54
- * Per-request authorization, run after the body parses and before execution. Return `false` to answer
55
- * `401` with a GraphQL error envelope and skip execution entirely.
69
+ * Per-request authorization, run after the origin check and before the body is read or parsed; a
70
+ * CORS preflight (`OPTIONS`) skips it. Return `false` to answer `401` with a GraphQL error envelope.
56
71
  */
57
72
  readonly authorize?: (request: Request) => boolean | Promise<boolean>;
58
73
  /** Emit the legacy always-200 `application/json` response shape instead of `application/graphql-response+json`. */
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAEL,KAAK,cAAc,EAOpB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAIL,YAAY,EACZ,KAAK,aAAa,EAMnB,MAAM,SAAS,CAAA;AAChB,OAAO,EAEL,KAAK,qBAAqB,EAE1B,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAA;AAoBrB,MAAM,WAAW,kBAAkB,CAAC,OAAO,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO;IAClE,0GAA0G;IAC1G,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;IAC9B,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,CAAC,EAAE,qBAAqB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IACtD,qFAAqF;IACrF,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAA;IACtC,oFAAoF;IACpF,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,yEAAyE;IACzE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACnC,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,sEAAsE;IACtE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,iEAAiE;IACjE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,wEAAwE;IACxE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAA;IACxC,kDAAkD;IAClD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3C;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACrE,mHAAmH;IACnH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;IACrC,yGAAyG;IACzG,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,GAAG,WAAW,KAAK,OAAO,CAAA;CACxF;AA2PD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,EACnE,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,GACxC,OAAO,CAAC,QAAQ,CAAC,CAmFnB"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAEL,KAAK,cAAc,EAOpB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAIL,YAAY,EACZ,KAAK,aAAa,EAKnB,MAAM,SAAS,CAAA;AAChB,OAAO,EAEL,KAAK,qBAAqB,EAE1B,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAA;AAsBrB,MAAM,WAAW,kBAAkB,CAAC,OAAO,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO;IAClE,0GAA0G;IAC1G,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;IAC9B,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,CAAC,EAAE,qBAAqB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IACtD,qFAAqF;IACrF,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAA;IACtC,oFAAoF;IACpF,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,yEAAyE;IACzE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,gEAAgE;IAChE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACnC,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,sEAAsE;IACtE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,iEAAiE;IACjE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAA;IACxC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;IAChC,kDAAkD;IAClD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3C;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACrE,mHAAmH;IACnH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;IACrC,yGAAyG;IACzG,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,GAAG,WAAW,KAAK,OAAO,CAAA;CACxF;AAqRD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,EACnE,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,GACxC,OAAO,CAAC,QAAQ,CAAC,CAgGnB"}
package/dist/http.js CHANGED
@@ -6,7 +6,8 @@
6
6
  * (`@nifrajs/core/edge-kit`'s {@link readBodyFramed}).
7
7
  *
8
8
  * Spec: https://graphql.github.io/graphql-over-http/draft/. POST carries `{query, operationName?,
9
- * variables?, extensions?}` as `application/json`; GET carries them as query-string params and may run
9
+ * variables?, extensions?}` as `application/json` (any other media type answers 415, so a cross-site
10
+ * form cannot post a mutation); GET carries them as query-string params and may run
10
11
  * **queries only** (never a mutation) so it stays a safe, cacheable idempotent method. Responses use the
11
12
  * `application/graphql-response+json` media type with spec status codes by default; set
12
13
  * `legacyJsonResponse` for the old always-200 `application/json` shape older clients expect.
@@ -16,9 +17,9 @@
16
17
  * operated concern, not a public-package one).
17
18
  */
18
19
  import { EMPTY_RESPONSE_CONTROLS, plainError, queryObjectOf, readBodyFramed, searchOf, toResponse, } from "@nifrajs/core/edge-kit";
19
- import { execute, GraphQLError, getOperationAST, parse, Source, specifiedRules, validate, } from "graphql";
20
+ import { execute, GraphQLError, getOperationAST, parse, Source, validate, } from "graphql";
20
21
  import { buildContext, } from "./context.js";
21
- import { documentLimitError, documentMetrics, graphqlLimits, requestLimitError, safeFormattedError, } from "./limits.js";
22
+ import { documentLimitError, documentMetrics, graphqlLimits, overlapLimitError, requestLimitError, safeFormattedError, validationRules, } from "./limits.js";
22
23
  const DEFAULT_MAX_BODY_BYTES = 1_000_000;
23
24
  const GRAPHQL_RESPONSE_JSON = "application/graphql-response+json; charset=utf-8";
24
25
  const JSON_UTF8 = "application/json; charset=utf-8";
@@ -89,6 +90,11 @@ function parseVariables(raw) {
89
90
  }
90
91
  return parsed;
91
92
  }
93
+ /** `application/json` or a structured `+json` type, parameters ignored. */
94
+ function isJsonMediaType(header) {
95
+ const essence = header?.split(";", 1)[0]?.trim().toLowerCase() ?? "";
96
+ return essence === "application/json" || /^application\/[a-z0-9.+-]+\+json$/.test(essence);
97
+ }
92
98
  /** Read `{query, operationName, variables}` from a parsed POST body. Throws GraphQLError when malformed. */
93
99
  function paramsFromBody(body) {
94
100
  if (body === null || typeof body !== "object" || Array.isArray(body)) {
@@ -123,14 +129,16 @@ async function run(params, request, opts, isGet, legacy, cors, limits, execution
123
129
  const gqlErr = err instanceof GraphQLError ? err : new GraphQLError(String(err));
124
130
  return requestError("", 400, legacy, cors, [gqlErr], opts.formatError);
125
131
  }
126
- const validationErrors = validate(opts.schema, document, specifiedRules);
127
- if (validationErrors.length > 0) {
128
- return requestError("", 400, legacy, cors, validationErrors, opts.formatError);
129
- }
130
- const documentLimit = documentLimitError(documentMetrics(document), limits);
132
+ // Every limit runs before validate(): its overlap rule is quadratic, so a small document within the
133
+ // byte limit can hold the event loop for seconds.
134
+ const documentLimit = documentLimitError(documentMetrics(document), limits) ?? overlapLimitError(document, limits);
131
135
  if (documentLimit !== undefined) {
132
136
  return requestError(documentLimit, 400, legacy, cors, [new GraphQLError(documentLimit)], opts.formatError);
133
137
  }
138
+ const validationErrors = validate(opts.schema, document, validationRules(opts.introspection));
139
+ if (validationErrors.length > 0) {
140
+ return requestError("", 400, legacy, cors, validationErrors, opts.formatError);
141
+ }
134
142
  // GET is idempotent and cacheable, so per the GraphQL-over-HTTP spec it may run queries only.
135
143
  const operationAst = getOperationAST(document, params.operationName ?? undefined);
136
144
  if (isGet && operationAst != null && operationAst.operation !== "query") {
@@ -147,15 +155,15 @@ async function run(params, request, opts, isGet, legacy, cors, limits, execution
147
155
  }
148
156
  let result;
149
157
  try {
150
- const execution = execute({
158
+ result = await withExecutionTimeout((abortSignal) => execute({
151
159
  schema: opts.schema,
152
160
  document,
153
161
  rootValue: opts.rootValue,
154
162
  contextValue,
155
163
  variableValues: params.variables ?? undefined,
156
164
  operationName: params.operationName ?? undefined,
157
- });
158
- result = (await withExecutionTimeout(execution, executionTimeoutMs));
165
+ abortSignal,
166
+ }), request.signal, executionTimeoutMs);
159
167
  }
160
168
  catch (err) {
161
169
  const gqlErr = err instanceof GraphQLError
@@ -179,12 +187,20 @@ class ExecutionTimeoutError extends Error {
179
187
  this.name = "ExecutionTimeoutError";
180
188
  }
181
189
  }
182
- async function withExecutionTimeout(work, timeoutMs) {
190
+ /** Run `start` under a deadline. A timeout rejects and aborts the signal resolvers were given. */
191
+ async function withExecutionTimeout(start, outer, timeoutMs) {
192
+ const controller = new AbortController();
193
+ const work = start(AbortSignal.any([outer, controller.signal]));
183
194
  if (!(work instanceof Promise) || timeoutMs === 0)
184
195
  return work;
185
196
  let timer;
186
197
  const timeout = new Promise((_, reject) => {
187
- timer = setTimeout(() => reject(new ExecutionTimeoutError()), timeoutMs);
198
+ timer = setTimeout(() => {
199
+ const error = new ExecutionTimeoutError();
200
+ // Rejected first: the abort can reject the work, and the race must settle on the timeout.
201
+ reject(error);
202
+ controller.abort(error);
203
+ }, timeoutMs);
188
204
  });
189
205
  try {
190
206
  return await Promise.race([work, timeout]);
@@ -231,6 +247,11 @@ export async function respondGraphql(request, options) {
231
247
  if (request.method !== "POST") {
232
248
  return requestError("Method not allowed.", 405, legacy, { ...cors, allow: "GET, POST" }, [new GraphQLError("Only GET and POST are supported.")], options.formatError);
233
249
  }
250
+ // Checked before the body is read: urlencoded, multipart and text/plain are what a browser sends
251
+ // cross-site without a preflight, so accepting one would let a form run a mutation with cookies.
252
+ if (!isJsonMediaType(request.headers.get("content-type"))) {
253
+ return requestError("Unsupported media type.", 415, legacy, cors, [new GraphQLError("A POST body must be sent as application/json.")], options.formatError);
254
+ }
234
255
  // Read the JSON body through core's single bounded + proto-guarded framing lane.
235
256
  return readBodyFramed(request, maxBytes, options.protoPoisoning ?? "reject", async (parsed) => {
236
257
  let params;
package/dist/http.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -16,7 +16,7 @@ import { type GraphqlWsOptions } from "./ws.js";
16
16
  export type { GraphqlContextBuilder, GraphqlContextInput, NifraContextLike, } from "./context.js";
17
17
  export { buildContext } from "./context.js";
18
18
  export { type GraphqlHttpOptions, respondGraphql } from "./http.js";
19
- export { createPubSub, type GraphqlPubSub } from "./pubsub.js";
19
+ export { createPubSub, type GraphqlPubSub, type GraphqlPubSubOptions, GraphqlPubSubOverflowError, } from "./pubsub.js";
20
20
  export { type GraphqlWsOptions, graphqlWebSocket } from "./ws.js";
21
21
  /** The structural slice of a nifra server `mountGraphql` needs. Kept loose so core stays a peer dep. */
22
22
  interface RouteContextLike<Env = unknown> extends NifraContextLike<Env> {
@@ -33,8 +33,10 @@ export interface MountGraphqlOptions<Context = unknown, Env = unknown> extends O
33
33
  /** Enable `GET /graphql` (queries only). Default `true`. */
34
34
  readonly enableGet?: boolean;
35
35
  /**
36
- * Enable `graphql-transport-ws` subscriptions on the same path. Pass the WS options (or `true` to
37
- * reuse `schema`/`context`). Requires the app to have `.use(websocket())` and `graphql-ws` installed.
36
+ * Enable `graphql-transport-ws` subscriptions on the same path. Pass `true` to reuse `schema`,
37
+ * `context`, `authorize` (run on the upgrade request) and the query limits, or pass the WS options.
38
+ * With `authorize` set, WS options must bring their own `authorize` or `onConnect`; the mount throws
39
+ * otherwise, since every socket would be admitted. Requires `.use(websocket())` and `graphql-ws`.
38
40
  */
39
41
  readonly subscriptions?: boolean | GraphqlWsOptions<Record<string, unknown>>;
40
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAyB,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC3E,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,WAAW,CAAA;AACnE,OAAO,EAAE,KAAK,gBAAgB,EAAoB,MAAM,SAAS,CAAA;AAEjE,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,KAAK,kBAAkB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,KAAK,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAEjE,wGAAwG;AACxG,UAAU,gBAAgB,CAAC,GAAG,GAAG,OAAO,CAAE,SAAQ,gBAAgB,CAAC,GAAG,CAAC;IACrE,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;CACtB;AAED,UAAU,YAAY,CAAC,GAAG,GAAG,OAAO;IAClC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAA;IAC/F,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAA;IAChG,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAA;CAC7C;AAED,MAAM,WAAW,mBAAmB,CAAC,OAAO,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,CACnE,SAAQ,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IACvD,yCAAyC;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAC7E;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,EAC3D,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,GACzC,IAAI,CA0BN"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAyB,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC3E,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,WAAW,CAAA;AACnE,OAAO,EAAE,KAAK,gBAAgB,EAAoB,MAAM,SAAS,CAAA;AAEjE,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,KAAK,kBAAkB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AACnE,OAAO,EACL,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,0BAA0B,GAC3B,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,KAAK,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAEjE,wGAAwG;AACxG,UAAU,gBAAgB,CAAC,GAAG,GAAG,OAAO,CAAE,SAAQ,gBAAgB,CAAC,GAAG,CAAC;IACrE,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;CACtB;AAED,UAAU,YAAY,CAAC,GAAG,GAAG,OAAO;IAClC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAA;IAC/F,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAA;IAChG,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAA;CAC7C;AAED,MAAM,WAAW,mBAAmB,CAAC,OAAO,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,CACnE,SAAQ,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IACvD,yCAAyC;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAC7E;AA8BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,EAC3D,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,EACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,GACzC,IAAI,CAmCN"}
package/dist/index.js CHANGED
@@ -14,8 +14,33 @@ import { respondGraphql } from "./http.js";
14
14
  import { graphqlWebSocket } from "./ws.js";
15
15
  export { buildContext } from "./context.js";
16
16
  export { respondGraphql } from "./http.js";
17
- export { createPubSub } from "./pubsub.js";
17
+ export { createPubSub, GraphqlPubSubOverflowError, } from "./pubsub.js";
18
18
  export { graphqlWebSocket } from "./ws.js";
19
+ const SHARED_LIMITS = [
20
+ "maxQueryBytes",
21
+ "maxVariablesBytes",
22
+ "maxDepth",
23
+ "maxAliases",
24
+ "maxComplexity",
25
+ "maxOperations",
26
+ "maxFieldOverlaps",
27
+ "executionTimeoutMs",
28
+ ];
29
+ /** The socket transport of `subscriptions: true`: the HTTP endpoint's schema, context, authorization and limits. */
30
+ function sharedWsOptions(options) {
31
+ const shared = { schema: options.schema };
32
+ const ctx = options.context;
33
+ if (ctx !== undefined)
34
+ shared.context = ctx;
35
+ if (options.authorize !== undefined)
36
+ shared.authorize = options.authorize;
37
+ for (const limit of SHARED_LIMITS) {
38
+ const value = options[limit];
39
+ if (value !== undefined)
40
+ shared[limit] = value;
41
+ }
42
+ return shared;
43
+ }
19
44
  /**
20
45
  * Mount a GraphQL endpoint. Wires `POST` (and `GET`, unless disabled) on `path`, injecting the nifra
21
46
  * route context into your resolver context, and - when `subscriptions` is set - a `graphql-ws` WebSocket
@@ -46,14 +71,17 @@ export function mountGraphql(app, options) {
46
71
  if (typeof app.ws !== "function") {
47
72
  throw new Error("mountGraphql: subscriptions require a WebSocket-enabled app - call `.use(websocket())` first.");
48
73
  }
49
- let wsOptions;
50
- if (options.subscriptions === true) {
51
- const ctx = options.context;
52
- wsOptions =
53
- ctx !== undefined ? { schema: options.schema, context: ctx } : { schema: options.schema };
54
- }
55
- else {
56
- wsOptions = options.subscriptions;
74
+ const given = options.subscriptions === true ? sharedWsOptions(options) : options.subscriptions;
75
+ // A schema hidden over HTTP stays hidden over the socket unless the WS options say otherwise.
76
+ const wsOptions = options.introspection === false && given.introspection === undefined
77
+ ? { ...given, introspection: false }
78
+ : given;
79
+ if (options.authorize !== undefined &&
80
+ wsOptions.authorize === undefined &&
81
+ wsOptions.onConnect === undefined) {
82
+ throw new Error("mountGraphql: `authorize` guards the HTTP endpoint only, and these subscription options " +
83
+ "admit every socket. Give them their own `authorize` or `onConnect`, or pass " +
84
+ "`subscriptions: true` to reuse `authorize`.");
57
85
  }
58
86
  app.ws(path, graphqlWebSocket(wsOptions));
59
87
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAA2B,cAAc,EAAE,MAAM,WAAW,CAAA;AACnE,OAAO,EAAyB,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAOjE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAA2B,cAAc,EAAE,MAAM,WAAW,CAAA;AACnE,OAAO,EAAE,YAAY,EAAsB,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAyB,gBAAgB,EAAE,MAAM,SAAS,CAAA;AA0BjE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,YAAY,CAC1B,GAAsB,EACtB,OAA0C;IAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAA;IACvC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,KAAK,CAAA;IAE7C,MAAM,MAAM,GAAG,CAAC,CAAwB,EAAqB,EAAE,CAC7D,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;IAEjD,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACtB,IAAI,SAAS;QAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAEpC,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;QAC1B,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAA;QACH,CAAC;QACD,IAAI,SAAoD,CAAA;QACxD,IAAI,OAAO,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAqE,CAAA;YACzF,SAAS;gBACP,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAA;QAC7F,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,OAAO,CAAC,aAAa,CAAA;QACnC,CAAC;QACD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAA;IAC3C,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/limits.d.ts CHANGED
@@ -1,4 +1,7 @@
1
- import { type DocumentNode, type GraphQLError } from "graphql";
1
+ import { type DocumentNode, type GraphQLError, type ValidationRule } from "graphql";
2
+ /** The rules a transport validates with: graphql's own, plus a refusal of `__schema` and `__type`
3
+ * fields when `introspection` is `false`. */
4
+ export declare function validationRules(introspection: boolean | undefined): readonly ValidationRule[];
2
5
  export declare const DEFAULT_GRAPHQL_LIMITS: Readonly<{
3
6
  maxQueryBytes: number;
4
7
  maxVariablesBytes: number;
@@ -6,6 +9,7 @@ export declare const DEFAULT_GRAPHQL_LIMITS: Readonly<{
6
9
  maxAliases: 100;
7
10
  maxComplexity: 1000;
8
11
  maxOperations: 10;
12
+ maxFieldOverlaps: 2000;
9
13
  }>;
10
14
  export interface GraphqlLimitsOptions {
11
15
  readonly maxQueryBytes?: number;
@@ -14,6 +18,7 @@ export interface GraphqlLimitsOptions {
14
18
  readonly maxAliases?: number;
15
19
  readonly maxComplexity?: number;
16
20
  readonly maxOperations?: number;
21
+ readonly maxFieldOverlaps?: number;
17
22
  }
18
23
  export interface GraphqlLimits {
19
24
  readonly maxQueryBytes: number;
@@ -22,6 +27,7 @@ export interface GraphqlLimits {
22
27
  readonly maxAliases: number;
23
28
  readonly maxComplexity: number;
24
29
  readonly maxOperations: number;
30
+ readonly maxFieldOverlaps: number;
25
31
  }
26
32
  export declare function graphqlLimits(options?: GraphqlLimitsOptions): GraphqlLimits;
27
33
  export declare function utf8Bytes(value: string): number;
@@ -39,6 +45,22 @@ export interface GraphqlDocumentMetrics {
39
45
  */
40
46
  export declare function documentMetrics(document: DocumentNode): GraphqlDocumentMetrics;
41
47
  export declare function requestLimitError(query: string, variables: Record<string, unknown> | null, limits: GraphqlLimits): string | undefined;
48
+ /**
49
+ * Pairs of same-named fields across every selection set, the work graphql-js's
50
+ * OverlappingFieldsCanBeMerged rule does: it compares every two fields that share a response name in
51
+ * one selection set, counting the fields its fragment spreads and inline fragments bring in. A few
52
+ * thousand bytes of `b(x: 1) b(x: 2) ...` hold within the depth and complexity limits yet cost seconds
53
+ * of synchronous validation, so this is counted, and refused, before `validate()` runs. Measured
54
+ * once {@link documentLimitError} passes and no fragment is unused, the fields it walks are bounded
55
+ * by `maxComplexity`.
56
+ */
57
+ export declare function fieldOverlaps(document: DocumentNode): number;
58
+ /**
59
+ * Refuses, before `validate()`, the documents whose overlap validation is expensive: too many
60
+ * same-named field pairs, or a fragment no operation uses (its fields escape `maxComplexity`). Run it
61
+ * after {@link documentLimitError} passes.
62
+ */
63
+ export declare function overlapLimitError(document: DocumentNode, limits: GraphqlLimits): string | undefined;
42
64
  export declare function documentLimitError(metrics: GraphqlDocumentMetrics, limits: GraphqlLimits): string | undefined;
43
65
  export declare function maskExecutionError(error: GraphQLError): Record<string, unknown>;
44
66
  export declare function safeFormattedError(error: GraphQLError, phase: "request" | "execution", formatter?: (error: GraphQLError, phase: "request" | "execution") => unknown): unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAA4B,MAAM,SAAS,CAAA;AAExF,eAAO,MAAM,sBAAsB;;;;;;;EAOjC,CAAA;AAEF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAC/B;AAUD,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CA6B/E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,MAAM,CAE5E;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAqCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,sBAAsB,CAmC9E;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACzC,MAAM,EAAE,aAAa,GACpB,MAAM,GAAG,SAAS,CAQpB;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,aAAa,GACpB,MAAM,GAAG,SAAS,CAcpB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM/E;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,SAAS,GAAG,WAAW,EAC9B,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,GAAG,WAAW,KAAK,OAAO,GAC3E,OAAO,CAST"}
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../src/limits.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EAMjB,KAAK,cAAc,EAEpB,MAAM,SAAS,CAAA;AAOhB;6CAC6C;AAC7C,wBAAgB,eAAe,CAAC,aAAa,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,cAAc,EAAE,CAE7F;AAED,eAAO,MAAM,sBAAsB;;;;;;;;EAQjC,CAAA;AAEF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;CAClC;AAUD,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAmC/E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,MAAM,CAE5E;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAqCD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,sBAAsB,CAmC9E;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACzC,MAAM,EAAE,aAAa,GACpB,MAAM,GAAG,SAAS,CAQpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAkD5D;AAgCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,aAAa,GACpB,MAAM,GAAG,SAAS,CAMpB;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,aAAa,GACpB,MAAM,GAAG,SAAS,CAcpB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM/E;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,SAAS,GAAG,WAAW,EAC9B,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,GAAG,WAAW,KAAK,OAAO,GAC3E,OAAO,CAST"}
package/dist/limits.js CHANGED
@@ -1,4 +1,13 @@
1
- import { Kind } from "graphql";
1
+ import { Kind, NoSchemaIntrospectionCustomRule, specifiedRules, visit, } from "graphql";
2
+ const RULES_WITHOUT_INTROSPECTION = [
3
+ ...specifiedRules,
4
+ NoSchemaIntrospectionCustomRule,
5
+ ];
6
+ /** The rules a transport validates with: graphql's own, plus a refusal of `__schema` and `__type`
7
+ * fields when `introspection` is `false`. */
8
+ export function validationRules(introspection) {
9
+ return introspection === false ? RULES_WITHOUT_INTROSPECTION : specifiedRules;
10
+ }
2
11
  export const DEFAULT_GRAPHQL_LIMITS = Object.freeze({
3
12
  maxQueryBytes: 64 * 1024,
4
13
  maxVariablesBytes: 256 * 1024,
@@ -6,6 +15,7 @@ export const DEFAULT_GRAPHQL_LIMITS = Object.freeze({
6
15
  maxAliases: 100,
7
16
  maxComplexity: 1_000,
8
17
  maxOperations: 10,
18
+ maxFieldOverlaps: 2_000,
9
19
  });
10
20
  function limit(value, fallback, name, minimum) {
11
21
  const result = value ?? fallback;
@@ -22,6 +32,7 @@ export function graphqlLimits(options = {}) {
22
32
  maxAliases: limit(options.maxAliases, DEFAULT_GRAPHQL_LIMITS.maxAliases, "maxAliases", 0),
23
33
  maxComplexity: limit(options.maxComplexity, DEFAULT_GRAPHQL_LIMITS.maxComplexity, "maxComplexity", 1),
24
34
  maxOperations: limit(options.maxOperations, DEFAULT_GRAPHQL_LIMITS.maxOperations, "maxOperations", 1),
35
+ maxFieldOverlaps: limit(options.maxFieldOverlaps, DEFAULT_GRAPHQL_LIMITS.maxFieldOverlaps, "maxFieldOverlaps", 0),
25
36
  };
26
37
  }
27
38
  export function utf8Bytes(value) {
@@ -113,6 +124,113 @@ export function requestLimitError(query, variables, limits) {
113
124
  }
114
125
  return undefined;
115
126
  }
127
+ /**
128
+ * Pairs of same-named fields across every selection set, the work graphql-js's
129
+ * OverlappingFieldsCanBeMerged rule does: it compares every two fields that share a response name in
130
+ * one selection set, counting the fields its fragment spreads and inline fragments bring in. A few
131
+ * thousand bytes of `b(x: 1) b(x: 2) ...` hold within the depth and complexity limits yet cost seconds
132
+ * of synchronous validation, so this is counted, and refused, before `validate()` runs. Measured
133
+ * once {@link documentLimitError} passes and no fragment is unused, the fields it walks are bounded
134
+ * by `maxComplexity`.
135
+ */
136
+ export function fieldOverlaps(document) {
137
+ const fragments = new Map();
138
+ for (const definition of document.definitions) {
139
+ if (definition.kind === Kind.FRAGMENT_DEFINITION) {
140
+ fragments.set(definition.name.value, definition.selectionSet.selections);
141
+ }
142
+ }
143
+ const fragmentNames = new Map();
144
+ const expanding = new Set();
145
+ const add = (selections, names, spread) => {
146
+ for (const selection of selections) {
147
+ if (selection.kind === Kind.FIELD) {
148
+ const name = selection.alias?.value ?? selection.name.value;
149
+ names.set(name, (names.get(name) ?? 0) + 1);
150
+ }
151
+ else if (selection.kind === Kind.INLINE_FRAGMENT) {
152
+ add(selection.selectionSet.selections, names, spread);
153
+ }
154
+ else if (!spread.has(selection.name.value)) {
155
+ spread.add(selection.name.value);
156
+ for (const [name, count] of fragmentNamesOf(selection.name.value)) {
157
+ names.set(name, (names.get(name) ?? 0) + count);
158
+ }
159
+ }
160
+ }
161
+ };
162
+ // An unknown fragment and a cycle, both refused by validation, contribute nothing.
163
+ const fragmentNamesOf = (fragment) => {
164
+ const known = fragmentNames.get(fragment);
165
+ if (known !== undefined)
166
+ return known;
167
+ const selections = fragments.get(fragment);
168
+ if (selections === undefined || expanding.has(fragment))
169
+ return new Map();
170
+ expanding.add(fragment);
171
+ const names = new Map();
172
+ add(selections, names, new Set([fragment]));
173
+ expanding.delete(fragment);
174
+ fragmentNames.set(fragment, names);
175
+ return names;
176
+ };
177
+ let pairs = 0;
178
+ visit(document, {
179
+ SelectionSet(node) {
180
+ const names = new Map();
181
+ add(node.selections, names, new Set());
182
+ for (const count of names.values())
183
+ pairs += (count * (count - 1)) / 2;
184
+ },
185
+ });
186
+ return pairs;
187
+ }
188
+ /** The first fragment no operation reaches; graphql-js refuses it, and no limit above counts it. */
189
+ function unusedFragment(document) {
190
+ const spreads = new Map();
191
+ const pending = [];
192
+ const spreadsIn = (node) => {
193
+ const names = [];
194
+ visit(node, {
195
+ FragmentSpread(spread) {
196
+ names.push(spread.name.value);
197
+ },
198
+ });
199
+ return names;
200
+ };
201
+ for (const definition of document.definitions) {
202
+ if (definition.kind === Kind.FRAGMENT_DEFINITION) {
203
+ spreads.set(definition.name.value, spreadsIn(definition));
204
+ }
205
+ else if (definition.kind === Kind.OPERATION_DEFINITION) {
206
+ pending.push(...spreadsIn(definition));
207
+ }
208
+ }
209
+ const reached = new Set();
210
+ for (let name = pending.pop(); name !== undefined; name = pending.pop()) {
211
+ if (reached.has(name))
212
+ continue;
213
+ reached.add(name);
214
+ pending.push(...(spreads.get(name) ?? []));
215
+ }
216
+ for (const name of spreads.keys())
217
+ if (!reached.has(name))
218
+ return name;
219
+ return undefined;
220
+ }
221
+ /**
222
+ * Refuses, before `validate()`, the documents whose overlap validation is expensive: too many
223
+ * same-named field pairs, or a fragment no operation uses (its fields escape `maxComplexity`). Run it
224
+ * after {@link documentLimitError} passes.
225
+ */
226
+ export function overlapLimitError(document, limits) {
227
+ const unused = unusedFragment(document);
228
+ if (unused !== undefined)
229
+ return `Fragment "${unused}" is never used.`;
230
+ return fieldOverlaps(document) > limits.maxFieldOverlaps
231
+ ? `GraphQL document repeats field names in one selection set beyond the limit of ${limits.maxFieldOverlaps} same-named field pairs.`
232
+ : undefined;
233
+ }
116
234
  export function documentLimitError(metrics, limits) {
117
235
  if (metrics.operations > limits.maxOperations) {
118
236
  return `GraphQL document exceeds the ${limits.maxOperations}-operation limit.`;