浏览代码

@uppy/companion: Unify redis initialization (#4597)

* Unify redis initialization

* Incorporate PR feedback

* Remove comment that made sense when redisOptions was set to null

---------

Co-authored-by: Mikael Finstad <finstaden@gmail.com>
Dominik Schmidt 1 年之前
父节点
当前提交
22d9381dd2

+ 0 - 13
.yarn/patches/@types-connect-redis-npm-0.0.18-4fd2b614d3

@@ -1,13 +0,0 @@
-diff --git a/index.d.ts b/index.d.ts
-index 413b15edf95c12b1b176279c82b3a9c3f06ade20..0158f6f7a95935acbb67aeea00cb94c241475565 100755
---- a/index.d.ts
-+++ b/index.d.ts
-@@ -19,7 +19,7 @@ declare module 'connect-redis' {
-     function s(options: (options?: session.SessionOptions) => express.RequestHandler): s.RedisStore;
- 
-     namespace s {
--        type Client = redis.RedisClient | ioRedis.Redis | ioRedis.Cluster;
-+        type Client = redis.RedisClientType | ioRedis.Redis | ioRedis.Cluster;
-         interface RedisStore extends session.Store {
-             new (options: RedisStoreOptions): RedisStore;
-             client: Client;

+ 0 - 1
package.json

@@ -168,7 +168,6 @@
     ]
   },
   "resolutions": {
-    "@types/connect-redis@0.0.18": "patch:@types/connect-redis@npm:0.0.18#.yarn/patches/@types-connect-redis-npm-0.0.18-4fd2b614d3",
     "@types/eslint@^7.2.13": "^8.2.0",
     "@types/react": "^17",
     "@types/webpack-dev-server": "^4",

+ 1 - 2
packages/@uppy/companion/package.json

@@ -37,7 +37,7 @@
     "body-parser": "1.20.0",
     "chalk": "4.1.2",
     "common-tags": "1.8.2",
-    "connect-redis": "6.1.3",
+    "connect-redis": "7.1.0",
     "content-disposition": "^0.5.4",
     "cookie-parser": "1.4.6",
     "cors": "^2.8.5",
@@ -72,7 +72,6 @@
   },
   "devDependencies": {
     "@types/compression": "1.7.0",
-    "@types/connect-redis": "0.0.18",
     "@types/cookie-parser": "1.4.2",
     "@types/cors": "2.8.6",
     "@types/eslint": "^8.2.0",

+ 3 - 5
packages/@uppy/companion/src/companion.js

@@ -82,11 +82,9 @@ module.exports.app = (optionsArg = {}) => {
   // mask provider secrets from log messages
   logger.setMaskables(getMaskableSecrets(options))
 
-  // create singleton redis client
-  if (options.redisUrl) {
-    redis.client(options)
-  }
-  const emitter = createEmitter(options.redisUrl, options.redisPubSubScope)
+  // create singleton redis client if corresponding options are set
+  const redisClient = redis.client(options)
+  const emitter = createEmitter(redisClient, options.redisPubSubScope)
 
   const app = express()
 

+ 1 - 1
packages/@uppy/companion/src/server/Uploader.js

@@ -349,7 +349,7 @@ class Uploader {
       size,
       companionOptions: req.companion.options,
       pathPrefix: `${req.companion.options.filePath}`,
-      storage: redis.client()?.v4,
+      storage: redis.client(),
       s3: req.companion.s3Client ? {
         client: req.companion.s3Client,
         options: req.companion.options.s3,

+ 2 - 2
packages/@uppy/companion/src/server/emitter/index.js

@@ -8,9 +8,9 @@ let emitter
  * Used to transmit events (such as progress, upload completion) from controllers,
  * such as the Google Drive 'get' controller, along to the client.
  */
-module.exports = (redisUrl, redisPubSubScope) => {
+module.exports = (redisClient, redisPubSubScope) => {
   if (!emitter) {
-    emitter = redisUrl ? redisEmitter(redisUrl, redisPubSubScope) : nodeEmitter()
+    emitter = redisClient ? redisEmitter(redisClient, redisPubSubScope) : nodeEmitter()
   }
 
   return emitter

+ 2 - 3
packages/@uppy/companion/src/server/emitter/redis-emitter.js

@@ -1,4 +1,3 @@
-const redis = require('redis')
 const { EventEmitter } = require('node:events')
 
 const logger = require('../logger')
@@ -8,10 +7,10 @@ const logger = require('../logger')
  * This is useful for when companion is running on multiple instances and events need
  * to be distributed across.
  */
-module.exports = (redisUrl, redisPubSubScope) => {
+module.exports = (redisClient, redisPubSubScope) => {
   const prefix = redisPubSubScope ? `${redisPubSubScope}:` : ''
   const getPrefixedEventName = (eventName) => `${prefix}${eventName}`
-  const publisher = redis.createClient({ url: redisUrl })
+  const publisher = redisClient.duplicate()
   publisher.on('error', err => logger.error('publisher redis error', err))
   let subscriber
 

+ 9 - 6
packages/@uppy/companion/src/server/redis.js

@@ -8,12 +8,15 @@ let redisClient
  * A Singleton module that provides a single redis client through out
  * the lifetime of the server
  *
- * @param {Record<string, unknown>} [opts] node-redis client options
+ * @param {{ redisUrl?: string, redisOptions?: Record<string, any> }} [companionOptions] options
  */
-function createClient (opts) {
+function createClient (companionOptions) {
   if (!redisClient) {
-    // todo remove legacyMode when fixed: https://github.com/tj/connect-redis/issues/361
-    redisClient = redis.createClient({ ...opts, legacyMode: true })
+    const { redisUrl, redisOptions } = companionOptions
+    redisClient = redis.createClient({
+      ...redisOptions,
+      ...(redisUrl && { url: redisUrl }),
+    })
 
     redisClient.on('error', err => logger.error('redis error', err))
 
@@ -32,9 +35,9 @@ function createClient (opts) {
 }
 
 module.exports.client = (companionOptions) => {
-  if (!companionOptions) {
+  if (!companionOptions?.redisUrl && !companionOptions?.redisOptions) {
     return redisClient
   }
 
-  return createClient({ ...companionOptions.redisOptions, url: companionOptions.redisUrl })
+  return createClient(companionOptions)
 }

+ 1 - 1
packages/@uppy/companion/src/server/socket.js

@@ -12,7 +12,7 @@ const { STORAGE_PREFIX, shortenToken } = require('./Uploader')
  */
 module.exports = (server) => {
   const wss = new SocketServer({ server })
-  const redisClient = redis.client()?.v4
+  const redisClient = redis.client()
 
   // A new connection is usually created when an upload begins,
   // or when connection fails while an upload is on-going and,

+ 11 - 2
packages/@uppy/companion/src/standalone/helper.js

@@ -146,9 +146,18 @@ const getConfigFromEnv = () => {
     filePath: process.env.COMPANION_DATADIR,
     redisUrl: process.env.COMPANION_REDIS_URL,
     redisPubSubScope: process.env.COMPANION_REDIS_PUBSUB_SCOPE,
-    // adding redisOptions to keep all companion options easily visible
     //  redisOptions refers to https://www.npmjs.com/package/redis#options-object-properties
-    redisOptions: {},
+    redisOptions: (() => {
+      try {
+        if (!process.env.COMPANION_REDIS_OPTIONS) {
+          return undefined
+        }
+        return JSON.parse(process.env.COMPANION_REDIS_OPTIONS)
+      } catch (e) {
+        logger.warn('COMPANION_REDIS_OPTIONS parse error', e)
+      }
+      return undefined
+    })(),
     sendSelfEndpoint: process.env.COMPANION_SELF_ENDPOINT,
     uploadUrls: uploadUrls ? uploadUrls.split(',') : null,
     secret: getSecret('COMPANION_SECRET'),

+ 3 - 4
packages/@uppy/companion/src/standalone/index.js

@@ -5,7 +5,7 @@ const morgan = require('morgan')
 const { URL } = require('node:url')
 const session = require('express-session')
 const addRequestId = require('express-request-id')()
-const connectRedis = require('connect-redis')
+const RedisStore = require('connect-redis').default
 
 const logger = require('../server/logger')
 const redis = require('../server/redis')
@@ -109,9 +109,8 @@ module.exports = function server (inputCompanionOptions) {
     saveUninitialized: true,
   }
 
-  if (companionOptions.redisUrl) {
-    const RedisStore = connectRedis(session)
-    const redisClient = redis.client(companionOptions)
+  const redisClient = redis.client(companionOptions)
+  if (redisClient) {
     // todo next major: change default prefix to something like "companion-session:" and possibly remove this option
     sessionOptions.store = new RedisStore({ client: redisClient, prefix: process.env.COMPANION_REDIS_EXPRESS_SESSION_PREFIX || 'sess:' })
   }

+ 7 - 57
yarn.lock

@@ -9456,30 +9456,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/connect-redis@npm:0.0.18":
-  version: 0.0.18
-  resolution: "@types/connect-redis@npm:0.0.18"
-  dependencies:
-    "@types/express": "*"
-    "@types/express-session": "*"
-    "@types/ioredis": "*"
-    "@types/redis": ^2.8.0
-  checksum: d65f0e4686cf482c3d580ebaba49817102578ed7cec1dd754132b097b320c7d1baae6b0e47a653b282b177d96807306fd59bb3b1af0a3875e6177fe4fb6d161b
-  languageName: node
-  linkType: hard
-
-"@types/connect-redis@patch:@types/connect-redis@npm:0.0.18#.yarn/patches/@types-connect-redis-npm-0.0.18-4fd2b614d3::locator=%40uppy-dev%2Fbuild%40workspace%3A.":
-  version: 0.0.18
-  resolution: "@types/connect-redis@patch:@types/connect-redis@npm%3A0.0.18#.yarn/patches/@types-connect-redis-npm-0.0.18-4fd2b614d3::version=0.0.18&hash=060147&locator=%40uppy-dev%2Fbuild%40workspace%3A."
-  dependencies:
-    "@types/express": "*"
-    "@types/express-session": "*"
-    "@types/ioredis": "*"
-    "@types/redis": ^2.8.0
-  checksum: 69f32b862305197678b77002ce36e6d45018cf54f66475338dfa0defc3aa89d66c9007693557778a414bbbdd388f67483702598e96c401fc2d1e974a87dce80f
-  languageName: node
-  linkType: hard
-
 "@types/connect@npm:*":
   version: 3.4.35
   resolution: "@types/connect@npm:3.4.35"
@@ -9591,15 +9567,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/express-session@npm:*":
-  version: 1.17.5
-  resolution: "@types/express-session@npm:1.17.5"
-  dependencies:
-    "@types/express": "*"
-  checksum: f6995f7720a18546bcb10cc707cf8c9c92455eb4319c0c50c57e9b9b10ed20dc379d74d5e4c3323fe4e924238b75e13c97822c9d81a80fa064ddc71654c1059d
-  languageName: node
-  linkType: hard
-
 "@types/express-session@npm:1.17.3":
   version: 1.17.3
   resolution: "@types/express-session@npm:1.17.3"
@@ -9689,15 +9656,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/ioredis@npm:*":
-  version: 4.28.10
-  resolution: "@types/ioredis@npm:4.28.10"
-  dependencies:
-    "@types/node": "*"
-  checksum: 0f2788cf25f490d3b345db8c5f8b8ce3f6c92cc99abcf744c8f974f02b9b3875233b3d22098614c462a0d6c41c523bd655509418ea88eb6249db6652290ce7cf
-  languageName: node
-  linkType: hard
-
 "@types/is-empty@npm:^1.0.0":
   version: 1.2.1
   resolution: "@types/is-empty@npm:1.2.1"
@@ -9998,15 +9956,6 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/redis@npm:^2.8.0":
-  version: 2.8.32
-  resolution: "@types/redis@npm:2.8.32"
-  dependencies:
-    "@types/node": "*"
-  checksum: 2b12103e05977941870c9a248f6ea51f4b7ad7e0f16a7403799c2ed1b3e63b60f693c39f9186be0ea02776934c4595ddcd2a5bde41e530aaad42d26449f6a669
-  languageName: node
-  linkType: hard
-
 "@types/request@npm:2.48.8":
   version: 2.48.8
   resolution: "@types/request@npm:2.48.8"
@@ -11090,7 +11039,6 @@ __metadata:
     "@aws-sdk/s3-presigned-post": ^3.338.0
     "@aws-sdk/s3-request-presigner": ^3.338.0
     "@types/compression": 1.7.0
-    "@types/connect-redis": 0.0.18
     "@types/cookie-parser": 1.4.2
     "@types/cors": 2.8.6
     "@types/eslint": ^8.2.0
@@ -11108,7 +11056,7 @@ __metadata:
     body-parser: 1.20.0
     chalk: 4.1.2
     common-tags: 1.8.2
-    connect-redis: 6.1.3
+    connect-redis: 7.1.0
     content-disposition: ^0.5.4
     cookie-parser: 1.4.6
     cors: ^2.8.5
@@ -15583,10 +15531,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"connect-redis@npm:6.1.3":
-  version: 6.1.3
-  resolution: "connect-redis@npm:6.1.3"
-  checksum: 1f61616e2ae7ad097b6553e45d683eeb309ac2e601ac49d721c6c0069fd96fbcfb46ee1c0e210b264b720dcd385201d30ff55ccf5deb11ee1529810890561b58
+"connect-redis@npm:7.1.0":
+  version: 7.1.0
+  resolution: "connect-redis@npm:7.1.0"
+  peerDependencies:
+    express-session: ">=1"
+  checksum: fb493fae8910a2d61e3babd579c6344c56d7d31d67669d9941465ef00eb54ef9c1a35ccfa761136d36fa38d1f82ebe48c2b10888f292d55b4aadb8ecf1fddf34
   languageName: node
   linkType: hard