From 999adf5c778b2e48c48bbd8b6f78ebb808a63b4c Mon Sep 17 00:00:00 2001 From: Trevor Scheer Date: Wed, 8 Jun 2022 13:38:50 -0700 Subject: [PATCH] Remove caching packages (#6541) Remove apollo-server-caching, apollo-server-cache-redis, and apollo-server-cache-memcached packages. We will continue to offer bugfixes for these packages as needed but don't intend to continue active development on them. Our recommendation going forward will be to use the keyv package along with our KeyvAdapter from the @apollo/utils.keyvadapter package. Docs updates to come in a following PR (but coupled with this release). The KeyValueCache interface and InMemoryLRUCache wrapper around lru-cache (as well as a few useful cache wrappers like PrefixingKeyValueCache) will continue to exist in the @apollo/utils.keyvaluecache package. It's worth mentioning that InMemoryLRUCache is on a newer major version of lru-cache which doesn't permit the unbounded behavior which we've had by default. In AS 3.9 you can opt into the bounded cache, and in AS4 it will be the default. --- .codesandbox/ci.json | 3 - CHANGELOG.md | 1 + package-lock.json | 330 +----------------- package.json | 7 - .../apollo-server-cache-memcached/.npmignore | 7 - .../apollo-server-cache-memcached/README.md | 26 -- .../jest.config.js | 3 - .../package.json | 26 -- .../src/__tests__/Memcached.test.ts | 19 - .../src/__tests__/tsconfig.json | 7 - .../src/index.ts | 58 --- .../tsconfig.json | 10 - packages/apollo-server-cache-redis/.npmignore | 7 - packages/apollo-server-cache-redis/README.md | 86 ----- .../apollo-server-cache-redis/jest.config.js | 3 - .../apollo-server-cache-redis/package.json | 26 -- .../src/BaseRedisCache.ts | 112 ------ .../src/RedisCache.ts | 8 - .../src/RedisClusterCache.ts | 21 -- .../src/__tests__/BaseRedisCache.test.ts | 41 --- .../src/__tests__/RedisCache.test.ts | 18 - .../src/__tests__/RedisClusterCache.test.ts | 18 - .../src/__tests__/mockIoredis.ts | 51 --- .../src/__tests__/tsconfig.json | 7 - .../apollo-server-cache-redis/src/index.ts | 3 - .../apollo-server-cache-redis/tsconfig.json | 10 - packages/apollo-server-caching/.gitignore | 1 - packages/apollo-server-caching/.npmignore | 7 - packages/apollo-server-caching/README.md | 52 --- packages/apollo-server-caching/jest.config.js | 3 - packages/apollo-server-caching/package.json | 23 -- .../src/InMemoryLRUCache.ts | 60 ---- .../src/KeyValueCache.ts | 14 - .../src/PrefixingKeyValueCache.ts | 25 -- .../src/__tests__/InMemoryLRUCache.test.ts | 15 - .../__tests__/PrefixingKeyValueCache.test.ts | 14 - .../src/__tests__/tsconfig.json | 7 - packages/apollo-server-caching/src/index.ts | 4 - .../apollo-server-caching/src/testsuite.ts | 56 --- packages/apollo-server-caching/tsconfig.json | 9 - renovate.json5 | 9 - tsconfig.build.json | 3 - tsconfig.test.json | 3 - 43 files changed, 11 insertions(+), 1202 deletions(-) delete mode 100644 packages/apollo-server-cache-memcached/.npmignore delete mode 100644 packages/apollo-server-cache-memcached/README.md delete mode 100644 packages/apollo-server-cache-memcached/jest.config.js delete mode 100644 packages/apollo-server-cache-memcached/package.json delete mode 100644 packages/apollo-server-cache-memcached/src/__tests__/Memcached.test.ts delete mode 100644 packages/apollo-server-cache-memcached/src/__tests__/tsconfig.json delete mode 100644 packages/apollo-server-cache-memcached/src/index.ts delete mode 100644 packages/apollo-server-cache-memcached/tsconfig.json delete mode 100644 packages/apollo-server-cache-redis/.npmignore delete mode 100644 packages/apollo-server-cache-redis/README.md delete mode 100644 packages/apollo-server-cache-redis/jest.config.js delete mode 100644 packages/apollo-server-cache-redis/package.json delete mode 100644 packages/apollo-server-cache-redis/src/BaseRedisCache.ts delete mode 100644 packages/apollo-server-cache-redis/src/RedisCache.ts delete mode 100644 packages/apollo-server-cache-redis/src/RedisClusterCache.ts delete mode 100644 packages/apollo-server-cache-redis/src/__tests__/BaseRedisCache.test.ts delete mode 100644 packages/apollo-server-cache-redis/src/__tests__/RedisCache.test.ts delete mode 100644 packages/apollo-server-cache-redis/src/__tests__/RedisClusterCache.test.ts delete mode 100644 packages/apollo-server-cache-redis/src/__tests__/mockIoredis.ts delete mode 100644 packages/apollo-server-cache-redis/src/__tests__/tsconfig.json delete mode 100644 packages/apollo-server-cache-redis/src/index.ts delete mode 100644 packages/apollo-server-cache-redis/tsconfig.json delete mode 100644 packages/apollo-server-caching/.gitignore delete mode 100644 packages/apollo-server-caching/.npmignore delete mode 100644 packages/apollo-server-caching/README.md delete mode 100644 packages/apollo-server-caching/jest.config.js delete mode 100644 packages/apollo-server-caching/package.json delete mode 100644 packages/apollo-server-caching/src/InMemoryLRUCache.ts delete mode 100644 packages/apollo-server-caching/src/KeyValueCache.ts delete mode 100644 packages/apollo-server-caching/src/PrefixingKeyValueCache.ts delete mode 100644 packages/apollo-server-caching/src/__tests__/InMemoryLRUCache.test.ts delete mode 100644 packages/apollo-server-caching/src/__tests__/PrefixingKeyValueCache.test.ts delete mode 100644 packages/apollo-server-caching/src/__tests__/tsconfig.json delete mode 100644 packages/apollo-server-caching/src/index.ts delete mode 100644 packages/apollo-server-caching/src/testsuite.ts delete mode 100644 packages/apollo-server-caching/tsconfig.json diff --git a/.codesandbox/ci.json b/.codesandbox/ci.json index 49367b08ed7..9d317c61a26 100644 --- a/.codesandbox/ci.json +++ b/.codesandbox/ci.json @@ -6,9 +6,6 @@ "packages/apollo-reporting-protobuf", "packages/apollo-server", "packages/apollo-server-azure-functions", - "packages/apollo-server-cache-memcached", - "packages/apollo-server-cache-redis", - "packages/apollo-server-caching", "packages/apollo-server-cloud-functions", "packages/apollo-server-cloudflare", "packages/apollo-server-core", diff --git a/CHANGELOG.md b/CHANGELOG.md index d5d8aa2233f..f6b2bbce0e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ The version headers in this history reflect the versions of Apollo Server itself - Remove internal dependency on `apollo-server-caching`, switch over to `@apollo/utils.keyvaluecache`. This PR specifically also introduces Keyv as an unbounded cache solution, but will replace with our own simple implementation in a follow-up PR targeting this minor version release. [PR #6522](https://github.com/apollographql/apollo-server/pull/6522) - Remove dependency on `keyv`/`@apollo/utils.keyvadapter` in favor of a simple `Map`-backed cache which implements TTL [PR #6535](https://github.com/apollographql/apollo-server/pull/6535) - Add `cache: "bounded"` configuration option, allowing users to opt into bounded request cache (recommended) [PR #6536](https://github.com/apollographql/apollo-server/pull/6536) +- Remove `apollo-server-caching` and `apollo-server-cache-*` packages [PR #6541](https://github.com/apollographql/apollo-server/pull/6541) ## v3.8.2 diff --git a/package-lock.json b/package-lock.json index 341316ef204..1d76f99ec70 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,9 +14,6 @@ "apollo-reporting-protobuf": "file:packages/apollo-reporting-protobuf", "apollo-server": "file:packages/apollo-server", "apollo-server-azure-functions": "file:packages/apollo-server-azure-functions", - "apollo-server-cache-memcached": "file:packages/apollo-server-cache-memcached", - "apollo-server-cache-redis": "file:packages/apollo-server-cache-redis", - "apollo-server-caching": "file:packages/apollo-server-caching", "apollo-server-cloud-functions": "file:packages/apollo-server-cloud-functions", "apollo-server-cloudflare": "file:packages/apollo-server-cloudflare", "apollo-server-core": "file:packages/apollo-server-core", @@ -54,14 +51,12 @@ "@types/express-serve-static-core": "4.17.29", "@types/fast-json-stable-stringify": "2.0.0", "@types/hapi__hapi": "20.0.12", - "@types/ioredis": "4.28.10", "@types/jest": "28.1.1", "@types/koa-router": "7.4.4", "@types/lodash": "4.14.182", "@types/lodash.sumby": "4.6.7", "@types/lodash.xorby": "4.7.7", "@types/lru-cache": "5.1.1", - "@types/memcached": "2.2.7", "@types/micro": "7.3.7", "@types/node": "12.20.55", "@types/node-fetch": "2.6.1", @@ -88,7 +83,6 @@ "form-data": "4.0.0", "graphql": "15.8.0", "graphql-tag": "2.12.6", - "ioredis": "4.28.5", "jest": "28.1.1", "jest-config": "28.1.1", "jest-junit": "13.2.0", @@ -98,7 +92,6 @@ "koa-router": "10.1.1", "lerna": "4.0.0", "lodash.sumby": "4.6.0", - "memcached-mock": "0.1.0", "mock-req": "0.2.0", "nock": "13.2.7", "node-fetch": "2.6.7", @@ -6655,15 +6648,6 @@ "version": "1.8.0", "license": "MIT" }, - "node_modules/@types/ioredis": { - "version": "4.28.10", - "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz", - "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -6794,15 +6778,6 @@ "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", "dev": true }, - "node_modules/@types/memcached": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.7.tgz", - "integrity": "sha512-ImJbz1i8pl+OnyhYdIDnHe8jAuM8TOwM/7VsciqhYX3IL0jPPUToAtVxklfcWFGYckahEYZxhd9FS0z3MM1dpA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/micro": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/@types/micro/-/micro-7.3.7.tgz", @@ -7312,18 +7287,6 @@ "resolved": "packages/apollo-server-azure-functions", "link": true }, - "node_modules/apollo-server-cache-memcached": { - "resolved": "packages/apollo-server-cache-memcached", - "link": true - }, - "node_modules/apollo-server-cache-redis": { - "resolved": "packages/apollo-server-cache-redis", - "link": true - }, - "node_modules/apollo-server-caching": { - "resolved": "packages/apollo-server-caching", - "link": true - }, "node_modules/apollo-server-cloud-functions": { "resolved": "packages/apollo-server-cloud-functions", "link": true @@ -8602,13 +8565,6 @@ "mimic-response": "^1.0.0" } }, - "node_modules/cluster-key-slot": { - "version": "1.1.0", - "license": "APACHE-2.0", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cmd-shim": { "version": "4.1.0", "dev": true, @@ -8840,10 +8796,6 @@ "node": ">= 0.10.0" } }, - "node_modules/connection-parse": { - "version": "0.0.7", - "license": "MIT" - }, "node_modules/console-control-strings": { "version": "1.1.0", "dev": true, @@ -9737,7 +9689,8 @@ "node_modules/dataloader": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz", - "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==" + "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==", + "dev": true }, "node_modules/date-fns": { "version": "1.30.1", @@ -9889,13 +9842,6 @@ "version": "1.0.0", "license": "MIT" }, - "node_modules/denque": { - "version": "1.5.0", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, "node_modules/depd": { "version": "1.1.2", "license": "MIT", @@ -11841,14 +11787,6 @@ "dev": true, "license": "ISC" }, - "node_modules/hashring": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "connection-parse": "0.0.x", - "simple-lru-cache": "0.0.x" - } - }, "node_modules/header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -12326,52 +12264,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/ioredis": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.28.5.tgz", - "integrity": "sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==", - "dependencies": { - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.1", - "denque": "^1.1.0", - "lodash.defaults": "^4.2.0", - "lodash.flatten": "^4.4.0", - "lodash.isarguments": "^3.1.0", - "p-map": "^2.1.0", - "redis-commands": "1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, - "node_modules/ioredis/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/ioredis/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/ip": { "version": "1.1.5", "dev": true, @@ -12944,18 +12836,6 @@ "dev": true, "license": "MIT" }, - "node_modules/jackpot": { - "version": "0.0.6", - "dependencies": { - "retry": "0.6.0" - } - }, - "node_modules/jackpot/node_modules/retry": { - "version": "0.6.0", - "engines": { - "node": "*" - } - }, "node_modules/jest": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.1.tgz", @@ -15824,14 +15704,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "license": "MIT" - }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -15844,11 +15716,6 @@ "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=", "dev": true }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, "node_modules/lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", @@ -16317,19 +16184,6 @@ "node": ">= 0.6" } }, - "node_modules/memcached": { - "version": "2.2.2", - "license": "MIT", - "dependencies": { - "hashring": "3.2.x", - "jackpot": ">=0.0.6" - } - }, - "node_modules/memcached-mock": { - "version": "0.1.0", - "dev": true, - "license": "MIT" - }, "node_modules/memorizer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/memorizer/-/memorizer-1.0.1.tgz", @@ -17521,6 +17375,7 @@ }, "node_modules/p-map": { "version": "2.1.0", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -18635,27 +18490,6 @@ "node": ">=8" } }, - "node_modules/redis-commands": { - "version": "1.7.0", - "license": "MIT" - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", @@ -19313,9 +19147,6 @@ "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==", "dev": true }, - "node_modules/simple-lru-cache": { - "version": "0.0.2" - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -19599,10 +19430,6 @@ "node": ">=8" } }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "license": "MIT" - }, "node_modules/statuses": { "version": "1.5.0", "license": "MIT", @@ -21343,6 +21170,7 @@ }, "packages/apollo-server-cache-memcached": { "version": "3.3.1", + "extraneous": true, "license": "MIT", "dependencies": { "@apollo/utils.keyvaluecache": "^1.0.1", @@ -21356,6 +21184,7 @@ }, "packages/apollo-server-cache-redis": { "version": "3.3.1", + "extraneous": true, "license": "MIT", "dependencies": { "@apollo/utils.keyvaluecache": "^1.0.1", @@ -21369,6 +21198,7 @@ }, "packages/apollo-server-caching": { "version": "3.3.0", + "extraneous": true, "license": "MIT", "dependencies": { "lru-cache": "^6.0.0" @@ -26713,15 +26543,6 @@ "@types/http-errors": { "version": "1.8.0" }, - "@types/ioredis": { - "version": "4.28.10", - "resolved": "https://registry.npmjs.org/@types/ioredis/-/ioredis-4.28.10.tgz", - "integrity": "sha512-69LyhUgrXdgcNDv7ogs1qXZomnfOEnSmrmMFqKgt1XMJxmoOSG/u3wYy13yACIfKuMJ8IhKgHafDO3sx19zVQQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -26847,15 +26668,6 @@ "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", "dev": true }, - "@types/memcached": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.7.tgz", - "integrity": "sha512-ImJbz1i8pl+OnyhYdIDnHe8jAuM8TOwM/7VsciqhYX3IL0jPPUToAtVxklfcWFGYckahEYZxhd9FS0z3MM1dpA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/micro": { "version": "7.3.7", "resolved": "https://registry.npmjs.org/@types/micro/-/micro-7.3.7.tgz", @@ -27303,30 +27115,6 @@ "apollo-server-types": "file:../apollo-server-types" } }, - "apollo-server-cache-memcached": { - "version": "file:packages/apollo-server-cache-memcached", - "requires": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "apollo-server-caching": "file:../apollo-server-caching", - "apollo-server-env": "file:../apollo-server-env", - "memcached": "^2.2.2" - } - }, - "apollo-server-cache-redis": { - "version": "file:packages/apollo-server-cache-redis", - "requires": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "apollo-server-env": "file:../apollo-server-env", - "dataloader": "^2.0.0", - "ioredis": "^4.17.3" - } - }, - "apollo-server-caching": { - "version": "file:packages/apollo-server-caching", - "requires": { - "lru-cache": "^6.0.0" - } - }, "apollo-server-cloud-functions": { "version": "file:packages/apollo-server-cloud-functions", "requires": { @@ -28408,9 +28196,6 @@ "mimic-response": "^1.0.0" } }, - "cluster-key-slot": { - "version": "1.1.0" - }, "cmd-shim": { "version": "4.1.0", "dev": true, @@ -28593,9 +28378,6 @@ "utils-merge": "1.0.1" } }, - "connection-parse": { - "version": "0.0.7" - }, "console-control-strings": { "version": "1.1.0", "dev": true @@ -29230,7 +29012,8 @@ "dataloader": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.0.0.tgz", - "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==" + "integrity": "sha512-YzhyDAwA4TaQIhM5go+vCLmU0UikghC/t9DTQYZR2M/UvZ1MdOhPezSDZcjj9uqQJOMqjLcpWtyW2iNINdlatQ==", + "dev": true }, "date-fns": { "version": "1.30.1", @@ -29336,9 +29119,6 @@ "delegates": { "version": "1.0.0" }, - "denque": { - "version": "1.5.0" - }, "depd": { "version": "1.1.2" }, @@ -30726,13 +30506,6 @@ "version": "2.0.1", "dev": true }, - "hashring": { - "version": "3.2.0", - "requires": { - "connection-parse": "0.0.x", - "simple-lru-cache": "0.0.x" - } - }, "header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -31059,39 +30832,6 @@ "loose-envify": "^1.0.0" } }, - "ioredis": { - "version": "4.28.5", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.28.5.tgz", - "integrity": "sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==", - "requires": { - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.1", - "denque": "^1.1.0", - "lodash.defaults": "^4.2.0", - "lodash.flatten": "^4.4.0", - "lodash.isarguments": "^3.1.0", - "p-map": "^2.1.0", - "redis-commands": "1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, "ip": { "version": "1.1.5", "dev": true @@ -31478,17 +31218,6 @@ "version": "1.2.2", "dev": true }, - "jackpot": { - "version": "0.0.6", - "requires": { - "retry": "0.6.0" - }, - "dependencies": { - "retry": { - "version": "0.6.0" - } - } - }, "jest": { "version": "28.1.1", "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.1.tgz", @@ -33648,12 +33377,6 @@ "version": "3.0.0", "dev": true }, - "lodash.defaults": { - "version": "4.2.0" - }, - "lodash.flatten": { - "version": "4.4.0" - }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -33666,11 +33389,6 @@ "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=", "dev": true }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, "lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", @@ -34030,17 +33748,6 @@ "media-typer": { "version": "0.3.0" }, - "memcached": { - "version": "2.2.2", - "requires": { - "hashring": "3.2.x", - "jackpot": ">=0.0.6" - } - }, - "memcached-mock": { - "version": "0.1.0", - "dev": true - }, "memorizer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/memorizer/-/memorizer-1.0.1.tgz", @@ -34871,7 +34578,8 @@ } }, "p-map": { - "version": "2.1.0" + "version": "2.1.0", + "dev": true }, "p-map-series": { "version": "2.1.0", @@ -35662,18 +35370,6 @@ "strip-indent": "^3.0.0" } }, - "redis-commands": { - "version": "1.7.0" - }, - "redis-errors": { - "version": "1.2.0" - }, - "redis-parser": { - "version": "3.0.0", - "requires": { - "redis-errors": "^1.0.0" - } - }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", @@ -36154,9 +35850,6 @@ "integrity": "sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww==", "dev": true }, - "simple-lru-cache": { - "version": "0.0.2" - }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -36371,9 +36064,6 @@ } } }, - "standard-as-callback": { - "version": "2.1.0" - }, "statuses": { "version": "1.5.0" }, diff --git a/package.json b/package.json index bf88b8e841d..f25e71831c9 100644 --- a/package.json +++ b/package.json @@ -35,9 +35,6 @@ "apollo-reporting-protobuf": "file:packages/apollo-reporting-protobuf", "apollo-server": "file:packages/apollo-server", "apollo-server-azure-functions": "file:packages/apollo-server-azure-functions", - "apollo-server-cache-memcached": "file:packages/apollo-server-cache-memcached", - "apollo-server-cache-redis": "file:packages/apollo-server-cache-redis", - "apollo-server-caching": "file:packages/apollo-server-caching", "apollo-server-cloud-functions": "file:packages/apollo-server-cloud-functions", "apollo-server-cloudflare": "file:packages/apollo-server-cloudflare", "apollo-server-core": "file:packages/apollo-server-core", @@ -75,14 +72,12 @@ "@types/express-serve-static-core": "4.17.29", "@types/fast-json-stable-stringify": "2.0.0", "@types/hapi__hapi": "20.0.12", - "@types/ioredis": "4.28.10", "@types/jest": "28.1.1", "@types/koa-router": "7.4.4", "@types/lodash": "4.14.182", "@types/lodash.sumby": "4.6.7", "@types/lodash.xorby": "4.7.7", "@types/lru-cache": "5.1.1", - "@types/memcached": "2.2.7", "@types/micro": "7.3.7", "@types/node": "12.20.55", "@types/node-fetch": "2.6.1", @@ -109,7 +104,6 @@ "form-data": "4.0.0", "graphql": "15.8.0", "graphql-tag": "2.12.6", - "ioredis": "4.28.5", "jest": "28.1.1", "jest-config": "28.1.1", "jest-junit": "13.2.0", @@ -119,7 +113,6 @@ "koa-router": "10.1.1", "lerna": "4.0.0", "lodash.sumby": "4.6.0", - "memcached-mock": "0.1.0", "mock-req": "0.2.0", "nock": "13.2.7", "node-fetch": "2.6.7", diff --git a/packages/apollo-server-cache-memcached/.npmignore b/packages/apollo-server-cache-memcached/.npmignore deleted file mode 100644 index 311075fe3ea..00000000000 --- a/packages/apollo-server-cache-memcached/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -* -!src/**/* -src/**/__tests__/** -!dist/**/* -dist/**/__tests__/** -!package.json -!README.md diff --git a/packages/apollo-server-cache-memcached/README.md b/packages/apollo-server-cache-memcached/README.md deleted file mode 100644 index ee8f936d665..00000000000 --- a/packages/apollo-server-cache-memcached/README.md +++ /dev/null @@ -1,26 +0,0 @@ -## MemcachedCache - -[![npm version](https://badge.fury.io/js/apollo-server-cache-memcached.svg)](https://badge.fury.io/js/apollo-server-cache-memcached) -[![Build Status](https://circleci.com/gh/apollographql/apollo-server/tree/main.svg?style=svg)](https://circleci.com/gh/apollographql/apollo-server) - -This package exports an implementation of `KeyValueCache` that allows using Memcached as a backing store for resource caching in [Data Sources](https://www.apollographql.com/docs/apollo-server/v2/features/data-sources.html). - -## Usage - -```js -const { MemcachedCache } = require('apollo-server-cache-memcached'); - -const server = new ApolloServer({ - typeDefs, - resolvers, - cache: new MemcachedCache( - ['memcached-server-1', 'memcached-server-2', 'memcached-server-3'], - { retries: 10, retry: 10000 }, // Options - ), - dataSources: () => ({ - moviesAPI: new MoviesAPI(), - }), -}); -``` - -For documentation of the options you can pass to the underlying memcached client, look [here](https://github.com/3rd-Eden/memcached). diff --git a/packages/apollo-server-cache-memcached/jest.config.js b/packages/apollo-server-cache-memcached/jest.config.js deleted file mode 100644 index a383fbc925f..00000000000 --- a/packages/apollo-server-cache-memcached/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../../jest.config.base'); - -module.exports = Object.assign(Object.create(null), config); diff --git a/packages/apollo-server-cache-memcached/package.json b/packages/apollo-server-cache-memcached/package.json deleted file mode 100644 index 29302cc4caa..00000000000 --- a/packages/apollo-server-cache-memcached/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "apollo-server-cache-memcached", - "version": "3.3.1", - "author": "Apollo ", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/apollographql/apollo-server", - "directory": "packages/apollo-server-cache-memcached" - }, - "homepage": "https://github.com/apollographql/apollo-server#readme", - "bugs": { - "url": "https://github.com/apollographql/apollo-server/issues" - }, - "main": "dist/index.js", - "types": "dist/index.d.ts", - "engines": { - "node": ">=12.0" - }, - "dependencies": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "apollo-server-caching": "file:../apollo-server-caching", - "apollo-server-env": "file:../apollo-server-env", - "memcached": "^2.2.2" - } -} diff --git a/packages/apollo-server-cache-memcached/src/__tests__/Memcached.test.ts b/packages/apollo-server-cache-memcached/src/__tests__/Memcached.test.ts deleted file mode 100644 index f09945630af..00000000000 --- a/packages/apollo-server-cache-memcached/src/__tests__/Memcached.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -// use mock implementations for underlying databases -jest.mock('memcached', () => require('memcached-mock')); - -import { MemcachedCache } from '../index'; -import { runKeyValueCacheTests } from 'apollo-server-caching'; -import FakeTimers from '@sinonjs/fake-timers'; - -describe('Memcached', () => { - it('run apollo-server-caching test suite', async () => { - const cache = new MemcachedCache('localhost'); - const clock = FakeTimers.install(); - try { - await runKeyValueCacheTests(cache, (ms: number) => clock.tick(ms)); - } finally { - clock.uninstall(); - await cache.close(); - } - }); -}); diff --git a/packages/apollo-server-cache-memcached/src/__tests__/tsconfig.json b/packages/apollo-server-cache-memcached/src/__tests__/tsconfig.json deleted file mode 100644 index d7cd9b716cc..00000000000 --- a/packages/apollo-server-cache-memcached/src/__tests__/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../../../tsconfig.test.base", - "include": ["**/*"], - "references": [ - { "path": "../../" }, - ] -} diff --git a/packages/apollo-server-cache-memcached/src/index.ts b/packages/apollo-server-cache-memcached/src/index.ts deleted file mode 100644 index cec2d9899c3..00000000000 --- a/packages/apollo-server-cache-memcached/src/index.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { - KeyValueCache, - KeyValueCacheSetOptions, -} from '@apollo/utils.keyvaluecache'; -import Memcached from 'memcached'; -import { promisify } from 'util'; - -export class MemcachedCache implements KeyValueCache { - // TODO: Replace any with proper promisified type - readonly client: any; - readonly defaultSetOptions: KeyValueCacheSetOptions = { - ttl: 300, - }; - - constructor(serverLocation: Memcached.Location, options?: Memcached.options) { - const client = new Memcached(serverLocation, options); - // promisify client calls for convenience - client.del = promisify(client.del).bind(client); - client.get = promisify(client.get).bind(client); - client.set = promisify(client.set).bind(client); - client.flush = promisify(client.flush).bind(client); - - this.client = client; - } - - async set( - key: string, - value: string, - options?: KeyValueCacheSetOptions, - ): Promise { - const { ttl } = Object.assign({}, this.defaultSetOptions, options); - if (typeof ttl === 'number') { - await this.client.set(key, value, ttl); - } else { - // In Memcached, zero indicates no specific expiration time. Of course, - // it may be purged from the cache for other reasons as deemed necessary. - await this.client.set(key, value, 0); - } - } - - async get(key: string): Promise { - return await this.client.get(key); - } - - async delete(key: string): Promise { - return await this.client.del(key); - } - - // Drops all data from Memcached. This should only be used by test suites --- - // production code should never drop all data from an end user cache. - async flush(): Promise { - await this.client.flush(); - } - - async close(): Promise { - this.client.end(); - } -} diff --git a/packages/apollo-server-cache-memcached/tsconfig.json b/packages/apollo-server-cache-memcached/tsconfig.json deleted file mode 100644 index 98e3dc7fa93..00000000000 --- a/packages/apollo-server-cache-memcached/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.base", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist" - }, - "include": ["src/**/*"], - "exclude": ["**/__tests__"], - "references": [] -} diff --git a/packages/apollo-server-cache-redis/.npmignore b/packages/apollo-server-cache-redis/.npmignore deleted file mode 100644 index 311075fe3ea..00000000000 --- a/packages/apollo-server-cache-redis/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -* -!src/**/* -src/**/__tests__/** -!dist/**/* -dist/**/__tests__/** -!package.json -!README.md diff --git a/packages/apollo-server-cache-redis/README.md b/packages/apollo-server-cache-redis/README.md deleted file mode 100644 index 5185648e778..00000000000 --- a/packages/apollo-server-cache-redis/README.md +++ /dev/null @@ -1,86 +0,0 @@ -## RedisCache - -[![npm version](https://badge.fury.io/js/apollo-server-cache-redis.svg)](https://badge.fury.io/js/apollo-server-cache-redis) -[![Build Status](https://circleci.com/gh/apollographql/apollo-server/tree/main.svg?style=svg)](https://circleci.com/gh/apollographql/apollo-server) - -This package exports an implementation of `KeyValueCache` that allows using Redis as a backing store for resource caching in [Data Sources](https://www.apollographql.com/docs/apollo-server/data/data-sources). - -It currently supports a single instance of Redis, [Cluster](http://redis.io/topics/cluster-tutorial) and [Sentinel](http://redis.io/topics/sentinel). - -## Usage - -This package is built to be compatible with the [ioredis](https://www.npmjs.com/package/ioredis) Redis client. The recommended usage is to use the `BaseRedisCache` class which takes either a `client` option (a client that talks to a single server) or a `noMgetClient` option (a client that talks to Redis Cluster). (The difference is that ioredis [only supports the `mget` multi-get command in non-cluster mode](https://github.com/luin/ioredis/issues/811), so using `noMgetClient` tells `BaseRedisCache` to use parallel `get` commands instead.) - -You may also use the older `RedisCache` and `RedisClusterCache` classes, which allow you to pass the ioredis constructor arguments directly to the cache class's constructor. -### Single instance - -```js -const { BaseRedisCache } = require('apollo-server-cache-redis'); -const Redis = require('ioredis'); - -const server = new ApolloServer({ - typeDefs, - resolvers, - cache: new BaseRedisCache({ - client: new Redis({ - host: 'redis-server', - }), - }), - dataSources: () => ({ - moviesAPI: new MoviesAPI(), - }), -}); -``` - -### Sentinels - -```js -const { BaseRedisCache } = require('apollo-server-cache-redis'); -const Redis = require('ioredis'); - -const server = new ApolloServer({ - typeDefs, - resolvers, - cache: new BaseRedisCache({ - client: new Redis({ - sentinels: [{ - host: 'sentinel-host-01', - port: 26379 - }], - password: 'my_password', - name: 'service_name', - }), - }), - dataSources: () => ({ - moviesAPI: new MoviesAPI(), - }), -}); -``` - -### Cluster - -```js -const { BaseRedisCache } = require('apollo-server-cache-redis'); -const Redis = require('ioredis'); - -const server = new ApolloServer({ - typeDefs, - resolvers, - cache: new BaseRedisCache({ - noMgetClient: new Redis.Cluster( - [{ - host: 'redis-node-01-host', - // Options are passed through to the Redis cluster client - }], - { - // Redis cluster client options - } - ), - }), - dataSources: () => ({ - moviesAPI: new MoviesAPI(), - }), -}); -``` - -For documentation of the options you can pass to the underlying redis client, look [here](https://github.com/luin/ioredis). diff --git a/packages/apollo-server-cache-redis/jest.config.js b/packages/apollo-server-cache-redis/jest.config.js deleted file mode 100644 index a383fbc925f..00000000000 --- a/packages/apollo-server-cache-redis/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../../jest.config.base'); - -module.exports = Object.assign(Object.create(null), config); diff --git a/packages/apollo-server-cache-redis/package.json b/packages/apollo-server-cache-redis/package.json deleted file mode 100644 index 647241d458e..00000000000 --- a/packages/apollo-server-cache-redis/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "apollo-server-cache-redis", - "version": "3.3.1", - "author": "Apollo ", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/apollographql/apollo-server", - "directory": "packages/apollo-server-cache-redis" - }, - "homepage": "https://github.com/apollographql/apollo-server#readme", - "bugs": { - "url": "https://github.com/apollographql/apollo-server/issues" - }, - "main": "dist/index.js", - "types": "dist/index.d.ts", - "engines": { - "node": ">=12.0" - }, - "dependencies": { - "@apollo/utils.keyvaluecache": "^1.0.1", - "apollo-server-env": "file:../apollo-server-env", - "dataloader": "^2.0.0", - "ioredis": "^4.17.3" - } -} diff --git a/packages/apollo-server-cache-redis/src/BaseRedisCache.ts b/packages/apollo-server-cache-redis/src/BaseRedisCache.ts deleted file mode 100644 index 9b375894cbd..00000000000 --- a/packages/apollo-server-cache-redis/src/BaseRedisCache.ts +++ /dev/null @@ -1,112 +0,0 @@ -import type { - KeyValueCache, - KeyValueCacheSetOptions, -} from '@apollo/utils.keyvaluecache'; -import DataLoader from 'dataloader'; - -interface BaseRedisClient { - set: ( - key: string, - value: string, - option?: string, - optionValue?: number, - ) => Promise; - flushdb: () => Promise; - del: (key: string) => Promise; - quit: () => Promise; -} - -export interface RedisClient extends BaseRedisClient { - mget: (...key: Array) => Promise>; -} - -export interface RedisNoMgetClient extends BaseRedisClient { - get: (key: string) => Promise; -} - -/** - * Provide exactly one of the options `client` and `noMgetClient`. `client` is - * a client that supports the `mget` multiple-get command. - * - * ioredis does not support `mget` for cluster mode (see - * https://github.com/luin/ioredis/issues/811), so if you're using cluster mode, - * pass `noMgetClient` instead, which has a `get` method instead of `mget`; - * this package will issue parallel `get` commands instead of a single `mget` - * command if `noMgetClient` is provided. - */ -export interface BaseRedisCacheOptions { - client?: RedisClient; - noMgetClient?: RedisNoMgetClient; -} - -export class BaseRedisCache implements KeyValueCache { - readonly client: BaseRedisClient; - readonly defaultSetOptions: KeyValueCacheSetOptions = { - ttl: 300, - }; - - private loader: DataLoader; - - constructor(options: BaseRedisCacheOptions) { - const { client, noMgetClient } = options; - if (client && noMgetClient) { - throw Error('You may only provide one of `client` and `noMgetClient`'); - } else if (client) { - this.client = client; - this.loader = new DataLoader((keys) => client.mget(...keys), { - cache: false, - }); - } else if (noMgetClient) { - this.client = noMgetClient; - this.loader = new DataLoader( - (keys) => - Promise.all( - keys.map((key) => noMgetClient.get(key).catch(() => null)), - ), - { - cache: false, - }, - ); - } else { - throw Error('You must provide `client` or `noMgetClient`'); - } - } - - async set( - key: string, - value: string, - options?: KeyValueCacheSetOptions, - ): Promise { - const { ttl } = Object.assign({}, this.defaultSetOptions, options); - if (typeof ttl === 'number') { - await this.client.set(key, value, 'EX', ttl); - } else { - // We'll leave out the EXpiration when no value is specified. Of course, - // it may be purged from the cache for other reasons as deemed necessary. - await this.client.set(key, value); - } - } - - async get(key: string): Promise { - const reply = await this.loader.load(key); - if (reply !== null) { - return reply; - } - return; - } - - async delete(key: string): Promise { - return (await this.client.del(key)) > 0; - } - - // Drops all data from Redis. This should only be used by test suites --- - // production code should never drop all data from an end user Redis cache! - async flush(): Promise { - await this.client.flushdb(); - } - - async close(): Promise { - await this.client.quit(); - return; - } -} diff --git a/packages/apollo-server-cache-redis/src/RedisCache.ts b/packages/apollo-server-cache-redis/src/RedisCache.ts deleted file mode 100644 index d7642f9320a..00000000000 --- a/packages/apollo-server-cache-redis/src/RedisCache.ts +++ /dev/null @@ -1,8 +0,0 @@ -import Redis, { RedisOptions } from 'ioredis'; -import { BaseRedisCache } from './BaseRedisCache'; - -export class RedisCache extends BaseRedisCache { - constructor(options?: RedisOptions) { - super({ client: new Redis(options) }); - } -} diff --git a/packages/apollo-server-cache-redis/src/RedisClusterCache.ts b/packages/apollo-server-cache-redis/src/RedisClusterCache.ts deleted file mode 100644 index 46633bfb78c..00000000000 --- a/packages/apollo-server-cache-redis/src/RedisClusterCache.ts +++ /dev/null @@ -1,21 +0,0 @@ -import Redis, { - ClusterOptions, - ClusterNode, - Redis as RedisInstance, -} from 'ioredis'; -import { BaseRedisCache } from './BaseRedisCache'; - -export class RedisClusterCache extends BaseRedisCache { - private readonly clusterClient: Redis.Cluster; - - constructor(nodes: ClusterNode[], options?: ClusterOptions) { - const clusterClient = new Redis.Cluster(nodes, options); - super({ noMgetClient: clusterClient }); - this.clusterClient = clusterClient; - } - - override async flush(): Promise { - const masters = this.clusterClient.nodes('master') || []; - await Promise.all(masters.map((node: RedisInstance) => node.flushdb())); - } -} diff --git a/packages/apollo-server-cache-redis/src/__tests__/BaseRedisCache.test.ts b/packages/apollo-server-cache-redis/src/__tests__/BaseRedisCache.test.ts deleted file mode 100644 index 5ed84a00172..00000000000 --- a/packages/apollo-server-cache-redis/src/__tests__/BaseRedisCache.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { BaseRedisCache, RedisClient } from '../index'; -import { runKeyValueCacheTests } from 'apollo-server-caching'; -import FakeTimers from '@sinonjs/fake-timers'; - -describe('BaseRedisCache', () => { - it('run apollo-server-caching test suite', async () => { - const store: { [key: string]: string } = {}; - const timeouts: NodeJS.Timer[] = []; - const testRedisClient: RedisClient = { - set: jest.fn( - (key: string, value: string, option?: string, ttl?: number) => { - store[key] = value; - if (option === 'EX' && ttl) { - timeouts.push(setTimeout(() => delete store[key], ttl * 1000)); - } - return Promise.resolve(); - }, - ), - mget: jest.fn((...keys) => - Promise.resolve(keys.map((key: string) => store[key])), - ), - flushdb: jest.fn(() => Promise.resolve()), - del: jest.fn((key: string) => { - const keysDeleted = store.hasOwnProperty(key) ? 1 : 0; - delete store[key]; - return Promise.resolve(keysDeleted); - }), - quit: jest.fn(() => Promise.resolve()), - }; - const cache = new BaseRedisCache({ client: testRedisClient }); - const clock = FakeTimers.install(); - - try { - await runKeyValueCacheTests(cache, (ms: number) => clock.tick(ms)); - } finally { - timeouts.forEach((t) => clearTimeout(t)); - clock.uninstall(); - await cache.close(); - } - }); -}); diff --git a/packages/apollo-server-cache-redis/src/__tests__/RedisCache.test.ts b/packages/apollo-server-cache-redis/src/__tests__/RedisCache.test.ts deleted file mode 100644 index 5b8aae4e74e..00000000000 --- a/packages/apollo-server-cache-redis/src/__tests__/RedisCache.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -jest.mock('ioredis', () => require('./mockIoredis')); - -import { RedisCache } from '../index'; -import { runKeyValueCacheTests } from 'apollo-server-caching'; -import FakeTimers from '@sinonjs/fake-timers'; - -describe('Redis', () => { - it('run apollo-server-caching test suite', async () => { - const cache = new RedisCache(); - const clock = FakeTimers.install(); - try { - await runKeyValueCacheTests(cache, (ms: number) => clock.tick(ms)); - } finally { - clock.uninstall(); - await cache.close(); - } - }); -}); diff --git a/packages/apollo-server-cache-redis/src/__tests__/RedisClusterCache.test.ts b/packages/apollo-server-cache-redis/src/__tests__/RedisClusterCache.test.ts deleted file mode 100644 index d65a67563d1..00000000000 --- a/packages/apollo-server-cache-redis/src/__tests__/RedisClusterCache.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -jest.mock('ioredis', () => require('./mockIoredis')); - -import { RedisClusterCache } from '../index'; -import { runKeyValueCacheTests } from 'apollo-server-caching'; -import FakeTimers from '@sinonjs/fake-timers'; - -describe('Redis', () => { - it('run apollo-server-caching test suite', async () => { - const cache = new RedisClusterCache([{ host: 'localhost' }]); - const clock = FakeTimers.install(); - try { - await runKeyValueCacheTests(cache, (ms: number) => clock.tick(ms)); - } finally { - clock.uninstall(); - await cache.close(); - } - }); -}); diff --git a/packages/apollo-server-cache-redis/src/__tests__/mockIoredis.ts b/packages/apollo-server-cache-redis/src/__tests__/mockIoredis.ts deleted file mode 100644 index f2169b18b3d..00000000000 --- a/packages/apollo-server-cache-redis/src/__tests__/mockIoredis.ts +++ /dev/null @@ -1,51 +0,0 @@ -class Redis { - private keyValue = new Map< - string, - { value: string; ttl: number | undefined } - >(); - private timeouts = new Set(); - - async del(key: string) { - const keysDeleted = this.keyValue.has(key) ? 1 : 0; - this.keyValue.delete(key); - return keysDeleted; - } - - async get(key: string) { - return this.keyValue.get(key)?.value; - } - - async mget(...keys: string[]) { - return keys.map((key) => this.keyValue.get(key)?.value); - } - - async set(key: string, value: string, _: string, ttl: number | undefined) { - this.keyValue.set(key, { - value, - ttl, - }); - if (ttl) { - const timeout = setTimeout(() => { - this.timeouts.delete(timeout); - this.del(key); - }, ttl * 1000); - this.timeouts.add(timeout); - } - return true; - } - - nodes() { - return []; - } - - async flushdb() {} - - async quit() { - this.timeouts.forEach((t) => clearTimeout(t)); - } -} - -// Use the same mock as Redis.Cluster. -(Redis as any).Cluster = Redis; - -export default Redis; diff --git a/packages/apollo-server-cache-redis/src/__tests__/tsconfig.json b/packages/apollo-server-cache-redis/src/__tests__/tsconfig.json deleted file mode 100644 index d7cd9b716cc..00000000000 --- a/packages/apollo-server-cache-redis/src/__tests__/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../../../tsconfig.test.base", - "include": ["**/*"], - "references": [ - { "path": "../../" }, - ] -} diff --git a/packages/apollo-server-cache-redis/src/index.ts b/packages/apollo-server-cache-redis/src/index.ts deleted file mode 100644 index 34782f2d488..00000000000 --- a/packages/apollo-server-cache-redis/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { RedisCache } from './RedisCache'; -export { RedisClusterCache } from './RedisClusterCache'; -export { RedisClient, BaseRedisCache } from './BaseRedisCache'; diff --git a/packages/apollo-server-cache-redis/tsconfig.json b/packages/apollo-server-cache-redis/tsconfig.json deleted file mode 100644 index 98e3dc7fa93..00000000000 --- a/packages/apollo-server-cache-redis/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.base", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist" - }, - "include": ["src/**/*"], - "exclude": ["**/__tests__"], - "references": [] -} diff --git a/packages/apollo-server-caching/.gitignore b/packages/apollo-server-caching/.gitignore deleted file mode 100644 index 723ef36f4e4..00000000000 --- a/packages/apollo-server-caching/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.idea \ No newline at end of file diff --git a/packages/apollo-server-caching/.npmignore b/packages/apollo-server-caching/.npmignore deleted file mode 100644 index 311075fe3ea..00000000000 --- a/packages/apollo-server-caching/.npmignore +++ /dev/null @@ -1,7 +0,0 @@ -* -!src/**/* -src/**/__tests__/** -!dist/**/* -dist/**/__tests__/** -!package.json -!README.md diff --git a/packages/apollo-server-caching/README.md b/packages/apollo-server-caching/README.md deleted file mode 100644 index 3017726ec76..00000000000 --- a/packages/apollo-server-caching/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# apollo-server-caching - -[![npm version](https://badge.fury.io/js/apollo-server-caching.svg)](https://badge.fury.io/js/apollo-server-caching) -[![Build Status](https://circleci.com/gh/apollographql/apollo-server/tree/main.svg?style=svg)](https://circleci.com/gh/apollographql/apollo-server) - -## Implementing your own Cache - -Internally, Apollo Server uses the `KeyValueCache` interface to provide a caching store for the Data Sources. An in-memory LRU cache is used by default, and we provide connectors for [Memcached](../apollo-server-cache-memcached)/[Redis](../apollo-server-cache-redis) backends. - -Built with extensibility in mind, you can also implement your own cache to use with Apollo Server, in a way that best suits your application needs. It needs to implement the following interface that can be exported from `apollo-server-caching`: - -```typescript -export interface KeyValueCache { - get(key: string): Promise; - set(key: string, value: string, options?: { ttl?: number }): Promise; -} -``` - -> The `ttl` value for the `set` method's `options` is specified in __seconds__. - -## Testing cache implementations - -### Test helpers - -`apollo-server-caching` exports a function that you can run within a test suite to validate your implementation. It throws on failure. If you want to test expiration, then mock out `Date` and `setTimeout` (probably with `@sinonjs/fake-timers`) and pass a `tick` can be called to advance the fake time. (If you don't pass `tick`, it won't test expiration.) Other than that, it has no dependencies and can work in any test system and shouldn't require any particular build configuration to use from jest. Here's an example of how to use it with jest: - -```typescript -// ../__tests__/YourKeyValueCache.test.ts - -import YourKeyValueCache from '../src/YourKeyValueCache'; -import { runKeyValueCacheTests } from 'apollo-server-caching'; -import FakeTimers from '@sinonjs/fake-timers'; - -describe('YourKeyValueCache', () => { - it('run apollo-server-caching test suite', async () => { - const cache = new YourKeyValueCache(); - const clock = FakeTimers.install(); - try { - await runKeyValueCacheTests(cache, (ms: number) => clock.tick(ms)); - } finally { - clock.uninstall(); - await cache.close(); - } - }); -}); -``` - -For more details, consult the [source for `apollo-server-caching`](./src/testsuite.ts). - -### Running tests - -Run tests with `jest --verbose` diff --git a/packages/apollo-server-caching/jest.config.js b/packages/apollo-server-caching/jest.config.js deleted file mode 100644 index a383fbc925f..00000000000 --- a/packages/apollo-server-caching/jest.config.js +++ /dev/null @@ -1,3 +0,0 @@ -const config = require('../../jest.config.base'); - -module.exports = Object.assign(Object.create(null), config); diff --git a/packages/apollo-server-caching/package.json b/packages/apollo-server-caching/package.json deleted file mode 100644 index b365a34fadc..00000000000 --- a/packages/apollo-server-caching/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "apollo-server-caching", - "version": "3.3.0", - "author": "Apollo ", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/apollographql/apollo-server", - "directory": "packages/apollo-server-caching" - }, - "homepage": "https://github.com/apollographql/apollo-server#readme", - "bugs": { - "url": "https://github.com/apollographql/apollo-server/issues" - }, - "main": "dist/index.js", - "types": "dist/index.d.ts", - "engines": { - "node": ">=12.0" - }, - "dependencies": { - "lru-cache": "^6.0.0" - } -} diff --git a/packages/apollo-server-caching/src/InMemoryLRUCache.ts b/packages/apollo-server-caching/src/InMemoryLRUCache.ts deleted file mode 100644 index fe6fa55ea3a..00000000000 --- a/packages/apollo-server-caching/src/InMemoryLRUCache.ts +++ /dev/null @@ -1,60 +0,0 @@ -import LRUCache from 'lru-cache'; -import type { KeyValueCache } from './KeyValueCache'; - -function defaultLengthCalculation(item: any) { - if (Array.isArray(item) || typeof item === 'string') { - return item.length; - } - - // Go with the lru-cache default "naive" size, in lieu anything better: - // https://github.com/isaacs/node-lru-cache/blob/a71be6cd/index.js#L17 - return 1; -} - -export class InMemoryLRUCache implements KeyValueCache { - private store: LRUCache; - - // TODO: Define reasonable default max size of the cache - constructor({ - maxSize = Infinity, - sizeCalculator = defaultLengthCalculation, - onDispose, - }: { - maxSize?: number; - sizeCalculator?: (value: V, key: string) => number; - onDispose?: (key: string, value: V) => void; - } = {}) { - this.store = new LRUCache({ - max: maxSize, - length: sizeCalculator, - dispose: onDispose, - }); - } - - async get(key: string) { - return this.store.get(key); - } - async set(key: string, value: V, options?: { ttl?: number }) { - const maxAge = options?.ttl && options.ttl * 1000; - this.store.set(key, value, maxAge); - } - async delete(key: string) { - this.store.del(key); - } - - // Drops all data from the cache. This should only be used by test suites --- - // production code should never drop all data from an end user cache. - async flush(): Promise { - this.store.reset(); - } - async getTotalSize() { - return this.store.length; - } - - // This is a size calculator based on the number of bytes in a JSON - // encoding of the stored object. It happens to be what ApolloServer - // uses for its default DocumentStore and may be helpful to others as well. - static jsonBytesSizeCalculator(obj: T): number { - return Buffer.byteLength(JSON.stringify(obj), 'utf8'); - } -} diff --git a/packages/apollo-server-caching/src/KeyValueCache.ts b/packages/apollo-server-caching/src/KeyValueCache.ts deleted file mode 100644 index a9f5f81fcd5..00000000000 --- a/packages/apollo-server-caching/src/KeyValueCache.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** Options for {@link KeyValueCache.set} */ -export interface KeyValueCacheSetOptions { - /** - * Specified in **seconds**, the time-to-live (TTL) value limits the lifespan - * of the data being stored in the cache. - */ - ttl?: number | null; -} - -export interface KeyValueCache { - get(key: string): Promise; - set(key: string, value: V, options?: KeyValueCacheSetOptions): Promise; - delete(key: string): Promise; -} diff --git a/packages/apollo-server-caching/src/PrefixingKeyValueCache.ts b/packages/apollo-server-caching/src/PrefixingKeyValueCache.ts deleted file mode 100644 index 956e47dcf8d..00000000000 --- a/packages/apollo-server-caching/src/PrefixingKeyValueCache.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { KeyValueCache, KeyValueCacheSetOptions } from './KeyValueCache'; - -// PrefixingKeyValueCache wraps another cache and adds a prefix to all keys used -// by all operations. This allows multiple features to share the same -// underlying cache without conflicts. -// -// Note that PrefixingKeyValueCache explicitly does not implement methods like -// flush() that aren't part of KeyValueCache, even though most KeyValueCache -// implementations also have a flush() method. Most implementations of flush() -// send a simple command that wipes the entire backend cache system, which -// wouldn't support "only wipe the part of the cache with this prefix", so -// trying to provide a flush() method here could be confusingly dangerous. -export class PrefixingKeyValueCache implements KeyValueCache { - constructor(private wrapped: KeyValueCache, private prefix: string) {} - - get(key: string) { - return this.wrapped.get(this.prefix + key); - } - set(key: string, value: V, options?: KeyValueCacheSetOptions) { - return this.wrapped.set(this.prefix + key, value, options); - } - delete(key: string) { - return this.wrapped.delete(this.prefix + key); - } -} diff --git a/packages/apollo-server-caching/src/__tests__/InMemoryLRUCache.test.ts b/packages/apollo-server-caching/src/__tests__/InMemoryLRUCache.test.ts deleted file mode 100644 index 69128f9d3e5..00000000000 --- a/packages/apollo-server-caching/src/__tests__/InMemoryLRUCache.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { InMemoryLRUCache } from '../InMemoryLRUCache'; -import { runKeyValueCacheTests } from 'apollo-server-caching'; -import FakeTimers from '@sinonjs/fake-timers'; - -describe('InMemoryLRUCache', () => { - it('run apollo-server-caching test suite', async () => { - const cache = new InMemoryLRUCache(); - const clock = FakeTimers.install(); - try { - await runKeyValueCacheTests(cache, (ms: number) => clock.tick(ms)); - } finally { - clock.uninstall(); - } - }); -}); diff --git a/packages/apollo-server-caching/src/__tests__/PrefixingKeyValueCache.test.ts b/packages/apollo-server-caching/src/__tests__/PrefixingKeyValueCache.test.ts deleted file mode 100644 index ffdb95d9951..00000000000 --- a/packages/apollo-server-caching/src/__tests__/PrefixingKeyValueCache.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { InMemoryLRUCache } from '../InMemoryLRUCache'; -import { PrefixingKeyValueCache } from '../PrefixingKeyValueCache'; - -describe('PrefixingKeyValueCache', () => { - it('prefixes', async () => { - const inner = new InMemoryLRUCache(); - const prefixing = new PrefixingKeyValueCache(inner, 'prefix:'); - await prefixing.set('foo', 'bar'); - expect(await prefixing.get('foo')).toBe('bar'); - expect(await inner.get('prefix:foo')).toBe('bar'); - await prefixing.delete('foo'); - expect(await prefixing.get('foo')).toBe(undefined); - }); -}); diff --git a/packages/apollo-server-caching/src/__tests__/tsconfig.json b/packages/apollo-server-caching/src/__tests__/tsconfig.json deleted file mode 100644 index d7cd9b716cc..00000000000 --- a/packages/apollo-server-caching/src/__tests__/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../../../tsconfig.test.base", - "include": ["**/*"], - "references": [ - { "path": "../../" }, - ] -} diff --git a/packages/apollo-server-caching/src/index.ts b/packages/apollo-server-caching/src/index.ts deleted file mode 100644 index f2bd0641a51..00000000000 --- a/packages/apollo-server-caching/src/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { KeyValueCache, KeyValueCacheSetOptions } from './KeyValueCache'; -export { InMemoryLRUCache } from './InMemoryLRUCache'; -export { PrefixingKeyValueCache } from './PrefixingKeyValueCache'; -export { runKeyValueCacheTests } from './testsuite'; diff --git a/packages/apollo-server-caching/src/testsuite.ts b/packages/apollo-server-caching/src/testsuite.ts deleted file mode 100644 index e1b68184837..00000000000 --- a/packages/apollo-server-caching/src/testsuite.ts +++ /dev/null @@ -1,56 +0,0 @@ -import type { KeyValueCache } from './KeyValueCache'; - -/** - * runKeyValueCacheTests is a function you can call from a test that exercises - * the given KeyValueCache. It throws on failure. If you want to test - * expiration, then mock out `Date` and `setTimeout` (probably with - * `@sinonjs/fake-timers`) and pass a `tick` that can be called to advance the - * fake time. (If you don't pass `tick`, it won't test expiration.) Other than - * that, it has no dependencies and can work in any test system and shouldn't - * require any particular build configuration to use from jest. See the - * README.md for an example of how to use this with jest. - */ -export async function runKeyValueCacheTests( - keyValueCache: KeyValueCache, - tick?: (ms: number) => void, -) { - // can do a basic get and set - await keyValueCache.set('hello', 'world'); - assertEqual(await keyValueCache.get('hello'), 'world'); - assertEqual(await keyValueCache.get('missing'), undefined); - - // can do a basic set and delete - await keyValueCache.set('hello2', 'world'); - assertEqual(await keyValueCache.get('hello2'), 'world'); - await keyValueCache.delete('hello2'); - assertEqual(await keyValueCache.get('hello2'), undefined); - - if (tick) { - // is able to expire keys based on ttl - await keyValueCache.set('short', 's', { ttl: 1 }); - await keyValueCache.set('long', 'l', { ttl: 5 }); - assertEqual(await keyValueCache.get('short'), 's'); - assertEqual(await keyValueCache.get('long'), 'l'); - tick(1500); - assertEqual(await keyValueCache.get('short'), undefined); - assertEqual(await keyValueCache.get('long'), 'l'); - tick(4000); - assertEqual(await keyValueCache.get('short'), undefined); - assertEqual(await keyValueCache.get('long'), undefined); - - // does not expire when ttl is null - await keyValueCache.set('forever', 'yours', { ttl: null }); - assertEqual(await keyValueCache.get('forever'), 'yours'); - tick(1500); - assertEqual(await keyValueCache.get('forever'), 'yours'); - tick(4000); - assertEqual(await keyValueCache.get('forever'), 'yours'); - } -} - -function assertEqual(actual: T, expected: T) { - if (actual === expected) { - return; - } - throw Error(`Expected ${actual} to equal ${expected}`); -} diff --git a/packages/apollo-server-caching/tsconfig.json b/packages/apollo-server-caching/tsconfig.json deleted file mode 100644 index d653fae6503..00000000000 --- a/packages/apollo-server-caching/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.base", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist" - }, - "include": ["src/**/*"], - "exclude": ["**/__tests__"] -} diff --git a/renovate.json5 b/renovate.json5 index 282ed047294..97635e91587 100644 --- a/renovate.json5 +++ b/renovate.json5 @@ -65,15 +65,6 @@ matchBaseBranches: ["main"], allowedVersions: "5.x" }, - // On version-4 we no longer are maintaining specific Redis cache bindings - // (instead we use the Keyv project). So we're not going to make the - // backwards-incompatible v4->v5 upgrade to this Redis library on - // apollo-server-cache-redis in AS3. - { - matchPackageNames: ["ioredis", "@types/ioredis"], - matchBaseBranches: ["main"], - allowedVersions: "4.x" - }, // We've transitioned from lerna to changesets on version-4. We don't need // to take the major upgrade on main. (Plus we can't because it drops Node // 12 support.) diff --git a/tsconfig.build.json b/tsconfig.build.json index 4a081a38182..661bf0efe0f 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -9,9 +9,6 @@ { "path": "./packages/apollo-datasource-rest" }, { "path": "./packages/apollo-server" }, { "path": "./packages/apollo-server-azure-functions" }, - { "path": "./packages/apollo-server-cache-memcached" }, - { "path": "./packages/apollo-server-cache-redis" }, - { "path": "./packages/apollo-server-caching" }, { "path": "./packages/apollo-server-cloud-functions" }, { "path": "./packages/apollo-server-cloudflare" }, { "path": "./packages/apollo-server-core" }, diff --git a/tsconfig.test.json b/tsconfig.test.json index 00f758fc67f..a81b43f1ba3 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -8,9 +8,6 @@ { "path": "./packages/apollo-datasource-rest/src/__tests__/" }, { "path": "./packages/apollo-server/src/__tests__/" }, { "path": "./packages/apollo-server-azure-functions/src/__tests__/" }, - { "path": "./packages/apollo-server-cache-memcached/src/__tests__/" }, - { "path": "./packages/apollo-server-cache-redis/src/__tests__/" }, - { "path": "./packages/apollo-server-caching/src/__tests__/" }, { "path": "./packages/apollo-server-cloud-functions/src/__tests__/" }, { "path": "./packages/apollo-server-core/src/__tests__/" }, { "path": "./packages/apollo-server-core/src/plugin/cacheControl/__tests__/" },