Skip to content

Commit a83a2a0

Browse files
committed
Buffer support for ioredis and node-redis
This allows subscribing to binary data payloads
1 parent 41486fd commit a83a2a0

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,28 @@ const pubsub = new RedisPubSub({
133133
});
134134
```
135135

136+
**Receiving messages as Buffers**
137+
138+
Some Redis use cases require receiving binary-safe data back from redis (in a Buffer). To accomplish this, override the event names for receiving messages and pmessages. Different redis clients use different names, for example:
139+
140+
| library | message event | message event (Buffer) | pmessage event | pmessage event (Buffer) |
141+
| ------- | ------------- | ---------------------- | -------------- | ----------------------- |
142+
| ioredis | `message` | `messageBuffer` | `pmessage` | `pmessageBuffer` |
143+
| node-redis | `message` | `message_buffer` | `pmessage` | `pmessage_buffer` |
144+
145+
```javascript
146+
import { RedisPubSub } from 'graphql-redis-subscriptions';
147+
import * as Redis from 'ioredis';
148+
149+
const pubsub = new RedisPubSub({
150+
...,
151+
// Tells RedisPubSub to register callbacks on the messageBuffer and pmessageBuffer EventEmitters
152+
messageEventName: 'messageBuffer',
153+
pmessageEventName: 'pmessageBuffer',
154+
});
155+
```
156+
157+
136158
**Also works with your Redis Cluster**
137159

138160
```javascript

src/redis-pubsub.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export interface PubSubRedisOptions {
1414
reviver?: Reviver;
1515
serializer?: Serializer;
1616
deserializer?: Deserializer;
17+
messageEventName?: string;
18+
pmessageEventName?: string;
1719
}
1820

1921
export class RedisPubSub implements PubSubEngine {
@@ -28,6 +30,8 @@ export class RedisPubSub implements PubSubEngine {
2830
reviver,
2931
serializer,
3032
deserializer,
33+
messageEventName = 'message',
34+
pmessageEventName = 'pmessage',
3135
} = options;
3236

3337
this.triggerTransform = triggerTransform || (trigger => trigger as string);
@@ -69,9 +73,9 @@ export class RedisPubSub implements PubSubEngine {
6973
}
7074

7175
// handle messages received via psubscribe and subscribe
72-
this.redisSubscriber.on('pmessage', this.onMessage.bind(this));
76+
this.redisSubscriber.on(pmessageEventName, this.onMessage.bind(this));
7377
// partially applied function passes undefined for pattern arg since 'message' event won't provide it:
74-
this.redisSubscriber.on('message', this.onMessage.bind(this, undefined));
78+
this.redisSubscriber.on(messageEventName, this.onMessage.bind(this, undefined));
7579

7680
this.subscriptionMap = {};
7781
this.subsRefsMap = {};
@@ -194,4 +198,4 @@ export type TriggerTransform = (
194198
) => string;
195199
export type Reviver = (key: any, value: any) => any;
196200
export type Serializer = (source: any) => string;
197-
export type Deserializer = (source: string) => any;
201+
export type Deserializer = (source: string | Buffer) => any;

0 commit comments

Comments
 (0)