grafserv 0.0.1-0.2 → 0.0.1-0.21

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 (63) hide show
  1. package/CHANGELOG.md +220 -0
  2. package/README.md +248 -3
  3. package/dist/accept.d.ts +8 -0
  4. package/dist/accept.d.ts.map +1 -0
  5. package/dist/accept.js +419 -0
  6. package/dist/accept.js.map +1 -0
  7. package/dist/core/base.d.ts +38 -0
  8. package/dist/core/base.d.ts.map +1 -0
  9. package/dist/core/base.js +440 -0
  10. package/dist/core/base.js.map +1 -0
  11. package/dist/index.d.ts +2 -2
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -3
  14. package/dist/index.js.map +1 -1
  15. package/dist/interfaces.d.ts +176 -23
  16. package/dist/interfaces.d.ts.map +1 -1
  17. package/dist/interfaces.js +2 -0
  18. package/dist/interfaces.js.map +1 -1
  19. package/dist/mapIterator.d.ts +2 -0
  20. package/dist/mapIterator.d.ts.map +1 -0
  21. package/dist/mapIterator.js +65 -0
  22. package/dist/mapIterator.js.map +1 -0
  23. package/dist/middleware/graphiql.d.ts +3 -3
  24. package/dist/middleware/graphiql.d.ts.map +1 -1
  25. package/dist/middleware/graphiql.js +14 -4
  26. package/dist/middleware/graphiql.js.map +1 -1
  27. package/dist/middleware/graphql.d.ts +8 -3
  28. package/dist/middleware/graphql.d.ts.map +1 -1
  29. package/dist/middleware/graphql.js +325 -23
  30. package/dist/middleware/graphql.js.map +1 -1
  31. package/dist/options.d.ts +23 -0
  32. package/dist/options.d.ts.map +1 -0
  33. package/dist/options.js +114 -0
  34. package/dist/options.js.map +1 -0
  35. package/dist/servers/express/v4/index.d.ts +24 -0
  36. package/dist/servers/express/v4/index.d.ts.map +1 -0
  37. package/dist/servers/express/v4/index.js +62 -0
  38. package/dist/servers/express/v4/index.js.map +1 -0
  39. package/dist/servers/fastify/v4/index.d.ts +21 -0
  40. package/dist/servers/fastify/v4/index.d.ts.map +1 -0
  41. package/dist/servers/fastify/v4/index.js +198 -0
  42. package/dist/servers/fastify/v4/index.js.map +1 -0
  43. package/dist/servers/koa/v2/index.d.ts +25 -0
  44. package/dist/servers/koa/v2/index.d.ts.map +1 -0
  45. package/dist/servers/koa/v2/index.js +137 -0
  46. package/dist/servers/koa/v2/index.js.map +1 -0
  47. package/dist/servers/node/index.d.ts +32 -0
  48. package/dist/servers/node/index.d.ts.map +1 -0
  49. package/dist/servers/node/index.js +269 -0
  50. package/dist/servers/node/index.js.map +1 -0
  51. package/dist/utils.d.ts +19 -0
  52. package/dist/utils.d.ts.map +1 -0
  53. package/dist/utils.js +145 -0
  54. package/dist/utils.js.map +1 -0
  55. package/package.json +42 -8
  56. package/dist/middleware/index.d.ts +0 -12
  57. package/dist/middleware/index.d.ts.map +0 -1
  58. package/dist/middleware/index.js +0 -431
  59. package/dist/middleware/index.js.map +0 -1
  60. package/dist/middleware/interfaces.d.ts +0 -40
  61. package/dist/middleware/interfaces.d.ts.map +0 -1
  62. package/dist/middleware/interfaces.js +0 -3
  63. package/dist/middleware/interfaces.js.map +0 -1
@@ -1,10 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.makeGraphQLHandler = void 0;
3
+ exports.makeGraphQLHandler = exports.TEXT_HTML = exports.APPLICATION_GRAPHQL_RESPONSE_JSON = exports.APPLICATION_JSON = void 0;
4
4
  const lru_1 = require("@graphile/lru");
5
5
  const crypto_1 = require("crypto");
6
6
  const grafast_1 = require("grafast");
7
7
  const graphql_1 = require("graphql");
