grafserv 0.0.0 → 0.0.1-0.1
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/CHANGELOG.md +23 -0
- package/README.md +42 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces.d.ts +49 -0
- package/dist/interfaces.d.ts.map +1 -0
- package/dist/interfaces.js +4 -0
- package/dist/interfaces.js.map +1 -0
- package/dist/middleware/graphiql.d.ts +4 -0
- package/dist/middleware/graphiql.d.ts.map +1 -0
- package/dist/middleware/graphiql.js +21 -0
- package/dist/middleware/graphiql.js.map +1 -0
- package/dist/middleware/graphql.d.ts +4 -0
- package/dist/middleware/graphql.d.ts.map +1 -0
- package/dist/middleware/graphql.js +119 -0
- package/dist/middleware/graphql.js.map +1 -0
- package/dist/middleware/index.d.ts +12 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +431 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/interfaces.d.ts +40 -0
- package/dist/middleware/interfaces.d.ts.map +1 -0
- package/dist/middleware/interfaces.js +3 -0
- package/dist/middleware/interfaces.js.map +1 -0
- package/package.json +52 -5
- package/index.js +0 -1
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# grafserv
|
|
2
|
+
|
|
3
|
+
## 0.0.1-0.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [[`55f15cf35`](undefined)]:
|
|
8
|
+
- grafast@0.0.1-0.1
|
|
9
|
+
|
|
10
|
+
## 0.0.1-0.0
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- [#125](https://github.com/benjie/postgraphile-private/pull/125)
|
|
15
|
+
[`91f2256b3`](https://github.com/benjie/postgraphile-private/commit/91f2256b3fd699bec19fc86f1ca79df057e58639)
|
|
16
|
+
Thanks [@benjie](https://github.com/benjie)! - Initial changesets release
|
|
17
|
+
|
|
18
|
+
- Updated dependencies
|
|
19
|
+
[[`91f2256b3`](https://github.com/benjie/postgraphile-private/commit/91f2256b3fd699bec19fc86f1ca79df057e58639)]:
|
|
20
|
+
- ruru@2.0.0-0.0
|
|
21
|
+
- @graphile/lru@5.0.0-0.1
|
|
22
|
+
- grafast@0.0.1-0.0
|
|
23
|
+
- graphile-config@0.0.1-0.0
|
package/README.md
CHANGED
|
@@ -1 +1,42 @@
|
|
|
1
|
-
|
|
1
|
+
# grafserv
|
|
2
|
+
|
|
3
|
+
<span class="badge-patreon"><a href="https://patreon.com/benjie" title="Support Graphile development on Patreon"><img src="https://img.shields.io/badge/sponsor-via%20Patreon-orange.svg" alt="Patreon sponsor button" /></a></span>
|
|
4
|
+
[](http://discord.gg/graphile)
|
|
5
|
+
[](https://www.npmjs.com/package/grafserv)
|
|
6
|
+

|
|
7
|
+
[](https://twitter.com/GraphileHQ)
|
|
8
|
+
|
|
9
|
+
_**A highly performant GraphQL server for Node.js, powered by
|
|
10
|
+
[Gra*fast*](https://grafast.org).**_
|
|
11
|
+
|
|
12
|
+
**Documentation**: https://grafast.org/grafserv/
|
|
13
|
+
|
|
14
|
+
<!-- SPONSORS_BEGIN -->
|
|
15
|
+
|
|
16
|
+
## Crowd-funded open-source software
|
|
17
|
+
|
|
18
|
+
To help us develop this software sustainably under the MIT license, we ask all
|
|
19
|
+
individuals and businesses that use it to help support its ongoing maintenance
|
|
20
|
+
and development via sponsorship.
|
|
21
|
+
|
|
22
|
+
### [Click here to find out more about sponsors and sponsorship.](https://www.graphile.org/sponsor/)
|
|
23
|
+
|
|
24
|
+
And please give some love to our featured sponsors 🤩:
|
|
25
|
+
|
|
26
|
+
<table><tr>
|
|
27
|
+
<td align="center"><a href="https://surge.io/"><img src="https://graphile.org/images/sponsors/surge.png" width="90" height="90" alt="Surge" /><br />Surge</a> *</td>
|
|
28
|
+
<td align="center"><a href="https://www.netflix.com/"><img src="https://graphile.org/images/sponsors/Netflix.png" width="90" height="90" alt="Netflix" /><br />Netflix</a> *</td>
|
|
29
|
+
<td align="center"><a href="https://qwick.com/"><img src="https://graphile.org/images/sponsors/qwick.png" width="90" height="90" alt="Qwick" /><br />Qwick</a> *</td>
|
|
30
|
+
<td align="center"><a href="https://www.the-guild.dev/"><img src="https://graphile.org/images/sponsors/theguild.png" width="90" height="90" alt="The Guild" /><br />The Guild</a> *</td>
|
|
31
|
+
</tr><tr>
|
|
32
|
+
<td align="center"><a href="http://chads.website"><img src="https://graphile.org/images/sponsors/chadf.png" width="90" height="90" alt="Chad Furman" /><br />Chad Furman</a> *</td>
|
|
33
|
+
<td align="center"><a href="https://www.fanatics.com/"><img src="https://graphile.org/images/sponsors/fanatics.png" width="90" height="90" alt="Fanatics" /><br />Fanatics</a> *</td>
|
|
34
|
+
<td align="center"><a href="https://dovetailapp.com/"><img src="https://graphile.org/images/sponsors/dovetail.png" width="90" height="90" alt="Dovetail" /><br />Dovetail</a> *</td>
|
|
35
|
+
<td align="center"><a href="https://www.enzuzo.com/"><img src="https://graphile.org/images/sponsors/enzuzo.png" width="90" height="90" alt="Enzuzo" /><br />Enzuzo</a> *</td>
|
|
36
|
+
</tr><tr>
|
|
37
|
+
<td align="center"><a href="https://stellate.co/"><img src="https://graphile.org/images/sponsors/Stellate.png" width="90" height="90" alt="Stellate" /><br />Stellate</a> *</td>
|
|
38
|
+
</tr></table>
|
|
39
|
+
|
|
40
|
+
<em>\* Sponsors the entire Graphile suite</em>
|
|
41
|
+
|
|
42
|
+
<!-- SPONSORS_END -->
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.grafserv = void 0;
|
|
4
|
+
var index_js_1 = require("./middleware/index.js");
|
|
5
|
+
Object.defineProperty(exports, "grafserv", { enumerable: true, get: function () { return index_js_1.grafserv; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,kDAA2D;AAAxC,oGAAA,QAAQ,OAAA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import "graphile-config";
|
|
4
|
+
import type { GraphQLSchema } from "graphql";
|
|
5
|
+
import type { IncomingMessage } from "node:http";
|
|
6
|
+
import type { Socket } from "node:net";
|
|
7
|
+
export declare type ContextCallback = (graphqlRequestContext: GraphileConfig.GraphQLRequestContext) => object;
|
|
8
|
+
export interface ServerParams {
|
|
9
|
+
schema: GraphQLSchema;
|
|
10
|
+
resolvedPreset: GraphileConfig.ResolvedPreset;
|
|
11
|
+
}
|
|
12
|
+
export interface ServerOptions {
|
|
13
|
+
/** Port number to listen on */
|
|
14
|
+
port?: number;
|
|
15
|
+
/** Host to listen on */
|
|
16
|
+
host?: string;
|
|
17
|
+
/** The path at which GraphQL will be available; usually /graphql */
|
|
18
|
+
graphqlPath?: string;
|
|
19
|
+
/** The path at which the GraphQL event stream would be made available; usually /graphql/stream */
|
|
20
|
+
eventStreamRoute?: string;
|
|
21
|
+
graphiql?: boolean;
|
|
22
|
+
/** If true, then we will render GraphiQL on GET requests to the /graphql endpoint */
|
|
23
|
+
graphiqlOnGraphQLGET?: boolean;
|
|
24
|
+
/** The path at which GraphiQL will be available; usually / */
|
|
25
|
+
graphiqlPath?: string;
|
|
26
|
+
/** Set true to enable watch mode */
|
|
27
|
+
watch?: boolean;
|
|
28
|
+
/** The length, in bytes, for the largest request body that the server will accept */
|
|
29
|
+
maxRequestLength?: number;
|
|
30
|
+
}
|
|
31
|
+
declare global {
|
|
32
|
+
namespace GraphileConfig {
|
|
33
|
+
/**
|
|
34
|
+
* Details about the incoming GraphQL request - e.g. if it was sent over an
|
|
35
|
+
* HTTP request, the request itself so headers can be interrogated.
|
|
36
|
+
*
|
|
37
|
+
* It's anticipated this will be expanded via declaration merging, e.g. if
|
|
38
|
+
* your server is Koa then a `koaCtx` might be added.
|
|
39
|
+
*/
|
|
40
|
+
interface GraphQLRequestContext {
|
|
41
|
+
httpRequest?: IncomingMessage;
|
|
42
|
+
socket?: Socket;
|
|
43
|
+
}
|
|
44
|
+
interface Preset {
|
|
45
|
+
server?: ServerOptions;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";;AAAA,OAAO,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,oBAAY,eAAe,GAAG,CAC5B,qBAAqB,EAAE,cAAc,CAAC,qBAAqB,KACxD,MAAM,CAAC;AAEZ,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,EAAE,cAAc,CAAC,cAAc,CAAC;CAC/C;AAED,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kGAAkG;IAClG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qFAAqF;IACrF,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,oCAAoC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,cAAc,CAAC;QACvB;;;;;;WAMG;QACH,UAAU,qBAAqB;YAE7B,WAAW,CAAC,EAAE,eAAe,CAAC;YAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB;QACD,UAAU,MAAM;YACd,MAAM,CAAC,EAAE,aAAa,CAAC;SACxB;KACF;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";;AAAA,2BAAyB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphiql.d.ts","sourceRoot":"","sources":["../../src/middleware/graphiql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMrD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,SACtC,QAAQ,aAAa,CAAC,CAWxC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeGraphiQLHandler = void 0;
|
|
4
|
+
const ruruServer = import("ruru/server");
|
|
5
|
+
let ruruHTML = undefined;
|
|
6
|
+
// TODO: use a specific version of mermaid
|
|
7
|
+
function makeGraphiQLHandler(_params) {
|
|
8
|
+
return async () => {
|
|
9
|
+
if (!ruruHTML) {
|
|
10
|
+
ruruHTML = (await ruruServer).ruruHTML;
|
|
11
|
+
}
|
|
12
|
+
const config = {};
|
|
13
|
+
return {
|
|
14
|
+
statusCode: 200,
|
|
15
|
+
type: "html",
|
|
16
|
+
payload: ruruHTML(config),
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
exports.makeGraphiQLHandler = makeGraphiQLHandler;
|
|
21
|
+
//# sourceMappingURL=graphiql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphiql.js","sourceRoot":"","sources":["../../src/middleware/graphiql.ts"],"names":[],"mappings":";;;AAGA,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;AACzC,IAAI,QAAQ,GAAuD,SAAS,CAAC;AAE7E,0CAA0C;AAC1C,SAAgB,mBAAmB,CAAC,OAAqB;IACvD,OAAO,KAAK,IAA4B,EAAE;QACxC,IAAI,CAAC,QAAQ,EAAE;YACb,QAAQ,GAAG,CAAC,MAAM,UAAU,CAAC,CAAC,QAAQ,CAAC;SACxC;QACD,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,OAAO;YACL,UAAU,EAAE,GAAG;YACf,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC;SAC1B,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAZD,kDAYC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ServerParams } from "../interfaces.js";
|
|
2
|
+
import type { HandlerResult } from "./interfaces.js";
|
|
3
|
+
export declare const makeGraphQLHandler: (params: ServerParams) => (resolvedPreset: GraphileConfig.ResolvedPreset, ctx: GraphileConfig.GraphQLRequestContext, body: unknown) => Promise<HandlerResult>;
|
|
4
|
+
//# sourceMappingURL=graphql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../src/middleware/graphql.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAqErD,eAAO,MAAM,kBAAkB,WAAY,YAAY,sBAMnC,eAAe,cAAc,OACxC,eAAe,qBAAqB,QACnC,OAAO,KACZ,QAAQ,aAAa,CA4DzB,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeGraphQLHandler = void 0;
|
|
4
|
+
const lru_1 = require("@graphile/lru");
|
|
5
|
+
const crypto_1 = require("crypto");
|
|
6
|
+
const grafast_1 = require("grafast");
|
|
7
|
+
const graphql_1 = require("graphql");
|
|
8
|
+
let lastString;
|
|
9
|
+
let lastHash;
|
|
10
|
+
const calculateQueryHash = (queryString) => {
|
|
11
|
+
if (queryString !== lastString) {
|
|
12
|
+
lastString = queryString;
|
|
13
|
+
lastHash = (0, crypto_1.createHash)("sha1").update(queryString).digest("base64");
|
|
14
|
+
}
|
|
15
|
+
return lastHash;
|
|
16
|
+
};
|
|
17
|
+
function makeParseAndValidateFunction(schema) {
|
|
18
|
+
const parseAndValidationCache = new lru_1.LRU({
|
|
19
|
+
maxLength: 500,
|
|
20
|
+
});
|
|
21
|
+
let lastParseAndValidateQuery;
|
|
22
|
+
let lastParseAndValidateResult;
|
|
23
|
+
function parseAndValidate(query) {
|
|
24
|
+
if (lastParseAndValidateQuery === query) {
|
|
25
|
+
return lastParseAndValidateResult;
|
|
26
|
+
}
|
|
27
|
+
const hash = query.length > 500 ? calculateQueryHash(query) : query;
|
|
28
|
+
const cached = parseAndValidationCache.get(hash);
|
|
29
|
+
if (cached) {
|
|
30
|
+
lastParseAndValidateQuery = query;
|
|
31
|
+
lastParseAndValidateResult = cached;
|
|
32
|
+
return cached;
|
|
33
|
+
}
|
|
34
|
+
const source = new graphql_1.Source(query, "GraphQL HTTP Request");
|
|
35
|
+
let document;
|
|
36
|
+
try {
|
|
37
|
+
document = (0, graphql_1.parse)(source);
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
const result = {
|
|
41
|
+
errors: [
|
|
42
|
+
new graphql_1.GraphQLError(e.message, null, undefined, undefined, undefined, e, undefined),
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
parseAndValidationCache.set(hash, result);
|
|
46
|
+
lastParseAndValidateQuery = query;
|
|
47
|
+
lastParseAndValidateResult = result;
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
const errors = (0, graphql_1.validate)(schema, document);
|
|
51
|
+
const result = errors.length
|
|
52
|
+
? { errors }
|
|
53
|
+
: { document };
|
|
54
|
+
parseAndValidationCache.set(hash, result);
|
|
55
|
+
lastParseAndValidateQuery = query;
|
|
56
|
+
lastParseAndValidateResult = result;
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
return parseAndValidate;
|
|
60
|
+
}
|
|
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");
|
|
69
|
+
}
|
|
70
|
+
const { query, variables: variableValues, operationName, } = body;
|
|
71
|
+
if (typeof query !== "string") {
|
|
72
|
+
throw new Error("Invalid query");
|
|
73
|
+
}
|
|
74
|
+
if (typeof operationName !== "string" && operationName != null) {
|
|
75
|
+
throw new Error("Invalid operationName");
|
|
76
|
+
}
|
|
77
|
+
if (variableValues != null && typeof variableValues !== "object") {
|
|
78
|
+
throw new Error("Invalid variables");
|
|
79
|
+
}
|
|
80
|
+
const { errors, document } = parseAndValidate(query);
|
|
81
|
+
if (errors) {
|
|
82
|
+
return { type: "graphql", statusCode: 200, payload: { errors } };
|
|
83
|
+
}
|
|
84
|
+
const args = {
|
|
85
|
+
schema,
|
|
86
|
+
document,
|
|
87
|
+
rootValue: null,
|
|
88
|
+
contextValue: Object.create(null),
|
|
89
|
+
variableValues,
|
|
90
|
+
operationName,
|
|
91
|
+
};
|
|
92
|
+
await (0, grafast_1.hookArgs)(args, ctx, resolvedPreset);
|
|
93
|
+
try {
|
|
94
|
+
const result = await (0, grafast_1.execute)(args, resolvedPreset);
|
|
95
|
+
if ((0, grafast_1.isAsyncIterable)(result)) {
|
|
96
|
+
return {
|
|
97
|
+
type: "graphqlIncremental",
|
|
98
|
+
statusCode: 200,
|
|
99
|
+
iterator: result,
|
|
100
|
+
asString,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return { type: "graphql", statusCode: 200, payload: result, asString };
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
console.error(e);
|
|
107
|
+
return {
|
|
108
|
+
type: "graphql",
|
|
109
|
+
statusCode: 500,
|
|
110
|
+
payload: {
|
|
111
|
+
errors: [new graphql_1.GraphQLError(e.message)],
|
|
112
|
+
extensions: args.rootValue?.[grafast_1.$$extensions],
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
exports.makeGraphQLHandler = makeGraphQLHandler;
|
|
119
|
+
//# sourceMappingURL=graphql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/middleware/graphql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { PromiseOrDirect } from "grafast";
|
|
3
|
+
import type { RequestListener } from "http";
|
|
4
|
+
import type { ServerParams } from "../interfaces.js";
|
|
5
|
+
export interface Grafserv {
|
|
6
|
+
handler: RequestListener;
|
|
7
|
+
release(): Promise<void>;
|
|
8
|
+
onRelease(cb: () => PromiseOrDirect<void>): void;
|
|
9
|
+
setParams(result: ServerParams): void;
|
|
10
|
+
}
|
|
11
|
+
export declare function grafserv(preset: GraphileConfig.Preset, initialParams?: PromiseOrDirect<ServerParams>): Grafserv;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAY,eAAe,EAAqB,MAAM,SAAS,CAAC;AAS5E,OAAO,KAAK,EAAmB,eAAe,EAAkB,MAAM,MAAM,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAmErD,MAAM,WAAW,QAAQ;IAEvB,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,SAAS,CAAC,EAAE,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACjD,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;CACvC;AAED,wBAAgB,QAAQ,CACtB,MAAM,EAAE,cAAc,CAAC,MAAM,EAC7B,aAAa,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,GAC5C,QAAQ,CAibV"}
|
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.grafserv = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const eventemitter3_1 = tslib_1.__importDefault(require("eventemitter3"));
|
|
6
|
+
const grafast_1 = require("grafast");
|
|
7
|
+
const graphile_config_1 = require("graphile-config");
|
|
8
|
+
const graphql_1 = require("graphql");
|
|
9
|
+
const graphiql_js_1 = require("./graphiql.js");
|
|
10
|
+
const graphql_js_1 = require("./graphql.js");
|
|
11
|
+
function getBodyFromRequest(req, maxLength) {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
req.setEncoding("utf8");
|
|
14
|
+
let data = "";
|
|
15
|
+
const handleData = (chunk) => {
|
|
16
|
+
data += chunk;
|
|
17
|
+
if (data.length > maxLength) {
|
|
18
|
+
req.off("end", done);
|
|
19
|
+
req.off("error", reject);
|
|
20
|
+
req.off("data", handleData);
|
|
21
|
+
// TODO: validate this approach
|
|
22
|
+
reject(new Error("Too much data"));
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const done = () => {
|
|
26
|
+
resolve(data);
|
|
27
|
+
};
|
|
28
|
+
req.on("end", done);
|
|
29
|
+
req.on("error", reject);
|
|
30
|
+
req.on("data", handleData);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function handleErrors(payload) {
|
|
34
|
+
if ("errors" in payload && payload.errors) {
|
|
35
|
+
payload.errors = payload.errors.map((e) => {
|
|
36
|
+
const obj = e instanceof graphql_1.GraphQLError
|
|
37
|
+
? e.toJSON()
|
|
38
|
+
: { message: e.message, ...e };
|
|
39
|
+
return Object.assign(obj, {
|
|
40
|
+
message: (0, grafast_1.stripAnsi)(obj.message),
|
|
41
|
+
extensions: { stack: (0, grafast_1.stripAnsi)(e.stack ?? "").split("\n") },
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function optionsFromConfig(config) {
|
|
47
|
+
const { graphqlPath = "/graphql", graphiql = true, graphiqlOnGraphQLGET = true, graphiqlPath = "/", watch = false, eventStreamRoute = "/graphql/stream", maxRequestLength = 100_000, } = config.server ?? {};
|
|
48
|
+
return {
|
|
49
|
+
graphqlPath,
|
|
50
|
+
graphiql,
|
|
51
|
+
graphiqlOnGraphQLGET,
|
|
52
|
+
graphiqlPath,
|
|
53
|
+
watch,
|
|
54
|
+
eventStreamRoute,
|
|
55
|
+
maxRequestLength,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function grafserv(preset, initialParams) {
|
|
59
|
+
/**
|
|
60
|
+
* Mutable options, change them by calling `setParams`. Don't dereference
|
|
61
|
+
* properties as they should be dynamic.
|
|
62
|
+
*/
|
|
63
|
+
const resolvedPreset = (0, graphile_config_1.resolvePresets)([preset]);
|
|
64
|
+
let dynamicOptions = optionsFromConfig(resolvedPreset);
|
|
65
|
+
const sendResult = (res, handlerResult) => {
|
|
66
|
+
switch (handlerResult.type) {
|
|
67
|
+
case "graphql": {
|
|
68
|
+
const { payload, statusCode = 200, asString } = handlerResult;
|
|
69
|
+
handleErrors(payload);
|
|
70
|
+
res.writeHead(statusCode, {
|
|
71
|
+
"Content-Type": "application/json",
|
|
72
|
+
...(dynamicOptions.watch
|
|
73
|
+
? {
|
|
74
|
+
"X-GraphQL-Event-Stream": dynamicOptions.eventStreamRoute,
|
|
75
|
+
}
|
|
76
|
+
: null),
|
|
77
|
+
});
|
|
78
|
+
const payloadString = (0, grafast_1.stringifyPayload)(payload, asString);
|
|
79
|
+
res.end(payloadString);
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
case "graphqlIncremental": {
|
|
83
|
+
const { iterator, statusCode = 200, asString } = handlerResult;
|
|
84
|
+
res.writeHead(statusCode, {
|
|
85
|
+
"Content-Type": 'multipart/mixed; boundary="-"',
|
|
86
|
+
"Transfer-Encoding": "chunked",
|
|
87
|
+
...(dynamicOptions.watch
|
|
88
|
+
? {
|
|
89
|
+
"X-GraphQL-Event-Stream": dynamicOptions.eventStreamRoute,
|
|
90
|
+
}
|
|
91
|
+
: null),
|
|
92
|
+
});
|
|
93
|
+
(async () => {
|
|
94
|
+
// TODO: use manual looping so the iterable can be aborted without awaiting the promise
|
|
95
|
+
try {
|
|
96
|
+
for await (const payload of iterator) {
|
|
97
|
+
handleErrors(payload);
|
|
98
|
+
const payloadString = (0, grafast_1.stringifyPayload)(payload, asString);
|
|
99
|
+
res.write("\r\n---\r\nContent-Type: application/json\r\n\r\n" +
|
|
100
|
+
payloadString);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
res.write("\r\n-----\r\n");
|
|
105
|
+
res.end();
|
|
106
|
+
}
|
|
107
|
+
})().catch((e) => {
|
|
108
|
+
console.error(`Error occurred when streaming result: ${e}`);
|
|
109
|
+
try {
|
|
110
|
+
res.end();
|
|
111
|
+
}
|
|
112
|
+
catch (e2) {
|
|
113
|
+
console.error(`A further error occurred when terminating the request: ${e2}`);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
case "text":
|
|
119
|
+
case "html": {
|
|
120
|
+
const { payload, statusCode = 200 } = handlerResult;
|
|
121
|
+
res.writeHead(statusCode, {
|
|
122
|
+
"Content-Type": handlerResult.type === "html"
|
|
123
|
+
? "text/html; charset=utf-8"
|
|
124
|
+
: "text/plain; charset=utf-8",
|
|
125
|
+
});
|
|
126
|
+
res.end(payload);
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
case "event-stream": {
|
|
130
|
+
const { payload: stream, statusCode = 200 } = handlerResult;
|
|
131
|
+
// Making sure these options are set.
|
|
132
|
+
res.req.socket.setTimeout(0);
|
|
133
|
+
res.req.socket.setNoDelay(true);
|
|
134
|
+
res.req.socket.setKeepAlive(true);
|
|
135
|
+
// Set headers for Server-Sent Events.
|
|
136
|
+
// Don't buffer EventStream in nginx
|
|
137
|
+
res.setHeader("X-Accel-Buffering", "no");
|
|
138
|
+
res.setHeader("Content-Type", "text/event-stream");
|
|
139
|
+
res.setHeader("Cache-Control", "no-cache, no-transform");
|
|
140
|
+
if (res.req.httpVersionMajor >= 2) {
|
|
141
|
+
// NOOP
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
res.setHeader("Connection", "keep-alive");
|
|
145
|
+
}
|
|
146
|
+
res.writeHead(statusCode);
|
|
147
|
+
// Creates a stream for the response
|
|
148
|
+
let stopped = false;
|
|
149
|
+
const send = (event) => {
|
|
150
|
+
if (stopped) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
let payload = "";
|
|
154
|
+
if (event.event) {
|
|
155
|
+
payload += `event: ${event.event}\n`;
|
|
156
|
+
}
|
|
157
|
+
if (event.id) {
|
|
158
|
+
payload += `id: ${event.id}\n`;
|
|
159
|
+
}
|
|
160
|
+
if (event.retry) {
|
|
161
|
+
payload += `retry: ${event.retry}\n`;
|
|
162
|
+
}
|
|
163
|
+
if (event.data != null) {
|
|
164
|
+
payload += `data: ${event.data.replace(/\n/g, "\ndata: ")}\n`;
|
|
165
|
+
}
|
|
166
|
+
payload += "\n";
|
|
167
|
+
res.write(payload);
|
|
168
|
+
// Technically we should see if `.write()` returned false, and if so we
|
|
169
|
+
// should pause the stream. However, since our stream is coming from
|
|
170
|
+
// watch mode, we find it unlikely that a significant amount of data
|
|
171
|
+
// will be buffered (and we don't recommend watch mode in production),
|
|
172
|
+
// so it doesn't feel like we need this currently. If it turns out you
|
|
173
|
+
// need this, a PR would be welcome.
|
|
174
|
+
if (typeof res.flush === "function") {
|
|
175
|
+
// https://github.com/expressjs/compression#server-sent-events
|
|
176
|
+
res.flush();
|
|
177
|
+
}
|
|
178
|
+
else if (typeof res.flushHeaders === "function") {
|
|
179
|
+
res.flushHeaders();
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
// Notify client that connection is open.
|
|
183
|
+
send({ event: "open" });
|
|
184
|
+
// Process stream
|
|
185
|
+
const iterator = stream[Symbol.asyncIterator]();
|
|
186
|
+
const waitNext = () => {
|
|
187
|
+
const n = iterator.next();
|
|
188
|
+
n.then((r) => {
|
|
189
|
+
if (!r.done || r.value) {
|
|
190
|
+
send(r.value);
|
|
191
|
+
}
|
|
192
|
+
if (r.done) {
|
|
193
|
+
res.end();
|
|
194
|
+
cleanup();
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
if (!stopped) {
|
|
199
|
+
waitNext();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}, (error) => {
|
|
203
|
+
console.error("Error occurred processing event stream:", error);
|
|
204
|
+
send({
|
|
205
|
+
event: "error",
|
|
206
|
+
data: JSON.stringify({
|
|
207
|
+
errors: [
|
|
208
|
+
{ message: "Error occurred processing event stream" },
|
|
209
|
+
],
|
|
210
|
+
}),
|
|
211
|
+
});
|
|
212
|
+
res.end();
|
|
213
|
+
cleanup();
|
|
214
|
+
});
|
|
215
|
+
};
|
|
216
|
+
waitNext();
|
|
217
|
+
// Clean up when connection closes.
|
|
218
|
+
const cleanup = () => {
|
|
219
|
+
stopped = true;
|
|
220
|
+
try {
|
|
221
|
+
iterator.return?.();
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
/* nom nom nom */
|
|
225
|
+
}
|
|
226
|
+
res.req.removeListener("close", cleanup);
|
|
227
|
+
res.req.removeListener("finish", cleanup);
|
|
228
|
+
res.req.removeListener("error", cleanup);
|
|
229
|
+
};
|
|
230
|
+
res.req.on("close", cleanup);
|
|
231
|
+
res.req.on("finish", cleanup);
|
|
232
|
+
res.req.on("error", cleanup);
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
default: {
|
|
236
|
+
const never = handlerResult;
|
|
237
|
+
console.error(`Did not understand '${never}' passed to sendResult`);
|
|
238
|
+
res.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" });
|
|
239
|
+
res.end("Unexpected input to sendResult");
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
const makeErrorHandler = (req, res, next) => {
|
|
244
|
+
if (typeof next === "function") {
|
|
245
|
+
return next;
|
|
246
|
+
}
|
|
247
|
+
return (e) => {
|
|
248
|
+
console.error(e);
|
|
249
|
+
sendResult(res, {
|
|
250
|
+
statusCode: 500,
|
|
251
|
+
type: "text",
|
|
252
|
+
payload: "Internal server error",
|
|
253
|
+
});
|
|
254
|
+
};
|
|
255
|
+
};
|
|
256
|
+
const eventEmitter = new eventemitter3_1.default();
|
|
257
|
+
function makeStream() {
|
|
258
|
+
const queue = [];
|
|
259
|
+
let finished = false;
|
|
260
|
+
const bump = () => {
|
|
261
|
+
const next = queue.shift();
|
|
262
|
+
if (next) {
|
|
263
|
+
next.resolve({
|
|
264
|
+
done: false,
|
|
265
|
+
value: { event: "change", data: "schema" },
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
const flushQueue = (e) => {
|
|
270
|
+
const entries = queue.splice(0, queue.length);
|
|
271
|
+
for (const entry of entries) {
|
|
272
|
+
if (e) {
|
|
273
|
+
entry.reject(e);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
entry.resolve({ done: true });
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
eventEmitter.on("newSchema", bump);
|
|
281
|
+
return {
|
|
282
|
+
[Symbol.asyncIterator]() {
|
|
283
|
+
return this;
|
|
284
|
+
},
|
|
285
|
+
next() {
|
|
286
|
+
if (finished) {
|
|
287
|
+
return Promise.resolve({
|
|
288
|
+
done: true,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
return new Promise((resolve, reject) => {
|
|
292
|
+
queue.push({ resolve, reject });
|
|
293
|
+
});
|
|
294
|
+
},
|
|
295
|
+
return() {
|
|
296
|
+
finished = true;
|
|
297
|
+
if (queue.length) {
|
|
298
|
+
flushQueue();
|
|
299
|
+
}
|
|
300
|
+
return Promise.resolve({
|
|
301
|
+
done: true,
|
|
302
|
+
});
|
|
303
|
+
},
|
|
304
|
+
throw(e) {
|
|
305
|
+
if (queue.length) {
|
|
306
|
+
flushQueue(e);
|
|
307
|
+
}
|
|
308
|
+
return Promise.reject(e);
|
|
309
|
+
},
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
function addHandlers(r) {
|
|
313
|
+
eventEmitter.emit("newSchema", r.schema);
|
|
314
|
+
return {
|
|
315
|
+
...r,
|
|
316
|
+
graphqlHandler: (0, graphql_js_1.makeGraphQLHandler)(r),
|
|
317
|
+
graphiqlHandler: (0, graphiql_js_1.makeGraphiQLHandler)(r),
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
let serverParams = initialParams == null
|
|
321
|
+
? (0, grafast_1.defer)()
|
|
322
|
+
: (0, grafast_1.isPromiseLike)(initialParams)
|
|
323
|
+
? initialParams.then(addHandlers)
|
|
324
|
+
: addHandlers(initialParams);
|
|
325
|
+
const middleware = (req, res, next) => {
|
|
326
|
+
const handleError = makeErrorHandler(req, res, next);
|
|
327
|
+
// TODO: consider allowing GraphQL queries over 'GET'
|
|
328
|
+
if (req.url === dynamicOptions.graphqlPath && req.method === "POST") {
|
|
329
|
+
(async () => {
|
|
330
|
+
const bodyRaw = await getBodyFromRequest(req, dynamicOptions.maxRequestLength);
|
|
331
|
+
// TODO: this parsing is unsafe (it doesn't even check the
|
|
332
|
+
// content-type!) - replace it with V4's behaviour
|
|
333
|
+
const body = JSON.parse(bodyRaw);
|
|
334
|
+
const sP = (0, grafast_1.isPromiseLike)(serverParams)
|
|
335
|
+
? await serverParams
|
|
336
|
+
: serverParams;
|
|
337
|
+
const result = await sP.graphqlHandler(resolvedPreset, {
|
|
338
|
+
httpRequest: req,
|
|
339
|
+
}, body);
|
|
340
|
+
sendResult(res, result);
|
|
341
|
+
})().catch((e) => {
|
|
342
|
+
// Special error handling for GraphQL route
|
|
343
|
+
try {
|
|
344
|
+
console.error("An error occurred whilst attempting to handle the GraphQL request:");
|
|
345
|
+
console.dir(e);
|
|
346
|
+
sendResult(res, {
|
|
347
|
+
type: "graphql",
|
|
348
|
+
payload: { errors: [e] },
|
|
349
|
+
statusCode: 500,
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
catch (e2) {
|
|
353
|
+
console.error("An error occurred whilst telling the user than an error occurred:", e2);
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
// TODO: handle 'HEAD' requests
|
|
359
|
+
if (dynamicOptions.graphiql &&
|
|
360
|
+
(req.url === dynamicOptions.graphiqlPath ||
|
|
361
|
+
(dynamicOptions.graphiqlOnGraphQLGET &&
|
|
362
|
+
req.url === dynamicOptions.graphqlPath)) &&
|
|
363
|
+
req.method === "GET") {
|
|
364
|
+
(async () => {
|
|
365
|
+
const sP = (0, grafast_1.isPromiseLike)(serverParams)
|
|
366
|
+
? await serverParams
|
|
367
|
+
: serverParams;
|
|
368
|
+
const result = await sP.graphiqlHandler();
|
|
369
|
+
sendResult(res, result);
|
|
370
|
+
})().catch(handleError);
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
if (dynamicOptions.watch &&
|
|
374
|
+
req.url === dynamicOptions.eventStreamRoute &&
|
|
375
|
+
req.method === "GET") {
|
|
376
|
+
(async () => {
|
|
377
|
+
const stream = makeStream();
|
|
378
|
+
sendResult(res, {
|
|
379
|
+
type: "event-stream",
|
|
380
|
+
payload: stream,
|
|
381
|
+
statusCode: 200,
|
|
382
|
+
});
|
|
383
|
+
})().catch(handleError);
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
// Not handled
|
|
387
|
+
if (next) {
|
|
388
|
+
return next();
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
console.log(`Unhandled ${req.method} to ${req.url}`);
|
|
392
|
+
sendResult(res, {
|
|
393
|
+
type: "text",
|
|
394
|
+
payload: `Could not process ${req.method} request to ${req.url} ─ please POST requests to ${dynamicOptions.graphqlPath}`,
|
|
395
|
+
statusCode: 404,
|
|
396
|
+
});
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
};
|
|
400
|
+
const releaseHandlers = [];
|
|
401
|
+
return {
|
|
402
|
+
handler: middleware,
|
|
403
|
+
async release() {
|
|
404
|
+
for (const handler of releaseHandlers) {
|
|
405
|
+
try {
|
|
406
|
+
await handler();
|
|
407
|
+
}
|
|
408
|
+
catch (e) {
|
|
409
|
+
/* nom nom nom */
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
},
|
|
413
|
+
onRelease(cb) {
|
|
414
|
+
releaseHandlers.push(cb);
|
|
415
|
+
},
|
|
416
|
+
setParams(newParams) {
|
|
417
|
+
const newParamsWithHandlers = addHandlers(newParams);
|
|
418
|
+
if (
|
|
419
|
+
// If serverParams was deferred, resolve it
|
|
420
|
+
serverParams !== null &&
|
|
421
|
+
"resolve" in serverParams &&
|
|
422
|
+
typeof serverParams.resolve === "function") {
|
|
423
|
+
serverParams.resolve(newParamsWithHandlers);
|
|
424
|
+
}
|
|
425
|
+
dynamicOptions = optionsFromConfig(newParams.resolvedPreset);
|
|
426
|
+
serverParams = newParamsWithHandlers;
|
|
427
|
+
},
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
exports.grafserv = grafserv;
|
|
431
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { AsyncExecutionResult, ExecutionResult } from "graphql";
|
|
2
|
+
interface IHandlerResult {
|
|
3
|
+
type: string;
|
|
4
|
+
statusCode?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface HTMLHandlerResult extends IHandlerResult {
|
|
7
|
+
type: "html";
|
|
8
|
+
payload: string;
|
|
9
|
+
}
|
|
10
|
+
export interface TextHandlerResult extends IHandlerResult {
|
|
11
|
+
type: "text";
|
|
12
|
+
payload: string;
|
|
13
|
+
}
|
|
14
|
+
export interface GraphQLHandlerResult extends IHandlerResult {
|
|
15
|
+
type: "graphql";
|
|
16
|
+
payload: ExecutionResult;
|
|
17
|
+
asString?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/** @see {@link https://github.com/glasser/graphql-over-http/blob/dac9638459bb17dd3ade889334fc2fadee9d11e5/rfcs/IncrementalDelivery.md} */
|
|
20
|
+
export interface GraphQLIncrementalHandlerResult extends IHandlerResult {
|
|
21
|
+
type: "graphqlIncremental";
|
|
22
|
+
iterator: AsyncGenerator<AsyncExecutionResult, void, undefined>;
|
|
23
|
+
asString?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface EventStreamEvent {
|
|
26
|
+
/** The name of the event. Use simple names. Don't put newlines in it! */
|
|
27
|
+
event: string;
|
|
28
|
+
/** The data for this event. We'll automatically split this on newlines for you */
|
|
29
|
+
data?: string;
|
|
30
|
+
id?: string;
|
|
31
|
+
/** integer number of milliseconds indicating how long to wait before reconnecting if connection is lost */
|
|
32
|
+
retry?: number;
|
|
33
|
+
}
|
|
34
|
+
export interface EventStreamHeandlerResult extends IHandlerResult {
|
|
35
|
+
type: "event-stream";
|
|
36
|
+
payload: AsyncIterable<EventStreamEvent>;
|
|
37
|
+
}
|
|
38
|
+
export declare type HandlerResult = HTMLHandlerResult | GraphQLHandlerResult | GraphQLIncrementalHandlerResult | TextHandlerResult | EventStreamHeandlerResult;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/middleware/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAErE,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AACD,0IAA0I;AAC1I,MAAM,WAAW,+BAAgC,SAAQ,cAAc;IACrE,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,cAAc,CAAC,oBAAoB,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AACD,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2GAA2G;IAC3G,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,yBAA0B,SAAQ,cAAc;IAC/D,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;CAC1C;AACD,oBAAY,aAAa,GACrB,iBAAiB,GACjB,oBAAoB,GACpB,+BAA+B,GAC/B,iBAAiB,GACjB,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/middleware/interfaces.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,14 +1,61 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "grafserv",
|
|
3
|
-
"version": "0.0.0",
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
3
|
+
"version": "0.0.1-0.1",
|
|
4
|
+
"description": "A highly optimized server for GraphQL, powered by Grafast",
|
|
5
|
+
"type": "commonjs",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
6
14
|
"scripts": {
|
|
7
|
-
"
|
|
15
|
+
"prepack": "tsc -b"
|
|
16
|
+
},
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/graphile/heart.git"
|
|
8
20
|
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"server",
|
|
23
|
+
"grafast",
|
|
24
|
+
"graphql",
|
|
25
|
+
"graphile",
|
|
26
|
+
"fast",
|
|
27
|
+
"graphite"
|
|
28
|
+
],
|
|
9
29
|
"author": "Benjie Gillam <code@benjiegillam.com>",
|
|
10
30
|
"license": "MIT",
|
|
31
|
+
"bugs": {
|
|
32
|
+
"url": "https://github.com/graphile/heart/issues"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/graphile/heart/tree/main/grafast/grafserv",
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@graphile/lru": "^5.0.0-0.1",
|
|
37
|
+
"debug": "^4.1.1",
|
|
38
|
+
"eventemitter3": "^4.0.7",
|
|
39
|
+
"graphile-config": "^0.0.1-0.0",
|
|
40
|
+
"ruru": "^2.0.0-0.0",
|
|
41
|
+
"tslib": "^2.4.0"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=16.10"
|
|
45
|
+
},
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"grafast": "^0.0.1-0.1"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"grafast": "^0.0.1-0.1",
|
|
51
|
+
"jest": "^28.1.0",
|
|
52
|
+
"jest-serializer-graphql-schema": "^5.0.0-0.1",
|
|
53
|
+
"nodemon": "^2.0.15",
|
|
54
|
+
"ts-node": "^10.9.1",
|
|
55
|
+
"typescript": "^4.8.1-rc"
|
|
56
|
+
},
|
|
11
57
|
"files": [
|
|
58
|
+
"dist",
|
|
12
59
|
"index.js"
|
|
13
60
|
]
|
|
14
|
-
}
|
|
61
|
+
}
|
package/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
console.log('Grafast is coming soon!')
|