rpcchannel
Version:
Easy RPC with permission controls
96 lines (81 loc) • 12.7 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.rpcSerialize = rpcSerialize;
exports.toRpcSerialized = void 0;
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var toRpcSerialized = Symbol('ChannelRpcSerialize');
exports.toRpcSerialized = toRpcSerialized;
/**
* Javascript will throw errors if I do a simple defined check, so all of this
* crap is to ensure that doesn't happen. It would be nice to put this in a
* function, but then JS would throw the error. So, all of this typed out crap
* is actually necessary.
*/
var transferrables = [typeof MessagePort !== 'undefined' && MessagePort, typeof ImageBitmap !== 'undefined' && ImageBitmap, typeof OffscreenCanvas !== 'undefined' && OffscreenCanvas, typeof ArrayBuffer !== 'undefined' && ArrayBuffer, typeof Int8Array !== 'undefined' && Int8Array, typeof Int16Array !== 'undefined' && Int16Array, typeof Int32Array !== 'undefined' && Int32Array, typeof BigInt64Array !== 'undefined' && BigInt64Array, typeof Uint8Array !== 'undefined' && Uint8Array, typeof Uint8ClampedArray !== 'undefined' && Uint8ClampedArray, typeof Uint16Array !== 'undefined' && Uint16Array, typeof Uint32Array !== 'undefined' && Uint32Array, typeof BigUint64Array !== 'undefined' && BigUint64Array, typeof Float32Array !== 'undefined' && Float32Array, typeof Float64Array !== 'undefined' && Float64Array].filter(function (d) {
return d;
});
/**
* Prepares `data` to be sent over a MessagePort by ensuring that all data is
* of a type that can be sent and that all transferrables are `push`ed to
* `xfer`.
* @todo Make error stack sending configurable
* @param data Data to serialize
* @param xfer Destination array for transferrables
* @returns The data in serialized format
*/
function rpcSerialize(data, xfer) {
if (data && data[toRpcSerialized]) {
return data[toRpcSerialized](data, xfer);
}
switch ((0, _typeof2["default"])(data)) {
case 'undefined':
case 'bigint':
case 'boolean':
case 'number':
case 'string':
return data;
case 'symbol':
throw new TypeError('Symbols cannot be serialized');
case 'function':
throw new TypeError('Functions cannot be serialized');
case 'object':
// Null is an object... I guess
if (data === null) {
return null;
}
if (transferrables.some(function (type) {
return data instanceof type;
})) {
xfer.push(data);
return data;
}
if (data instanceof Error) {
return {
name: data.name,
message: data.message,
stack: 'Stack trace redacted for security reasons',
// These don't exist in the TS definitions, but they may exist in
// other runtime environments
columnNumber: data.columnNumber,
lineNumber: data.lineNumber,
fileName: data.fileName
};
}
if (Array.isArray(data)) {
return data.map(function (e) {
return rpcSerialize(e, xfer);
});
}
var robj = {};
Object.keys(data).forEach(function (k) {
robj[k] = rpcSerialize(data[k], xfer);
});
return robj;
default:
throw new TypeError("Cannot serialize unknown type ".concat((0, _typeof2["default"])(data)));
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zZXJpYWxpemVyLnRzIl0sIm5hbWVzIjpbInRvUnBjU2VyaWFsaXplZCIsIlN5bWJvbCIsInRyYW5zZmVycmFibGVzIiwiTWVzc2FnZVBvcnQiLCJJbWFnZUJpdG1hcCIsIk9mZnNjcmVlbkNhbnZhcyIsIkFycmF5QnVmZmVyIiwiSW50OEFycmF5IiwiSW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJCaWdJbnQ2NEFycmF5IiwiVWludDhBcnJheSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiVWludDE2QXJyYXkiLCJVaW50MzJBcnJheSIsIkJpZ1VpbnQ2NEFycmF5IiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiZmlsdGVyIiwiZCIsInJwY1NlcmlhbGl6ZSIsImRhdGEiLCJ4ZmVyIiwiVHlwZUVycm9yIiwic29tZSIsInR5cGUiLCJwdXNoIiwiRXJyb3IiLCJuYW1lIiwibWVzc2FnZSIsInN0YWNrIiwiY29sdW1uTnVtYmVyIiwibGluZU51bWJlciIsImZpbGVOYW1lIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiZSIsInJvYmoiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImsiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFPLElBQU1BLGVBQWUsR0FBR0MsTUFBTSxDQUFDLHFCQUFELENBQTlCOzs7QUE2QlA7Ozs7OztBQU1BLElBQU1DLGNBQWMsR0FBRyxDQUNyQixPQUFPQyxXQUFQLEtBQXVCLFdBQXZCLElBQXNDQSxXQURqQixFQUVyQixPQUFPQyxXQUFQLEtBQXVCLFdBQXZCLElBQXNDQSxXQUZqQixFQUdyQixPQUFPQyxlQUFQLEtBQTJCLFdBQTNCLElBQTBDQSxlQUhyQixFQUtyQixPQUFPQyxXQUFQLEtBQXVCLFdBQXZCLElBQXNDQSxXQUxqQixFQU9yQixPQUFPQyxTQUFQLEtBQXFCLFdBQXJCLElBQW9DQSxTQVBmLEVBUXJCLE9BQU9DLFVBQVAsS0FBc0IsV0FBdEIsSUFBcUNBLFVBUmhCLEVBU3JCLE9BQU9D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Z0REIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHRvUnBjU2VyaWFsaXplZCA9IFN5bWJvbCgnQ2hhbm5lbFJwY1NlcmlhbGl6ZScpXG5cbnR5cGUgUHJpbWl0aXZlID0gdW5kZWZpbmVkIHwgbnVsbCB8IHZvaWQgfCBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgQmlnSW50XG5cbnR5cGUgU2VyaWFsaXphYmxlQXJyYXkgPSBTZXJpYWxpemFibGVEYXRhW11cbnR5cGUgU2VyaWFsaXphdGlvbkZ1bmNPYmplY3QgPSB7IFt0b1JwY1NlcmlhbGl6ZWRdOiBTZXJpYWxpemF0aW9uRnVuY3Rpb24gfVxudHlwZSBTZXJpYWxpemFibGVPYmplY3QgPVxuICB8IHsgW2tleTogc3RyaW5nXTogU2VyaWFsaXphYmxlRGF0YSB9XG4gIHwgU2VyaWFsaXphdGlvbkZ1bmNPYmplY3RcbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZURhdGEgPVxuICB8IFByaW1pdGl2ZVxuICB8IFNlcmlhbGl6YWJsZUFycmF5XG4gIHwgU2VyaWFsaXphYmxlT2JqZWN0XG4gIHwgVHJhbnNmZXJhYmxlXG4gIHwgRXJyb3JcblxudHlwZSBTZXJpYWxpemVkQXJyYXkgPSBTZXJpYWxpemVkRGF0YVtdXG50eXBlIFNlcmlhbGl6ZWRPYmplY3QgPSB7IFtrZXk6IHN0cmluZ106IFNlcmlhbGl6ZWREYXRhIH1cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWREYXRhID1cbiAgfCBQcmltaXRpdmVcbiAgfCBTZXJpYWxpemVkQXJyYXlcbiAgfCBTZXJpYWxpemVkT2JqZWN0XG4gIHwgVHJhbnNmZXJhYmxlXG5cbnR5cGUgU2VyaWFsaXphdGlvbkZ1bmN0aW9uID0gKFxuICBkYXRhOiBTZXJpYWxpemFibGVEYXRhLFxuICB4ZmVyOiBUcmFuc2ZlcmFibGVbXVxuKSA9PiBTZXJpYWxpemVkRGF0YVxuXG4vKipcbiAqIEphdmFzY3JpcHQgd2lsbCB0aHJvdyBlcnJvcnMgaWYgSSBkbyBhIHNpbXBsZSBkZWZpbmVkIGNoZWNrLCBzbyBhbGwgb2YgdGhpc1xuICogY3JhcCBpcyB0byBlbnN1cmUgdGhhdCBkb2Vzbid0IGhhcHBlbi4gSXQgd291bGQgYmUgbmljZSB0byBwdXQgdGhpcyBpbiBhXG4gKiBmdW5jdGlvbiwgYnV0IHRoZW4gSlMgd291bGQgdGhyb3cgdGhlIGVycm9yLiBTbywgYWxsIG9mIHRoaXMgdHlwZWQgb3V0IGNyYXBcbiAqIGlzIGFjdHVhbGx5IG5lY2Vzc2FyeS5cbiAqL1xuY29uc3QgdHJhbnNmZXJyYWJsZXMgPSBbXG4gIHR5cGVvZiBNZXNzYWdlUG9ydCAhPT0gJ3VuZGVmaW5lZCcgJiYgTWVzc2FnZVBvcnQsXG4gIHR5cGVvZiBJbWFnZUJpdG1hcCAhPT0gJ3VuZGVmaW5lZCcgJiYgSW1hZ2VCaXRtYXAsXG4gIHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICd1bmRlZmluZWQnICYmIE9mZnNjcmVlbkNhbnZhcyxcblxuICB0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIEFycmF5QnVmZmVyLFxuXG4gIHR5cGVvZiBJbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnICYmIEludDhBcnJheSxcbiAgdHlwZW9mIEludDE2QXJyYXkgIT09ICd1bmRlZmluZWQnICYmIEludDE2QXJyYXksXG4gIHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBJbnQzMkFycmF5LFxuICB0eXBlb2YgQmlnSW50NjRBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgQmlnSW50NjRBcnJheSxcblxuICB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgVWludDhBcnJheSxcbiAgdHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBVaW50OENsYW1wZWRBcnJheSxcbiAgdHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBVaW50MTZBcnJheSxcbiAgdHlwZW9mIFVpbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBVaW50MzJBcnJheSxcbiAgdHlwZW9mIEJpZ1VpbnQ2NEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBCaWdVaW50NjRBcnJheSxcblxuICB0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBGbG9hdDMyQXJyYXksXG4gIHR5cGVvZiBGbG9hdDY0QXJyYXkgIT09ICd1bmRlZmluZWQnICYmIEZsb2F0NjRBcnJheVxuXS5maWx0ZXIoKGQpID0+IGQpXG5cbi8qKlxuICogUHJlcGFyZXMgYGRhdGFgIHRvIGJlIHNlbnQgb3ZlciBhIE1lc3NhZ2VQb3J0IGJ5IGVuc3VyaW5nIHRoYXQgYWxsIGRhdGEgaXNcbiAqIG9mIGEgdHlwZSB0aGF0IGNhbiBiZSBzZW50IGFuZCB0aGF0IGFsbCB0cmFuc2ZlcnJhYmxlcyBhcmUgYHB1c2hgZWQgdG9cbiAqIGB4ZmVyYC5cbiAqIEB0b2RvIE1ha2UgZXJyb3Igc3RhY2sgc2VuZGluZyBjb25maWd1cmFibGVcbiAqIEBwYXJhbSBkYXRhIERhdGEgdG8gc2VyaWFsaXplXG4gKiBAcGFyYW0geGZlciBEZXN0aW5hdGlvbiBhcnJheSBmb3IgdHJhbnNmZXJyYWJsZXNcbiAqIEByZXR1cm5zIFRoZSBkYXRhIGluIHNlcmlhbGl6ZWQgZm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBycGNTZXJpYWxpemUoXG4gIGRhdGE6IFNlcmlhbGl6YWJsZURhdGEsXG4gIHhmZXI6IFRyYW5zZmVyYWJsZVtdXG4pOiBTZXJpYWxpemVkRGF0YSB7XG4gIGlmIChkYXRhICYmIChkYXRhIGFzIFNlcmlhbGl6YXRpb25GdW5jT2JqZWN0KVt0b1JwY1NlcmlhbGl6ZWRdKSB7XG4gICAgcmV0dXJuIChkYXRhIGFzIFNlcmlhbGl6YXRpb25GdW5jT2JqZWN0KVt0b1JwY1NlcmlhbGl6ZWRdKGRhdGEsIHhmZXIpXG4gIH1cbiAgc3dpdGNoICh0eXBlb2YgZGF0YSkge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgY2FzZSAnYmlnaW50JzpcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gZGF0YVxuICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTeW1ib2xzIGNhbm5vdCBiZSBzZXJpYWxpemVkJylcbiAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGdW5jdGlvbnMgY2Fubm90IGJlIHNlcmlhbGl6ZWQnKVxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAvLyBOdWxsIGlzIGFuIG9iamVjdC4uLiBJIGd1ZXNzXG4gICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0cmFuc2ZlcnJhYmxlcy5zb21lKFxuICAgICAgICAgICh0eXBlKSA9PiBkYXRhIGluc3RhbmNlb2YgKCh0eXBlIGFzIHVua25vd24pIGFzICgpID0+IHZvaWQpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB4ZmVyLnB1c2goZGF0YSBhcyBUcmFuc2ZlcmFibGUpXG4gICAgICAgIHJldHVybiBkYXRhIGFzIFNlcmlhbGl6ZWREYXRhXG4gICAgICB9XG4gICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogZGF0YS5uYW1lLFxuICAgICAgICAgIG1lc3NhZ2U6IGRhdGEubWVzc2FnZSxcbiAgICAgICAgICBzdGFjazogJ1N0YWNrIHRyYWNlIHJlZGFjdGVkIGZvciBzZWN1cml0eSByZWFzb25zJyxcbiAgICAgICAgICAvLyBUaGVzZSBkb24ndCBleGlzdCBpbiB0aGUgVFMgZGVmaW5pdGlvbnMsIGJ1dCB0aGV5IG1heSBleGlzdCBpblxuICAgICAgICAgIC8vIG90aGVyIHJ1bnRpbWUgZW52aXJvbm1lbnRzXG4gICAgICAgICAgY29sdW1uTnVtYmVyOiAoKGRhdGEgYXMgdW5rbm93bikgYXMgeyBjb2x1bW5OdW1iZXI6IG51bWJlciB9KVxuICAgICAgICAgICAgLmNvbHVtbk51bWJlcixcbiAgICAgICAgICBsaW5lTnVtYmVyOiAoKGRhdGEgYXMgdW5rbm93bikgYXMgeyBsaW5lTnVtYmVyOiBudW1iZXIgfSkubGluZU51bWJlcixcbiAgICAgICAgICBmaWxlTmFtZTogKChkYXRhIGFzIHVua25vd24pIGFzIHsgZmlsZU5hbWU6IG51bWJlciB9KS5maWxlTmFtZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICByZXR1cm4gZGF0YS5tYXAoKGUpID0+IHJwY1NlcmlhbGl6ZShlLCB4ZmVyKSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvYmo6IFNlcmlhbGl6ZWRPYmplY3QgPSB7fVxuICAgICAgT2JqZWN0LmtleXMoZGF0YSBhcyBTZXJpYWxpemVkT2JqZWN0KS5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgIHJvYmpba10gPSBycGNTZXJpYWxpemUoKGRhdGEgYXMgU2VyaWFsaXplZE9iamVjdClba10sIHhmZXIpXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHJvYmpcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgQ2Fubm90IHNlcmlhbGl6ZSB1bmtub3duIHR5cGUgJHt0eXBlb2YgZGF0YX1gKVxuICB9XG59XG4iXX0=