From 9ddecb02cc45f5aa8188bfc489a36749d32cdb77 Mon Sep 17 00:00:00 2001 From: James Holcomb Date: Fri, 7 Apr 2023 16:51:25 -0500 Subject: [PATCH 1/2] chore: add ioredis dep, test update feathers@5.0.3 --- package-lock.json | 171 +++++++++++++++++++++++++++++++--- package.json | 3 +- test/adapters/ioredis.test.js | 116 +++++++++++++++++++++++ 3 files changed, 274 insertions(+), 16 deletions(-) create mode 100644 test/adapters/ioredis.test.js diff --git a/package-lock.json b/package-lock.json index 088389c..cb43b39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,13 +17,14 @@ "redis": "^4.6.4" }, "devDependencies": { - "@feathersjs/feathers": "^5.0.0-pre.38", + "@feathersjs/feathers": "^5.0.3", "@semantic-release/commit-analyzer": "^9.0.2", "@semantic-release/npm": "^9.0.2", "@semantic-release/release-notes-generator": "^10.0.3", "@types/node": "^18.14.0", "bson": "^5.0.1", "dtslint": "^4.2.1", + "ioredis": "^5.3.1", "mocha": "^10.2.0", "npm-check-updates": "^16.7.6", "nyc": "^15.1.0", @@ -626,9 +627,9 @@ } }, "node_modules/@feathersjs/commons": { - "version": "5.0.0-pre.38", - "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-5.0.0-pre.38.tgz", - "integrity": "sha512-Nh3snF12c0f+KsPwcmkpWBFi/coZj22fUmdqGgncVbZvf/01J3hvcUdKZ0sasLuanschj6jgiYHeDDQspLtXig==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-5.0.3.tgz", + "integrity": "sha512-8UHTd/WUl7VzNScAnfCGL3/6bzhnaZkFzrLVNgK8tsO1vz+XAbcDuWN/EI4CKNjrjepOtF9KD/wixXPpLJrdkA==", "dev": true, "engines": { "node": ">= 12" @@ -639,12 +640,12 @@ } }, "node_modules/@feathersjs/feathers": { - "version": "5.0.0-pre.38", - "resolved": "https://registry.npmjs.org/@feathersjs/feathers/-/feathers-5.0.0-pre.38.tgz", - "integrity": "sha512-sX5JTCki9byEwQbftgqZhCYtQeE2Ga3Prr65SPBpTOKuz0vH6IzUc93S/V/t7QtM8Kx9Cm64O9e/bmlPABJt3g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@feathersjs/feathers/-/feathers-5.0.3.tgz", + "integrity": "sha512-g7kKG1UrDEaT2g3X9N+OZ3LZe0gVnAyV1hyW3ED+vX1XUHRHLw/QY16h5w0fJlRrgD2MTuU/Itl+nXMbnI4Wtw==", "dev": true, "dependencies": { - "@feathersjs/commons": "^5.0.0-pre.38", + "@feathersjs/commons": "^5.0.3", "@feathersjs/hooks": "^0.8.1", "events": "^3.3.0" }, @@ -691,6 +692,12 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", + "dev": true + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -3397,6 +3404,15 @@ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -5754,6 +5770,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ioredis": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.1.tgz", + "integrity": "sha512-C+IBcMysM6v52pTLItYMeV4Hz7uriGtoJdz7SSBDX6u+zwSYGirLdQh3L7t/OItWITcw3gTFMjJReYUwS4zihg==", + "dev": true, + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, "node_modules/ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", @@ -6626,6 +6666,12 @@ "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", "dev": true }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true + }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", @@ -6638,6 +6684,12 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true + }, "node_modules/lodash.ismatch": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", @@ -12256,6 +12308,27 @@ "@redis/time-series": "1.0.4" } }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "dev": true, + "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": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dev": true, + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", @@ -13568,6 +13641,12 @@ "node": ">= 8" } }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "dev": true + }, "node_modules/standard-engine": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-14.0.1.tgz", @@ -15782,18 +15861,18 @@ } }, "@feathersjs/commons": { - "version": "5.0.0-pre.38", - "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-5.0.0-pre.38.tgz", - "integrity": "sha512-Nh3snF12c0f+KsPwcmkpWBFi/coZj22fUmdqGgncVbZvf/01J3hvcUdKZ0sasLuanschj6jgiYHeDDQspLtXig==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-5.0.3.tgz", + "integrity": "sha512-8UHTd/WUl7VzNScAnfCGL3/6bzhnaZkFzrLVNgK8tsO1vz+XAbcDuWN/EI4CKNjrjepOtF9KD/wixXPpLJrdkA==", "dev": true }, "@feathersjs/feathers": { - "version": "5.0.0-pre.38", - "resolved": "https://registry.npmjs.org/@feathersjs/feathers/-/feathers-5.0.0-pre.38.tgz", - "integrity": "sha512-sX5JTCki9byEwQbftgqZhCYtQeE2Ga3Prr65SPBpTOKuz0vH6IzUc93S/V/t7QtM8Kx9Cm64O9e/bmlPABJt3g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@feathersjs/feathers/-/feathers-5.0.3.tgz", + "integrity": "sha512-g7kKG1UrDEaT2g3X9N+OZ3LZe0gVnAyV1hyW3ED+vX1XUHRHLw/QY16h5w0fJlRrgD2MTuU/Itl+nXMbnI4Wtw==", "dev": true, "requires": { - "@feathersjs/commons": "^5.0.0-pre.38", + "@feathersjs/commons": "^5.0.3", "@feathersjs/hooks": "^0.8.1", "events": "^3.3.0" } @@ -15827,6 +15906,12 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", + "dev": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -17899,6 +17984,12 @@ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, + "denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "dev": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -19665,6 +19756,23 @@ "p-is-promise": "^3.0.0" } }, + "ioredis": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.1.tgz", + "integrity": "sha512-C+IBcMysM6v52pTLItYMeV4Hz7uriGtoJdz7SSBDX6u+zwSYGirLdQh3L7t/OItWITcw3gTFMjJReYUwS4zihg==", + "dev": true, + "requires": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + } + }, "ip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", @@ -20318,6 +20426,12 @@ "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", "dev": true }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true + }, "lodash.escaperegexp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", @@ -20330,6 +20444,12 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true + }, "lodash.ismatch": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", @@ -24349,6 +24469,21 @@ "@redis/time-series": "1.0.4" } }, + "redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "dev": true + }, + "redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dev": true, + "requires": { + "redis-errors": "^1.0.0" + } + }, "regexp.prototype.flags": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", @@ -25281,6 +25416,12 @@ "minipass": "^3.1.1" } }, + "standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "dev": true + }, "standard-engine": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-14.0.1.tgz", diff --git a/package.json b/package.json index 0d5ab2e..b82daa8 100644 --- a/package.json +++ b/package.json @@ -62,13 +62,14 @@ "redis": "^4.6.4" }, "devDependencies": { - "@feathersjs/feathers": "^5.0.0-pre.38", + "@feathersjs/feathers": "^5.0.3", "@semantic-release/commit-analyzer": "^9.0.2", "@semantic-release/npm": "^9.0.2", "@semantic-release/release-notes-generator": "^10.0.3", "@types/node": "^18.14.0", "bson": "^5.0.1", "dtslint": "^4.2.1", + "ioredis": "^5.3.1", "mocha": "^10.2.0", "npm-check-updates": "^16.7.6", "nyc": "^15.1.0", diff --git a/test/adapters/ioredis.test.js b/test/adapters/ioredis.test.js new file mode 100644 index 0000000..2ccf3ea --- /dev/null +++ b/test/adapters/ioredis.test.js @@ -0,0 +1,116 @@ +const assert = require('assert'); +const feathers = require('@feathersjs/feathers'); +const { redis } = require('../../lib'); +const Redis = require('ioredis'); + +const redisClient = new Redis({ + lazyConnect: true, + maxRetriesPerRequest: null +}); + +describe('ioredis client tests', () => { + let app; + + before(done => { + app = feathers() + .configure(redis({ + key: 'feathers-sync', + serialize: JSON.stringify, + deserialize: JSON.parse, + redisClient + })) + .use('/todo', { + events: ['custom'], + async create (data) { + return data; + }, + async update (id, data, params) { + return data; + } + }); + app.sync.ready.then(() => { + done(); + }); + }); + + it('duplicates client', () => { + assert.ok(redisClient.duplicate()); + }); + + it('syncs on created with hook context', done => { + const original = { test: 'data' }; + + app.service('todo').once('created', (data, context) => { + assert.deepStrictEqual(original, data); + assert.ok(context); + assert.deepStrictEqual(context.result, data); + assert.strictEqual(context.method, 'create'); + assert.strictEqual(context.type, 'around'); + assert.strictEqual(context.service, app.service('todo')); + assert.strictEqual(context.app, app); + + done(); + }); + + app.service('todo') + .create(original) + .then(data => + assert.deepStrictEqual(original, data) + ) + .catch(done); + }); + + it('sync-in event gets turned into service event', done => { + app.service('todo').once('created', (data, context) => { + assert.deepStrictEqual(data, { message: 'This is a test' }); + assert.strictEqual(context.app, app); + assert.strictEqual(context.service, app.service('todo')); + assert.strictEqual(context.method, 'create'); + assert.strictEqual(context.type, 'after'); + done(); + }); + app.emit('sync-in', { + event: 'created', + path: 'todo', + data: { message: 'This is a test' }, + context: { + data: { message: 'This is a test' }, + params: {}, + type: 'after', + method: 'create', + path: 'todo', + result: { message: 'This is a test' } + } + }); + }); + + it('sends sync-out for service events', done => { + const message = { message: 'This is a test' }; + + app.once('sync-out', data => { + try { + assert.deepStrictEqual(data, { + event: 'created', + path: 'todo', + data: message, + context: { + arguments: [message, {}], + data: message, + params: {}, + type: 'around', + statusCode: undefined, + method: 'create', + event: 'created', + path: 'todo', + result: message + } + }); + done(); + } catch (error) { + done(error); + } + }); + + app.service('todo').create(message); + }); +}); From 618ff97511fc8b30b4571cded8fc8b73f32b1c84 Mon Sep 17 00:00:00 2001 From: James Holcomb Date: Fri, 7 Apr 2023 20:11:28 -0500 Subject: [PATCH 2/2] feat: replace node-redis with ioredis --- README.md | 32 +++--- lib/adapters/redis.js | 27 +++-- package-lock.json | 179 +++------------------------------- package.json | 5 +- test/adapters/ioredis.test.js | 116 ---------------------- test/adapters/redis.test.js | 1 - 6 files changed, 48 insertions(+), 312 deletions(-) delete mode 100644 test/adapters/ioredis.test.js diff --git a/README.md b/README.md index eb8062b..6592739 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ When running multiple instances of your Feathers application (e.g. on several He feathers-sync uses a messaging mechanism to propagate all events to all application instances. It currently supports: -- Redis via [redis](https://github.com/NodeRedis/node_redis) +- Redis via [ioredis](https://github.com/luin/ioredis) - AMQP (RabbitMQ) via [amqplib](https://github.com/squaremo/amqp.node) This allows to scale real-time websocket connections to any number of clients. @@ -94,33 +94,39 @@ app.service('messages').hooks({ `feathers-sync` can be initialized either by specifying the type of adapter through the `uri` (e.g. `redis://localhost:6379`) or using e.g. `sync.redis` directly: ```js -// Configure Redis +// Configure with Redis app.configure( sync({ uri: 'redis://localhost:6379', }) ); -app.configure( - sync.redis({ - db: redisInstance, - }) -); +// Configure Redis using an existing redis instance +const Redis = require('ioredis'); +const redisClient = new Redis({ + // see https://luin.github.io/ioredis/index.html#RedisOptions for additional options + host: 'my.redis.host.com', + port: 6379, + lazyConnect: true, + maxRetriesPerRequest: null, + // ... +}); -// Configure Redis using an existing redisClient app.configure( sync.redis({ - redisClient: redisClient, + key: 'feathers-sync', + serialize: JSON.stringify, + deserialize: JSON.parse, + redisClient }) ); ``` ### Redis -- `uri` - The connection string (must start with `redis://`) +- `uri` - The connection string (must start with `redis://`) (default: `localhost:6379`) - `key` - The key under which all synchronization events will be stored (default: `feathers-sync`) -- `redisClient` - An existing instance of redisClient -- `redisOptions` - Redis [client options](http://redis.js.org/#api-rediscreateclient) +- `redisClient` - (optional) An existing instance of a redis client ### AMQP @@ -155,8 +161,6 @@ const bson = require('bson'); app.configure( sync({ uri: 'redis://localhost:6379', - // Replies will be sent to callbacks as Buffers instead of Strings for bson.deserialize to work. - redisOptions: { return_buffers: true }, serialize: bson.serialize, deserialize: bson.deserialize, }) diff --git a/lib/adapters/redis.js b/lib/adapters/redis.js index 8890825..5877fd1 100644 --- a/lib/adapters/redis.js +++ b/lib/adapters/redis.js @@ -1,27 +1,18 @@ -const redis = require('redis'); +const Redis = require('ioredis'); const debug = require('debug')('feathers-sync:redis'); const core = require('../core'); module.exports = config => { return app => { const { key, serialize, deserialize, redisClient, uri } = config; - const options = { - url: uri, - ...config.redisOptions - }; if (!redisClient) { - debug(`Setting up Redis client for ${options.uri}`); + debug(`Setting up new Redis client for ${uri}`); } - const pub = redisClient || redis.createClient(options); + const pub = redisClient || new Redis(uri); const sub = pub.duplicate(); - const msgFromRedisHandler = data => { - debug(`Got ${key} message from Redis`); - app.emit('sync-in', data); - }; - app.configure(core); app.sync = { deserialize, @@ -30,11 +21,17 @@ module.exports = config => { sub, type: 'redis', ready: new Promise((resolve, reject) => { - pub.connect(); - sub.connect(); sub.once('ready', resolve); sub.once('error', reject); - }).then(() => sub.subscribe(key, msgFromRedisHandler, true)) + }).then(() => { + sub.subscribe(key); + sub.on(serialize && deserialize ? 'messageBuffer' : 'message', function (channel, data) { + if (channel.toString() === key) { + debug(`Got ${key} message from Redis`); + app.emit('sync-in', data); + } + }); + }) }; app.on('sync-out', data => { diff --git a/package-lock.json b/package-lock.json index cb43b39..ca467d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,9 +12,9 @@ "amqp-connection-manager": "^4.1.10", "amqplib": "^0.10.3", "debug": "^4.3.4", + "ioredis": "^5.3.1", "lodash": "^4.17.21", - "nats": "^2.12.1", - "redis": "^4.6.4" + "nats": "^2.12.1" }, "devDependencies": { "@feathersjs/feathers": "^5.0.3", @@ -24,7 +24,6 @@ "@types/node": "^18.14.0", "bson": "^5.0.1", "dtslint": "^4.2.1", - "ioredis": "^5.3.1", "mocha": "^10.2.0", "npm-check-updates": "^16.7.6", "nyc": "^15.1.0", @@ -695,8 +694,7 @@ "node_modules/@ioredis/commands": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", - "dev": true + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -1188,59 +1186,6 @@ "npmlog": "2 || ^3.1.0 || ^4.0.0" } }, - "node_modules/@redis/bloom": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", - "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/client": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.5.tgz", - "integrity": "sha512-fuMnpDYSjT5JXR9rrCW1YWA4L8N/9/uS4ImT3ZEC/hcaQRI1D/9FvwjriRj1UvepIgzZXthFVKMNRzP/LNL7BQ==", - "dependencies": { - "cluster-key-slot": "1.1.2", - "generic-pool": "3.9.0", - "yallist": "4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@redis/graph": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", - "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", - "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.1", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.1.tgz", - "integrity": "sha512-pqCXTc5e7wJJgUuJiC3hBgfoFRoPxYzwn0BEfKgejTM7M/9zP3IpUcqcjgfp8hF+LoV8rHZzcNTz7V+pEIY7LQ==", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/time-series": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", - "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, "node_modules/@semantic-release/commit-analyzer": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", @@ -3408,7 +3353,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "dev": true, "engines": { "node": ">=0.10" } @@ -4993,14 +4937,6 @@ "wide-align": "^1.1.0" } }, - "node_modules/generic-pool": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", - "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", - "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", @@ -5774,7 +5710,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.1.tgz", "integrity": "sha512-C+IBcMysM6v52pTLItYMeV4Hz7uriGtoJdz7SSBDX6u+zwSYGirLdQh3L7t/OItWITcw3gTFMjJReYUwS4zihg==", - "dev": true, "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", @@ -6669,8 +6604,7 @@ "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "dev": true + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", @@ -6687,8 +6621,7 @@ "node_modules/lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "dev": true + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" }, "node_modules/lodash.ismatch": { "version": "4.4.0", @@ -12295,24 +12228,10 @@ "esprima": "~4.0.0" } }, - "node_modules/redis": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.4.tgz", - "integrity": "sha512-wi2tgDdQ+Q8q+PR5FLRx4QvDiWaA+PoJbrzsyFqlClN5R4LplHqN3scs/aGjE//mbz++W19SgxiEnQ27jnCRaA==", - "dependencies": { - "@redis/bloom": "1.2.0", - "@redis/client": "1.5.5", - "@redis/graph": "1.1.0", - "@redis/json": "1.0.4", - "@redis/search": "1.1.1", - "@redis/time-series": "1.0.4" - } - }, "node_modules/redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "dev": true, "engines": { "node": ">=4" } @@ -12321,7 +12240,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "dev": true, "dependencies": { "redis-errors": "^1.0.0" }, @@ -13644,8 +13562,7 @@ "node_modules/standard-as-callback": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", - "dev": true + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" }, "node_modules/standard-engine": { "version": "14.0.1", @@ -15182,7 +15099,8 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/yaml": { "version": "2.2.1", @@ -15909,8 +15827,7 @@ "@ioredis/commands": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", - "dev": true + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -16305,46 +16222,6 @@ "ssri": "^8.0.0" } }, - "@redis/bloom": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", - "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", - "requires": {} - }, - "@redis/client": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.5.tgz", - "integrity": "sha512-fuMnpDYSjT5JXR9rrCW1YWA4L8N/9/uS4ImT3ZEC/hcaQRI1D/9FvwjriRj1UvepIgzZXthFVKMNRzP/LNL7BQ==", - "requires": { - "cluster-key-slot": "1.1.2", - "generic-pool": "3.9.0", - "yallist": "4.0.0" - } - }, - "@redis/graph": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", - "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", - "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.1", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.1.tgz", - "integrity": "sha512-pqCXTc5e7wJJgUuJiC3hBgfoFRoPxYzwn0BEfKgejTM7M/9zP3IpUcqcjgfp8hF+LoV8rHZzcNTz7V+pEIY7LQ==", - "requires": {} - }, - "@redis/time-series": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", - "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", - "requires": {} - }, "@semantic-release/commit-analyzer": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", @@ -17987,8 +17864,7 @@ "denque": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "dev": true + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" }, "depd": { "version": "1.1.2", @@ -19186,11 +19062,6 @@ "wide-align": "^1.1.0" } }, - "generic-pool": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", - "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==" - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -19760,7 +19631,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.1.tgz", "integrity": "sha512-C+IBcMysM6v52pTLItYMeV4Hz7uriGtoJdz7SSBDX6u+zwSYGirLdQh3L7t/OItWITcw3gTFMjJReYUwS4zihg==", - "dev": true, "requires": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", @@ -20429,8 +20299,7 @@ "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "dev": true + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, "lodash.escaperegexp": { "version": "4.1.2", @@ -20447,8 +20316,7 @@ "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "dev": true + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" }, "lodash.ismatch": { "version": "4.4.0", @@ -24456,30 +24324,15 @@ "esprima": "~4.0.0" } }, - "redis": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.4.tgz", - "integrity": "sha512-wi2tgDdQ+Q8q+PR5FLRx4QvDiWaA+PoJbrzsyFqlClN5R4LplHqN3scs/aGjE//mbz++W19SgxiEnQ27jnCRaA==", - "requires": { - "@redis/bloom": "1.2.0", - "@redis/client": "1.5.5", - "@redis/graph": "1.1.0", - "@redis/json": "1.0.4", - "@redis/search": "1.1.1", - "@redis/time-series": "1.0.4" - } - }, "redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "dev": true + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==" }, "redis-parser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "dev": true, "requires": { "redis-errors": "^1.0.0" } @@ -25419,8 +25272,7 @@ "standard-as-callback": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", - "dev": true + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" }, "standard-engine": { "version": "14.0.1", @@ -26626,7 +26478,8 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "yaml": { "version": "2.2.1", diff --git a/package.json b/package.json index b82daa8..1f6fd17 100644 --- a/package.json +++ b/package.json @@ -57,9 +57,9 @@ "amqp-connection-manager": "^4.1.10", "amqplib": "^0.10.3", "debug": "^4.3.4", + "ioredis": "^5.3.1", "lodash": "^4.17.21", - "nats": "^2.12.1", - "redis": "^4.6.4" + "nats": "^2.12.1" }, "devDependencies": { "@feathersjs/feathers": "^5.0.3", @@ -69,7 +69,6 @@ "@types/node": "^18.14.0", "bson": "^5.0.1", "dtslint": "^4.2.1", - "ioredis": "^5.3.1", "mocha": "^10.2.0", "npm-check-updates": "^16.7.6", "nyc": "^15.1.0", diff --git a/test/adapters/ioredis.test.js b/test/adapters/ioredis.test.js deleted file mode 100644 index 2ccf3ea..0000000 --- a/test/adapters/ioredis.test.js +++ /dev/null @@ -1,116 +0,0 @@ -const assert = require('assert'); -const feathers = require('@feathersjs/feathers'); -const { redis } = require('../../lib'); -const Redis = require('ioredis'); - -const redisClient = new Redis({ - lazyConnect: true, - maxRetriesPerRequest: null -}); - -describe('ioredis client tests', () => { - let app; - - before(done => { - app = feathers() - .configure(redis({ - key: 'feathers-sync', - serialize: JSON.stringify, - deserialize: JSON.parse, - redisClient - })) - .use('/todo', { - events: ['custom'], - async create (data) { - return data; - }, - async update (id, data, params) { - return data; - } - }); - app.sync.ready.then(() => { - done(); - }); - }); - - it('duplicates client', () => { - assert.ok(redisClient.duplicate()); - }); - - it('syncs on created with hook context', done => { - const original = { test: 'data' }; - - app.service('todo').once('created', (data, context) => { - assert.deepStrictEqual(original, data); - assert.ok(context); - assert.deepStrictEqual(context.result, data); - assert.strictEqual(context.method, 'create'); - assert.strictEqual(context.type, 'around'); - assert.strictEqual(context.service, app.service('todo')); - assert.strictEqual(context.app, app); - - done(); - }); - - app.service('todo') - .create(original) - .then(data => - assert.deepStrictEqual(original, data) - ) - .catch(done); - }); - - it('sync-in event gets turned into service event', done => { - app.service('todo').once('created', (data, context) => { - assert.deepStrictEqual(data, { message: 'This is a test' }); - assert.strictEqual(context.app, app); - assert.strictEqual(context.service, app.service('todo')); - assert.strictEqual(context.method, 'create'); - assert.strictEqual(context.type, 'after'); - done(); - }); - app.emit('sync-in', { - event: 'created', - path: 'todo', - data: { message: 'This is a test' }, - context: { - data: { message: 'This is a test' }, - params: {}, - type: 'after', - method: 'create', - path: 'todo', - result: { message: 'This is a test' } - } - }); - }); - - it('sends sync-out for service events', done => { - const message = { message: 'This is a test' }; - - app.once('sync-out', data => { - try { - assert.deepStrictEqual(data, { - event: 'created', - path: 'todo', - data: message, - context: { - arguments: [message, {}], - data: message, - params: {}, - type: 'around', - statusCode: undefined, - method: 'create', - event: 'created', - path: 'todo', - result: message - } - }); - done(); - } catch (error) { - done(error); - } - }); - - app.service('todo').create(message); - }); -}); diff --git a/test/adapters/redis.test.js b/test/adapters/redis.test.js index 2efb86c..9293ec3 100644 --- a/test/adapters/redis.test.js +++ b/test/adapters/redis.test.js @@ -59,7 +59,6 @@ describe('feathers-sync Redis custom serializer / deserializer tests', () => { const createApp = _app({ uri: 'redis://localhost:6379', key: 'feathers-sync2', - redisOptions: { return_buffers: true }, serialize: bson.serialize, deserialize: bson.deserialize });