Skip to content

Commit 9478dfa

Browse files
authored
Merge pull request #506 from tibber/feature/deserializer-context-with-docs
Expose channel and pattern to deserialize callback (with docs)
2 parents b412078 + 2ec4727 commit 9478dfa

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,28 @@ const pubsub = new RedisPubSub({
172172

173173
You can learn more on the `ioredis` package [here](https://github.com/luin/ioredis).
174174

175+
## Using a custom serializer/deserializer
176+
177+
By default, Javascript objects are (de)serialized using the `JSON.stringify` and `JSON.parse` methods.
178+
You may pass your own serializer and/or deserializer function(s) as part of the options.
179+
180+
The `deserializer` will be called with an extra context object containing `pattern` (if available) and `channel` properties, allowing you to access this information when subscribing to a pattern.
181+
182+
```javascript
183+
import { RedisPubSub } from 'graphql-redis-subscriptions';
184+
import { someSerializer, someDeserializer } from 'some-serializer-library';
185+
186+
const serialize = (source) => {
187+
return someSerializer(source);
188+
};
189+
190+
const deserialize = (sourceOrBuffer, { channel, pattern }) => {
191+
return someDeserializer(sourceOrBuffer, channel, pattern);
192+
};
193+
194+
const pubSub = new RedisPubSub({ ..., serializer: serialize, deserializer: deserialize });
195+
```
196+
175197
## Using a custom reviver
176198

177199
By default, Javascript objects are serialized using the `JSON.stringify` and `JSON.parse` methods.

src/redis-pubsub.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {PubSubAsyncIterator} from './pubsub-async-iterator';
44

55
type RedisClient = Redis | Cluster;
66
type OnMessage<T> = (message: T) => void;
7+
type DeserializerContext = { channel: string, pattern?: string };
78

89
export interface PubSubRedisOptions {
910
connection?: RedisOptions;
@@ -178,7 +179,9 @@ export class RedisPubSub implements PubSubEngine {
178179

179180
let parsedMessage;
180181
try {
181-
parsedMessage = this.deserializer ? this.deserializer(message) : JSON.parse(message, this.reviver);
182+
parsedMessage = this.deserializer
183+
? this.deserializer(message, { pattern, channel })
184+
: JSON.parse(message, this.reviver);
182185
} catch (e) {
183186
parsedMessage = message;
184187
}
@@ -198,4 +201,4 @@ export type TriggerTransform = (
198201
) => string;
199202
export type Reviver = (key: any, value: any) => any;
200203
export type Serializer = (source: any) => string;
201-
export type Deserializer = (source: string | Buffer) => any;
204+
export type Deserializer = (source: string | Buffer, context: DeserializerContext) => any;

0 commit comments

Comments
 (0)