data-transport
Version:
A simple and responsive transport
113 lines • 15.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ServiceWorkerTransport = exports.ServiceWorkerServiceTransport = exports.ServiceWorkerClientTransport = void 0;
var tslib_1 = require("tslib");
var transport_1 = require("../transport");
var utils_1 = require("../utils");
var DEFAULT_USE_ON_SAFARI = true;
var decode = function (data, useOnSafari) {
try {
return useOnSafari && (0, utils_1.detectSafari)() ? JSON.stringify(data) : data;
}
catch (e) {
console.error("Failed to stringify:", data);
throw e;
}
};
var encode = function (data, useOnSafari) {
try {
return typeof data === 'string' && useOnSafari && (0, utils_1.detectSafari)()
? JSON.parse(data)
: data;
}
catch (e) {
console.error("Failed to parse:", data);
}
return data;
};
var ServiceWorkerClientTransport = /** @class */ (function (_super) {
tslib_1.__extends(ServiceWorkerClientTransport, _super);
function ServiceWorkerClientTransport(_options) {
var worker = _options.worker, _a = _options.useOnSafari, useOnSafari = _a === void 0 ? DEFAULT_USE_ON_SAFARI : _a, _b = _options.listener, listener = _b === void 0 ? function (callback) {
var handler = function (_a) {
var data = _a.data;
callback(encode(data, useOnSafari));
};
navigator.serviceWorker.addEventListener('message', handler);
return function () {
navigator.serviceWorker.removeEventListener('message', handler);
};
} : _b, _c = _options.sender, sender = _c === void 0 ? function (message) {
var _a;
var transfer = (_a = message.transfer) !== null && _a !== void 0 ? _a : [];
delete message.transfer;
worker.postMessage(message, transfer);
} : _c, options = tslib_1.__rest(_options, ["worker", "useOnSafari", "listener", "sender"]);
return _super.call(this, tslib_1.__assign(tslib_1.__assign({}, options), { listener: listener, sender: sender })) || this;
}
return ServiceWorkerClientTransport;
}(transport_1.Transport));
exports.ServiceWorkerClientTransport = ServiceWorkerClientTransport;
var ServiceWorkerServiceTransport = /** @class */ (function (_super) {
tslib_1.__extends(ServiceWorkerServiceTransport, _super);
function ServiceWorkerServiceTransport(_options) {
if (_options === void 0) { _options = {}; }
var _this = this;
var _a = _options.useOnSafari, useOnSafari = _a === void 0 ? DEFAULT_USE_ON_SAFARI : _a, _b = _options.listener, listener = _b === void 0 ? function (callback) {
var handler = function (_a) {
var data = _a.data, source = _a.source;
data._clientId = source.id;
callback(data);
};
self.addEventListener('message', handler);
return function () { return self.removeEventListener('message', handler); };
} : _b, _c = _options.sender, sender = _c === void 0 ? function (message) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var transfer, data, client_1, client;
var _a;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
transfer = message.transfer || [];
delete message.transfer;
data = decode(message, useOnSafari);
if (!message._clientId) return [3 /*break*/, 2];
return [4 /*yield*/, self.clients.get(message._clientId)];
case 1:
client_1 = _b.sent();
if (!client_1) {
console.warn("The client \"".concat(message._clientId, "\" is closed."));
return [2 /*return*/];
}
delete message._clientId;
client_1.postMessage(data, transfer);
return [2 /*return*/];
case 2:
client = (_a = message._extra) === null || _a === void 0 ? void 0 : _a._client;
if (client) {
delete message._extra._client;
client.postMessage(data, transfer);
return [2 /*return*/];
}
self.clients
.matchAll()
.then(function (all) {
return all.map(function (client) { return client.postMessage(data, transfer); });
});
return [2 /*return*/];
}
});
}); } : _c, options = tslib_1.__rest(_options, ["useOnSafari", "listener", "sender"]);
_this = _super.call(this, tslib_1.__assign(tslib_1.__assign({}, options), { listener: listener, sender: sender })) || this;
self.addEventListener('activate', function (event) {
event.waitUntil(self.clients.claim());
});
return _this;
}
return ServiceWorkerServiceTransport;
}(transport_1.Transport));
exports.ServiceWorkerServiceTransport = ServiceWorkerServiceTransport;
exports.ServiceWorkerTransport = {
Client: ServiceWorkerClientTransport,
Service: ServiceWorkerServiceTransport,
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZVdvcmtlclRyYW5zcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmFuc3BvcnRzL3NlcnZpY2VXb3JrZXJUcmFuc3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQU1BLDBDQUF5QztBQUN6QyxrQ0FBd0M7QUE4QnhDLElBQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDO0FBRW5DLElBQU0sTUFBTSxHQUFHLFVBQUMsSUFBUyxFQUFFLFdBQW9CO0lBQzdDLElBQUksQ0FBQztRQUNILE9BQU8sV0FBVyxJQUFJLElBQUEsb0JBQVksR0FBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDckUsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxDQUFDO0lBQ1YsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLElBQU0sTUFBTSxHQUFHLFVBQUMsSUFBUyxFQUFFLFdBQW9CO0lBQzdDLElBQUksQ0FBQztRQUNILE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLFdBQVcsSUFBSSxJQUFBLG9CQUFZLEdBQUU7WUFDOUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBVyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDWCxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBRUY7SUFFVSx3REFBWTtJQUNwQixzQ0FBWSxRQUE2QztRQUVyRCxJQUFBLE1BQU0sR0FtQkosUUFBUSxPQW5CSixF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Q0FBQyxNQUFNLDBDQUFFLE9BQU8sQ0FBQzt3QkFDdkMsSUFBSSxNQUFNLEVBQUUsQ0FBQzs0QkFDWCxPQUFPLE9BQU8sQ0FBQyxNQUFPLENBQUMsT0FBTyxDQUFDOzRCQUMvQixNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQzs0QkFDbkMsc0JBQU87d0JBQ1QsQ0FBQzt3QkFDRCxJQUFJLENBQUMsT0FBTzs2QkFDVCxRQUFRLEVBQUU7NkJBQ1YsSUFBSSxDQUFDLFVBQUMsR0FBRzs0QkFDUixPQUFBLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFNLElBQUssT0FBQSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBbEMsQ0FBa0MsQ0FBQzt3QkFBdkQsQ0FBdUQsQ0FDeEQsQ0FBQzs7OzthQUNMLEtBQUEsRUFDRSxPQUFPLGtCQUNSLFFBQVEsRUF0Q04scUNBc0NMLENBRFcsQ0FDQztRQUNiLFFBQUEsTUFBSyxrREFDQSxPQUFPLEtBQ1YsUUFBUSxVQUFBLEVBQ1IsTUFBTSxRQUFBLElBQ04sU0FBQztRQUNILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsVUFBQyxLQUFLO1lBQ3RDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDOztJQUNMLENBQUM7SUFDSCxvQ0FBQztBQUFELENBQUMsQUFwREQsQ0FFVSxxQkFBUyxHQWtEbEI7QUFwRHFCLHNFQUE2QjtBQXNEdEMsUUFBQSxzQkFBc0IsR0FBRztJQUNwQyxNQUFNLEVBQUUsNEJBQTRCO0lBQ3BDLE9BQU8sRUFBRSw2QkFBNkI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFRyYW5zcG9ydE9wdGlvbnMsXG4gIFRyYW5zZmVyYWJsZVdvcmtlcixcbiAgTGlzdGVuZXJPcHRpb25zLFxuICBCYXNlSW50ZXJhY3Rpb24sXG59IGZyb20gJy4uL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBUcmFuc3BvcnQgfSBmcm9tICcuLi90cmFuc3BvcnQnO1xuaW1wb3J0IHsgZGV0ZWN0U2FmYXJpIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG4vLyBmb2xsb3cgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMjA1OTVcbi8vIHdvcmthcm91bmQ6IGB0c2MgLS1za2lwTGliQ2hlY2tgLlxuZGVjbGFyZSB2YXIgc2VsZjogU2VydmljZVdvcmtlckdsb2JhbFNjb3BlO1xuXG5pbnRlcmZhY2UgU2VydmljZVdvcmtlckNsaWVudElkIGV4dGVuZHMgVHJhbnNmZXJhYmxlV29ya2VyIHtcbiAgX2NsaWVudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VXb3JrZXJDbGllbnRUcmFuc3BvcnRPcHRpb25zXG4gIGV4dGVuZHMgUGFydGlhbDxUcmFuc3BvcnRPcHRpb25zPFRyYW5zZmVyYWJsZVdvcmtlcj4+IHtcbiAgLyoqXG4gICAqIEEgc2VydmljZSB3b3JrZXIgaW5zdGFuY2UgZm9yIGRhdGEgdHJhbnNwb3J0LlxuICAgKi9cbiAgd29ya2VyOiBTZXJ2aWNlV29ya2VyO1xuICAvKipcbiAgICogQ29tcGF0aWJpbGl0eSB3aXRoIHVuc3RhYmxlIHNlcmlhbGl6YXRpb24gaW4gU2FmYXJpXG4gICAqL1xuICB1c2VPblNhZmFyaT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVdvcmtlclNlcnZpY2VUcmFuc3BvcnRPcHRpb25zXG4gIGV4dGVuZHMgUGFydGlhbDxUcmFuc3BvcnRPcHRpb25zPFNlcnZpY2VXb3JrZXJDbGllbnRJZD4+IHtcbiAgLyoqXG4gICAqIENvbXBhdGliaWxpdHkgd2l0aCB1bnN0YWJsZSBzZXJpYWxpemF0aW9uIGluIFNhZmFyaVxuICAgKi9cbiAgdXNlT25TYWZhcmk/OiBib29sZWFuO1xufVxuXG5jb25zdCBERUZBVUxUX1VTRV9PTl9TQUZBUkkgPSB0cnVlO1xuXG5jb25zdCBkZWNvZGUgPSAoZGF0YTogYW55LCB1c2VPblNhZmFyaTogYm9vbGVhbikgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiB1c2VPblNhZmFyaSAmJiBkZXRlY3RTYWZhcmkoKSA/IEpTT04uc3RyaW5naWZ5KGRhdGEpIDogZGF0YTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBzdHJpbmdpZnk6YCwgZGF0YSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcblxuY29uc3QgZW5jb2RlID0gKGRhdGE6IGFueSwgdXNlT25TYWZhcmk6IGJvb2xlYW4pID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnICYmIHVzZU9uU2FmYXJpICYmIGRldGVjdFNhZmFyaSgpXG4gICAgICA/IEpTT04ucGFyc2UoZGF0YSBhcyBhbnkpXG4gICAgICA6IGRhdGE7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2U6YCwgZGF0YSk7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59O1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2VydmljZVdvcmtlckNsaWVudFRyYW5zcG9ydDxcbiAgVCBleHRlbmRzIEJhc2VJbnRlcmFjdGlvbiA9IGFueVxuPiBleHRlbmRzIFRyYW5zcG9ydDxUPiB7XG4gIGNvbnN0cnVjdG9yKF9vcHRpb25zOiBTZXJ2aWNlV29ya2VyQ2xpZW50VHJhbnNwb3J0T3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIHdvcmtlcixcbiAgICAgIHVzZU9uU2FmYXJpID0gREVGQVVMVF9VU0VfT05fU0FGQVJJLFxuICAgICAgbGlzdGVuZXIgPSAoY2FsbGJhY2spID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9ICh7XG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgfTogTWVzc2FnZUV2ZW50PExpc3RlbmVyT3B0aW9uczxUcmFuc2ZlcmFibGVXb3JrZXI+PikgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKGVuY29kZShkYXRhLCB1c2VPblNhZmFyaSkpO1xuICAgICAgICB9O1xuICAgICAgICBuYXZpZ2F0b3Iuc2VydmljZVdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgbmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHNlbmRlciA9IChtZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyID0gbWVzc2FnZS50cmFuc2ZlciA/PyBbXTtcbiAgICAgICAgZGVsZXRlIG1lc3NhZ2UudHJhbnNmZXI7XG4gICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShtZXNzYWdlLCB0cmFuc2Zlcik7XG4gICAgICB9LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gPSBfb3B0aW9ucztcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbGlzdGVuZXIsXG4gICAgICBzZW5kZXIsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFNlcnZpY2VXb3JrZXJTZXJ2aWNlVHJhbnNwb3J0PFxuICBUIGV4dGVuZHMgQmFzZUludGVyYWN0aW9uID0gYW55XG4+IGV4dGVuZHMgVHJhbnNwb3J0PFQ+IHtcbiAgY29uc3RydWN0b3IoX29wdGlvbnM6IFNlcnZpY2VXb3JrZXJTZXJ2aWNlVHJhbnNwb3J0T3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgdXNlT25TYWZhcmkgPSBERUZBVUxUX1VTRV9PTl9TQUZBUkksXG4gICAgICBsaXN0ZW5lciA9IChjYWxsYmFjaykgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gKHsgZGF0YSwgc291cmNlIH06IEV4dGVuZGFibGVNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgICAgICBkYXRhLl9jbGllbnRJZCA9IChzb3VyY2UgYXMgQ2xpZW50KS5pZCBhcyBzdHJpbmc7XG4gICAgICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gKCkgPT4gc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICB9LFxuICAgICAgc2VuZGVyID0gYXN5bmMgKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgdHJhbnNmZXIgPSBtZXNzYWdlLnRyYW5zZmVyIHx8IFtdO1xuICAgICAgICBkZWxldGUgbWVzc2FnZS50cmFuc2ZlcjtcbiAgICAgICAgY29uc3QgZGF0YSA9IGRlY29kZShtZXNzYWdlLCB1c2VPblNhZmFyaSk7XG4gICAgICAgIGlmIChtZXNzYWdlLl9jbGllbnRJZCkge1xuICAgICAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHNlbGYuY2xpZW50cy5nZXQobWVzc2FnZS5fY2xpZW50SWQpO1xuICAgICAgICAgIGlmICghY2xpZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFRoZSBjbGllbnQgXCIke21lc3NhZ2UuX2NsaWVudElkfVwiIGlzIGNsb3NlZC5gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIG1lc3NhZ2UuX2NsaWVudElkO1xuICAgICAgICAgIGNsaWVudC5wb3N0TWVzc2FnZShkYXRhLCB0cmFuc2Zlcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xpZW50ID0gbWVzc2FnZS5fZXh0cmE/Ll9jbGllbnQ7XG4gICAgICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgICBkZWxldGUgbWVzc2FnZS5fZXh0cmEhLl9jbGllbnQ7XG4gICAgICAgICAgY2xpZW50LnBvc3RNZXNzYWdlKGRhdGEsIHRyYW5zZmVyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5jbGllbnRzXG4gICAgICAgICAgLm1hdGNoQWxsKClcbiAgICAgICAgICAudGhlbigoYWxsKSA9PlxuICAgICAgICAgICAgYWxsLm1hcCgoY2xpZW50KSA9PiBjbGllbnQucG9zdE1lc3NhZ2UoZGF0YSwgdHJhbnNmZXIpKVxuICAgICAgICAgICk7XG4gICAgICB9LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gPSBfb3B0aW9ucztcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgbGlzdGVuZXIsXG4gICAgICBzZW5kZXIsXG4gICAgfSk7XG4gICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdhY3RpdmF0ZScsIChldmVudCkgPT4ge1xuICAgICAgZXZlbnQud2FpdFVudGlsKHNlbGYuY2xpZW50cy5jbGFpbSgpKTtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgU2VydmljZVdvcmtlclRyYW5zcG9ydCA9IHtcbiAgQ2xpZW50OiBTZXJ2aWNlV29ya2VyQ2xpZW50VHJhbnNwb3J0LFxuICBTZXJ2aWNlOiBTZXJ2aWNlV29ya2VyU2VydmljZVRyYW5zcG9ydCxcbn07XG4iXX0=