UNPKG

@stolbivi/pirojok

Version:

Some minimalistic library used to build chrome extensions, covers some popular Chrome Extension API

160 lines (159 loc) 6.27 kB
"use strict"; 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;