UNPKG

3.06 kBJavaScriptView Raw
1/**
2 * Subscribe
3 *
4 * TODO: Verify how multiple channel subscription works in actual Redis
5 * Optional callback?
6 *
7 */
8
9var patternToRegex = require('./helpers').patternToRegex;
10
11exports.subscribe = function () {
12
13 var self = this;
14
15 if (!arguments.length) {
16 return;
17 }
18
19 this.pub_sub_mode = true;
20
21 for (var i = 0; i < arguments.length; i++) {
22
23 if ('string' == typeof arguments[i]) {
24
25 // Event on next tick to emulate an actual server call
26 var channelName = arguments[i];
27 process.nextTick(function () {
28 self.subscriptions[channelName] = true;
29 // TODO Should also send length of subscriptions here
30 self.emit('subscribe', channelName);
31 });
32 }
33 }
34}
35
36/**
37 * pSubscribe
38 */
39exports.psubscribe = function () {
40 var self = this;
41 if (!arguments.length) {
42 return;
43 }
44 this.pub_sub_mode = true;
45
46 for (var i = 0; i < arguments.length; i++) {
47 if ('string' == typeof arguments[i]) {
48 // Event on next tick to emulate an actual server call
49 var channelName = arguments[i];
50 process.nextTick(function () {
51 self.psubscriptions[channelName] = patternToRegex(channelName);
52 self.emit('psubscribe', channelName);
53 });
54 }
55 }
56}
57/**
58 * Unsubscribe
59 */
60exports.unsubscribe = function () {
61
62 var self = this
63 , subcriptions = arguments;
64
65 if (!arguments.length) {
66 subcriptions = Object.keys(self.subscriptions).map(function (subscription) {
67 return subscription;
68 })
69 }
70
71 for (var i = 0; i < subcriptions.length; i++) {
72
73 if ('string' == typeof subcriptions[i]) {
74
75 // Event on next tick to emulate an actual server call
76 var channelName = subcriptions[i];
77 process.nextTick((function(channelName) {
78 return function () {
79 self.subscriptions[channelName] = false;
80 delete self.subscriptions[channelName];
81 self.emit('unsubscribe', channelName);
82 }
83 })(channelName));
84 }
85 }
86
87 // TODO: If this was the last subscription, pub_sub_mode should be set to false
88 this.pub_sub_mode = false;
89}
90
91/**
92 * punsubscribe
93 */
94exports.punsubscribe = function () {
95 var self = this
96 , subcriptions = arguments;
97
98 // Unsubscribe from ALL channels
99 if (!arguments.length) {
100 subcriptions = Object.keys(self.psubscriptions);
101 this.pub_sub_mode = false;
102 }
103
104 for (var i = 0; i < subcriptions.length; i++) {
105 if ('string' == typeof arguments[i]) {
106 // Event on next tick to emulate an actual server call
107 var channelName = arguments[i];
108 process.nextTick(function () {
109 delete self.psubscriptions[channelName];
110 self.emit('punsubscribe', channelName);
111 });
112 }
113 }
114 // TODO: If this was the last subscription, pub_sub_mode should be set to false
115}
116
117/**
118 * Publish
119 */
120exports.publish = function (mockInstance, channel, msg) {
121
122 this.pub_sub_mode = true;
123 process.nextTick(function () {
124 if ((typeof msg == "object") && (msg !== null)) {
125 msg = JSON.stringify(msg);
126 }
127 mockInstance.emit('message', channel, msg);
128 });
129}