From 9824def69a1a23f92e5e30c7e11080861d663a03 Mon Sep 17 00:00:00 2001 From: Andrew McGivery Date: Tue, 5 Nov 2024 16:45:40 -0500 Subject: [PATCH 1/8] Added ability to use a custom executor such as graphql-jit --- package-lock.json | 337 ++++++++++++++++++ package.json | 2 + packages/server/src/ApolloServer.ts | 10 + .../server/src/__tests__/ApolloServer.test.ts | 78 ++++ .../server/src/externalTypes/constructor.ts | 3 + .../src/externalTypes/requestPipeline.ts | 12 + packages/server/src/requestPipeline.ts | 3 + 7 files changed, 445 insertions(+) diff --git a/package-lock.json b/package-lock.json index d9cbb4c6c2b..46db264833c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,6 +52,7 @@ "eslint-plugin-import": "2.31.0", "express": "4.21.1", "graphql": "16.9.0", + "graphql-jit": "^0.8.7", "graphql-subscriptions": "2.0.0", "graphql-tag": "2.12.6", "jest": "29.7.0", @@ -69,6 +70,7 @@ "rollup": "3.29.5", "supertest": "7.0.0", "test-listen": "1.1.0", + "tiny-lru": "^11.2.11", "ts-jest": "29.2.5", "typescript": "5.4.5" }, @@ -2532,6 +2534,15 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, "node_modules/@graphql-codegen/cli": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-3.3.1.tgz", @@ -5114,6 +5125,51 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/ansi-colors": { "version": "4.1.3", "dev": true, @@ -8016,6 +8072,49 @@ "version": "2.1.0", "license": "MIT" }, + "node_modules/fast-json-stringify": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.16.1.tgz", + "integrity": "sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==", + "dev": true, + "dependencies": { + "@fastify/merge-json-schemas": "^0.1.0", + "ajv": "^8.10.0", + "ajv-formats": "^3.0.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-json-stringify/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fast-json-stringify/node_modules/ajv/node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, + "node_modules/fast-json-stringify/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/fast-levenshtein": { "version": "2.0.6", "dev": true, @@ -8035,6 +8134,12 @@ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, + "node_modules/fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==", + "dev": true + }, "node_modules/fast-url-parser": { "version": "1.1.3", "dev": true, @@ -8397,6 +8502,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "dependencies": { + "is-property": "^1.0.2" + } + }, "node_modules/gensequence": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-5.0.2.tgz", @@ -8680,6 +8794,32 @@ "graphql": ">=0.11 <=16" } }, + "node_modules/graphql-jit": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/graphql-jit/-/graphql-jit-0.8.7.tgz", + "integrity": "sha512-KGzCrsxQPfEiXOUIJCexWKiWF6ycjO89kAO6SdO8OWRGwYXbG0hsLuTnbFfMq0gj7d7/ib/Gh7jtst7FHZEEjw==", + "dev": true, + "dependencies": { + "@graphql-typed-document-node/core": "^3.2.0", + "fast-json-stringify": "^5.16.1", + "generate-function": "^2.3.1", + "lodash.memoize": "^4.1.2", + "lodash.merge": "4.6.2", + "lodash.mergewith": "4.6.2" + }, + "peerDependencies": { + "graphql": ">=15" + } + }, + "node_modules/graphql-jit/node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "dev": true, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/graphql-request": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-5.1.0.tgz", @@ -9434,6 +9574,12 @@ "node": ">=8" } }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "dev": true + }, "node_modules/is-reference": { "version": "1.2.1", "dev": true, @@ -10407,6 +10553,15 @@ "version": "2.3.1", "license": "MIT" }, + "node_modules/json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + } + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "dev": true, @@ -10686,6 +10841,12 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -12222,6 +12383,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-main-filename": { "version": "2.0.0", "dev": true, @@ -13307,6 +13477,15 @@ "dev": true, "license": "MIT" }, + "node_modules/tiny-lru": { + "version": "11.2.11", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.2.11.tgz", + "integrity": "sha512-27BIW0dIWTYYoWNnqSmoNMKe5WIbkXsc0xaCQHd3/3xT2XMuMJrzHdrO9QBFR14emBz1Bu0dOAs2sCBBrvgPQA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/title-case": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", @@ -16388,6 +16567,15 @@ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true }, + "@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, "@graphql-codegen/cli": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-3.3.1.tgz", @@ -18501,6 +18689,41 @@ "uri-js": "^4.2.2" } }, + "ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, "ansi-colors": { "version": "4.1.3", "dev": true @@ -20574,6 +20797,49 @@ "fast-json-stable-stringify": { "version": "2.1.0" }, + "fast-json-stringify": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-5.16.1.tgz", + "integrity": "sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==", + "dev": true, + "requires": { + "@fastify/merge-json-schemas": "^0.1.0", + "ajv": "^8.10.0", + "ajv-formats": "^3.0.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "json-schema-ref-resolver": "^1.0.1", + "rfdc": "^1.2.0" + }, + "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "dependencies": { + "fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + } + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, "fast-levenshtein": { "version": "2.0.6", "dev": true @@ -20592,6 +20858,12 @@ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, + "fast-uri": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-2.4.0.tgz", + "integrity": "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==", + "dev": true + }, "fast-url-parser": { "version": "1.1.3", "dev": true, @@ -20868,6 +21140,15 @@ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "requires": { + "is-property": "^1.0.2" + } + }, "gensequence": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-5.0.2.tgz", @@ -21045,6 +21326,29 @@ "integrity": "sha512-4Jor+LRbA7SfSaw7dfDUs2UBzvWg3cKrykfHRgKsOIvQaLuf+QOcG2t3Mx5N9GzSNJcuqMqJWz0ta5+BryEmXg==", "requires": {} }, + "graphql-jit": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/graphql-jit/-/graphql-jit-0.8.7.tgz", + "integrity": "sha512-KGzCrsxQPfEiXOUIJCexWKiWF6ycjO89kAO6SdO8OWRGwYXbG0hsLuTnbFfMq0gj7d7/ib/Gh7jtst7FHZEEjw==", + "dev": true, + "requires": { + "@graphql-typed-document-node/core": "^3.2.0", + "fast-json-stringify": "^5.16.1", + "generate-function": "^2.3.1", + "lodash.memoize": "^4.1.2", + "lodash.merge": "4.6.2", + "lodash.mergewith": "4.6.2" + }, + "dependencies": { + "@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "dev": true, + "requires": {} + } + } + }, "graphql-request": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-5.1.0.tgz", @@ -21535,6 +21839,12 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "dev": true + }, "is-reference": { "version": "1.2.1", "dev": true, @@ -22237,6 +22547,15 @@ "json-parse-even-better-errors": { "version": "2.3.1" }, + "json-schema-ref-resolver": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz", + "integrity": "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, "json-schema-traverse": { "version": "0.4.1", "dev": true @@ -22440,6 +22759,12 @@ "version": "4.6.2", "dev": true }, + "lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -23490,6 +23815,12 @@ "require-directory": { "version": "2.1.1" }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "require-main-filename": { "version": "2.0.0", "dev": true @@ -24269,6 +24600,12 @@ "version": "2.3.8", "dev": true }, + "tiny-lru": { + "version": "11.2.11", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.2.11.tgz", + "integrity": "sha512-27BIW0dIWTYYoWNnqSmoNMKe5WIbkXsc0xaCQHd3/3xT2XMuMJrzHdrO9QBFR14emBz1Bu0dOAs2sCBBrvgPQA==", + "dev": true + }, "title-case": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", diff --git a/package.json b/package.json index 1833f15646c..fdd9d8057c6 100644 --- a/package.json +++ b/package.json @@ -80,6 +80,7 @@ "eslint-plugin-import": "2.31.0", "express": "4.21.1", "graphql": "16.9.0", + "graphql-jit": "^0.8.7", "graphql-subscriptions": "2.0.0", "graphql-tag": "2.12.6", "jest": "29.7.0", @@ -97,6 +98,7 @@ "rollup": "3.29.5", "supertest": "7.0.0", "test-listen": "1.1.0", + "tiny-lru": "^11.2.11", "ts-jest": "29.2.5", "typescript": "5.4.5" }, diff --git a/packages/server/src/ApolloServer.ts b/packages/server/src/ApolloServer.ts index 4a9c8d97c9f..5a424812b73 100644 --- a/packages/server/src/ApolloServer.ts +++ b/packages/server/src/ApolloServer.ts @@ -74,6 +74,7 @@ import { UnreachableCaseError } from './utils/UnreachableCaseError.js'; import { computeCoreSchemaHash } from './utils/computeCoreSchemaHash.js'; import { isDefined } from './utils/isDefined.js'; import { SchemaManager } from './utils/schemaManager.js'; +import { GraphQLExecutor } from './externalTypes/requestPipeline.js'; const NoIntrospection: ValidationRule = (context: ValidationContext) => ({ Field(node) { @@ -184,6 +185,7 @@ export interface ApolloServerInternals { stringifyResult: ( value: FormattedExecutionResult, ) => string | Promise; + customExecutor?: GraphQLExecutor; } function defaultLogger(): Logger { @@ -241,6 +243,13 @@ export class ApolloServer { ); } + if (config.gateway && config.customExecutor) { + throw new Error( + 'You cannot specify both config.gateway and config.customExecutor' + + 'because they are mutually exclusive.', + ); + } + const state: ServerState = config.gateway ? // ApolloServer has been initialized but we have not yet tried to load the // schema from the gateway. That will wait until `start()` or @@ -330,6 +339,7 @@ export class ApolloServer { stopOnTerminationSignals: config.stopOnTerminationSignals, gatewayExecutor: null, // set by _start + customExecutor: config.customExecutor, csrfPreventionRequestHeaders: config.csrfPrevention === true || config.csrfPrevention === undefined diff --git a/packages/server/src/__tests__/ApolloServer.test.ts b/packages/server/src/__tests__/ApolloServer.test.ts index 460a7d5cc76..9e97d851857 100644 --- a/packages/server/src/__tests__/ApolloServer.test.ts +++ b/packages/server/src/__tests__/ApolloServer.test.ts @@ -17,6 +17,9 @@ import type { GraphQLResponseBody } from '../externalTypes/graphql'; import { ApolloServerPluginCacheControlDisabled } from '../plugin/disabled/index.js'; import { ApolloServerPluginUsageReporting } from '../plugin/usageReporting/index.js'; import { mockLogger } from './mockLogger.js'; +import { GraphQLExecutor } from '../externalTypes/requestPipeline'; +import { compileQuery, isCompiledQuery } from 'graphql-jit'; +import { lru } from 'tiny-lru'; const typeDefs = gql` type Query { @@ -109,6 +112,27 @@ describe('ApolloServer construction', () => { }).toThrow(); }); + it('throws when both a Gateway and a customExecutor are provided', () => { + const schema = makeExecutableSchema({ typeDefs, resolvers }); + const gateway: GatewayInterface = { + async load() { + return { schema, executor: null }; + }, + async stop() {}, + onSchemaLoadOrUpdate() { + return () => {}; + }, + }; + + const customExecutor: GraphQLExecutor = async () => { + return {}; + }; + + expect(() => new ApolloServer({ gateway, customExecutor })).toThrowError( + 'You cannot specify both config.gateway and config.customExecutor', + ); + }); + it('TypeScript enforces schema-related option combinations', async () => { const schema = makeExecutableSchema({ typeDefs, resolvers }); const gateway: GatewayInterface = { @@ -509,6 +533,60 @@ describe('ApolloServer executeOperation', () => { await server.stop(); }); + it('is able to use a custom executor', async () => { + const executor = ( + schema: GraphQLSchema, + cacheSize = 2014, + compilerOpts = {}, + ) => { + const cache = lru(cacheSize); + return async ({ + contextValue, + document, + operationName, + request, + queryHash, + }: any) => { + const prefix = operationName || 'NotParametrized'; + const cacheKey = `${prefix}-${queryHash}`; + let compiledQuery = cache.get(cacheKey); + if (!compiledQuery) { + const compilationResult = compileQuery( + schema, + document, + operationName || undefined, + compilerOpts, + ); + if (isCompiledQuery(compilationResult)) { + compiledQuery = compilationResult; + cache.set(cacheKey, compiledQuery); + } else { + // ...is ExecutionResult + return compilationResult; + } + } + + return compiledQuery.query( + undefined, + contextValue, + request.variables || {}, + ); + }; + }; + const schema = makeExecutableSchema({ typeDefs, resolvers }); + const server = new ApolloServer({ + schema, + customExecutor: executor(schema), + }); + await server.start(); + + const { body } = await server.executeOperation({ query: '{ hello }' }); + const result = singleResult(body); + expect(result.errors).toBeUndefined(); + expect(result.data?.hello).toBe('world'); + await server.stop(); + }); + it('parse errors', async () => { const server = new ApolloServer({ typeDefs, diff --git a/packages/server/src/externalTypes/constructor.ts b/packages/server/src/externalTypes/constructor.ts index 6d6f354f655..1becd408ad7 100644 --- a/packages/server/src/externalTypes/constructor.ts +++ b/packages/server/src/externalTypes/constructor.ts @@ -20,6 +20,7 @@ import type { GatewayInterface } from '@apollo/server-gateway-interface'; import type { ApolloServerPlugin } from './plugins.js'; import type { BaseContext } from './index.js'; import type { GraphQLExperimentalIncrementalExecutionResults } from '../incrementalDeliveryPolyfill.js'; +import { GraphQLExecutor } from './requestPipeline.js'; export type DocumentStore = KeyValueCache; @@ -116,6 +117,8 @@ interface ApolloServerOptionsBase { // consider undoing the workaround). status400ForVariableCoercionErrors?: boolean; + customExecutor?: GraphQLExecutor; + // For testing only. __testing_incrementalExecutionResults?: GraphQLExperimentalIncrementalExecutionResults; } diff --git a/packages/server/src/externalTypes/requestPipeline.ts b/packages/server/src/externalTypes/requestPipeline.ts index 75445cc7de2..7af284add00 100644 --- a/packages/server/src/externalTypes/requestPipeline.ts +++ b/packages/server/src/externalTypes/requestPipeline.ts @@ -121,3 +121,15 @@ export type GraphQLRequestContextDidEncounterSubsequentErrors< export type GraphQLRequestContextWillSendSubsequentPayload< TContext extends BaseContext, > = GraphQLRequestContextWillSendResponse; + +export type GraphQLExecutionResult = { + data?: Record | null; + errors?: ReadonlyArray; + extensions?: Record; +}; + +export type GraphQLExecutor< + TContext extends BaseContext = Record, +> = ( + requestContext: GraphQLRequestContextExecutionDidStart, +) => Promise; diff --git a/packages/server/src/requestPipeline.ts b/packages/server/src/requestPipeline.ts index b9b4b5542dc..9eb55cff84a 100644 --- a/packages/server/src/requestPipeline.ts +++ b/packages/server/src/requestPipeline.ts @@ -539,6 +539,9 @@ export async function processGraphQLRequest( makeGatewayGraphQLRequestContext(requestContext, server, internals), ); return { singleResult: result }; + } else if (internals.customExecutor) { + const result = await internals.customExecutor(requestContext); + return { singleResult: result }; } else { const resultOrResults = await executeIncrementally({ schema: schemaDerivedData.schema, From 9dd7ce8cb3f19d748b5fa7634cf24eb03f74c277 Mon Sep 17 00:00:00 2001 From: Andrew McGivery Date: Tue, 5 Nov 2024 17:59:47 -0500 Subject: [PATCH 2/8] Added docs --- docs/source/api/apollo-server.mdx | 21 +++++++++ docs/source/performance/custom-executor.mdx | 49 ++++++++++++++++++++ docs/source/performance/graphqljit.png | Bin 0 -> 92170 bytes 3 files changed, 70 insertions(+) create mode 100644 docs/source/performance/custom-executor.mdx create mode 100644 docs/source/performance/graphqljit.png diff --git a/docs/source/api/apollo-server.mdx b/docs/source/api/apollo-server.mdx index e6585ccdf8e..60ff065af5b 100644 --- a/docs/source/api/apollo-server.mdx +++ b/docs/source/api/apollo-server.mdx @@ -421,6 +421,27 @@ You can also manually call `stop()` in other contexts. Note that `stop()` is asy + + + + +###### `customExecutor` + +`Object` + + + + +Apollo Server uses graphql-js behind the scenes when executing graphql queries. +If you would like to use a [custom executor](/apollo-server/performance/custom-executor), such as +[graphql-jit](https://github.com/zalando-incubator/graphql-jit/tree/main), +you can swap in a `customExecutor`. + +Note that this cannot be used when using the `gateway` option. + + + + diff --git a/docs/source/performance/custom-executor.mdx b/docs/source/performance/custom-executor.mdx new file mode 100644 index 00000000000..4f2a317a21d --- /dev/null +++ b/docs/source/performance/custom-executor.mdx @@ -0,0 +1,49 @@ +--- +title: Using a Custom Executor +description: How to configure Apollo Server to use a custom executor +--- + +Apollo Server uses graphql-js behind the scenes when executing graphql queries. +If you would like to use a custom executor, such as +[graphql-jit](https://github.com/zalando-incubator/graphql-jit/tree/main), +you can swap in a `customExecutor`. This can result in significant performance +gains when used in combination with `staticOnly` cache control hints, especially with larger response sizes. + +Note that this cannot be used when using the `gateway` option. + +![graph showing how Apollo Server performance with increasing payload size with various setups](graphqlhit.png) + +## Example using graphql-jit + +```ts +import { compileQuery, isCompiledQuery } from 'graphql-jit'; +import { lru } from 'tiny-lru'; + +const executor = (schema: GraphQLSchema, cacheSize = 2014, compilerOpts = {}) => { + const cache = lru(cacheSize); + return async ({ contextValue, document, operationName, request, queryHash }) => { + const prefix = operationName || 'NotParametrized'; + const cacheKey = `${prefix}-${queryHash}`; + let compiledQuery = cache.get(cacheKey); + if (!compiledQuery) { + const compilationResult = compileQuery(schema, document, operationName || undefined, compilerOpts); + if (isCompiledQuery(compilationResult)) { + compiledQuery = compilationResult; + cache.set(cacheKey, compiledQuery); + } else { + // ...is ExecutionResult + return compilationResult; + } + } + + return compiledQuery.query(undefined, contextValue, request.variables || {}); + }; +}; + +const schema = buildSubgraphSchema([{ typeDefs, resolvers }]); + +const server = new ApolloServer({ + schema, + customExecutor: executor(schema), +}); +``` diff --git a/docs/source/performance/graphqljit.png b/docs/source/performance/graphqljit.png new file mode 100644 index 0000000000000000000000000000000000000000..d94141b3d7dbf812c91375ebaaf5c8e9d5651603 GIT binary patch literal 92170 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 M*V5N4*02uw51b Date: Tue, 5 Nov 2024 18:12:02 -0500 Subject: [PATCH 3/8] Add custom executor doc to sidebar --- docs/source/config.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/config.json b/docs/source/config.json index 8e4be099ff7..fec723ea7fb 100644 --- a/docs/source/config.json +++ b/docs/source/config.json @@ -45,7 +45,8 @@ "Caching": "/performance/caching", "Cache Backends": "/performance/cache-backends", "Response Cache Eviction": "/performance/response-cache-eviction", - "Automatic Persisted Queries": "/performance/apq" + "Automatic Persisted Queries": "/performance/apq", + "Using a Custom Executor": "/performance/custom-executor" }, "Security": { "Authentication and Authorization": "/security/authentication", From 7eb267f4ea9a4a46f74a015f51db6444b06f5d2f Mon Sep 17 00:00:00 2001 From: Andrew McGivery Date: Tue, 5 Nov 2024 18:14:07 -0500 Subject: [PATCH 4/8] Added changeset --- .changeset/good-spies-share.md | 46 ++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 .changeset/good-spies-share.md diff --git a/.changeset/good-spies-share.md b/.changeset/good-spies-share.md new file mode 100644 index 00000000000..b638ccb6260 --- /dev/null +++ b/.changeset/good-spies-share.md @@ -0,0 +1,46 @@ +--- +'@apollo/server': minor +--- + +# Added ability to use a custom executor such as graphql-jit + +Apollo Server uses graphql-js behind the scenes when executing graphql queries. +If you would like to use a custom executor, such as +[graphql-jit](https://github.com/zalando-incubator/graphql-jit/tree/main), +you can swap in a `customExecutor`. This can result in significant performance +gains when used in combination with `staticOnly` cache control hints, especially with larger response sizes. + +Note that this cannot be used when using the `gateway` option. + +```ts +import { compileQuery, isCompiledQuery } from 'graphql-jit'; +import { lru } from 'tiny-lru'; + +const executor = (schema: GraphQLSchema, cacheSize = 2014, compilerOpts = {}) => { + const cache = lru(cacheSize); + return async ({ contextValue, document, operationName, request, queryHash }) => { + const prefix = operationName || 'NotParametrized'; + const cacheKey = `${prefix}-${queryHash}`; + let compiledQuery = cache.get(cacheKey); + if (!compiledQuery) { + const compilationResult = compileQuery(schema, document, operationName || undefined, compilerOpts); + if (isCompiledQuery(compilationResult)) { + compiledQuery = compilationResult; + cache.set(cacheKey, compiledQuery); + } else { + // ...is ExecutionResult + return compilationResult; + } + } + + return compiledQuery.query(undefined, contextValue, request.variables || {}); + }; +}; + +const schema = buildSubgraphSchema([{ typeDefs, resolvers }]); + +const server = new ApolloServer({ + schema, + customExecutor: executor(schema), +}); +``` From 2ce1aef988ee441a0c081dc8482f9b943bc5e5dd Mon Sep 17 00:00:00 2001 From: Andrew McGivery Date: Wed, 6 Nov 2024 11:54:03 -0500 Subject: [PATCH 5/8] Fix eslint issues --- packages/server/src/ApolloServer.ts | 2 +- packages/server/src/externalTypes/constructor.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/ApolloServer.ts b/packages/server/src/ApolloServer.ts index 5a424812b73..f7d6e9c1a9a 100644 --- a/packages/server/src/ApolloServer.ts +++ b/packages/server/src/ApolloServer.ts @@ -74,7 +74,7 @@ import { UnreachableCaseError } from './utils/UnreachableCaseError.js'; import { computeCoreSchemaHash } from './utils/computeCoreSchemaHash.js'; import { isDefined } from './utils/isDefined.js'; import { SchemaManager } from './utils/schemaManager.js'; -import { GraphQLExecutor } from './externalTypes/requestPipeline.js'; +import type { GraphQLExecutor } from './externalTypes/requestPipeline.js'; const NoIntrospection: ValidationRule = (context: ValidationContext) => ({ Field(node) { diff --git a/packages/server/src/externalTypes/constructor.ts b/packages/server/src/externalTypes/constructor.ts index 1becd408ad7..e1bf4cb140b 100644 --- a/packages/server/src/externalTypes/constructor.ts +++ b/packages/server/src/externalTypes/constructor.ts @@ -20,7 +20,7 @@ import type { GatewayInterface } from '@apollo/server-gateway-interface'; import type { ApolloServerPlugin } from './plugins.js'; import type { BaseContext } from './index.js'; import type { GraphQLExperimentalIncrementalExecutionResults } from '../incrementalDeliveryPolyfill.js'; -import { GraphQLExecutor } from './requestPipeline.js'; +import type { GraphQLExecutor } from './requestPipeline.js'; export type DocumentStore = KeyValueCache; From c3a32d053237fa1ac0e5fa1ac475c114bf412692 Mon Sep 17 00:00:00 2001 From: Andrew McGivery Date: Thu, 7 Nov 2024 10:49:32 -0500 Subject: [PATCH 6/8] Remove GraphQLExecutionResult in favor of type from graphql package --- packages/server/src/externalTypes/requestPipeline.ts | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/server/src/externalTypes/requestPipeline.ts b/packages/server/src/externalTypes/requestPipeline.ts index 7af284add00..175e1ce1a6d 100644 --- a/packages/server/src/externalTypes/requestPipeline.ts +++ b/packages/server/src/externalTypes/requestPipeline.ts @@ -14,6 +14,7 @@ import type { Logger } from '@apollo/utils.logger'; import type { KeyValueCache } from '@apollo/utils.keyvaluecache'; import type { DocumentNode, + ExecutionResult, GraphQLError, GraphQLSchema, OperationDefinitionNode, @@ -122,14 +123,8 @@ export type GraphQLRequestContextWillSendSubsequentPayload< TContext extends BaseContext, > = GraphQLRequestContextWillSendResponse; -export type GraphQLExecutionResult = { - data?: Record | null; - errors?: ReadonlyArray; - extensions?: Record; -}; - export type GraphQLExecutor< TContext extends BaseContext = Record, > = ( requestContext: GraphQLRequestContextExecutionDidStart, -) => Promise; +) => Promise; From 24e994615dc7db49d3a04a1d27cf1b03f12bbab6 Mon Sep 17 00:00:00 2001 From: Andrew McGivery Date: Thu, 21 Nov 2024 10:42:01 -0500 Subject: [PATCH 7/8] Remove references to staticOnly since that PR died on impact --- .changeset/good-spies-share.md | 3 +-- docs/source/performance/custom-executor.mdx | 5 +---- docs/source/performance/graphqljit.png | Bin 92170 -> 0 bytes 3 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 docs/source/performance/graphqljit.png diff --git a/.changeset/good-spies-share.md b/.changeset/good-spies-share.md index b638ccb6260..b55f1c0004a 100644 --- a/.changeset/good-spies-share.md +++ b/.changeset/good-spies-share.md @@ -7,8 +7,7 @@ Apollo Server uses graphql-js behind the scenes when executing graphql queries. If you would like to use a custom executor, such as [graphql-jit](https://github.com/zalando-incubator/graphql-jit/tree/main), -you can swap in a `customExecutor`. This can result in significant performance -gains when used in combination with `staticOnly` cache control hints, especially with larger response sizes. +you can swap in a `customExecutor`. This can result in This can result in improved performance. Note that this cannot be used when using the `gateway` option. diff --git a/docs/source/performance/custom-executor.mdx b/docs/source/performance/custom-executor.mdx index 4f2a317a21d..fc3766e0a27 100644 --- a/docs/source/performance/custom-executor.mdx +++ b/docs/source/performance/custom-executor.mdx @@ -6,13 +6,10 @@ description: How to configure Apollo Server to use a custom executor Apollo Server uses graphql-js behind the scenes when executing graphql queries. If you would like to use a custom executor, such as [graphql-jit](https://github.com/zalando-incubator/graphql-jit/tree/main), -you can swap in a `customExecutor`. This can result in significant performance -gains when used in combination with `staticOnly` cache control hints, especially with larger response sizes. +you can swap in a `customExecutor`. This can result in improved performance. Note that this cannot be used when using the `gateway` option. -![graph showing how Apollo Server performance with increasing payload size with various setups](graphqlhit.png) - ## Example using graphql-jit ```ts diff --git a/docs/source/performance/graphqljit.png b/docs/source/performance/graphqljit.png deleted file mode 100644 index d94141b3d7dbf812c91375ebaaf5c8e9d5651603..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92170 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 M*V5N4*02uw51b Date: Thu, 21 Nov 2024 12:38:00 -0500 Subject: [PATCH 8/8] Update example to get schema from request context instead of passing in --- .changeset/good-spies-share.md | 6 +++--- docs/source/performance/custom-executor.mdx | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.changeset/good-spies-share.md b/.changeset/good-spies-share.md index b55f1c0004a..0195588b248 100644 --- a/.changeset/good-spies-share.md +++ b/.changeset/good-spies-share.md @@ -15,9 +15,9 @@ Note that this cannot be used when using the `gateway` option. import { compileQuery, isCompiledQuery } from 'graphql-jit'; import { lru } from 'tiny-lru'; -const executor = (schema: GraphQLSchema, cacheSize = 2014, compilerOpts = {}) => { +const executor = (cacheSize = 2014, compilerOpts = {}) => { const cache = lru(cacheSize); - return async ({ contextValue, document, operationName, request, queryHash }) => { + return async ({ contextValue, document, operationName, request, queryHash, schema }) => { const prefix = operationName || 'NotParametrized'; const cacheKey = `${prefix}-${queryHash}`; let compiledQuery = cache.get(cacheKey); @@ -40,6 +40,6 @@ const schema = buildSubgraphSchema([{ typeDefs, resolvers }]); const server = new ApolloServer({ schema, - customExecutor: executor(schema), + customExecutor: executor(), }); ``` diff --git a/docs/source/performance/custom-executor.mdx b/docs/source/performance/custom-executor.mdx index fc3766e0a27..389c9470104 100644 --- a/docs/source/performance/custom-executor.mdx +++ b/docs/source/performance/custom-executor.mdx @@ -16,9 +16,9 @@ Note that this cannot be used when using the `gateway` option. import { compileQuery, isCompiledQuery } from 'graphql-jit'; import { lru } from 'tiny-lru'; -const executor = (schema: GraphQLSchema, cacheSize = 2014, compilerOpts = {}) => { +const executor = (cacheSize = 2014, compilerOpts = {}) => { const cache = lru(cacheSize); - return async ({ contextValue, document, operationName, request, queryHash }) => { + return async ({ contextValue, document, operationName, request, queryHash, schema }) => { const prefix = operationName || 'NotParametrized'; const cacheKey = `${prefix}-${queryHash}`; let compiledQuery = cache.get(cacheKey); @@ -41,6 +41,6 @@ const schema = buildSubgraphSchema([{ typeDefs, resolvers }]); const server = new ApolloServer({ schema, - customExecutor: executor(schema), + customExecutor: executor(), }); ```