gecko-dev/browser/components/pocket/content/panels/js/messages.js

60 lines
1.7 KiB
JavaScript

/* global RPMRemoveMessageListener:false, RPMAddMessageListener:false, RPMSendAsyncMessage:false */
var pktPanelMessaging = (function() {
function panelIdFromURL(url) {
var panelId = url.match(/panelId=([\w|\d|\.]*)&?/);
if (panelId && panelId.length > 1) {
return panelId[1];
}
return 0;
}
function removeMessageListener(messageId, panelId, callback) {
RPMRemoveMessageListener(`${messageId}_${panelId}`, callback);
}
function addMessageListener(messageId, panelId, callback = () => {}) {
RPMAddMessageListener(`${messageId}_${panelId}`, callback);
}
function sendMessage(messageId, panelId, payload = {}, callback) {
// Payload needs to be an object in format:
// { panelId: panelId, payload: {} }
var messagePayload = {
panelId,
payload,
};
if (callback) {
// If we expect something back, we use RPMSendAsyncMessage and not RPMSendQuery.
// Even though RPMSendQuery returns something, our frame could be closed at any moment,
// and we don't want to close a RPMSendQuery promise loop unexpectedly.
// So instead we setup a response event.
const responseMessageId = `${messageId}_response`;
var responseListener = function(responsePayload) {
callback(responsePayload);
removeMessageListener(responseMessageId, panelId, responseListener);
};
addMessageListener(responseMessageId, panelId, responseListener);
}
// Send message
RPMSendAsyncMessage(messageId, messagePayload);
}
function log() {
RPMSendAsyncMessage("PKT_log", arguments);
}
/**
* Public functions
*/
return {
log,
panelIdFromURL,
addMessageListener,
sendMessage,
};
})();