Skip to content

Commit fc0ec6e

Browse files
authored
Multiple callbacks per topic (#50)
* allow multiple callbacks per topic and call all on message received * remove typo in ternary * remove ES6 * add console logs for testing * adjust type def file to include new callbackId parameter * remove console logs
1 parent 44d9132 commit fc0ec6e

2 files changed

Lines changed: 38 additions & 12 deletions

File tree

index.d.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,9 +410,14 @@ interface Messaging {
410410
subscribe(
411411
topic: string,
412412
options: MessagingSubscribeOptions,
413-
messageCallback: MessageCallback
413+
messageCallback: MessageCallback,
414+
callbackId?: string
415+
): void;
416+
unsubscribe(
417+
topic: string,
418+
options: MessagingSubscribeOptions,
419+
callbackId?: string
414420
): void;
415-
unsubscribe(topic: string, options: MessagingSubscribeOptions): void;
416421
disconnect(): void;
417422
}
418423

index.js

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2017,6 +2017,8 @@ if (!window.console) {
20172017
return user;
20182018
};
20192019

2020+
const DEFAULT_CALLBACK_ID = '__default_callback_id__';
2021+
20202022
/**
20212023
* Initializes the ClearBlade messaging object and connects to a server.
20222024
* @class ClearBlade.Messaging
@@ -2109,11 +2111,15 @@ if (!window.console) {
21092111
};
21102112

21112113
messaging.client.onMessageArrived = function (message) {
2112-
// messageCallback from Subscribe()
2113-
2114-
messageCallbacks[
2115-
ClearBlade.getMessageTopic(message.destinationName, messageCallbacks)
2116-
](message.payloadString, message);
2114+
// messageCallbacks from Subscribe() may contain multiple callbacks per topic
2115+
const callbacks = Object.values(
2116+
messageCallbacks[
2117+
ClearBlade.getMessageTopic(message.destinationName, messageCallbacks)
2118+
]
2119+
);
2120+
for (callback of callbacks) {
2121+
callback(message.payloadString, message);
2122+
}
21172123
};
21182124
// the mqtt websocket library uses "onConnect," but our terminology uses
21192125
// "onSuccess" and "onFailure"
@@ -2186,7 +2192,12 @@ if (!window.console) {
21862192
* var cb = ClearBlade.Messaging({}, callback);
21872193
* cb.subscribe("ClearBlade/is awesome!",{});
21882194
*/
2189-
messaging.subscribe = function (topic, options, messageCallback) {
2195+
messaging.subscribe = function (
2196+
topic,
2197+
options,
2198+
messageCallback,
2199+
callbackId
2200+
) {
21902201
var conf = {
21912202
qos: this._qos || 0,
21922203
};
@@ -2197,7 +2208,15 @@ if (!window.console) {
21972208

21982209
this.client.subscribe(topic, conf);
21992210

2200-
messageCallbacks[topic] = messageCallback;
2211+
if (messageCallbacks[topic]) {
2212+
messageCallbacks[topic] = Object.assign(messageCallbacks[topic], {
2213+
[callbackId || DEFAULT_CALLBACK_ID]: messageCallback,
2214+
});
2215+
} else {
2216+
messageCallbacks[topic] = {
2217+
[callbackId || DEFAULT_CALLBACK_ID]: messageCallback,
2218+
};
2219+
}
22012220
};
22022221

22032222
/**
@@ -2218,15 +2237,17 @@ if (!window.console) {
22182237
* var cb = ClearBlade.Messaging({}, callback);
22192238
* cb.unsubscribe("ClearBlade/is awesome!",{"onSuccess":function(){console.log("we unsubscribe");});
22202239
*/
2221-
messaging.unsubscribe = function (topic, options) {
2240+
messaging.unsubscribe = function (topic, options, callbackId) {
22222241
var conf = {};
22232242
conf['invocationContext'] = options['invocationContext'] || {};
22242243
conf['onSuccess'] = options['onSuccess'] || function () {}; //null;
22252244
conf['onFailure'] = options['onFailure'] || function () {}; //null;
22262245
conf['timeout'] = options['timeout'] || 60;
22272246

2228-
delete messageCallbacks[topic];
2229-
this.client.unsubscribe(topic, conf);
2247+
delete messageCallbacks[topic][callbackId || DEFAULT_CALLBACK_ID];
2248+
if (Object.keys(messageCallbacks[topic]).length === 0) {
2249+
this.client.unsubscribe(topic, conf);
2250+
}
22302251
};
22312252

22322253
/**

0 commit comments

Comments
 (0)