From 19f4ff0b5340ead4b6a117cd334182e9183e8c16 Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Mon, 17 Oct 2022 11:41:24 -0400 Subject: [PATCH 1/3] feat: Update to cache-manager-redis-store ^3.0.0 * Also bump node minor version to be in line with cache-manager-redis-store --- .nvmrc | 2 +- package-lock.json | 276 +++++++++++++++++++++++++--------------------- package.json | 5 +- 3 files changed, 152 insertions(+), 131 deletions(-) diff --git a/.nvmrc b/.nvmrc index d9f88006..94f5f26d 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -16.14.2 +16.18.0 diff --git a/package-lock.json b/package-lock.json index bf71b0fa..7dceac27 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "autolinker": "^3.14.3", "body-parser": "^1.19.0", "cache-manager": "^3.4.4", - "cache-manager-redis-store": "^2.0.0", + "cache-manager-redis-store": "^3.0.1", "commander": "^8.0.0", "comment-json": "^4.1.1", "connect-typeorm": "^2.0.0", @@ -95,7 +95,6 @@ "@tsconfig/node14": "^1.0.0", "@types/async": "^3.2.7", "@types/cache-manager": "^3.4.2", - "@types/cache-manager-redis-store": "^2.0.0", "@types/chai": "^4.3.0", "@types/chai-as-promised": "^7.1.5", "@types/cookie-parser": "^1.4.2", @@ -138,7 +137,7 @@ "typescript-json-schema": "~0.53" }, "engines": { - "node": ">=16" + "node": ">=16.18.0" }, "optionalDependencies": { "better-sqlite3": "^7.5.0", @@ -979,6 +978,59 @@ "resolved": "https://registry.npmjs.org/@nlpjs/slot/-/slot-4.22.17.tgz", "integrity": "sha512-cNYcxf9DKB+fnRa2NxT5wbWq5j57R1WCTXLWI/1Cyycr227IP7GN7qaD4RbkzotBFFB8wm63UHod9frzmuiXxg==" }, + "node_modules/@redis/bloom": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.0.2.tgz", + "integrity": "sha512-EBw7Ag1hPgFzdznK2PBblc1kdlj5B5Cw3XwI9/oG7tSn85/HKy3X9xHy/8tm/eNXJYHLXHJL/pkwBpFMVVefkw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.3.0.tgz", + "integrity": "sha512-XCFV60nloXAefDsPnYMjHGtvbtHR8fV5Om8cQ0JYqTNbWcQo/4AryzJ2luRj4blveWazRK/j40gES8M7Cp6cfQ==", + "dependencies": { + "cluster-key-slot": "1.1.0", + "generic-pool": "3.8.2", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/graph": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.0.1.tgz", + "integrity": "sha512-oDE4myMCJOCVKYMygEMWuriBgqlS5FqdWerikMoJxzmmTUErnTRRgmIDa2VcgytACZMFqpAOWDzops4DOlnkfQ==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", + "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz", + "integrity": "sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.3.tgz", + "integrity": "sha512-OFp0q4SGrTH0Mruf6oFsHGea58u8vS/iI5+NpYdicaM+7BgqBZH8FFvNZ8rYYLrUO/QRqMq72NpXmxLVNcdmjA==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -1163,16 +1215,6 @@ "integrity": "sha512-71aBXoFYXZW4TnDHHH8gExw2lS28BZaWeKefgsiJI7QYZeJfUEbMKw6CQtzGjlYQcGIWwB76hcCrkVA3YHSvsw==", "dev": true }, - "node_modules/@types/cache-manager-redis-store": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/cache-manager-redis-store/-/cache-manager-redis-store-2.0.1.tgz", - "integrity": "sha512-8QuccvcPieh1xM/5kReE76SfdcIdEB0ePc+54ah/NBuK2eG+6O50SX4WKoJX81UxGdW3sh/WlDaDNqjnqxWNsA==", - "dev": true, - "dependencies": { - "@types/cache-manager": "*", - "@types/redis": "^2.8.0" - } - }, "node_modules/@types/cacheable-request": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", @@ -1456,15 +1498,6 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, - "node_modules/@types/redis": { - "version": "2.8.32", - "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.32.tgz", - "integrity": "sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", @@ -2350,14 +2383,14 @@ } }, "node_modules/cache-manager-redis-store": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cache-manager-redis-store/-/cache-manager-redis-store-2.0.0.tgz", - "integrity": "sha512-bWLWlUg6nCYHiJLCCYxY2MgvwvKnvlWwrbuynrzpjEIhfArD2GC9LtutIHFEPeyGVQN6C+WEw+P3r+BFBwhswg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cache-manager-redis-store/-/cache-manager-redis-store-3.0.1.tgz", + "integrity": "sha512-o560kw+dFqusC9lQJhcm6L2F2fMKobJ5af+FoR2PdnMVdpQ3f3Bz6qzvObTGyvoazQJxjQNWgMQeChP4vRTuXQ==", "dependencies": { - "redis": "^3.0.2" + "redis": "^4.3.1" }, "engines": { - "node": ">= 8.3" + "node": ">= 16.18.0" } }, "node_modules/cacheable-lookup": { @@ -2641,6 +2674,14 @@ "mimic-response": "^1.0.0" } }, + "node_modules/cluster-key-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", + "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -3210,14 +3251,6 @@ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "optional": true }, - "node_modules/denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -4166,6 +4199,14 @@ "node": ">=10" } }, + "node_modules/generic-pool": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", + "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==", + "engines": { + "node": ">= 4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7798,45 +7839,16 @@ } }, "node_modules/redis": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", - "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", - "dependencies": { - "denque": "^1.5.0", - "redis-commands": "^1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-redis" - } - }, - "node_modules/redis-commands": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.3.1.tgz", + "integrity": "sha512-cM7yFU5CA6zyCF7N/+SSTcSJQSRMEKN0k0Whhu6J7n9mmXRoXugfWDBo5iOzGwABmsWKSwGPTU5J4Bxbl+0mrA==", "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" + "@redis/bloom": "1.0.2", + "@redis/client": "1.3.0", + "@redis/graph": "1.0.1", + "@redis/json": "1.0.4", + "@redis/search": "1.1.0", + "@redis/time-series": "1.0.3" } }, "node_modules/reflect-metadata": { @@ -11115,6 +11127,46 @@ "resolved": "https://registry.npmjs.org/@nlpjs/slot/-/slot-4.22.17.tgz", "integrity": "sha512-cNYcxf9DKB+fnRa2NxT5wbWq5j57R1WCTXLWI/1Cyycr227IP7GN7qaD4RbkzotBFFB8wm63UHod9frzmuiXxg==" }, + "@redis/bloom": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.0.2.tgz", + "integrity": "sha512-EBw7Ag1hPgFzdznK2PBblc1kdlj5B5Cw3XwI9/oG7tSn85/HKy3X9xHy/8tm/eNXJYHLXHJL/pkwBpFMVVefkw==", + "requires": {} + }, + "@redis/client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.3.0.tgz", + "integrity": "sha512-XCFV60nloXAefDsPnYMjHGtvbtHR8fV5Om8cQ0JYqTNbWcQo/4AryzJ2luRj4blveWazRK/j40gES8M7Cp6cfQ==", + "requires": { + "cluster-key-slot": "1.1.0", + "generic-pool": "3.8.2", + "yallist": "4.0.0" + } + }, + "@redis/graph": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.0.1.tgz", + "integrity": "sha512-oDE4myMCJOCVKYMygEMWuriBgqlS5FqdWerikMoJxzmmTUErnTRRgmIDa2VcgytACZMFqpAOWDzops4DOlnkfQ==", + "requires": {} + }, + "@redis/json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", + "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "requires": {} + }, + "@redis/search": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz", + "integrity": "sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ==", + "requires": {} + }, + "@redis/time-series": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.3.tgz", + "integrity": "sha512-OFp0q4SGrTH0Mruf6oFsHGea58u8vS/iI5+NpYdicaM+7BgqBZH8FFvNZ8rYYLrUO/QRqMq72NpXmxLVNcdmjA==", + "requires": {} + }, "@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -11214,16 +11266,6 @@ "integrity": "sha512-71aBXoFYXZW4TnDHHH8gExw2lS28BZaWeKefgsiJI7QYZeJfUEbMKw6CQtzGjlYQcGIWwB76hcCrkVA3YHSvsw==", "dev": true }, - "@types/cache-manager-redis-store": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/cache-manager-redis-store/-/cache-manager-redis-store-2.0.1.tgz", - "integrity": "sha512-8QuccvcPieh1xM/5kReE76SfdcIdEB0ePc+54ah/NBuK2eG+6O50SX4WKoJX81UxGdW3sh/WlDaDNqjnqxWNsA==", - "dev": true, - "requires": { - "@types/cache-manager": "*", - "@types/redis": "^2.8.0" - } - }, "@types/cacheable-request": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", @@ -11507,15 +11549,6 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, - "@types/redis": { - "version": "2.8.32", - "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.32.tgz", - "integrity": "sha512-7jkMKxcGq9p242exlbsVzuJb57KqHRhNl4dHoQu2Y5v9bCAbtIXXH0R3HleSQW4CTOqpHIYUW3t6tpUj4BVQ+w==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", @@ -12253,11 +12286,11 @@ } }, "cache-manager-redis-store": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cache-manager-redis-store/-/cache-manager-redis-store-2.0.0.tgz", - "integrity": "sha512-bWLWlUg6nCYHiJLCCYxY2MgvwvKnvlWwrbuynrzpjEIhfArD2GC9LtutIHFEPeyGVQN6C+WEw+P3r+BFBwhswg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cache-manager-redis-store/-/cache-manager-redis-store-3.0.1.tgz", + "integrity": "sha512-o560kw+dFqusC9lQJhcm6L2F2fMKobJ5af+FoR2PdnMVdpQ3f3Bz6qzvObTGyvoazQJxjQNWgMQeChP4vRTuXQ==", "requires": { - "redis": "^3.0.2" + "redis": "^4.3.1" } }, "cacheable-lookup": { @@ -12470,6 +12503,11 @@ "mimic-response": "^1.0.0" } }, + "cluster-key-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", + "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==" + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -12933,11 +12971,6 @@ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "optional": true }, - "denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -13675,6 +13708,11 @@ "json-bigint": "^1.0.0" } }, + "generic-pool": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", + "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==" + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -16455,32 +16493,16 @@ } }, "redis": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", - "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", - "requires": { - "denque": "^1.5.0", - "redis-commands": "^1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0" - } - }, - "redis-commands": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" - }, - "redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" - }, - "redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", - "requires": { - "redis-errors": "^1.0.0" + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.3.1.tgz", + "integrity": "sha512-cM7yFU5CA6zyCF7N/+SSTcSJQSRMEKN0k0Whhu6J7n9mmXRoXugfWDBo5iOzGwABmsWKSwGPTU5J4Bxbl+0mrA==", + "requires": { + "@redis/bloom": "1.0.2", + "@redis/client": "1.3.0", + "@redis/graph": "1.0.1", + "@redis/json": "1.0.4", + "@redis/search": "1.1.0", + "@redis/time-series": "1.0.3" } }, "reflect-metadata": { diff --git a/package.json b/package.json index 021285ec..7da09c07 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "initMigration": "npm run typeorm -- migration:generate -t 1642180264563 -d ormconfig.js \"src/Common/Migrations/Database/init\"" }, "engines": { - "node": ">=16" + "node": ">=16.18.0" }, "keywords": [], "author": "", @@ -49,7 +49,7 @@ "autolinker": "^3.14.3", "body-parser": "^1.19.0", "cache-manager": "^3.4.4", - "cache-manager-redis-store": "^2.0.0", + "cache-manager-redis-store": "^3.0.1", "commander": "^8.0.0", "comment-json": "^4.1.1", "connect-typeorm": "^2.0.0", @@ -115,7 +115,6 @@ "@tsconfig/node14": "^1.0.0", "@types/async": "^3.2.7", "@types/cache-manager": "^3.4.2", - "@types/cache-manager-redis-store": "^2.0.0", "@types/chai": "^4.3.0", "@types/chai-as-promised": "^7.1.5", "@types/cookie-parser": "^1.4.2", From acd4b54d8e444b17ce1271c07643a4b70d03b3cc Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Mon, 17 Oct 2022 11:42:39 -0400 Subject: [PATCH 2/3] Implement typings for cache-manager-redis-store@3^ --- src/Common/Typings/support.d.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Common/Typings/support.d.ts b/src/Common/Typings/support.d.ts index 3384a342..7f267809 100644 --- a/src/Common/Typings/support.d.ts +++ b/src/Common/Typings/support.d.ts @@ -163,3 +163,9 @@ declare module 'wink-sentiment' { export default sentiment; } + +declare module 'cache-manager-redis-store' { + import {RedisClientOptions} from "@redis/client"; + import {Cache, CachingConfig} from "cache-manager"; + export async function redisStore(config: RedisClientOptions & Partial): Cache; +} From 9e364c3e28515e7eabe1d959325020c28a0a4da1 Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Mon, 17 Oct 2022 11:42:58 -0400 Subject: [PATCH 3/3] Refactor cache instantiation to use async method --- src/Common/Cache/index.ts | 47 +++++++++++++++++++++++++ src/Subreddit/SubredditResources.ts | 23 ++++++------- src/Web/Client/StorageProvider.ts | 21 ++++++------ src/Web/Client/index.ts | 5 +-- src/util.ts | 53 ++++------------------------- 5 files changed, 79 insertions(+), 70 deletions(-) create mode 100644 src/Common/Cache/index.ts diff --git a/src/Common/Cache/index.ts b/src/Common/Cache/index.ts new file mode 100644 index 00000000..8100ab85 --- /dev/null +++ b/src/Common/Cache/index.ts @@ -0,0 +1,47 @@ +import {CacheOptions} from "../interfaces"; +import cacheManager, {Cache} from "cache-manager"; +import {redisStore} from "cache-manager-redis-store"; +import {create as createMemoryStore} from "../../Utils/memoryStore"; +import {CacheProvider} from "../Infrastructure/Atomic"; +import {cacheOptDefaults} from "../defaults"; + +export const buildCacheOptionsFromProvider = (provider: CacheProvider | any): CacheOptions => { + if (typeof provider === 'string') { + return { + store: provider as CacheProvider, + ...cacheOptDefaults + } + } + return { + store: 'memory', + ...cacheOptDefaults, + ...provider, + } +} +export const createCacheManager = async (options: CacheOptions): Promise => { + const {store, max, ttl = 60, host = 'localhost', port, auth_pass, db, ...rest} = options; + switch (store) { + case 'none': + return cacheManager.caching({store: 'none', max, ttl}); + case 'redis': + const rStore = await redisStore( + { + socket: { + host, + port + }, + password: auth_pass, + database: db, + } + ); + return cacheManager.caching({ + store: rStore, + ttl, + ...rest, + }); + case 'memory': + default: + //return cacheManager.caching({store: 'memory', max, ttl}); + return cacheManager.caching({store: {create: createMemoryStore}, max, ttl, shouldCloneBeforeSet: false}); + } +} diff --git a/src/Subreddit/SubredditResources.ts b/src/Subreddit/SubredditResources.ts index c472206e..0ff756cc 100644 --- a/src/Subreddit/SubredditResources.ts +++ b/src/Subreddit/SubredditResources.ts @@ -14,10 +14,8 @@ import { asActivity, asSubmission, asUserNoteCriteria, - buildCacheOptionsFromProvider, buildCachePrefix, cacheStats, - createCacheManager, escapeRegex, FAIL, fetchExternalResult, @@ -173,6 +171,7 @@ import ConfigParseError from "../Utils/ConfigParseError"; import {ActivityReport} from "../Common/Entities/ActivityReport"; import {ActionResultEntity} from "../Common/Entities/ActionResultEntity"; import {ActivitySource} from "../Common/ActivitySource"; +import {buildCacheOptionsFromProvider, createCacheManager} from "../Common/Cache"; export const DEFAULT_FOOTER = '\r\n*****\r\nThis action was performed by [a bot.]({{botLink}}) Mention a moderator or [send a modmail]({{modmailLink}}) if you have any ideas, questions, or concerns about this action.'; @@ -3545,7 +3544,7 @@ export class BotResourcesManager { authorTTL: number = 10000; enabled: boolean = true; modStreams: Map> = new Map(); - defaultCache: Cache; + defaultCache: Promise; defaultCacheConfig: StrongCache defaultCacheMigrated: boolean = false; cacheType: string = 'none'; @@ -3649,7 +3648,7 @@ export class BotResourcesManager { // }); let opts: SubredditResourceOptions = { - cache: this.defaultCache, + cache: await this.defaultCache, cacheType: this.cacheType, cacheSettingsHash: hash, ttl: this.ttlDefaults, @@ -3680,7 +3679,7 @@ export class BotResourcesManager { trueProvider.prefix = subPrefix; const eventsMax = this.actionedEventsMaxDefault !== undefined ? Math.min(actionedEventsMax, this.actionedEventsMaxDefault) : actionedEventsMax; opts = { - cache: createCacheManager(trueProvider), + cache: await createCacheManager(trueProvider), actionedEventsMax: eventsMax, cacheType: trueProvider.store, cacheSettingsHash: hash, @@ -3695,7 +3694,7 @@ export class BotResourcesManager { await runMigrations(opts.cache, opts.logger, trueProvider.prefix); } } else if(!this.defaultCacheMigrated) { - await runMigrations(this.defaultCache, this.logger, opts.prefix); + await runMigrations(await this.defaultCache, this.logger, opts.prefix); this.defaultCacheMigrated = true; } @@ -3730,7 +3729,7 @@ export class BotResourcesManager { } async getPendingSubredditInvites(): Promise<(string[])> { - const subredditNames = await this.defaultCache.get(`modInvites`); + const subredditNames = await (await this.defaultCache).get(`modInvites`); if (subredditNames !== undefined && subredditNames !== null) { return subredditNames as string[]; } @@ -3741,7 +3740,7 @@ export class BotResourcesManager { if(subreddit === null || subreddit === undefined || subreddit == '') { throw new CMError('Subreddit name cannot be empty'); } - let subredditNames = await this.defaultCache.get(`modInvites`) as (string[] | undefined | null); + let subredditNames = await (await this.defaultCache).get(`modInvites`) as (string[] | undefined | null); if (subredditNames === undefined || subredditNames === null) { subredditNames = []; } @@ -3751,22 +3750,22 @@ export class BotResourcesManager { throw new CMError(`An invite for the Subreddit '${subreddit}' already exists`); } subredditNames.push(cleanName); - await this.defaultCache.set(`modInvites`, subredditNames, {ttl: 0}); + await (await this.defaultCache).set(`modInvites`, subredditNames, {ttl: 0}); return; } async deletePendingSubredditInvite(subreddit: string): Promise { - let subredditNames = await this.defaultCache.get(`modInvites`) as (string[] | undefined | null); + let subredditNames = await (await this.defaultCache).get(`modInvites`) as (string[] | undefined | null); if (subredditNames === undefined || subredditNames === null) { subredditNames = []; } subredditNames = subredditNames.filter(x => x.toLowerCase() !== subreddit.trim().toLowerCase()); - await this.defaultCache.set(`modInvites`, subredditNames, {ttl: 0}); + await (await this.defaultCache).set(`modInvites`, subredditNames, {ttl: 0}); return; } async clearPendingSubredditInvites(): Promise { - await this.defaultCache.del(`modInvites`); + await (await this.defaultCache).del(`modInvites`); return; } } diff --git a/src/Web/Client/StorageProvider.ts b/src/Web/Client/StorageProvider.ts index 687cb9b8..ee545ba4 100644 --- a/src/Web/Client/StorageProvider.ts +++ b/src/Web/Client/StorageProvider.ts @@ -1,7 +1,7 @@ import {SessionOptions, Store} from "express-session"; import {TypeormStore} from "connect-typeorm"; import {InviteData} from "../Common/interfaces"; -import {buildCachePrefix, createCacheManager, mergeArr} from "../../util"; +import {buildCachePrefix, mergeArr} from "../../util"; import {Cache} from "cache-manager"; // @ts-ignore import CacheManagerStore from 'express-session-cache-manager' @@ -11,6 +11,7 @@ import {ClientSession} from "../../Common/WebEntities/ClientSession"; import {Logger} from "winston"; import {WebSetting} from "../../Common/WebEntities/WebSetting"; import {ErrorWithCause} from "pony-cause"; +import {createCacheManager} from "../../Common/Cache"; export interface CacheManagerStoreOptions { prefix?: string @@ -24,7 +25,7 @@ export type TypeormStoreOptions = Partial; interface IWebStorageProvider { - createSessionStore(options?: CacheManagerStoreOptions | TypeormStoreOptions): Store + createSessionStore(options?: CacheManagerStoreOptions | TypeormStoreOptions): Promise getSessionSecret(): Promise @@ -48,7 +49,7 @@ abstract class StorageProvider implements IWebStorageProvider { this.logger = logger.child({labels: ['Web', 'Storage', ...loggerLabels]}, mergeArr); } - abstract createSessionStore(options?: CacheManagerStoreOptions | TypeormStoreOptions): Store; + abstract createSessionStore(options?: CacheManagerStoreOptions | TypeormStoreOptions): Promise; abstract getSessionSecret(): Promise; @@ -57,24 +58,24 @@ abstract class StorageProvider implements IWebStorageProvider { export class CacheStorageProvider extends StorageProvider { - protected cache: Cache; + protected cache: Promise; constructor(caching: CacheOptions & StorageProviderOptions) { super(caching); const {logger, invitesMaxAge, loggerLabels, ...restCache } = caching; - this.cache = createCacheManager({...restCache, prefix: buildCachePrefix(['web'])}) as Cache; + this.cache = createCacheManager({...restCache, prefix: buildCachePrefix(['web'])}) as Promise; this.logger.debug('Using CACHE'); if (caching.store === 'none') { this.logger.warn(`Using 'none' as cache provider means no one will be able to access the interface since sessions will never be persisted!`); } } - createSessionStore(options?: CacheManagerStoreOptions): Store { - return new CacheManagerStore(this.cache, {prefix: 'sess:'}); + async createSessionStore(options?: CacheManagerStoreOptions): Promise { + return new CacheManagerStore((await this.cache), {prefix: 'sess:'}); } async getSessionSecret() { - const val = await this.cache.get(`sessionSecret`); + const val = await (await this.cache).get(`sessionSecret`); if (val === null || val === undefined) { return undefined; } @@ -82,7 +83,7 @@ export class CacheStorageProvider extends StorageProvider { } async setSessionSecret(secret: string) { - await this.cache.set('sessionSecret', secret, {ttl: 0}); + await (await this.cache).set('sessionSecret', secret, {ttl: 0}); } } @@ -101,7 +102,7 @@ export class DatabaseStorageProvider extends StorageProvider { this.logger.debug('Using DATABASE'); } - createSessionStore(options?: TypeormStoreOptions): Store { + async createSessionStore(options?: TypeormStoreOptions): Promise { return new TypeormStore(options).connect(this.clientSessionRepo) } diff --git a/src/Web/Client/index.ts b/src/Web/Client/index.ts index 51246e0d..c9277cd2 100644 --- a/src/Web/Client/index.ts +++ b/src/Web/Client/index.ts @@ -17,7 +17,7 @@ import { } from "../../Common/interfaces"; import { buildCachePrefix, - createCacheManager, defaultFormat, filterLogBySubreddit, filterCriteriaSummary, formatFilterData, + defaultFormat, filterLogBySubreddit, filterCriteriaSummary, formatFilterData, formatLogLineToHtml, filterLogs, getUserAgent, intersect, isLogLineMinLevel, LogEntry, parseInstanceLogInfoName, parseInstanceLogName, parseRedditEntity, @@ -64,6 +64,7 @@ import { InviteData, SubredditInviteDataPersisted } from "../Common/interfaces"; import {open} from "fs/promises"; +import {createCacheManager} from "../../Common/Cache"; const emitter = new EventEmitter(); @@ -323,7 +324,7 @@ const webClient = async (options: OperatorConfigWithFileContext) => { cookie: { maxAge: sessionMaxAge * 1000, }, - store: sessionStoreProvider.createSessionStore(sessionStorage === 'database' ? { + store: await sessionStoreProvider.createSessionStore(sessionStorage === 'database' ? { cleanupLimit: 2, ttl: sessionMaxAge } : {}), diff --git a/src/util.ts b/src/util.ts index 53e3816d..ded4dc25 100644 --- a/src/util.ts +++ b/src/util.ts @@ -14,7 +14,6 @@ import { ActionResult, ActivityDispatch, ActivityDispatchConfig, - CacheOptions, CheckSummary, ImageComparisonResult, ItemCritPropHelper, @@ -35,11 +34,9 @@ import { } from "./Common/interfaces"; import InvalidRegexError from "./Utils/InvalidRegexError"; import {accessSync, constants, promises} from "fs"; -import {cacheOptDefaults, VERSION} from "./Common/defaults"; -import cacheManager, {Cache} from "cache-manager"; -import redisStore from "cache-manager-redis-store"; +import {VERSION} from "./Common/defaults"; +import cacheManager from "cache-manager"; import Autolinker from 'autolinker'; -import {create as createMemoryStore} from './Utils/memoryStore'; import {LEVEL, MESSAGE} from "triple-beam"; import {Comment, PrivateMessage, RedditUser, Submission, Subreddit} from "snoowrap/dist/objects"; import reRegExp from '@stdlib/regexp-regexp'; @@ -71,9 +68,9 @@ import { UserNoteCriteria } from "./Common/Infrastructure/Filters/FilterCriteria"; import { - ActivitySourceValue, + ActivitySourceData, ActivitySourceTypes, - CacheProvider, + ActivitySourceValue, ConfigFormat, DurationVal, ExternalUrlContext, @@ -81,13 +78,13 @@ import { ModUserNoteLabel, modUserNoteLabels, RedditEntity, - RedditEntityType, RelativeDateTimeMatch, + RedditEntityType, + RelativeDateTimeMatch, statFrequencies, StatisticFrequency, StatisticFrequencyOption, UrlContext, - WikiContext, - ActivitySourceData + WikiContext } from "./Common/Infrastructure/Atomic"; import { AuthorOptions, @@ -1765,42 +1762,6 @@ export const cacheStats = (): ResourceStats => { }; } -export const buildCacheOptionsFromProvider = (provider: CacheProvider | any): CacheOptions => { - if(typeof provider === 'string') { - return { - store: provider as CacheProvider, - ...cacheOptDefaults - } - } - return { - store: 'memory', - ...cacheOptDefaults, - ...provider, - } -} - -export const createCacheManager = (options: CacheOptions): Cache => { - const {store, max, ttl = 60, host = 'localhost', port, auth_pass, db, ...rest} = options; - switch (store) { - case 'none': - return cacheManager.caching({store: 'none', max, ttl}); - case 'redis': - return cacheManager.caching({ - store: redisStore, - host, - port, - auth_pass, - db, - ttl, - ...rest, - }); - case 'memory': - default: - //return cacheManager.caching({store: 'memory', max, ttl}); - return cacheManager.caching({store: {create: createMemoryStore}, max, ttl, shouldCloneBeforeSet: false}); - } -} - export const randomId = () => crypto.randomBytes(20).toString('hex'); export const intersect = (a: Array, b: Array) => {