UNPKG

2.33 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.createRedisEventTarget = void 0;
4const events_1 = require("@whatwg-node/events");
5function createRedisEventTarget(args) {
6 const { publishClient, subscribeClient } = args;
7 const serializer = args.serializer ?? JSON;
8 const callbacksForTopic = new Map();
9 function onMessage(channel, message) {
10 const callbacks = callbacksForTopic.get(channel);
11 if (callbacks === undefined) {
12 return;
13 }
14 const event = new events_1.CustomEvent(channel, {
15 detail: message === '' ? null : serializer.parse(message),
16 });
17 for (const callback of callbacks) {
18 callback(event);
19 }
20 }
21 subscribeClient.on('message', onMessage);
22 function addCallback(topic, callback) {
23 let callbacks = callbacksForTopic.get(topic);
24 if (callbacks === undefined) {
25 callbacks = new Set();
26 callbacksForTopic.set(topic, callbacks);
27 subscribeClient.subscribe(topic);
28 }
29 callbacks.add(callback);
30 }
31 function removeCallback(topic, callback) {
32 const callbacks = callbacksForTopic.get(topic);
33 if (callbacks === undefined) {
34 return;
35 }
36 callbacks.delete(callback);
37 if (callbacks.size > 0) {
38 return;
39 }
40 callbacksForTopic.delete(topic);
41 subscribeClient.unsubscribe(topic);
42 }
43 return {
44 addEventListener(topic, callbackOrOptions) {
45 if (callbackOrOptions != null) {
46 const callback = 'handleEvent' in callbackOrOptions ? callbackOrOptions.handleEvent : callbackOrOptions;
47 addCallback(topic, callback);
48 }
49 },
50 dispatchEvent(event) {
51 publishClient.publish(event.type, event.detail === undefined ? '' : serializer.stringify(event.detail));
52 return true;
53 },
54 removeEventListener(topic, callbackOrOptions) {
55 if (callbackOrOptions != null) {
56 const callback = 'handleEvent' in callbackOrOptions ? callbackOrOptions.handleEvent : callbackOrOptions;
57 removeCallback(topic, callback);
58 }
59 },
60 };
61}
62exports.createRedisEventTarget = createRedisEventTarget;