8
+ const node_querystring_1 = require("node:querystring");
9
+ const accept_js_1 = require("../accept.js");
10
+ const interfaces_js_1 = require("../interfaces.js");
11
+ const utils_js_1 = require("../utils.js");
12
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
8
13
  let lastString;
9
14
  let lastHash;
10
15
  const calculateQueryHash = (queryString) => {
@@ -58,28 +63,303 @@ function makeParseAndValidateFunction(schema) {
58
63
  }
59
64
  return parseAndValidate;
60
65
  }
61
- const makeGraphQLHandler = (params) => {
62
- const { schema } = params;
63
- const parseAndValidate = makeParseAndValidateFunction(schema);
64
- const asString = true;
65
- return async (resolvedPreset, ctx, body) => {
66
- // Parse the body
67
- if (typeof body !== "object" || body == null) {
68
- throw new Error("Invalid body in request");
66
+ function processAndValidateQueryParams(params) {
67
+ const query = params.query;
68
+ if (typeof query !== "string") {
69
+ throw (0, utils_js_1.httpError)(400, "query must be a string");
70
+ }
71
+ const operationName = params.operationName ?? undefined;
72
+ if (operationName != null && typeof operationName !== "string") {
73
+ throw (0, utils_js_1.httpError)(400, "operationName, if given, must be a string");
74
+ }
75
+ const variablesString = params.variables ?? undefined;
76
+ const variableValues = typeof variablesString === "string"
77
+ ? JSON.parse(variablesString)
78
+ : undefined;
79
+ if (variableValues != null &&
80
+ (typeof variableValues !== "object" || Array.isArray(variableValues))) {
81
+ throw (0, utils_js_1.httpError)(400, "Invalid variables; expected JSON-encoded object");
82
+ }
83
+ const extensionsString = params.extensions ?? undefined;
84
+ const extensions = typeof extensionsString === "string"
85
+ ? JSON.parse(extensionsString)
86
+ : undefined;
87
+ if (extensions != null &&
88
+ (typeof extensions !== "object" || Array.isArray(extensions))) {
89
+ throw (0, utils_js_1.httpError)(400, "Invalid extensions; expected JSON-encoded object");
90
+ }
91
+ return {
92
+ query,
93
+ operationName,
94
+ variableValues,
95
+ extensions,
96
+ };
97
+ }
98
+ function processAndValidateJSON(params) {
99
+ if (!params) {
100
+ throw (0, utils_js_1.httpError)(400, "No body");
101
+ }
102
+ if (typeof params !== "object" || Array.isArray(params)) {
103
+ throw (0, utils_js_1.httpError)(400, "Invalid body; expected object");
104
+ }
105
+ const query = params.query;
106
+ if (typeof query !== "string") {
107
+ throw (0, utils_js_1.httpError)(400, "query must be a string");
108
+ }
109
+ const operationName = params.operationName ?? undefined;
110
+ if (operationName != null && typeof operationName !== "string") {
111
+ throw (0, utils_js_1.httpError)(400, "operationName, if given, must be a string");
112
+ }
113
+ const variableValues = params.variables ?? undefined;
114
+ if (variableValues != null &&
115
+ (typeof variableValues !== "object" || Array.isArray(variableValues))) {
116
+ throw (0, utils_js_1.httpError)(400, "Invalid variables; expected JSON-encoded object");
117
+ }
118
+ const extensions = params.extensions ?? undefined;
119
+ if (extensions != null &&
120
+ (typeof extensions !== "object" || Array.isArray(extensions))) {
121
+ throw (0, utils_js_1.httpError)(400, "Invalid extensions; expected JSON-encoded object");
122
+ }
123
+ return {
124
+ query,
125
+ operationName,
126
+ variableValues,
127
+ extensions,
128
+ };
129
+ }
130
+ function processAndValidateBody(request, body) {
131
+ const contentType = request[interfaces_js_1.$$normalizedHeaders]["content-type"];
132
+ if (!contentType) {
133
+ throw (0, utils_js_1.httpError)(400, "Could not determine the Content-Type of the request");
134
+ }
135
+ const semi = contentType.indexOf(";");
136
+ const ct = semi >= 0 ? contentType.slice(0, semi).trim() : contentType.trim();
137
+ // TODO: we should probably at least look at the parameters... e.g. throw if encoding !== utf-8
138
+ switch (ct) {
139
+ case "application/json": {
140
+ switch (body.type) {
141
+ case "buffer": {
142
+ return processAndValidateJSON(JSON.parse(body.buffer.toString("utf8")));
143
+ }
144
+ case "text": {
145
+ return processAndValidateJSON(JSON.parse(body.text));
146
+ }
147
+ case "json": {
148
+ return processAndValidateJSON(body.json);
149
+ }
150
+ default: {
151
+ const never = body;
152
+ throw (0, utils_js_1.httpError)(400, `Do not understand type ${never.type}`);
153
+ }
154
+ }
155
+ }
156
+ case "application/x-www-form-urlencoded": {
157
+ switch (body.type) {
158
+ case "buffer": {
159
+ return processAndValidateQueryParams((0, node_querystring_1.parse)(body.buffer.toString("utf8")));
160
+ }
161
+ case "text": {
162
+ return processAndValidateQueryParams((0, node_querystring_1.parse)(body.text));
163
+ }
164
+ case "json": {
165
+ if (body.json == null ||
166
+ typeof body.json !== "object" ||
167
+ Array.isArray(body.json)) {
168
+ throw (0, utils_js_1.httpError)(400, `Invalid body`);
169
+ }
170
+ return processAndValidateQueryParams(body.json);
171
+ }
172
+ default: {
173
+ const never = body;
174
+ throw (0, utils_js_1.httpError)(400, `Do not understand type ${never.type}`);
175
+ }
176
+ }
177
+ }
178
+ case "application/graphql": {
179
+ // TODO: I have a vague feeling that people that do this pass variables via the query string?
180
+ switch (body.type) {
181
+ case "text": {
182
+ return {
183
+ query: body.text,
184
+ operationName: undefined,
185
+ variableValues: undefined,
186
+ extensions: undefined,
187
+ };
188
+ }
189
+ case "buffer": {
190
+ return {
191
+ query: body.buffer.toString("utf8"),
192
+ operationName: undefined,
193
+ variableValues: undefined,
194
+ extensions: undefined,
195
+ };
196
+ }
197
+ case "json": {
198
+ return processAndValidateJSON(body.json);
199
+ }
200
+ default: {
201
+ const never = body;
202
+ throw (0, utils_js_1.httpError)(400, `Do not understand type ${never.type}`);
203
+ }
204
+ }
205
+ }
206
+ default: {
207
+ throw (0, utils_js_1.httpError)(400, `Do not understand content type`);
208
+ }
209
+ }
210
+ }
211
+ exports.APPLICATION_JSON = "application/json;charset=utf-8";
212
+ exports.APPLICATION_GRAPHQL_RESPONSE_JSON = "application/graphql-response+json;charset=utf-8";
213
+ exports.TEXT_HTML = "text/html;charset=utf-8";
214
+ /** https://graphql.github.io/graphql-over-http/draft/#sec-Legacy-Watershed */
215
+ const isAfterWatershed = Date.now() >= +new Date(2025, 0, 1);
216
+ const GRAPHQL_TYPES = isAfterWatershed
217
+ ? [exports.APPLICATION_GRAPHQL_RESPONSE_JSON, exports.APPLICATION_JSON]
218
+ : [exports.APPLICATION_JSON, exports.APPLICATION_GRAPHQL_RESPONSE_JSON];
219
+ const graphqlAcceptMatcher = (0, accept_js_1.makeAcceptMatcher)([...GRAPHQL_TYPES]);
220
+ const graphqlOrHTMLAcceptMatcher = (0, accept_js_1.makeAcceptMatcher)([
221
+ ...GRAPHQL_TYPES,
222
+ // Must be lowest priority, otherwise GraphiQL may override GraphQL in some
223
+ // situations
224
+ exports.TEXT_HTML,
225
+ ]);
226
+ const makeGraphQLHandler = (resolvedPreset, dynamicOptions, schemaOrPromise) => {
227
+ if (schemaOrPromise == null) {
228
+ const err = Promise.reject(new graphql_1.GraphQLError("The schema is currently unavailable", null, null, null, null, null, {
229
+ statusCode: 503,
230
+ }));
231
+ return () => err;
232
+ }
233
+ let latestSchema;
234
+ let latestParseAndValidate;
235
+ let wait;
236
+ if ((0, grafast_1.isPromiseLike)(schemaOrPromise)) {
237
+ wait = schemaOrPromise.then((_schema) => {
238
+ if (_schema == null) {
239
+ throw new graphql_1.GraphQLError("The schema is current unavailable.", null, null, null, null, null, {
240
+ statusCode: 503,
241
+ });
242
+ }
243
+ latestSchema = _schema;
244
+ latestParseAndValidate = makeParseAndValidateFunction(latestSchema);
245
+ wait = null;
246
+ });
247
+ }
248
+ else {
249
+ latestSchema = schemaOrPromise;
250
+ latestParseAndValidate = makeParseAndValidateFunction(latestSchema);
251
+ }
252
+ const outputDataAsString = dynamicOptions.outputDataAsString;
253
+ const { maskIterator, maskPayload, maskError } = dynamicOptions;
254
+ return async (request, graphiqlHandler) => {
255
+ const accept = request[interfaces_js_1.$$normalizedHeaders].accept;
256
+ // Do they want HTML, or do they want GraphQL?
257
+ const chosenContentType = request.method === "GET" &&
258
+ dynamicOptions.graphiqlOnGraphQLGET &&
259
+ graphiqlHandler
260
+ ? graphqlOrHTMLAcceptMatcher(accept)
261
+ : graphqlAcceptMatcher(accept);
262
+ if (chosenContentType === exports.TEXT_HTML) {
263
+ // They want HTML -> Ruru
264
+ return graphiqlHandler(request);
69
265
  }
70
- const { query, variables: variableValues, operationName, } = body;
71
- if (typeof query !== "string") {
72
- throw new Error("Invalid query");
266
+ else if (chosenContentType === exports.APPLICATION_JSON ||
267
+ chosenContentType === exports.APPLICATION_GRAPHQL_RESPONSE_JSON) {
268
+ // They want GraphQL
269
+ if (request.method === "POST" ||
270
+ (dynamicOptions.graphqlOverGET && request.method === "GET")) {
271
+ /* continue */
272
+ }
273
+ else {
274
+ return {
275
+ type: "graphql",
276
+ request,
277
+ dynamicOptions,
278
+ statusCode: 405,
279
+ contentType: "application/json",
280
+ payload: {
281
+ errors: [new graphql_1.GraphQLError("Method not supported, please use POST")],
282
+ },
283
+ };
284
+ }
285
+ }
286
+ else {
287
+ // > Respond with a 406 Not Acceptable status code and stop processing the request.
288
+ // https://graphql.github.io/graphql-over-http/draft/#sel-DANHELDAACNA4rR
289
+ return {
290
+ type: "graphql",
291
+ request,
292
+ dynamicOptions,
293
+ statusCode: 406,
294
+ contentType: "application/json",
295
+ payload: {
296
+ errors: [
297
+ new graphql_1.GraphQLError("Could not find a supported media type; consider adding 'application/json' or 'application/graphql-response+json' to your Accept header."),
298
+ ],
299
+ },
300
+ };
73
301
  }
74
- if (typeof operationName !== "string" && operationName != null) {
75
- throw new Error("Invalid operationName");
302
+ // If we get here, we're handling a GraphQL request
303
+ const isLegacy = chosenContentType === exports.APPLICATION_JSON;
304
+ if (wait) {
305
+ await Promise.race([wait, sleep(dynamicOptions.schemaWaitTime)]);
306
+ if (!latestSchema) {
307
+ // Handle missing schema
308
+ throw (0, utils_js_1.httpError)(502, `Schema isn't ready`);
309
+ }
76
310
  }
77
- if (variableValues != null && typeof variableValues !== "object") {
78
- throw new Error("Invalid variables");
311
+ // Get a reference to the latest versions to use for this entire operation
312
+ const schema = latestSchema;
313
+ const parseAndValidate = latestParseAndValidate;
314
+ let body;
315
+ try {
316
+ body =
317
+ request.method === "POST"
318
+ ? processAndValidateBody(request, await request.getBody())
319
+ : processAndValidateQueryParams(await request.getQueryParams());
79
320
  }
321
+ catch (e) {
322
+ if (typeof e.statusCode === "number" &&
323
+ e.statusCode >= 400 &&
324
+ e.statusCode < 600) {
325
+ throw e;
326
+ }
327
+ else {
328
+ // TODO: should maybe handle more specific issues here. See examples:
329
+ // https://graphql.github.io/graphql-over-http/draft/#sec-Examples
330
+ throw (0, utils_js_1.httpError)(400, `Parsing failed, please check that the data you're sending to the server is correct`);
331
+ }
332
+ }
333
+ const { query, operationName, variableValues } = body;
80
334
  const { errors, document } = parseAndValidate(query);
81
335
  if (errors) {
82
- return { type: "graphql", statusCode: 200, payload: { errors } };
336
+ return {
337
+ type: "graphql",
338
+ request,
339
+ dynamicOptions,
340
+ statusCode: isLegacy ? 200 : 400,
341
+ contentType: chosenContentType,
342
+ payload: { errors },
343
+ };
344
+ }
345
+ if (request.method !== "POST") {
346
+ // Forbid mutation
347
+ const operation = (0, graphql_1.getOperationAST)(document, operationName);
348
+ if (!operation || operation.operation !== "query") {
349
+ const error = new graphql_1.GraphQLError("Only queries may take place over non-POST requests.", operation);
350
+ return {
351
+ type: "graphql",
352
+ request,
353
+ dynamicOptions,
354
+ // Note: the GraphQL-over-HTTP spec currently mandates 405, even for legacy clients:
355
+ // https://graphql.github.io/graphql-over-http/draft/#sel-FALJRPCE2BCGoBitR
356
+ statusCode: 405,
357
+ contentType: chosenContentType,
358
+ payload: {
359
+ errors: [error],
360
+ },
361
+ };
362
+ }
83
363
  }
84
364
  const args = {
85
365
  schema,
@@ -89,26 +369,48 @@ const makeGraphQLHandler = (params) => {
89
369
  variableValues,
90
370
  operationName,
91
371
  };
92
- await (0, grafast_1.hookArgs)(args, ctx, resolvedPreset);
372
+ await (0, grafast_1.hookArgs)(args, {
373
+ ...request.requestContext,
374
+ http: request,
375
+ }, resolvedPreset);
93
376
  try {
94
377
  const result = await (0, grafast_1.execute)(args, resolvedPreset);
95
378
  if ((0, grafast_1.isAsyncIterable)(result)) {
96
379
  return {
97
380
  type: "graphqlIncremental",
381
+ request,
382
+ dynamicOptions,
98
383
  statusCode: 200,
99
- iterator: result,
100
- asString,
384
+ iterator: maskIterator(result),
385
+ outputDataAsString,
101
386
  };
102
387
  }
103
- return { type: "graphql", statusCode: 200, payload: result, asString };
388
+ return {
389
+ type: "graphql",
390
+ request,
391
+ dynamicOptions,
392
+ statusCode: isLegacy || !result.errors
393
+ ? 200
394
+ : result.data === undefined
395
+ ? 400
396
+ : 200,
397
+ contentType: chosenContentType,
398
+ payload: maskPayload(result),
399
+ outputDataAsString,
400
+ };
104
401
  }
105
402
  catch (e) {
106
403
  console.error(e);
107
404
  return {
108
405
  type: "graphql",
109
- statusCode: 500,
406
+ request,
407
+ dynamicOptions,
408
+ // e.g. We should always return 400 on no Content-Type header:
409
+ // https://graphql.github.io/graphql-over-http/draft/#sel-DALLDJAADLCA8tb
410
+ statusCode: e.statusCode ?? (isLegacy ? 200 : 500),
411
+ contentType: chosenContentType,
110
412
  payload: {
111
- errors: [new graphql_1.GraphQLError(e.message)],
413
+ errors: [maskError(new graphql_1.GraphQLError(e.message))],
112
414
  extensions: args.rootValue?.[grafast_1.$$extensions],
113
415
  },
114
416
  };
@@ -1 +1 @@
1
- {"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/middleware/graphql.ts"],"names":[],"mappings":";;;AAAA,uCAAoC;AACpC,mCAAoC;AACpC,qCAKiB;AAEjB,qCAAgE;AAKhE,IAAI,UAAkB,CAAC;AACvB,IAAI,QAAgB,CAAC;AACrB,MAAM,kBAAkB,GAAG,CAAC,WAAmB,EAAU,EAAE;IACzD,IAAI,WAAW,KAAK,UAAU,EAAE;QAC9B,UAAU,GAAG,WAAW,CAAC;QACzB,QAAQ,GAAG,IAAA,mBAAU,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;KACpE;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,SAAS,4BAA4B,CAAC,MAAqB;IAIzD,MAAM,uBAAuB,GAAG,IAAI,SAAG,CAAiC;QACtE,SAAS,EAAE,GAAG;KACf,CAAC,CAAC;IACH,IAAI,yBAAiC,CAAC;IACtC,IAAI,0BAAkD,CAAC;IACvD,SAAS,gBAAgB,CAAC,KAAa;QACrC,IAAI,yBAAyB,KAAK,KAAK,EAAE;YACvC,OAAO,0BAA0B,CAAC;SACnC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAEpE,MAAM,MAAM,GAAG,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,MAAM,EAAE;YACV,yBAAyB,GAAG,KAAK,CAAC;YAClC,0BAA0B,GAAG,MAAM,CAAC;YACpC,OAAO,MAAM,CAAC;SACf;QAED,MAAM,MAAM,GAAG,IAAI,gBAAM,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;QACzD,IAAI,QAAQ,CAAC;QACb,IAAI;YACF,QAAQ,GAAG,IAAA,eAAK,EAAC,MAAM,CAAC,CAAC;SAC1B;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,MAAM,GAAG;gBACb,MAAM,EAAE;oBACN,IAAI,sBAAY,CACd,CAAC,CAAC,OAAO,EACT,IAAI,EACJ,SAAS,EACT,SAAS,EACT,SAAS,EACT,CAAC,EACD,SAAS,CACV;iBACF;aACF,CAAC;YACF,uBAAuB,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC1C,yBAAyB,GAAG,KAAK,CAAC;YAClC,0BAA0B,GAAG,MAAM,CAAC;YACpC,OAAO,MAAM,CAAC;SACf;QACD,MAAM,MAAM,GAAG,IAAA,kBAAQ,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,MAAM,GAA2B,MAAM,CAAC,MAAM;YAClD,CAAC,CAAC,EAAE,MAAM,EAAE;YACZ,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QACjB,uBAAuB,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,yBAAyB,GAAG,KAAK,CAAC;QAClC,0BAA0B,GAAG,MAAM,CAAC;QACpC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAEM,MAAM,kBAAkB,GAAG,CAAC,MAAoB,EAAE,EAAE;IACzD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC1B,MAAM,gBAAgB,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC;IAEtB,OAAO,KAAK,EACV,cAA6C,EAC7C,GAAyC,EACzC,IAAa,EACW,EAAE;QAC1B,iBAAiB;QACjB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAI,IAAI,EAAE;YAC5C,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC5C;QACD,MAAM,EACJ,KAAK,EACL,SAAS,EAAE,cAAc,EACzB,aAAa,GACd,GAAG,IAA2B,CAAC;QAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;SAClC;QACD,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,IAAI,IAAI,EAAE;YAC9D,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;SAC1C;QACD,IAAI,cAAc,IAAI,IAAI,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE;YAChE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;SACtC;QAED,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAErD,IAAI,MAAM,EAAE;YACV,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;SAClE;QAED,MAAM,IAAI,GAAkB;YAC1B,MAAM;YACN,QAAQ;YACR,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACjC,cAAc;YACd,aAAa;SACd,CAAC;QAEF,MAAM,IAAA,kBAAQ,EAAC,IAAI,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;QAE1C,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAc,EAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAC1D,IAAI,IAAA,yBAAe,EAAC,MAAM,CAAC,EAAE;gBAC3B,OAAO;oBACL,IAAI,EAAE,oBAAoB;oBAC1B,UAAU,EAAE,GAAG;oBACf,QAAQ,EAAE,MAAM;oBAChB,QAAQ;iBACT,CAAC;aACH;YACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;SACxE;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE;oBACP,MAAM,EAAE,CAAC,IAAI,sBAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;oBACrC,UAAU,EAAG,IAAI,CAAC,SAAiB,EAAE,CAAC,sBAAY,CAAC;iBACpD;aACF,CAAC;SACH;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AArEW,QAAA,kBAAkB,sBAqE7B"}
1
+ {"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/middleware/graphql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { AsyncExecutionResult, ExecutionResult } from "graphql";
2
+ import { GraphQLError } from "graphql";
3
+ export declare function defaultMaskError(error: GraphQLError): GraphQLError;
4
+ export declare function makeMaskError(callback: (error: GraphQLError) => GraphQLError): (error: GraphQLError) => GraphQLError;
5
+ export declare function optionsFromConfig(config: GraphileConfig.ResolvedPreset): {
6
+ outputDataAsString: boolean;
7
+ graphqlPath: string;
8
+ graphqlOverGET: boolean;
9
+ graphiql: boolean;
10
+ graphiqlOnGraphQLGET: boolean;
11
+ graphiqlPath: string;
12
+ watch: boolean;
13
+ eventStreamRoute: string;
14
+ maxRequestLength: number;
15
+ explain: boolean | string[] | undefined;
16
+ schemaWaitTime: number;
17
+ maskError: (error: GraphQLError) => GraphQLError;
18
+ maskPayload: (payload: any) => any;
19
+ maskIterator: (result: AsyncGenerator<AsyncExecutionResult>) => AsyncGenerator<AsyncExecutionResult>;
20
+ maskExecutionResult: (result: ExecutionResult | AsyncGenerator<AsyncExecutionResult>) => any;
21
+ };
22
+ export type OptionsFromConfig = ReturnType<typeof optionsFromConfig>;
23
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAiBvC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CA6BlE;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,YAAY,GAC9C,CAAC,KAAK,EAAE,YAAY,KAAK,YAAY,CAavC;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,CAAC,cAAc;;;;;;;;;;;;;2BAmBvC,GAAG;2BAOvB,eAAe,oBAAoB,CAAC,KAC3C,eAAe,oBAAoB,CAAC;kCAyB7B,eAAe,GAAG,eAAe,oBAAoB,CAAC;EAyBjE;AACD,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.optionsFromConfig = exports.makeMaskError = exports.defaultMaskError = void 0;
4
+ const grafast_1 = require("grafast");
5
+ const graphql_1 = require("graphql");
6
+ // Only the non-ambiguous characters
7
+ const RANDOM_STRING_LETTERS = "ABCDEFGHJKLMNPQRTUVWXYZ2346789";
8
+ const RANDOM_STRING_LETTERS_LENGTH = RANDOM_STRING_LETTERS.length;
9
+ const randomString = (length = 10) => {
10
+ let str = "";
11
+ for (let i = 0; i < length; i++) {
12
+ str +=
13
+ RANDOM_STRING_LETTERS[Math.floor(Math.random() * RANDOM_STRING_LETTERS_LENGTH)];
14
+ }
15
+ return str;
16
+ };
17
+ function defaultMaskError(error) {
18
+ if (error.originalError instanceof graphql_1.GraphQLError) {
19
+ return error;
20
+ }
21
+ else if (error.originalError != null && (0, grafast_1.isSafeError)(error.originalError)) {
22
+ return new graphql_1.GraphQLError(error.originalError.message, error.nodes, error.source, error.positions, error.path, error.originalError, error.originalError.extensions ?? null);
23
+ }
24
+ else {
25
+ const errorId = randomString();
26
+ console.error(`Masked GraphQL error (code: '${errorId}')`, error);
27
+ return new graphql_1.GraphQLError(`An error occurred (code: '${errorId}')`, error.nodes, error.source, error.positions, error.path, error.originalError,
28
+ // Deliberately wipe the extensions
29
+ {
30
+ errorId,
31
+ });
32
+ }
33
+ }
34
+ exports.defaultMaskError = defaultMaskError;
35
+ function makeMaskError(callback) {
36
+ let warnedAboutMaskErrorCallback = false;
37
+ return (error) => {
38
+ const path = error.path;
39
+ const replacement = callback(error);
40
+ if (!warnedAboutMaskErrorCallback && replacement.path !== path) {
41
+ warnedAboutMaskErrorCallback = true;
42
+ console.warn(`[WARNING] Your maskError callback is changing the error path; please reuse the path of the original error to ensure compliance with the GraphQL specification. We will not issue this warning again until the server is restarted or another maskError function is provided.`);
43
+ }
44
+ return replacement;
45
+ };
46
+ }
47
+ exports.makeMaskError = makeMaskError;
48
+ function optionsFromConfig(config) {
49
+ const { graphqlPath = "/graphql", graphqlOverGET = false, graphiql = true, graphiqlOnGraphQLGET = true, graphiqlPath = "/", watch = false,
50
+ // TODO: Why 'Path' for graphqlPath and graphiqlPath, but 'Route' for this?!
51
+ eventStreamRoute = "/graphql/stream", maxRequestLength = 100_000, outputDataAsString = false, schemaWaitTime = 15000, maskError: rawMaskError, } = config.grafserv ?? {};
52
+ const { explain } = config.grafast ?? {};
53
+ const maskError = rawMaskError
54
+ ? makeMaskError(rawMaskError)
55
+ : defaultMaskError;
56
+ const maskPayload = (payload) => {
57
+ if (payload.errors) {
58
+ payload.errors = payload.errors.map(maskError);
59
+ }
60
+ return payload;
61
+ };
62
+ const maskIterator = (result) => {
63
+ return {
64
+ [Symbol.asyncIterator]() {
65
+ return this;
66
+ },
67
+ return(value) {
68
+ return result.return(value);
69
+ },
70
+ throw(e) {
71
+ return result.throw(e);
72
+ },
73
+ async next(...args) {
74
+ const ir = await result.next(...args);
75
+ if (ir.value != null) {
76
+ return {
77
+ done: ir.done,
78
+ value: maskPayload(ir.value),
79
+ };
80
+ }
81
+ else {
82
+ return ir;
83
+ }
84
+ },
85
+ };
86
+ };
87
+ const maskExecutionResult = (result) => {
88
+ if ((0, grafast_1.isAsyncIterable)(result)) {
89
+ return maskIterator(result);
90
+ }
91
+ else {
92
+ return maskPayload(result);
93
+ }
94
+ };
95
+ return {
96
+ outputDataAsString,
97
+ graphqlPath,
98
+ graphqlOverGET,
99
+ graphiql,
100
+ graphiqlOnGraphQLGET,
101
+ graphiqlPath,
102
+ watch,
103
+ eventStreamRoute,
104
+ maxRequestLength,
105
+ explain,
106
+ schemaWaitTime,
107
+ maskError,
108
+ maskPayload,
109
+ maskIterator,
110
+ maskExecutionResult,
111
+ };
112
+ }
113
+ exports.optionsFromConfig = optionsFromConfig;
114
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import type { Express, Request, Response } from "express";
4
+ import type { Server as HTTPServer } from "node:http";
5
+ import type { Server as HTTPSServer } from "node:https";
6
+ import type { GrafservConfig, RequestDigest } from "../../../interfaces.js";
7
+ import type { OptionsFromConfig } from "../../../options.js";
8
+ import { NodeGrafservBase } from "../../node/index.js";
9
+ declare global {
10
+ namespace Grafast {
11
+ interface RequestContext {
12
+ expressv4: {
13
+ req: Request;
14
+ res: Response;
15
+ };
16
+ }
17
+ }
18
+ }
19
+ export declare class ExpressGrafserv extends NodeGrafservBase {
20
+ protected getDigest(dynamicOptions: OptionsFromConfig, req: Request, res: Response): RequestDigest;
21
+ addTo(app: Express, server: HTTPServer | HTTPSServer | null): Promise<void>;
22
+ }
23
+ export declare function grafserv(config: GrafservConfig): ExpressGrafserv;
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/servers/express/v4/index.ts"],"names":[],"mappings":";;AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAM7D,OAAO,EAEL,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,OAAO,CAAC;QAChB,UAAU,cAAc;YACtB,SAAS,EAAE;gBACT,GAAG,EAAE,OAAO,CAAC;gBACb,GAAG,EAAE,QAAQ,CAAC;aACf,CAAC;SACH;KACF;CACF;AAED,qBAAa,eAAgB,SAAQ,gBAAgB;IACnD,SAAS,CAAC,SAAS,CACjB,cAAc,EAAE,iBAAiB,EACjC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,GACZ,aAAa;IA+BV,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI;CAiBlE;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,mBAE9C"}