@stolbivi/pirojok
Version:
Some minimalistic library used to build chrome extensions, covers some popular Chrome Extension API
160 lines (159 loc) • 6.27 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MessagesV2 = exports.createFromRequest = exports.createAction = exports.createRequest = void 0;
function createRequest(type) {
function create(payload) {
var request = {
type: type,
payload: payload,
};
return __assign(__assign({}, request), { toAction: function () { return request; } });
}
create.toString = function () { return "".concat(type); };
create.type = type;
return create;
}
exports.createRequest = createRequest;
function createAction(type, handler) {
function create(payload) {
return {
type: type,
payload: payload !== null && payload !== void 0 ? payload : undefined,
handler: handler,
};
}
create.toString = function () { return "".concat(type); };
create.type = type;
return create;
}
exports.createAction = createAction;
function createFromRequest(requestCreator, handler) {
function create(payload) {
return {
type: requestCreator.type,
payload: payload,
handler: handler,
};
}
create.toString = function () { return "".concat(requestCreator.type); };
create.type = requestCreator.type;
return create;
}
exports.createFromRequest = createFromRequest;
/**
* Upgraded version of messaging API wrapper. Designed for one time request-response style of communication.
* Internally cleans up listeners everywhere after receiving response or failing to receive it.
* You are still responsible to remove connection listener manually on the listening side, see #removeListener
*/
var MessagesV2 = /** @class */ (function () {
function MessagesV2(verbose) {
if (verbose === void 0) { verbose = false; }
this._verbose = verbose;
}
MessagesV2.prototype.request = function (request) {
return this.handleRequest(request, chrome.runtime.connect({ name: request.type }));
};
MessagesV2.prototype.requestTab = function (tabId, request) {
return this.handleRequest(request, chrome.tabs.connect(tabId, { name: request.type }));
};
MessagesV2.prototype.handleRequest = function (request, port) {
var _this = this;
return new Promise(function (resolve, reject) {
var onDisconnect = function () {
try {
if (chrome.runtime.lastError) {
reject(chrome.runtime.lastError.message);
}
}
catch (e) {
reject('Error handling runtime error: ' + JSON.stringify(e));
}
if (_this._verbose) {
console.debug('Removing onDisconnect listener for:', request.type);
}
port.onDisconnect.removeListener(onDisconnect);
};
port.onDisconnect.addListener(onDisconnect);
var onMessage = function (response) {
resolve(response);
if (_this._verbose) {
console.debug('Removing onMessage listener for:', request.type);
}
port.onMessage.removeListener(onMessage);
};
port.onMessage.addListener(onMessage);
try {
port.postMessage(request.payload);
}
catch (e) {
reject('Error posting message: ' + JSON.stringify(e));
}
});
};
MessagesV2.prototype.listen = function (actionCreator) {
var _this = this;
var onConnect = function (port) {
var action = actionCreator();
if (port.name === action.type) {
var onMessage_1 = function (payload) {
action
.handler(payload, port.sender)
.then(function (response) {
try {
port.postMessage(response);
}
catch (e) {
console.error('Error posting response:', JSON.stringify(e));
}
})
.then(function () {
if (_this._verbose) {
console.debug('Listener completed for:', port.name);
}
})
.catch(function (e) { return console.error(e); })
.finally(function () {
if (_this._verbose) {
console.debug('Disconnecting port and removing listener');
}
port.disconnect();
port.onMessage.removeListener(onMessage_1);
});
};
if (_this._verbose) {
console.debug('Adding listener for port:', port.name);
}
port.onMessage.addListener(onMessage_1);
var onDisconnect_1 = function (p) {
if (_this._verbose) {
console.debug('Disconnect detected for:', p.name, 'removing listeners');
}
p.onMessage.removeListener(onMessage_1);
p.onDisconnect.removeListener(onDisconnect_1);
};
port.onDisconnect.addListener(onDisconnect_1);
}
};
chrome.runtime.onConnect.addListener(onConnect);
return onConnect;
};
MessagesV2.prototype.removeListener = function (onConnect) {
if (this._verbose) {
console.debug('Removing listener');
}
chrome.runtime.onConnect.removeListener(onConnect);
};
return MessagesV2;
}());
exports.MessagesV2 = MessagesV2;