Compare commits

...

3 Commits

Author SHA1 Message Date
FoxxMD
9e364c3e28 Refactor cache instantiation to use async method 2022-10-17 11:42:58 -04:00
FoxxMD
acd4b54d8e Implement typings for cache-manager-redis-store@3^ 2022-10-17 11:42:39 -04:00
FoxxMD
19f4ff0b53 feat: Update to cache-manager-redis-store ^3.0.0
* Also bump node minor version to be in line with cache-manager-redis-store
2022-10-17 11:42:04 -04:00
9 changed files with 236 additions and 200 deletions

2
.nvmrc
View File

@@ -1 +1 @@
16.14.2 16.18.0

274
package-lock.json generated
View File

@@ -29,7 +29,7 @@
"autolinker": "^3.14.3", "autolinker": "^3.14.3",
"body-parser": "^1.19.0", "body-parser": "^1.19.0",
"cache-manager": "^3.4.4", "cache-manager": "^3.4.4",
"cache-manager-redis-store": "^2.0.0", "cache-manager-redis-store": "^3.0.1",
"commander": "^8.0.0", "commander": "^8.0.0",
"comment-json": "^4.1.1", "comment-json": "^4.1.1",
"connect-typeorm": "^2.0.0", "connect-typeorm": "^2.0.0",
@@ -95,7 +95,6 @@
"@tsconfig/node14": "^1.0.0", "@tsconfig/node14": "^1.0.0",
"@types/async": "^3.2.7", "@types/async": "^3.2.7",
"@types/cache-manager": "^3.4.2", "@types/cache-manager": "^3.4.2",
"@types/cache-manager-redis-store": "^2.0.0",
"@types/chai": "^4.3.0", "@types/chai": "^4.3.0",
"@types/chai-as-promised": "^7.1.5", "@types/chai-as-promised": "^7.1.5",
"@types/cookie-parser": "^1.4.2", "@types/cookie-parser": "^1.4.2",
@@ -138,7 +137,7 @@
"typescript-json-schema": "~0.53" "typescript-json-schema": "~0.53"
}, },
"engines": { "engines": {
"node": ">=16" "node": ">=16.18.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"better-sqlite3": "^7.5.0", "better-sqlite3": "^7.5.0",
@@ -979,6 +978,59 @@
"resolved": "https://registry.npmjs.org/@nlpjs/slot/-/slot-4.22.17.tgz", "resolved": "https://registry.npmjs.org/@nlpjs/slot/-/slot-4.22.17.tgz",
"integrity": "sha512-cNYcxf9DKB+fnRa2NxT5wbWq5j57R1WCTXLWI/1Cyycr227IP7GN7qaD4RbkzotBFFB8wm63UHod9frzmuiXxg==" "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": { "node_modules/@sindresorhus/is": {
"version": "4.6.0", "version": "4.6.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
@@ -1163,16 +1215,6 @@
"integrity": "sha512-71aBXoFYXZW4TnDHHH8gExw2lS28BZaWeKefgsiJI7QYZeJfUEbMKw6CQtzGjlYQcGIWwB76hcCrkVA3YHSvsw==", "integrity": "sha512-71aBXoFYXZW4TnDHHH8gExw2lS28BZaWeKefgsiJI7QYZeJfUEbMKw6CQtzGjlYQcGIWwB76hcCrkVA3YHSvsw==",
"dev": true "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": { "node_modules/@types/cacheable-request": {
"version": "6.0.2", "version": "6.0.2",
"resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", "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", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
"integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" "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": { "node_modules/@types/responselike": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
@@ -2350,14 +2383,14 @@
} }
}, },
"node_modules/cache-manager-redis-store": { "node_modules/cache-manager-redis-store": {
"version": "2.0.0", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/cache-manager-redis-store/-/cache-manager-redis-store-2.0.0.tgz", "resolved": "https://registry.npmjs.org/cache-manager-redis-store/-/cache-manager-redis-store-3.0.1.tgz",
"integrity": "sha512-bWLWlUg6nCYHiJLCCYxY2MgvwvKnvlWwrbuynrzpjEIhfArD2GC9LtutIHFEPeyGVQN6C+WEw+P3r+BFBwhswg==", "integrity": "sha512-o560kw+dFqusC9lQJhcm6L2F2fMKobJ5af+FoR2PdnMVdpQ3f3Bz6qzvObTGyvoazQJxjQNWgMQeChP4vRTuXQ==",
"dependencies": { "dependencies": {
"redis": "^3.0.2" "redis": "^4.3.1"
}, },
"engines": { "engines": {
"node": ">= 8.3" "node": ">= 16.18.0"
} }
}, },
"node_modules/cacheable-lookup": { "node_modules/cacheable-lookup": {
@@ -2641,6 +2674,14 @@
"mimic-response": "^1.0.0" "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": { "node_modules/code-point-at": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
@@ -3210,14 +3251,6 @@
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"optional": true "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": { "node_modules/depd": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -4166,6 +4199,14 @@
"node": ">=10" "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": { "node_modules/gensync": {
"version": "1.0.0-beta.2", "version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -7798,45 +7839,16 @@
} }
}, },
"node_modules/redis": { "node_modules/redis": {
"version": "3.1.2", "version": "4.3.1",
"resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", "resolved": "https://registry.npmjs.org/redis/-/redis-4.3.1.tgz",
"integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", "integrity": "sha512-cM7yFU5CA6zyCF7N/+SSTcSJQSRMEKN0k0Whhu6J7n9mmXRoXugfWDBo5iOzGwABmsWKSwGPTU5J4Bxbl+0mrA==",
"dependencies": { "dependencies": {
"denque": "^1.5.0", "@redis/bloom": "1.0.2",
"redis-commands": "^1.7.0", "@redis/client": "1.3.0",
"redis-errors": "^1.2.0", "@redis/graph": "1.0.1",
"redis-parser": "^3.0.0" "@redis/json": "1.0.4",
}, "@redis/search": "1.1.0",
"engines": { "@redis/time-series": "1.0.3"
"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=",
"dependencies": {
"redis-errors": "^1.0.0"
},
"engines": {
"node": ">=4"
} }
}, },
"node_modules/reflect-metadata": { "node_modules/reflect-metadata": {
@@ -11115,6 +11127,46 @@
"resolved": "https://registry.npmjs.org/@nlpjs/slot/-/slot-4.22.17.tgz", "resolved": "https://registry.npmjs.org/@nlpjs/slot/-/slot-4.22.17.tgz",
"integrity": "sha512-cNYcxf9DKB+fnRa2NxT5wbWq5j57R1WCTXLWI/1Cyycr227IP7GN7qaD4RbkzotBFFB8wm63UHod9frzmuiXxg==" "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": { "@sindresorhus/is": {
"version": "4.6.0", "version": "4.6.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
@@ -11214,16 +11266,6 @@
"integrity": "sha512-71aBXoFYXZW4TnDHHH8gExw2lS28BZaWeKefgsiJI7QYZeJfUEbMKw6CQtzGjlYQcGIWwB76hcCrkVA3YHSvsw==", "integrity": "sha512-71aBXoFYXZW4TnDHHH8gExw2lS28BZaWeKefgsiJI7QYZeJfUEbMKw6CQtzGjlYQcGIWwB76hcCrkVA3YHSvsw==",
"dev": true "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": { "@types/cacheable-request": {
"version": "6.0.2", "version": "6.0.2",
"resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", "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", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
"integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" "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": { "@types/responselike": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
@@ -12253,11 +12286,11 @@
} }
}, },
"cache-manager-redis-store": { "cache-manager-redis-store": {
"version": "2.0.0", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/cache-manager-redis-store/-/cache-manager-redis-store-2.0.0.tgz", "resolved": "https://registry.npmjs.org/cache-manager-redis-store/-/cache-manager-redis-store-3.0.1.tgz",
"integrity": "sha512-bWLWlUg6nCYHiJLCCYxY2MgvwvKnvlWwrbuynrzpjEIhfArD2GC9LtutIHFEPeyGVQN6C+WEw+P3r+BFBwhswg==", "integrity": "sha512-o560kw+dFqusC9lQJhcm6L2F2fMKobJ5af+FoR2PdnMVdpQ3f3Bz6qzvObTGyvoazQJxjQNWgMQeChP4vRTuXQ==",
"requires": { "requires": {
"redis": "^3.0.2" "redis": "^4.3.1"
} }
}, },
"cacheable-lookup": { "cacheable-lookup": {
@@ -12470,6 +12503,11 @@
"mimic-response": "^1.0.0" "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": { "code-point-at": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
@@ -12933,11 +12971,6 @@
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"optional": true "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": { "depd": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -13675,6 +13708,11 @@
"json-bigint": "^1.0.0" "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": { "gensync": {
"version": "1.0.0-beta.2", "version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -16455,32 +16493,16 @@
} }
}, },
"redis": { "redis": {
"version": "3.1.2", "version": "4.3.1",
"resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", "resolved": "https://registry.npmjs.org/redis/-/redis-4.3.1.tgz",
"integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", "integrity": "sha512-cM7yFU5CA6zyCF7N/+SSTcSJQSRMEKN0k0Whhu6J7n9mmXRoXugfWDBo5iOzGwABmsWKSwGPTU5J4Bxbl+0mrA==",
"requires": { "requires": {
"denque": "^1.5.0", "@redis/bloom": "1.0.2",
"redis-commands": "^1.7.0", "@redis/client": "1.3.0",
"redis-errors": "^1.2.0", "@redis/graph": "1.0.1",
"redis-parser": "^3.0.0" "@redis/json": "1.0.4",
} "@redis/search": "1.1.0",
}, "@redis/time-series": "1.0.3"
"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"
} }
}, },
"reflect-metadata": { "reflect-metadata": {

View File

@@ -24,7 +24,7 @@
"initMigration": "npm run typeorm -- migration:generate -t 1642180264563 -d ormconfig.js \"src/Common/Migrations/Database/init\"" "initMigration": "npm run typeorm -- migration:generate -t 1642180264563 -d ormconfig.js \"src/Common/Migrations/Database/init\""
}, },
"engines": { "engines": {
"node": ">=16" "node": ">=16.18.0"
}, },
"keywords": [], "keywords": [],
"author": "", "author": "",
@@ -49,7 +49,7 @@
"autolinker": "^3.14.3", "autolinker": "^3.14.3",
"body-parser": "^1.19.0", "body-parser": "^1.19.0",
"cache-manager": "^3.4.4", "cache-manager": "^3.4.4",
"cache-manager-redis-store": "^2.0.0", "cache-manager-redis-store": "^3.0.1",
"commander": "^8.0.0", "commander": "^8.0.0",
"comment-json": "^4.1.1", "comment-json": "^4.1.1",
"connect-typeorm": "^2.0.0", "connect-typeorm": "^2.0.0",
@@ -115,7 +115,6 @@
"@tsconfig/node14": "^1.0.0", "@tsconfig/node14": "^1.0.0",
"@types/async": "^3.2.7", "@types/async": "^3.2.7",
"@types/cache-manager": "^3.4.2", "@types/cache-manager": "^3.4.2",
"@types/cache-manager-redis-store": "^2.0.0",
"@types/chai": "^4.3.0", "@types/chai": "^4.3.0",
"@types/chai-as-promised": "^7.1.5", "@types/chai-as-promised": "^7.1.5",
"@types/cookie-parser": "^1.4.2", "@types/cookie-parser": "^1.4.2",

47
src/Common/Cache/index.ts Normal file
View File

@@ -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<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':
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});
}
}

View File

@@ -163,3 +163,9 @@ declare module 'wink-sentiment' {
export default 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<CachingConfig>): Cache;
}

View File

@@ -14,10 +14,8 @@ import {
asActivity, asActivity,
asSubmission, asSubmission,
asUserNoteCriteria, asUserNoteCriteria,
buildCacheOptionsFromProvider,
buildCachePrefix, buildCachePrefix,
cacheStats, cacheStats,
createCacheManager,
escapeRegex, escapeRegex,
FAIL, FAIL,
fetchExternalResult, fetchExternalResult,
@@ -173,6 +171,7 @@ import ConfigParseError from "../Utils/ConfigParseError";
import {ActivityReport} from "../Common/Entities/ActivityReport"; import {ActivityReport} from "../Common/Entities/ActivityReport";
import {ActionResultEntity} from "../Common/Entities/ActionResultEntity"; import {ActionResultEntity} from "../Common/Entities/ActionResultEntity";
import {ActivitySource} from "../Common/ActivitySource"; 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.'; 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; authorTTL: number = 10000;
enabled: boolean = true; enabled: boolean = true;
modStreams: Map<string, SPoll<Snoowrap.Submission | Snoowrap.Comment>> = new Map(); modStreams: Map<string, SPoll<Snoowrap.Submission | Snoowrap.Comment>> = new Map();
defaultCache: Cache; defaultCache: Promise<Cache>;
defaultCacheConfig: StrongCache defaultCacheConfig: StrongCache
defaultCacheMigrated: boolean = false; defaultCacheMigrated: boolean = false;
cacheType: string = 'none'; cacheType: string = 'none';
@@ -3649,7 +3648,7 @@ export class BotResourcesManager {
// }); // });
let opts: SubredditResourceOptions = { let opts: SubredditResourceOptions = {
cache: this.defaultCache, cache: await this.defaultCache,
cacheType: this.cacheType, cacheType: this.cacheType,
cacheSettingsHash: hash, cacheSettingsHash: hash,
ttl: this.ttlDefaults, ttl: this.ttlDefaults,
@@ -3680,7 +3679,7 @@ export class BotResourcesManager {
trueProvider.prefix = subPrefix; trueProvider.prefix = subPrefix;
const eventsMax = this.actionedEventsMaxDefault !== undefined ? Math.min(actionedEventsMax, this.actionedEventsMaxDefault) : actionedEventsMax; const eventsMax = this.actionedEventsMaxDefault !== undefined ? Math.min(actionedEventsMax, this.actionedEventsMaxDefault) : actionedEventsMax;
opts = { opts = {
cache: createCacheManager(trueProvider), cache: await createCacheManager(trueProvider),
actionedEventsMax: eventsMax, actionedEventsMax: eventsMax,
cacheType: trueProvider.store, cacheType: trueProvider.store,
cacheSettingsHash: hash, cacheSettingsHash: hash,
@@ -3695,7 +3694,7 @@ export class BotResourcesManager {
await runMigrations(opts.cache, opts.logger, trueProvider.prefix); await runMigrations(opts.cache, opts.logger, trueProvider.prefix);
} }
} else if(!this.defaultCacheMigrated) { } else if(!this.defaultCacheMigrated) {
await runMigrations(this.defaultCache, this.logger, opts.prefix); await runMigrations(await this.defaultCache, this.logger, opts.prefix);
this.defaultCacheMigrated = true; this.defaultCacheMigrated = true;
} }
@@ -3730,7 +3729,7 @@ export class BotResourcesManager {
} }
async getPendingSubredditInvites(): Promise<(string[])> { async getPendingSubredditInvites(): Promise<(string[])> {
const subredditNames = await this.defaultCache.get(`modInvites`); const subredditNames = await (await this.defaultCache).get(`modInvites`);
if (subredditNames !== undefined && subredditNames !== null) { if (subredditNames !== undefined && subredditNames !== null) {
return subredditNames as string[]; return subredditNames as string[];
} }
@@ -3741,7 +3740,7 @@ export class BotResourcesManager {
if(subreddit === null || subreddit === undefined || subreddit == '') { if(subreddit === null || subreddit === undefined || subreddit == '') {
throw new CMError('Subreddit name cannot be empty'); 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) { if (subredditNames === undefined || subredditNames === null) {
subredditNames = []; subredditNames = [];
} }
@@ -3751,22 +3750,22 @@ export class BotResourcesManager {
throw new CMError(`An invite for the Subreddit '${subreddit}' already exists`); throw new CMError(`An invite for the Subreddit '${subreddit}' already exists`);
} }
subredditNames.push(cleanName); subredditNames.push(cleanName);
await this.defaultCache.set(`modInvites`, subredditNames, {ttl: 0}); await (await this.defaultCache).set(`modInvites`, subredditNames, {ttl: 0});
return; return;
} }
async deletePendingSubredditInvite(subreddit: string): Promise<void> { async deletePendingSubredditInvite(subreddit: string): Promise<void> {
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) { if (subredditNames === undefined || subredditNames === null) {
subredditNames = []; subredditNames = [];
} }
subredditNames = subredditNames.filter(x => x.toLowerCase() !== subreddit.trim().toLowerCase()); 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; return;
} }
async clearPendingSubredditInvites(): Promise<void> { async clearPendingSubredditInvites(): Promise<void> {
await this.defaultCache.del(`modInvites`); await (await this.defaultCache).del(`modInvites`);
return; return;
} }
} }

View File

@@ -1,7 +1,7 @@
import {SessionOptions, Store} from "express-session"; import {SessionOptions, Store} from "express-session";
import {TypeormStore} from "connect-typeorm"; import {TypeormStore} from "connect-typeorm";
import {InviteData} from "../Common/interfaces"; import {InviteData} from "../Common/interfaces";
import {buildCachePrefix, createCacheManager, mergeArr} from "../../util"; import {buildCachePrefix, mergeArr} from "../../util";
import {Cache} from "cache-manager"; import {Cache} from "cache-manager";
// @ts-ignore // @ts-ignore
import CacheManagerStore from 'express-session-cache-manager' import CacheManagerStore from 'express-session-cache-manager'
@@ -11,6 +11,7 @@ import {ClientSession} from "../../Common/WebEntities/ClientSession";
import {Logger} from "winston"; import {Logger} from "winston";
import {WebSetting} from "../../Common/WebEntities/WebSetting"; import {WebSetting} from "../../Common/WebEntities/WebSetting";
import {ErrorWithCause} from "pony-cause"; import {ErrorWithCause} from "pony-cause";
import {createCacheManager} from "../../Common/Cache";
export interface CacheManagerStoreOptions { export interface CacheManagerStoreOptions {
prefix?: string prefix?: string
@@ -24,7 +25,7 @@ export type TypeormStoreOptions = Partial<SessionOptions & {
}>; }>;
interface IWebStorageProvider { interface IWebStorageProvider {
createSessionStore(options?: CacheManagerStoreOptions | TypeormStoreOptions): Store createSessionStore(options?: CacheManagerStoreOptions | TypeormStoreOptions): Promise<Store>
getSessionSecret(): Promise<string | undefined> getSessionSecret(): Promise<string | undefined>
@@ -48,7 +49,7 @@ abstract class StorageProvider implements IWebStorageProvider {
this.logger = logger.child({labels: ['Web', 'Storage', ...loggerLabels]}, mergeArr); this.logger = logger.child({labels: ['Web', 'Storage', ...loggerLabels]}, mergeArr);
} }
abstract createSessionStore(options?: CacheManagerStoreOptions | TypeormStoreOptions): Store; abstract createSessionStore(options?: CacheManagerStoreOptions | TypeormStoreOptions): Promise<Store>;
abstract getSessionSecret(): Promise<string | undefined>; abstract getSessionSecret(): Promise<string | undefined>;
@@ -57,24 +58,24 @@ abstract class StorageProvider implements IWebStorageProvider {
export class CacheStorageProvider extends StorageProvider { export class CacheStorageProvider extends StorageProvider {
protected cache: Cache; protected cache: Promise<Cache>;
constructor(caching: CacheOptions & StorageProviderOptions) { constructor(caching: CacheOptions & StorageProviderOptions) {
super(caching); super(caching);
const {logger, invitesMaxAge, loggerLabels, ...restCache } = 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<Cache>;
this.logger.debug('Using CACHE'); this.logger.debug('Using CACHE');
if (caching.store === 'none') { 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!`); 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 { async createSessionStore(options?: CacheManagerStoreOptions): Promise<Store> {
return new CacheManagerStore(this.cache, {prefix: 'sess:'}); return new CacheManagerStore((await this.cache), {prefix: 'sess:'});
} }
async getSessionSecret() { async getSessionSecret() {
const val = await this.cache.get(`sessionSecret`); const val = await (await this.cache).get(`sessionSecret`);
if (val === null || val === undefined) { if (val === null || val === undefined) {
return undefined; return undefined;
} }
@@ -82,7 +83,7 @@ export class CacheStorageProvider extends StorageProvider {
} }
async setSessionSecret(secret: string) { 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'); this.logger.debug('Using DATABASE');
} }
createSessionStore(options?: TypeormStoreOptions): Store { async createSessionStore(options?: TypeormStoreOptions): Promise<Store> {
return new TypeormStore(options).connect(this.clientSessionRepo) return new TypeormStore(options).connect(this.clientSessionRepo)
} }

View File

@@ -17,7 +17,7 @@ import {
} from "../../Common/interfaces"; } from "../../Common/interfaces";
import { import {
buildCachePrefix, buildCachePrefix,
createCacheManager, defaultFormat, filterLogBySubreddit, filterCriteriaSummary, formatFilterData, defaultFormat, filterLogBySubreddit, filterCriteriaSummary, formatFilterData,
formatLogLineToHtml, filterLogs, getUserAgent, formatLogLineToHtml, filterLogs, getUserAgent,
intersect, isLogLineMinLevel, intersect, isLogLineMinLevel,
LogEntry, parseInstanceLogInfoName, parseInstanceLogName, parseRedditEntity, LogEntry, parseInstanceLogInfoName, parseInstanceLogName, parseRedditEntity,
@@ -64,6 +64,7 @@ import {
InviteData, SubredditInviteDataPersisted InviteData, SubredditInviteDataPersisted
} from "../Common/interfaces"; } from "../Common/interfaces";
import {open} from "fs/promises"; import {open} from "fs/promises";
import {createCacheManager} from "../../Common/Cache";
const emitter = new EventEmitter(); const emitter = new EventEmitter();
@@ -323,7 +324,7 @@ const webClient = async (options: OperatorConfigWithFileContext) => {
cookie: { cookie: {
maxAge: sessionMaxAge * 1000, maxAge: sessionMaxAge * 1000,
}, },
store: sessionStoreProvider.createSessionStore(sessionStorage === 'database' ? { store: await sessionStoreProvider.createSessionStore(sessionStorage === 'database' ? {
cleanupLimit: 2, cleanupLimit: 2,
ttl: sessionMaxAge ttl: sessionMaxAge
} : {}), } : {}),

View File

@@ -14,7 +14,6 @@ import {
ActionResult, ActionResult,
ActivityDispatch, ActivityDispatch,
ActivityDispatchConfig, ActivityDispatchConfig,
CacheOptions,
CheckSummary, CheckSummary,
ImageComparisonResult, ImageComparisonResult,
ItemCritPropHelper, ItemCritPropHelper,
@@ -35,11 +34,9 @@ import {
} from "./Common/interfaces"; } from "./Common/interfaces";
import InvalidRegexError from "./Utils/InvalidRegexError"; import InvalidRegexError from "./Utils/InvalidRegexError";
import {accessSync, constants, promises} from "fs"; import {accessSync, constants, promises} from "fs";
import {cacheOptDefaults, VERSION} from "./Common/defaults"; import {VERSION} from "./Common/defaults";
import cacheManager, {Cache} from "cache-manager"; import cacheManager from "cache-manager";
import redisStore from "cache-manager-redis-store";
import Autolinker from 'autolinker'; import Autolinker from 'autolinker';
import {create as createMemoryStore} from './Utils/memoryStore';
import {LEVEL, MESSAGE} from "triple-beam"; import {LEVEL, MESSAGE} from "triple-beam";
import {Comment, PrivateMessage, RedditUser, Submission, Subreddit} from "snoowrap/dist/objects"; import {Comment, PrivateMessage, RedditUser, Submission, Subreddit} from "snoowrap/dist/objects";
import reRegExp from '@stdlib/regexp-regexp'; import reRegExp from '@stdlib/regexp-regexp';
@@ -71,9 +68,9 @@ import {
UserNoteCriteria UserNoteCriteria
} from "./Common/Infrastructure/Filters/FilterCriteria"; } from "./Common/Infrastructure/Filters/FilterCriteria";
import { import {
ActivitySourceValue, ActivitySourceData,
ActivitySourceTypes, ActivitySourceTypes,
CacheProvider, ActivitySourceValue,
ConfigFormat, ConfigFormat,
DurationVal, DurationVal,
ExternalUrlContext, ExternalUrlContext,
@@ -81,13 +78,13 @@ import {
ModUserNoteLabel, ModUserNoteLabel,
modUserNoteLabels, modUserNoteLabels,
RedditEntity, RedditEntity,
RedditEntityType, RelativeDateTimeMatch, RedditEntityType,
RelativeDateTimeMatch,
statFrequencies, statFrequencies,
StatisticFrequency, StatisticFrequency,
StatisticFrequencyOption, StatisticFrequencyOption,
UrlContext, UrlContext,
WikiContext, WikiContext
ActivitySourceData
} from "./Common/Infrastructure/Atomic"; } from "./Common/Infrastructure/Atomic";
import { import {
AuthorOptions, 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 randomId = () => crypto.randomBytes(20).toString('hex');
export const intersect = (a: Array<any>, b: Array<any>) => { export const intersect = (a: Array<any>, b: Array<any>) => {