| // @flow | ||
| // No user-supplied value will ever be identical to this. | ||
| export const dirtyValue = {} | ||
| // idea: `on`, `watch`, `emit`, `update` &c. all add the object to a table. | ||
| // The table contains subscribers and a value snapshot. | ||
| // Emit grabs subscribers from the table and calls them (if any). | ||
| // `on` and `watch` add the item to the table and then hook up the subscriber. | ||
| // `close` removes the object from the table. It can be re-added trivially | ||
| // So closing isn't really death, in this case. | ||
| // The bridge might have a different eviction strategy for this | ||
| // Actually, the bridge would have two tables, object -> id and id > object. | ||
| // closing would remove the second table, but the first could be a `WeakMap` | ||
| // that stays around forever. So, really, we don't need `close` | ||
| // at this level of the game - the fact that we use a `WeakMap` is | ||
| // enough to avoid all memory problems. | ||
| // Update adds to the table, then runs a diff. | ||
| // This happens synchronously, including the callbacks. | ||
| // If the callbacks throw, that flows back through the `update` call. | ||
| // This would include the JSON-ification in the case of the bridge. | ||
| // There are four cases where a user can put an object into YAOB: | ||
| // - top-level `sendMessage` calls | ||
| // - method calls / return values | ||
| // - event payloads | ||
| // - property updates | ||
| // In each of these cases, the user is calling some method to make this happen, | ||
| // so this is where the errors should kick out from. Basically, yaob will be free | ||
| // of try/catch statements, letting errors happen where they happen (but method | ||
| // calls are `async`, so they reject). | ||
| // Object packing is historically the most difficult - we need to | ||
| // recurse down the new object to check for errors, but we don't | ||
| // want to assign ID's in case there is an error & we need to back out. | ||
| // On the flip side, we don't want to recurse twice if we don't have to, | ||
| // so we *should* assign ID's, knowing they may be disposed of. | ||
| // This is probably fine if packing messages is an atomic, synchronous operation. | ||
| // Our `catch/finally` block can clean up newly-allocated ID's if anything fails, | ||
| // since we aren't going forward with this send. One solution is to return new | ||
| // id's in an array, and then only commit that array on success. Packing will | ||
| // either succeed, returning a new list, or it will fail, throwing an exception | ||
| // with no other side effects | ||
| // The three major subsystems are events (this one), JSON-based structured clone, | ||
| // and the YAOB state machine. The YAOB state machine hooks the structured clone | ||
| // algorithm in some way to add arbitrary object packing, which is the heart of | ||
| // its business. The rest of the structured clone can stay the same. The YAOB | ||
| // state machine also hooks the event system to listen to object lifetimes. | ||
| // The only other thing it handles are method calls on its proxies (proxies are | ||
| // part of the structured clone hooking). |
| // @flow | ||
| /** | ||
| * Undoes the effect of `on` or `watch`. | ||
| */ | ||
| export type CallbackRemover = () => mixed | ||
| /** | ||
| * Signature of the `on` and `watch` methods. | ||
| */ | ||
| export type Subscriber<Events: {} = {}> = <Name: $Keys<Events>>( | ||
| name: Name, | ||
| f: (v: $ElementType<Events, Name>) => mixed | ||
| ) => CallbackRemover |
| /** | ||
| * Options used to create a new bridge. | ||
| */ | ||
| export interface BridgeOptions { | ||
| sendMessage: (message: object) => unknown | ||
| throttleMs?: number | ||
| } | ||
| /** | ||
| * An object bridge. | ||
| */ | ||
| export declare class Bridge { | ||
| constructor(opts: BridgeOptions) | ||
| handleMessage(message: object): unknown | ||
| getRoot(): Promise<any> | ||
| sendRoot(root: object): void | ||
| close(error: Error): void | ||
| } | ||
| /** | ||
| * Options used to create a new local bridge. | ||
| */ | ||
| export interface LocalBridgeOptions { | ||
| cloneMessage?: (x: object) => object | ||
| throttleMs?: number | ||
| } | ||
| /** | ||
| * Bridges a single object locally. This is great for unit tests, | ||
| * where you want to verify that your API works correctly over a bridge, | ||
| * but don't want to actually spawn a separate process. | ||
| */ | ||
| export declare function makeLocalBridge<T>(o: T, opts?: LocalBridgeOptions): T | ||
| /** | ||
| * Undoes the effect of `on` or `watch`. | ||
| */ | ||
| export type CallbackRemover = () => unknown | ||
| /** | ||
| * Signature of the `on` and `watch` methods. | ||
| */ | ||
| export type Subscriber<Events extends {} = {}> = <Name extends keyof Events>( | ||
| name: Name, | ||
| f: (v: Events[Name]) => unknown | ||
| ) => CallbackRemover | ||
| /** | ||
| * The `on` function, | ||
| * but packaged as a method and ready to be placed on an object. | ||
| */ | ||
| export declare const onMethod: Function | ||
| /** | ||
| * The `watch` function, | ||
| * but packaged as a method and ready to be placed on an object. | ||
| */ | ||
| export declare const watchMethod: Function | ||
| /** | ||
| * The base class for all bridgeable API's. Provides callback capability. | ||
| */ | ||
| export declare class Bridgeable<Props extends {} = {}, Events extends {} = {}> { | ||
| readonly on: Subscriber<Events> | ||
| readonly watch: Subscriber<Props> | ||
| _close(): void | ||
| _emit<Name extends keyof Events>(name: Name, payload: Events[Name]): unknown | ||
| _update(name?: keyof Props): void | ||
| } | ||
| export declare function bridgifyClass<Type extends Function>(Class: Type): Type | ||
| export declare function bridgifyObject<Type extends object>(o: Type): Type | ||
| export declare function shareData( | ||
| table: { [name: string]: object }, | ||
| namespace?: string | ||
| ): void | ||
| export declare function close(o: object): unknown | ||
| export declare function emit(o: object, name: string, payload: unknown): unknown | ||
| export declare function update<T extends object>(o: T, name?: keyof T): unknown |
+4
-1
| # Changelog | ||
| ## Unreleased | ||
| ## 0.3.5 (2019-11-23) | ||
| - Add TypeScript type definitions. | ||
| - Increase Flow support to version 0.105. | ||
| ## 0.3.4 (2019-05-06) | ||
@@ -6,0 +9,0 @@ |
+131
-120
@@ -30,3 +30,2 @@ 'use strict'; | ||
| */ | ||
| // An object is bridgeable if it has this key: | ||
| var MAGIC_KEY = '_yaob'; | ||
@@ -167,3 +166,3 @@ /** | ||
| raw: raw, | ||
| throw: true | ||
| "throw": true | ||
| }; | ||
@@ -179,3 +178,3 @@ } | ||
| var out = map != null ? unpackItem(table, map, raw, path) : raw; | ||
| if (data.throw) throw out; | ||
| if (data["throw"]) throw out; | ||
| return out; | ||
@@ -196,46 +195,48 @@ } | ||
| case 'object': | ||
| if (data === null) return ''; | ||
| if (data instanceof Date) return 'd'; | ||
| if (data instanceof Error) return 'e'; | ||
| if (data instanceof Uint8Array) return 'u8'; | ||
| { | ||
| if (data === null) return ''; | ||
| if (data instanceof Date) return 'd'; | ||
| if (data instanceof Error) return 'e'; | ||
| if (data instanceof Uint8Array) return 'u8'; | ||
| if (data[MAGIC_KEY] != null) { | ||
| return data[MAGIC_KEY].shareId != null ? 's' : 'o'; | ||
| } // Arrays: | ||
| if (data[MAGIC_KEY] != null) { | ||
| return data[MAGIC_KEY].shareId != null ? 's' : 'o'; | ||
| } // Arrays: | ||
| if (Array.isArray(data)) { | ||
| var _out = ''; | ||
| if (Array.isArray(data)) { | ||
| var _out = ''; | ||
| for (var i = 0; i < data.length; ++i) { | ||
| var map = mapData(table, data[i]); | ||
| for (var i = 0; i < data.length; ++i) { | ||
| var map = mapData(table, data[i]); | ||
| if (map !== '' && _out === '') { | ||
| _out = []; | ||
| if (map !== '' && _out === '') { | ||
| _out = []; | ||
| for (var j = 0; j < i; ++j) { | ||
| _out[j] = ''; | ||
| for (var j = 0; j < i; ++j) { | ||
| _out[j] = ''; | ||
| } | ||
| } | ||
| if (_out !== '') _out[i] = map; | ||
| } | ||
| if (_out !== '') _out[i] = map; | ||
| } | ||
| return _out; | ||
| } // Data objects: | ||
| return _out; | ||
| } // Data objects: | ||
| var out = ''; | ||
| var out = ''; | ||
| for (var n in data) { | ||
| var _map = mapData(table, data[n]); | ||
| for (var n in data) { | ||
| var _map = mapData(table, data[n]); | ||
| if (_map !== '') { | ||
| if (out === '') out = {}; | ||
| out[n] = _map; | ||
| } | ||
| } | ||
| if (_map !== '') { | ||
| if (out === '') out = {}; | ||
| out[n] = _map; | ||
| } | ||
| return out; | ||
| } | ||
| return out; | ||
| case 'undefined': | ||
@@ -245,2 +246,3 @@ return 'u'; | ||
| case 'function': | ||
| // $FlowFixMe - MAGIC_KEY isn't a known property here | ||
| return data[MAGIC_KEY] != null && data[MAGIC_KEY].shareId != null ? 's' : '?'; | ||
@@ -306,21 +308,23 @@ | ||
| default: | ||
| // Arrays: | ||
| if (Array.isArray(map)) { | ||
| var _out2 = []; | ||
| { | ||
| // Arrays: | ||
| if (Array.isArray(map)) { | ||
| var _out2 = []; | ||
| for (var i = 0; i < map.length; ++i) { | ||
| _out2[i] = packItem(table, map[i], data[i]); | ||
| } | ||
| for (var i = 0; i < map.length; ++i) { | ||
| _out2[i] = packItem(table, map[i], data[i]); | ||
| } | ||
| return _out2; | ||
| } // Objects: | ||
| return _out2; | ||
| } // Objects: | ||
| var out = {}; | ||
| var out = {}; | ||
| for (var n in data) { | ||
| out[n] = n in map ? packItem(table, map[n], data[n]) : data[n]; | ||
| for (var n in data) { | ||
| out[n] = n in map ? packItem(table, map[n], data[n]) : data[n]; | ||
| } | ||
| return out; | ||
| } | ||
| return out; | ||
| } | ||
@@ -340,5 +344,5 @@ } | ||
| TypeError: TypeError, | ||
| URIError: URIError // Make the object: | ||
| URIError: URIError | ||
| }; // Make the object: | ||
| }; | ||
| var Base = value.base != null ? bases[value.base] || Error : Error; | ||
@@ -366,4 +370,6 @@ var out = new Base(); // Restore the properties: | ||
| case '?': | ||
| var type = typeof raw === 'string' ? raw : '?'; | ||
| throw new TypeError("Unsupported value of type " + type + " at " + path); | ||
| { | ||
| var type = typeof raw === 'string' ? raw : '?'; | ||
| throw new TypeError("Unsupported value of type " + type + " at " + path); | ||
| } | ||
@@ -381,26 +387,30 @@ case 'd': | ||
| case 'o': | ||
| if (raw === null) { | ||
| throw new TypeError("Closed bridge object at " + path); | ||
| } | ||
| { | ||
| if (raw === null) { | ||
| throw new TypeError("Closed bridge object at " + path); | ||
| } | ||
| if (typeof raw !== 'number') { | ||
| throw new TypeError("Expecting a packedId at " + path); | ||
| } | ||
| if (typeof raw !== 'number') { | ||
| throw new TypeError("Expecting a packedId at " + path); | ||
| } | ||
| var _o = table.getObject(-raw); | ||
| var _o = table.getObject(-raw); | ||
| if (_o == null) throw new RangeError("Invalid packedId " + raw + " at " + path); | ||
| return _o; | ||
| if (_o == null) throw new RangeError("Invalid packedId " + raw + " at " + path); | ||
| return _o; | ||
| } | ||
| case 's': | ||
| if (typeof raw !== 'string') { | ||
| throw new TypeError("Expecting a shareId at " + path); | ||
| { | ||
| if (typeof raw !== 'string') { | ||
| throw new TypeError("Expecting a shareId at " + path); | ||
| } | ||
| var s = sharedData[raw]; | ||
| if (s == null) throw new RangeError("Invalid shareId '" + raw + "' at " + path); | ||
| return s; | ||
| } | ||
| var s = sharedData[raw]; | ||
| if (s == null) throw new RangeError("Invalid shareId '" + raw + "' at " + path); | ||
| return s; | ||
| case 'u': | ||
| return void 0; | ||
| return undefined; | ||
@@ -415,33 +425,35 @@ case 'u8': | ||
| default: | ||
| if (typeof map !== 'object' || map === null) { | ||
| throw new TypeError("Invalid type information " + map + " at " + path); | ||
| } | ||
| { | ||
| if (typeof map !== 'object' || map === null) { | ||
| throw new TypeError("Invalid type information " + map + " at " + path); | ||
| } | ||
| if (typeof raw !== 'object' || raw === null) { | ||
| throw new TypeError("Expecting an array or object at " + path); | ||
| } // Arrays: | ||
| if (typeof raw !== 'object' || raw === null) { | ||
| throw new TypeError("Expecting an array or object at " + path); | ||
| } // Arrays: | ||
| if (Array.isArray(map)) { | ||
| if (!Array.isArray(raw)) { | ||
| throw new TypeError("Expecting an array at " + path); | ||
| } | ||
| if (Array.isArray(map)) { | ||
| if (!Array.isArray(raw)) { | ||
| throw new TypeError("Expecting an array at " + path); | ||
| } | ||
| var _out3 = []; | ||
| var _out3 = []; | ||
| for (var i = 0; i < map.length; ++i) { | ||
| _out3[i] = unpackItem(table, map[i], raw[i], path + "[" + i + "]"); | ||
| } | ||
| for (var i = 0; i < map.length; ++i) { | ||
| _out3[i] = unpackItem(table, map[i], raw[i], path + "[" + i + "]"); | ||
| } | ||
| return _out3; | ||
| } // Objects: | ||
| return _out3; | ||
| } // Objects: | ||
| var out = {}; | ||
| var out = {}; | ||
| for (var n in raw) { | ||
| out[n] = n in map ? unpackItem(table, map[n], raw[n], path + "." + n) : raw[n]; | ||
| for (var n in raw) { | ||
| out[n] = n in map ? unpackItem(table, map[n], raw[n], path + "." + n) : raw[n]; | ||
| } | ||
| return out; | ||
| } | ||
| return out; | ||
| } | ||
@@ -508,3 +520,3 @@ } | ||
| var listeners = magic.listeners['close']; | ||
| var listeners = magic.listeners.close; | ||
@@ -514,3 +526,3 @@ if (listeners != null) { | ||
| var _f = listeners[_i2]; | ||
| callCallback(o, _f, void 0, true); | ||
| callCallback(o, _f, undefined, true); | ||
| } | ||
@@ -598,3 +610,3 @@ } | ||
| if (emitError && out != null && typeof out.then === 'function') { | ||
| out.then(void 0, function (e) { | ||
| out.then(undefined, function (e) { | ||
| return emit(o, 'error', e); | ||
@@ -710,6 +722,5 @@ }); | ||
| props[MAGIC_KEY] = { | ||
| value: magic // Add the getters: | ||
| value: magic | ||
| }; // Add the getters: | ||
| }; | ||
| for (var n in create.props) { | ||
@@ -808,3 +819,3 @@ props[n] = { | ||
| _proto.close = function close$$1(error) { | ||
| _proto.close = function close$1(error) { | ||
| for (var _callId in this.pendingCalls) { | ||
@@ -820,11 +831,11 @@ var call = this.pendingCalls[Number(_callId)]; | ||
| this.closed = true; | ||
| }; | ||
| } | ||
| /** | ||
| * Grabs an object by its proxy id. | ||
| */ | ||
| ; | ||
| _proto.getObject = function getObject(packedId) { | ||
| return packedId < 0 ? this.proxies[-packedId] : this.objects[packedId]; | ||
| }; | ||
| } | ||
| /** | ||
@@ -835,4 +846,4 @@ * Returns an object's id relative to this bridge. | ||
| */ | ||
| ; | ||
| _proto.getPackedId = function getPackedId(o) { | ||
@@ -860,8 +871,8 @@ var magic = getInstanceMagic(o); | ||
| return magic.localId; | ||
| }; | ||
| } | ||
| /** | ||
| * Marks an object as needing changes. | ||
| */ | ||
| ; | ||
| _proto.markDirty = function markDirty(localId, name) { | ||
@@ -875,8 +886,8 @@ var cache = this.caches[localId]; | ||
| this.wakeup(); | ||
| }; | ||
| } | ||
| /** | ||
| * Marks an object as being deleted. | ||
| */ | ||
| ; | ||
| _proto.emitClose = function emitClose(localId) { | ||
@@ -888,17 +899,17 @@ delete this.objects[localId]; | ||
| this.wakeup(); | ||
| }; | ||
| } | ||
| /** | ||
| * Attaches an object to this bridge, sending a creation message. | ||
| */ | ||
| ; | ||
| _proto.emitCreate = function emitCreate(create, o) { | ||
| if (this.message.created == null) this.message.created = []; | ||
| this.message.created.push(create); // this.wakeup() not needed, since this is part of data packing. | ||
| }; | ||
| } | ||
| /** | ||
| * Enqueues a proxy call message. | ||
| */ | ||
| ; | ||
| _proto.emitCall = function emitCall(remoteId, name, args) { | ||
@@ -925,8 +936,8 @@ var _this = this; | ||
| }); | ||
| }; | ||
| } | ||
| /** | ||
| * Enqueues an event message. | ||
| */ | ||
| ; | ||
| _proto.emitEvent = function emitEvent(localId, name, payload) { | ||
@@ -941,8 +952,8 @@ var message = _extends({ | ||
| this.wakeup(); | ||
| }; | ||
| } | ||
| /** | ||
| * Enqueues a function return message. | ||
| */ | ||
| ; | ||
| _proto.emitReturn = function emitReturn(callId, fail, value) { | ||
@@ -956,3 +967,3 @@ var message = _extends({ | ||
| this.wakeup(); | ||
| }; | ||
| } | ||
| /** | ||
@@ -962,4 +973,4 @@ * Handles an incoming message, | ||
| */ | ||
| ; | ||
| _proto.handleMessage = function handleMessage(message) { | ||
@@ -1100,8 +1111,8 @@ var _this2 = this; | ||
| } | ||
| }; | ||
| } | ||
| /** | ||
| * Sends the current message. | ||
| */ | ||
| ; | ||
| _proto.sendNow = function sendNow() { | ||
@@ -1135,8 +1146,8 @@ if (this.closed) return; // Build change messages: | ||
| this.sendMessage(message); | ||
| }; | ||
| } | ||
| /** | ||
| * Something has changed, so prepare to send the pending message: | ||
| */ | ||
| ; | ||
| _proto.wakeup = function wakeup() { | ||
@@ -1198,3 +1209,3 @@ var _this3 = this; | ||
| _proto.close = function close$$1(error) { | ||
| _proto.close = function close(error) { | ||
| this._state.close(error); | ||
@@ -1292,5 +1303,3 @@ }; | ||
| exports.onMethod = onMethod; | ||
| exports.shareData = shareData; | ||
| exports.watchMethod = watchMethod; | ||
| exports.Bridge = Bridge; | ||
| exports.Bridgeable = Bridgeable; | ||
@@ -1301,5 +1310,7 @@ exports.bridgifyClass = bridgifyClass; | ||
| exports.emit = emit; | ||
| exports.makeLocalBridge = makeLocalBridge; | ||
| exports.onMethod = onMethod; | ||
| exports.shareData = shareData; | ||
| exports.update = update; | ||
| exports.Bridge = Bridge; | ||
| exports.makeLocalBridge = makeLocalBridge; | ||
| exports.watchMethod = watchMethod; | ||
| //# sourceMappingURL=yaob.cjs.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"yaob.cjs.js","sources":["../src/magic.js","../src/data.js","../src/manage.js","../src/objects.js","../src/state.js","../src/bridge.js","../src/bridgeable.js"],"sourcesContent":["// @flow\n/**\n * @file\n * Bridgeable objects have a special \"magic\" property.\n * This file contains routines for working with these magic properties.\n */\n\nimport type { BridgeState } from './state.js'\n\n// An object is bridgeable if it has this key:\nexport const MAGIC_KEY = '_yaob'\n\n/**\n * Magic data used to mark classes as bridgeable.\n */\nexport type ClassMagic = {}\n\n/**\n * Magic data shared by all object instances.\n */\ntype ObjectMagic = {\n // The object id on this side of the bridge:\n +localId: number,\n\n // The object is no longer bridgeable when set:\n closed?: true,\n\n // Bridges subscribed to this object:\n bridges: Array<BridgeState>,\n\n // Event listeners subscribed to this object:\n listeners: { [name: string]: Array<Function> },\n\n // Property watchers subscribed to this object:\n watchers: { [name: string]: { data: mixed, fs: Array<Function> } }\n}\n\n/**\n * Magic data found on user-facing object instances.\n */\nexport type InstanceMagic = ObjectMagic & {\n // This is a proxy object if set. See ProxyMagic for other properties:\n +remoteId?: number\n}\n\n/**\n * Magic data found on proxy objects.\n */\nexport type ProxyMagic = ObjectMagic & {\n +remoteId: number,\n\n // True if the property getter should throw the value:\n +errors: { [name: string]: boolean },\n\n // Values for property getters to return:\n +props: { [name: string]: mixed }\n}\n\n/**\n * Magic data found on shared props.\n */\nexport type SharedMagic = {\n +shareId: string\n}\n\nlet nextLocalId = 1\nexport const sharedData: { [sharedId: string]: mixed } = {}\n\n/**\n * Adds or updates an object's magic data.\n */\nfunction addMagic (o: Object, magic: ClassMagic | ObjectMagic | SharedMagic) {\n if (Object.prototype.hasOwnProperty.call(o, MAGIC_KEY)) {\n Object.assign(o[MAGIC_KEY], magic)\n } else {\n Object.defineProperty(o, MAGIC_KEY, { value: magic })\n }\n}\n\n/**\n * Makes a class bridgeable, including anything derived from it.\n */\nexport function bridgifyClass<Type: Function> (Class: Type): Type {\n const o = Class.prototype\n if (!Object.prototype.hasOwnProperty.call(o, MAGIC_KEY)) {\n const magic: ClassMagic = {}\n addMagic(o, magic)\n }\n return Class\n}\n\n/**\n * Makes an object instance bridgeable.\n */\nexport function bridgifyObject<Type: Object> (o: Type): Type {\n if (\n !Object.prototype.hasOwnProperty.call(o, MAGIC_KEY) ||\n o[MAGIC_KEY].localId == null\n ) {\n const magic: InstanceMagic = {\n localId: nextLocalId++,\n bridges: [],\n listeners: {},\n watchers: {}\n }\n addMagic(o, magic)\n }\n return o\n}\n\n/**\n * Gets the magic data from an object instance.\n */\nexport function getInstanceMagic (o: Object): InstanceMagic {\n // We only want to look at bridgeable objects:\n if (o[MAGIC_KEY] == null) throw new TypeError('Not a bridgeable object')\n\n bridgifyObject(o)\n return o[MAGIC_KEY]\n}\n\n/**\n * Creates a new `ProxyMagic` object.\n */\nexport function makeProxyMagic (remoteId: number): ProxyMagic {\n return {\n // InstanceMagic:\n localId: nextLocalId++,\n bridges: [],\n listeners: {},\n watchers: {},\n // ProxyMagic:\n remoteId,\n errors: {},\n props: {}\n }\n}\n\n/**\n * Adds items to the global shared data table.\n */\nexport function shareData (\n table: { [name: string]: Object },\n namespace?: string\n) {\n if (namespace == null) namespace = ''\n else namespace += '.'\n\n for (const n of Object.getOwnPropertyNames(table)) {\n const shareId = namespace + n\n if (sharedData[shareId] != null) {\n throw new Error(`A shared value named ${shareId} already exists`)\n }\n sharedData[shareId] = table[n]\n addMagic(table[n], { shareId })\n }\n}\n","// @flow\n/**\n * @file\n * Routines for breaking primitive values into messages,\n * and then restoring those messages into values on the other side.\n */\n\nimport { base64 } from 'rfc4648'\n\nimport { MAGIC_KEY, sharedData } from './magic.js'\n\n/**\n * The data-packing system uses this interface to turn\n * bridgeable objects into packedId's and vice-versa.\n */\nexport interface ObjectTable {\n getPackedId(o: Object): number | null;\n getObject(packedId: number): Object | void;\n}\n\n/**\n * The bridge tries to send values as-is, but that isn't always possible.\n * If this data structure is non-null, the strings indicate what changes\n * need to take place to the value. This data structure is recursive,\n * so it matches the \"shape\" of the value.\n */\nexport type DataMap =\n | { +[name: string]: DataMap }\n | Array<DataMap>\n | '' // No change\n | '?' // Invalid value\n | 'd' // Date\n | 'e' // Error\n | 'o' // Object\n | 's' // Shared data\n | 'u' // Undefined\n | 'u8' // Uint8Array\n\n/**\n * A pure JSON value type.\n */\nexport type JsonValue =\n | { +[name: string]: JsonValue }\n | Array<JsonValue>\n | false\n | null\n | number\n | string\n | true\n\n/**\n * A value for sending over the wire.\n * If the `value` needs to be modified on the client side,\n * those modifications are in the `map` structure.\n * If this value was thrown, `throw` will be true.\n */\nexport type PackedData = {\n +map?: DataMap,\n +raw: JsonValue,\n +throw?: true\n}\n\n/**\n * The bridge turns errors into these objects.\n */\nexport type PackedError = {\n +base: string | null\n} & PackedData // Object properties\n\n/**\n * Prepares a value for sending over the wire.\n */\nexport function packData (table: ObjectTable, data: mixed): PackedData {\n try {\n const map = mapData(table, data)\n const raw = packItem(table, map, data)\n return map !== '' ? { map, raw } : { raw }\n } catch (data) {\n return packThrow(table, data)\n }\n}\n\n/**\n * Prepares a thrown value for sending over the wire.\n */\nexport function packThrow (table: ObjectTable, data: mixed): PackedData {\n const map = mapData(table, data)\n const raw = packItem(table, map, data)\n return { map, raw, throw: true }\n}\n\n/**\n * Restores a value that has been sent over the wire.\n */\nexport function unpackData (\n table: ObjectTable,\n data: PackedData,\n path: string\n): any {\n const { map, raw } = data\n const out = map != null ? unpackItem(table, map, raw, path) : raw\n if (data.throw) throw out\n return out\n}\n\n/**\n * Searches through a value, looking for data we can't send directly.\n * Returns a map showing where fixes need to take place.\n */\nfunction mapData (table: ObjectTable, data: mixed): DataMap {\n switch (typeof data) {\n case 'boolean':\n case 'number':\n case 'string':\n return ''\n\n case 'object':\n if (data === null) return ''\n if (data instanceof Date) return 'd'\n if (data instanceof Error) return 'e'\n if (data instanceof Uint8Array) return 'u8'\n if (data[MAGIC_KEY] != null) {\n return data[MAGIC_KEY].shareId != null ? 's' : 'o'\n }\n\n // Arrays:\n if (Array.isArray(data)) {\n let out: Array<DataMap> | '' = ''\n for (let i = 0; i < data.length; ++i) {\n const map = mapData(table, data[i])\n if (map !== '' && out === '') {\n out = []\n for (let j = 0; j < i; ++j) out[j] = ''\n }\n if (out !== '') out[i] = map\n }\n return out\n }\n\n // Data objects:\n let out: { [name: string]: DataMap } | '' = ''\n for (const n in data) {\n const map = mapData(table, data[n])\n if (map !== '') {\n if (out === '') out = {}\n out[n] = map\n }\n }\n return out\n\n case 'undefined':\n return 'u'\n\n case 'function':\n return data[MAGIC_KEY] != null && data[MAGIC_KEY].shareId != null\n ? 's'\n : '?'\n\n default:\n return '?'\n }\n}\n\n/**\n * Breaks down an error object into a JSON representation.\n */\nfunction packError (table: ObjectTable, o: Object): PackedError {\n // Grab the properties off the object:\n const { message, stack } = o\n const props = { message, stack, ...o }\n\n let base = null\n if (o instanceof EvalError) base = 'EvalError'\n else if (o instanceof RangeError) base = 'RangeError'\n else if (o instanceof ReferenceError) base = 'ReferenceError'\n else if (o instanceof SyntaxError) base = 'SyntaxError'\n else if (o instanceof TypeError) base = 'TypeError'\n else if (o instanceof URIError) base = 'URIError'\n\n // Build the JSON value:\n return { base, ...packData(table, props) }\n}\n\n/**\n * Copies a value, removing any API objects identified in the types.\n */\nfunction packItem (table: ObjectTable, map: DataMap, data: any): JsonValue {\n switch (map) {\n case '':\n return data\n\n case '?':\n return typeof data\n\n case 'd':\n return data.toISOString()\n\n case 'e':\n return packError(table, data)\n\n case 'o':\n return table.getPackedId(data)\n\n case 's':\n return data[MAGIC_KEY].shareId\n\n case 'u':\n return null\n\n case 'u8':\n return base64.stringify(data)\n\n default:\n // Arrays:\n if (Array.isArray(map)) {\n const out = []\n for (let i = 0; i < map.length; ++i) {\n out[i] = packItem(table, map[i], data[i])\n }\n return out\n }\n\n // Objects:\n const out = {}\n for (const n in data) {\n out[n] = n in map ? packItem(table, map[n], data[n]) : data[n]\n }\n return out\n }\n}\n\n/**\n * Restores an error object from its JSON representation.\n */\nfunction unpackError (\n table: ObjectTable,\n value: PackedError,\n path: string\n): Error {\n const bases = {\n EvalError,\n RangeError,\n ReferenceError,\n SyntaxError,\n TypeError,\n URIError\n }\n\n // Make the object:\n const Base = value.base != null ? bases[value.base] || Error : Error\n const out: Object = new Base()\n\n // Restore the properties:\n const props = unpackData(table, value, path)\n for (const n in props) out[n] = props[n]\n\n return out\n}\n\n/**\n * Restores a value that has been sent over the wire.\n */\nfunction unpackItem (\n table: ObjectTable,\n map: DataMap,\n raw: any,\n path: string\n): any {\n switch (map) {\n case '':\n return raw\n\n case '?':\n const type = typeof raw === 'string' ? raw : '?'\n throw new TypeError(`Unsupported value of type ${type} at ${path}`)\n\n case 'd':\n return new Date(raw)\n\n case 'e':\n if (typeof raw !== 'object' || raw === null) {\n throw new TypeError(`Expecting an error description at ${path}`)\n }\n return unpackError(table, raw, path)\n\n case 'o':\n if (raw === null) {\n throw new TypeError(`Closed bridge object at ${path}`)\n }\n if (typeof raw !== 'number') {\n throw new TypeError(`Expecting a packedId at ${path}`)\n }\n const o = table.getObject(-raw)\n if (o == null) throw new RangeError(`Invalid packedId ${raw} at ${path}`)\n return o\n\n case 's':\n if (typeof raw !== 'string') {\n throw new TypeError(`Expecting a shareId at ${path}`)\n }\n const s = sharedData[raw]\n if (s == null) throw new RangeError(`Invalid shareId '${raw}' at ${path}`)\n return s\n\n case 'u':\n return void 0\n\n case 'u8':\n if (typeof raw !== 'string') {\n throw new TypeError(`Expecting a base64 string at ${path}`)\n }\n return base64.parse(raw)\n\n default:\n if (typeof map !== 'object' || map === null) {\n throw new TypeError(`Invalid type information ${map} at ${path}`)\n }\n if (typeof raw !== 'object' || raw === null) {\n throw new TypeError(`Expecting an array or object at ${path}`)\n }\n\n // Arrays:\n if (Array.isArray(map)) {\n if (!Array.isArray(raw)) {\n throw new TypeError(`Expecting an array at ${path}`)\n }\n const out = []\n for (let i = 0; i < map.length; ++i) {\n out[i] = unpackItem(table, map[i], raw[i], `${path}[${i}]`)\n }\n return out\n }\n\n // Objects:\n const out = {}\n for (const n in raw) {\n out[n] =\n n in map ? unpackItem(table, map[n], raw[n], `${path}.${n}`) : raw[n]\n }\n return out\n }\n}\n","// @flow\n/**\n * @file\n * Functions for managing updates, events, and object lifetime.\n */\n\nimport { getInstanceMagic } from './magic.js'\n\n/**\n * Undoes the effect of `on`.\n */\nexport type CallbackRemover = () => mixed\n\n/**\n * Signature of the `on` method.\n */\nexport type Subscriber<Events: {} = {}> = <Name: $Keys<Events>>(\n name: Name,\n f: (v: $ElementType<Events, Name>) => mixed\n) => CallbackRemover\n\n// No user-supplied value will ever be identical to this.\nexport const dirtyValue = {}\n\n/**\n * Subscribes to an event on a bridgeable object.\n */\nexport function addListener (\n o: Object,\n name: string,\n f: Function\n): CallbackRemover {\n const { closed, listeners } = getInstanceMagic(o)\n\n if (closed) return () => {}\n if (listeners[name] == null) listeners[name] = [f]\n else listeners[name].push(f)\n\n return function unsubscribe () {\n listeners[name] = listeners[name].filter(i => i !== f)\n }\n}\n\n/**\n * Subscribes to property changes on a bridgeable object.\n */\nexport function addWatcher (\n o: Object,\n name: string,\n f: Function\n): CallbackRemover {\n const { closed, watchers } = getInstanceMagic(o)\n\n // Don't catch access errors, since we want the user to see them:\n const data = o[name]\n\n if (closed) return () => {}\n if (watchers[name] == null) watchers[name] = { data, fs: [f] }\n else watchers[name].fs.push(f)\n\n return function unsubscribe () {\n watchers[name].fs = watchers[name].fs.filter(i => i !== f)\n }\n}\n\n/**\n * Destroys a proxy.\n * The remote client will completely forget about this object,\n * and accessing it will become an error.\n */\nexport function close (o: Object): mixed {\n const magic = getInstanceMagic(o)\n\n // Call local callbacks:\n const listeners = magic.listeners['close']\n if (listeners != null) {\n for (const f of listeners) {\n callCallback(o, f, void 0, true)\n }\n }\n\n magic.closed = true\n for (const bridge of magic.bridges) {\n bridge.emitClose(magic.localId)\n }\n magic.bridges = []\n magic.listeners = {}\n magic.watchers = {}\n}\n\n/**\n * Emits an event on a bridgeable object.\n */\nexport function emit (o: Object, name: string, payload: mixed): mixed {\n const magic = getInstanceMagic(o)\n if (magic.closed) throw new Error('Cannot emit event on closed object')\n\n // Schedule outgoing event messages:\n for (const bridge of magic.bridges) {\n bridge.emitEvent(magic.localId, name, payload)\n }\n\n // Call local callbacks:\n const listeners = magic.listeners[name]\n if (listeners != null) {\n for (const f of listeners) {\n callCallback(o, f, payload, name !== 'error')\n }\n }\n}\n\n/**\n * Marks an object as having changes. The proxy server will send an update.\n */\nexport function update<T: {}> (o: T, name?: $Keys<T>): mixed {\n const magic = getInstanceMagic(o)\n if (magic.closed) throw new Error('Cannot update closed object')\n\n for (const bridge of magic.bridges) {\n bridge.markDirty(magic.localId, name)\n }\n\n // Blow away the cache if we have a name:\n if (name != null && magic.watchers[name] != null) {\n magic.watchers[name].data = dirtyValue\n }\n\n // Call watcher callbacks:\n for (const n in magic.watchers) {\n const cache = magic.watchers[n]\n try {\n const data = o[n]\n if (data !== cache.data) {\n cache.data = data\n for (const f of cache.fs) callCallback(o, f, cache.data, true)\n }\n } catch (e) {}\n }\n}\n\n/**\n * Calls a user-supplied callback function with error checking.\n */\nexport function callCallback (\n o: Object,\n f: Function,\n payload: mixed,\n emitError: boolean\n) {\n try {\n const out = f(payload)\n\n // If the function returns a promise, emit an error if it rejects:\n if (emitError && out != null && typeof out.then === 'function') {\n out.then(void 0, e => emit(o, 'error', e))\n }\n } catch (e) {\n if (emitError) emit(o, 'error', e)\n }\n}\n","// @flow\n/**\n * @file\n * Routines for breaking bridgeable objects into messages,\n * and then restoring those messages into proxies on the other side.\n */\n\nimport { packData, packThrow, unpackData } from './data.js'\nimport {\n MAGIC_KEY,\n type ProxyMagic,\n getInstanceMagic,\n makeProxyMagic\n} from './magic.js'\nimport type { CreateMessage, PackedProps } from './protocol.js'\nimport type { BridgeState } from './state.js'\n\nexport type ValueCache = { [name: string]: mixed }\n\n// No user-supplied value will ever be identical to this.\nexport const dirtyValue = {}\n\n/**\n * Examines a bridgeable object and prepares it for sending of the wire.\n * Returns a creation method an the initial value cache.\n */\nexport function packObject (\n state: BridgeState,\n o: Object\n): {\n cache: ValueCache,\n create: CreateMessage\n} {\n // Iterate the prototype chain, looking for property names:\n const allNames: { [name: string]: true } = {}\n const end = Object.prototype\n for (let p = o; p !== end && p != null; p = Object.getPrototypeOf(p)) {\n for (const name of Object.getOwnPropertyNames(p)) {\n if (name !== MAGIC_KEY && !/^_/.test(name) && name !== 'constructor') {\n allNames[name] = true\n }\n }\n }\n\n // Iterate over the object's properties and add their names to\n // the method list or the value cache.\n const cache: ValueCache = {}\n const methods: Array<string> = []\n const props: PackedProps = {}\n for (const n in allNames) {\n try {\n const data = o[n]\n if (\n typeof data === 'function' &&\n (data[MAGIC_KEY] == null || data[MAGIC_KEY].shareId == null)\n ) {\n methods.push(n)\n } else {\n cache[n] = data\n props[n] = packData(state, data)\n }\n } catch (e) {\n cache[n] = dirtyValue\n props[n] = packThrow(state, e)\n }\n }\n\n const { localId } = getInstanceMagic(o)\n const create: CreateMessage = { localId, methods, props }\n return { cache, create }\n}\n\n/**\n * Checks an object for changes.\n * Updates the cache, and returns an object with the necessary changes.\n */\nexport function diffObject (\n state: BridgeState,\n o: Object,\n cache: ValueCache\n): { dirty: boolean, props: PackedProps } {\n let dirty = false\n const props: PackedProps = {}\n\n for (const n in cache) {\n try {\n const value = o[n]\n if (value !== cache[n]) {\n dirty = true\n props[n] = packData(state, value)\n cache[n] = value\n }\n } catch (e) {\n props[n] = packThrow(state, e)\n cache[n] = dirtyValue\n }\n }\n\n return { dirty, props }\n}\n\n/**\n * Creates an object proxy.\n * The object will have the same values and methods as the original,\n * but will send everything over the bridge.\n */\nexport function makeProxy (state: BridgeState, create: CreateMessage): Object {\n const props = {}\n\n // Make the magic property descriptor:\n const magic = makeProxyMagic(create.localId)\n props[MAGIC_KEY] = { value: magic }\n\n // Add the getters:\n for (const n in create.props) {\n props[n] = { enumerable: true, get: makeProxyGetter(magic, n) }\n }\n\n // Add the methods:\n for (const n of create.methods) {\n props[n] = { value: makeProxyMethod(state, magic, n) }\n }\n\n // Make the object:\n return Object.create(Object.prototype, props)\n}\n\n/**\n * Unpacks a proxy's properties into the magic storage area.\n */\nexport function updateObjectProps (\n state: BridgeState,\n o: Object,\n props: PackedProps\n): mixed {\n const magic: ProxyMagic = o[MAGIC_KEY]\n\n for (const n in props) {\n try {\n magic.props[n] = unpackData(state, props[n], n)\n magic.errors[n] = false\n } catch (e) {\n magic.props[n] = e\n magic.errors[n] = true\n }\n }\n}\n\nfunction makeProxyGetter (magic: ProxyMagic, name: string) {\n return function get () {\n if (magic.errors[name]) throw magic.props[name]\n return magic.props[name]\n }\n}\n\nfunction makeProxyMethod (state: BridgeState, magic: ProxyMagic, name: string) {\n return function method (...args) {\n if (magic.closed) {\n return Promise.reject(\n new TypeError(`Cannot call method '${name}' of closed proxy`)\n )\n }\n return state.emitCall(magic.remoteId, name, args)\n }\n}\n","// @flow\n\nimport type { BridgeOptions, SendMessage } from './bridge.js'\nimport { type ObjectTable, packData, packThrow, unpackData } from './data.js'\nimport { bridgifyClass, getInstanceMagic } from './magic.js'\nimport { close, emit, update } from './manage.js'\nimport {\n type ValueCache,\n diffObject,\n dirtyValue,\n makeProxy,\n packObject,\n updateObjectProps\n} from './objects.js'\nimport type {\n CallMessage,\n ChangeMessage,\n CreateMessage,\n EventMessage,\n Message,\n ReturnMessage\n} from './protocol.js'\n\nexport class BridgeState implements ObjectTable {\n // Objects:\n +proxies: { [objectId: number]: Object }\n +objects: { [localId: number]: Object }\n +caches: { [localId: number]: ValueCache }\n\n // Outgoing method calls:\n nextCallId: number\n pendingCalls: {\n [callId: number]: { name: string, resolve: Function, reject: Function }\n }\n\n // Pending message:\n dirty: { [localId: number]: { cache: ValueCache, object: Object } }\n message: Message\n\n // Update scheduling:\n closed: boolean\n +throttleMs: number\n lastUpdate: number\n sendPending: boolean\n +sendMessage: SendMessage\n\n constructor (opts: BridgeOptions) {\n const { sendMessage, throttleMs = 0 } = opts\n\n // Objects:\n this.proxies = {}\n this.objects = {}\n this.caches = {}\n\n // Outgoing method calls:\n this.nextCallId = 0\n this.pendingCalls = {}\n\n // Pending message:\n this.dirty = {}\n this.message = {}\n\n // Update scheduling:\n this.throttleMs = throttleMs\n this.lastUpdate = 0\n this.sendPending = false\n this.sendMessage = sendMessage\n }\n\n /**\n * Close the bridge, so it will no longer send messages.\n * This also closes all proxies created by the bridge and rejects\n * all pending calls.\n */\n close (error: Error) {\n for (const callId in this.pendingCalls) {\n const call = this.pendingCalls[Number(callId)]\n call.reject(error)\n }\n for (const objectId in this.proxies) {\n close(this.proxies[Number(objectId)])\n }\n this.closed = true\n }\n\n /**\n * Grabs an object by its proxy id.\n */\n getObject (packedId: number): Object | void {\n return packedId < 0 ? this.proxies[-packedId] : this.objects[packedId]\n }\n\n /**\n * Returns an object's id relative to this bridge.\n * The id is positive for objects created on this side of the bridge,\n * and negative for proxy objects reflecting things on the other side.\n */\n getPackedId (o: Object): number | null {\n const magic = getInstanceMagic(o)\n if (magic.closed) return null\n if (magic.remoteId != null && this.proxies[magic.remoteId] != null) {\n return -magic.remoteId\n }\n if (this.objects[magic.localId] == null) {\n // Add unknown objects to the bridge:\n this.objects[magic.localId] = o\n\n const { cache, create } = packObject(this, o)\n this.caches[magic.localId] = cache\n magic.bridges.push(this)\n this.emitCreate(create, o)\n }\n return magic.localId\n }\n\n /**\n * Marks an object as needing changes.\n */\n markDirty (localId: number, name?: string) {\n const cache = this.caches[localId]\n if (name != null && name in cache) cache[name] = dirtyValue\n\n this.dirty[localId] = { cache, object: this.objects[localId] }\n this.wakeup()\n }\n\n /**\n * Marks an object as being deleted.\n */\n emitClose (localId: number) {\n delete this.objects[localId]\n delete this.caches[localId]\n if (this.message.closed == null) this.message.closed = []\n this.message.closed.push(localId)\n this.wakeup()\n }\n\n /**\n * Attaches an object to this bridge, sending a creation message.\n */\n emitCreate (create: CreateMessage, o: Object) {\n if (this.message.created == null) this.message.created = []\n this.message.created.push(create)\n // this.wakeup() not needed, since this is part of data packing.\n }\n\n /**\n * Enqueues a proxy call message.\n */\n emitCall (remoteId: number, name: string, args: mixed): Promise<mixed> {\n const callId = this.nextCallId++\n const message: CallMessage = {\n callId,\n remoteId,\n name,\n ...packData(this, args)\n }\n if (this.message.calls == null) this.message.calls = []\n this.message.calls.push(message)\n this.wakeup()\n\n return new Promise((resolve, reject) => {\n this.pendingCalls[callId] = { name, resolve, reject }\n })\n }\n\n /**\n * Enqueues an event message.\n */\n emitEvent (localId: number, name: string, payload: mixed) {\n const message: EventMessage = {\n localId,\n name,\n ...packData(this, payload)\n }\n if (this.message.events == null) this.message.events = []\n this.message.events.push(message)\n this.wakeup()\n }\n\n /**\n * Enqueues a function return message.\n */\n emitReturn (callId: number, fail: boolean, value: mixed) {\n const message: ReturnMessage = {\n callId,\n ...(fail ? packThrow(this, value) : packData(this, value))\n }\n if (this.message.returns == null) this.message.returns = []\n this.message.returns.push(message)\n this.wakeup()\n }\n\n /**\n * Handles an incoming message,\n * updating state and triggering side-effects as needed.\n */\n handleMessage (message: Message) {\n // ----------------------------------------\n // Phase 1: Get our proxies up to date.\n // ----------------------------------------\n\n // Handle newly-created objects:\n if (message.created) {\n // Pass 1: Create proxies for the new objects:\n for (const create of message.created) {\n this.proxies[create.localId] = makeProxy(this, create)\n }\n\n // Pass 2: Fill in the values:\n for (const create of message.created) {\n updateObjectProps(this, this.proxies[create.localId], create.props)\n }\n }\n\n // Handle updated objects:\n if (message.changed) {\n // Pass 1: Update all the proxies:\n for (const change of message.changed) {\n const { localId, props } = change\n const o = this.proxies[localId]\n if (o == null) {\n throw new RangeError(`Invalid localId ${localId}`)\n }\n updateObjectProps(this, o, props)\n }\n\n // Pass 2: Fire the callbacks:\n for (const change of message.changed) {\n update(this.proxies[change.localId])\n }\n }\n\n // ----------------------------------------\n // Phase 2: Handle events & method calls\n // ----------------------------------------\n\n // Handle events:\n if (message.events) {\n for (const event of message.events) {\n const { localId, name } = event\n const o = localId === 0 ? this : this.proxies[localId]\n if (o == null) continue\n try {\n emit(o, name, unpackData(this, event, name))\n } catch (e) {\n emit(o, 'error', e) // Payload unpacking problem\n }\n }\n }\n\n // Handle method calls:\n if (message.calls) {\n for (const call of message.calls) {\n const { callId, remoteId, name } = call\n\n try {\n const o = this.objects[remoteId]\n if (o == null) {\n throw new TypeError(\n `Cannot call method '${name}' of closed proxy (remote)`\n )\n }\n if (typeof o[name] !== 'function') {\n throw new TypeError(`'${name}' is not a function`)\n }\n const args = unpackData(this, call, `${name}.arguments`)\n Promise.resolve(o[name].apply(o, args)).then(\n value => this.emitReturn(callId, false, value),\n e => this.emitReturn(callId, true, e)\n )\n } catch (e) {\n this.emitReturn(callId, true, e)\n }\n }\n }\n\n // Handle method returns:\n if (message.returns) {\n for (const ret of message.returns) {\n const { callId } = ret\n const pendingCall = this.pendingCalls[callId]\n if (pendingCall == null) {\n throw new RangeError(`Invalid callId ${callId}`)\n }\n try {\n pendingCall.resolve(\n unpackData(this, ret, `${pendingCall.name}.return`)\n )\n } catch (e) {\n pendingCall.reject(e)\n } finally {\n delete this.pendingCalls[callId]\n }\n }\n }\n\n // ----------------------------------------\n // Phase 3: Clean up closed objects\n // ----------------------------------------\n\n if (message.closed) {\n for (const localId of message.closed) {\n const o = this.proxies[localId]\n if (o == null) return\n delete this.proxies[localId]\n close(o)\n }\n }\n }\n\n /**\n * Sends the current message.\n */\n sendNow () {\n if (this.closed) return\n\n // Build change messages:\n for (const id in this.dirty) {\n const localId = Number(id)\n const { object, cache } = this.dirty[localId]\n const { dirty, props } = diffObject(this, object, cache)\n if (dirty) {\n const message: ChangeMessage = { localId, props }\n if (this.message.changed == null) this.message.changed = []\n this.message.changed.push(message)\n }\n }\n\n const message = this.message\n this.dirty = {}\n this.message = {}\n this.sendMessage(message)\n }\n\n /**\n * Something has changed, so prepare to send the pending message:\n */\n wakeup () {\n if (this.sendPending) return\n\n this.sendPending = true\n const task = () => {\n this.sendPending = false\n this.lastUpdate = Date.now()\n this.sendNow()\n }\n\n // We really do want `setTimeout` here, even if the delay is 0,\n // since promises and other micro tasks should fire first.\n const delay = this.lastUpdate + this.throttleMs - Date.now()\n setTimeout(task, delay < 0 ? 0 : delay)\n }\n}\n\nbridgifyClass(BridgeState)\n","// @flow\n\nimport { packData, unpackData } from './data.js'\nimport { addListener } from './manage.js'\nimport { type Message } from './protocol.js'\nimport { BridgeState } from './state.js'\n\n/**\n * The bridge sends messages using this function.\n */\nexport type SendMessage = (message: Object) => mixed\n\n/**\n * Options used to create a new bridge.\n */\nexport type BridgeOptions = {\n sendMessage: SendMessage,\n throttleMs?: number\n}\n\n/**\n * Options used to create a new local bridge.\n */\nexport type LocalBridgeOptions = {\n cloneMessage?: (x: Object) => Object,\n throttleMs?: number\n}\n\n/**\n * An object bridge.\n */\nexport class Bridge {\n +_state: BridgeState\n +_rootPromise: Promise<Object>\n\n constructor (opts: BridgeOptions) {\n this._state = new BridgeState(opts)\n this._rootPromise = new Promise(resolve =>\n addListener(this._state, 'root', resolve)\n )\n }\n\n handleMessage (message: Message): mixed {\n this._state.handleMessage(message)\n }\n\n getRoot () {\n return this._rootPromise\n }\n\n sendRoot (root: Object) {\n this._state.emitEvent(0, 'root', root)\n }\n\n close (error: Error) {\n this._state.close(error)\n }\n}\n\n/**\n * Bridges a single object locally. This is great for unit tests,\n * where you want to verify that your API works correctly over a bridge,\n * but don't want to actually spawn a separate process.\n */\nexport function makeLocalBridge<T> (o: T, opts: LocalBridgeOptions = {}): T {\n function nopClone (m: Object): Object {\n return m\n }\n const { cloneMessage = nopClone, throttleMs } = opts\n\n const serverState = new BridgeState({\n sendMessage (message) {\n clientState.handleMessage(cloneMessage(message))\n },\n throttleMs\n })\n const clientState = new BridgeState({\n sendMessage (message) {\n serverState.handleMessage(cloneMessage(message))\n },\n throttleMs\n })\n\n const data = cloneMessage(packData(serverState, o))\n serverState.sendNow()\n return unpackData(clientState, cloneMessage(data), 'root')\n}\n","// @flow\n\nimport { bridgifyClass, shareData } from './magic.js'\nimport type { Subscriber } from './manage.js'\nimport { addListener, addWatcher, close, emit, update } from './manage.js'\n\n/**\n * The `on` function,\n * but packaged as a method and ready to be placed on an object.\n */\nexport const onMethod: Function = function on (name, f) {\n return addListener(this, name, f)\n}\n\n/**\n * The `watch` function,\n * but packaged as a method and ready to be placed on an object.\n */\nexport const watchMethod: Function = function watch (name, f) {\n return addWatcher(this, name, f)\n}\n\nshareData({ onMethod, watchMethod })\n\n/**\n * The base class for all bridgeable API's. Provides callback capability.\n */\nexport class Bridgeable<Props: {} = {}, Events: {} = {}> {\n +on: Subscriber<Events>\n +watch: Subscriber<Props>\n\n _close () {\n close(this)\n }\n\n _emit<Name: $Keys<Events>> (\n name: Name,\n payload: $ElementType<Events, Name>\n ): mixed {\n return emit(this, name, payload)\n }\n\n _update (name?: $Keys<Props>) {\n update(this, name)\n }\n}\n\n// Put the shared methods onto the prototype:\nconst hack: any = Bridgeable.prototype\nhack.on = onMethod\nhack.watch = watchMethod\n\nbridgifyClass(Bridgeable)\n"],"names":["MAGIC_KEY","nextLocalId","sharedData","addMagic","o","magic","Object","prototype","hasOwnProperty","call","defineProperty","value","bridgifyClass","Class","bridgifyObject","localId","bridges","listeners","watchers","getInstanceMagic","TypeError","makeProxyMagic","remoteId","errors","props","shareData","table","namespace","getOwnPropertyNames","n","shareId","Error","packData","data","map","mapData","raw","packItem","packThrow","throw","unpackData","path","out","unpackItem","Date","Uint8Array","Array","isArray","i","length","j","packError","message","stack","base","EvalError","RangeError","ReferenceError","SyntaxError","URIError","toISOString","getPackedId","base64","stringify","unpackError","bases","Base","type","getObject","s","parse","dirtyValue","addListener","name","f","closed","push","unsubscribe","filter","addWatcher","fs","close","callCallback","bridge","emitClose","emit","payload","emitEvent","update","markDirty","cache","e","emitError","then","packObject","state","allNames","end","p","getPrototypeOf","test","methods","create","diffObject","dirty","makeProxy","enumerable","get","makeProxyGetter","makeProxyMethod","updateObjectProps","method","Promise","reject","args","emitCall","BridgeState","opts","sendMessage","throttleMs","proxies","objects","caches","nextCallId","pendingCalls","lastUpdate","sendPending","error","callId","Number","objectId","packedId","emitCreate","object","wakeup","created","calls","resolve","events","emitReturn","fail","returns","handleMessage","changed","change","event","apply","ret","pendingCall","sendNow","id","task","now","delay","setTimeout","Bridge","_state","_rootPromise","getRoot","sendRoot","root","makeLocalBridge","nopClone","m","cloneMessage","serverState","clientState","onMethod","on","watchMethod","watch","Bridgeable","_close","_emit","_update","hack"],"mappings":"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"} | ||
| {"version":3,"file":"yaob.cjs.js","sources":["../src/magic.js","../src/data.js","../src/manage.js","../src/objects.js","../src/state.js","../src/bridge.js","../src/bridgeable.js"],"sourcesContent":["// @flow\n/**\n * @file\n * Bridgeable objects have a special \"magic\" property.\n * This file contains routines for working with these magic properties.\n */\n\nimport type { BridgeState } from './state.js'\n\n// An object is bridgeable if it has this key:\nexport const MAGIC_KEY = '_yaob'\n\n/**\n * Magic data used to mark classes as bridgeable.\n */\nexport type ClassMagic = {}\n\n/**\n * Magic data shared by all object instances.\n */\ntype ObjectMagic = {\n // The object id on this side of the bridge:\n +localId: number,\n\n // The object is no longer bridgeable when set:\n closed?: true,\n\n // Bridges subscribed to this object:\n bridges: Array<BridgeState>,\n\n // Event listeners subscribed to this object:\n listeners: { [name: string]: Array<Function> },\n\n // Property watchers subscribed to this object:\n watchers: { [name: string]: { data: mixed, fs: Array<Function> } }\n}\n\n/**\n * Magic data found on user-facing object instances.\n */\nexport type InstanceMagic = ObjectMagic & {\n // This is a proxy object if set. See ProxyMagic for other properties:\n +remoteId?: number\n}\n\n/**\n * Magic data found on proxy objects.\n */\nexport type ProxyMagic = ObjectMagic & {\n +remoteId: number,\n\n // True if the property getter should throw the value:\n +errors: { [name: string]: boolean },\n\n // Values for property getters to return:\n +props: { [name: string]: mixed }\n}\n\n/**\n * Magic data found on shared props.\n */\nexport type SharedMagic = {\n +shareId: string\n}\n\nlet nextLocalId = 1\nexport const sharedData: { [sharedId: string]: mixed } = {}\n\n/**\n * Adds or updates an object's magic data.\n */\nfunction addMagic(o: Object, magic: ClassMagic | ObjectMagic | SharedMagic) {\n if (Object.prototype.hasOwnProperty.call(o, MAGIC_KEY)) {\n Object.assign(o[MAGIC_KEY], magic)\n } else {\n Object.defineProperty(o, MAGIC_KEY, { value: magic })\n }\n}\n\n/**\n * Makes a class bridgeable, including anything derived from it.\n */\nexport function bridgifyClass<Type: Function>(Class: Type): Type {\n const o = Class.prototype\n if (!Object.prototype.hasOwnProperty.call(o, MAGIC_KEY)) {\n const magic: ClassMagic = {}\n addMagic(o, magic)\n }\n return Class\n}\n\n/**\n * Makes an object instance bridgeable.\n */\nexport function bridgifyObject<Type: Object>(o: Type): Type {\n if (\n !Object.prototype.hasOwnProperty.call(o, MAGIC_KEY) ||\n o[MAGIC_KEY].localId == null\n ) {\n const magic: InstanceMagic = {\n localId: nextLocalId++,\n bridges: [],\n listeners: {},\n watchers: {}\n }\n addMagic(o, magic)\n }\n return o\n}\n\n/**\n * Gets the magic data from an object instance.\n */\nexport function getInstanceMagic(o: Object): InstanceMagic {\n // We only want to look at bridgeable objects:\n if (o[MAGIC_KEY] == null) throw new TypeError('Not a bridgeable object')\n\n bridgifyObject(o)\n return o[MAGIC_KEY]\n}\n\n/**\n * Creates a new `ProxyMagic` object.\n */\nexport function makeProxyMagic(remoteId: number): ProxyMagic {\n return {\n // InstanceMagic:\n localId: nextLocalId++,\n bridges: [],\n listeners: {},\n watchers: {},\n // ProxyMagic:\n remoteId,\n errors: {},\n props: {}\n }\n}\n\n/**\n * Adds items to the global shared data table.\n */\nexport function shareData(\n table: { [name: string]: Object },\n namespace?: string\n) {\n if (namespace == null) namespace = ''\n else namespace += '.'\n\n for (const n of Object.getOwnPropertyNames(table)) {\n const shareId = namespace + n\n if (sharedData[shareId] != null) {\n throw new Error(`A shared value named ${shareId} already exists`)\n }\n sharedData[shareId] = table[n]\n addMagic(table[n], { shareId })\n }\n}\n","// @flow\n/**\n * @file\n * Routines for breaking primitive values into messages,\n * and then restoring those messages into values on the other side.\n */\n\nimport { base64 } from 'rfc4648'\n\nimport { MAGIC_KEY, sharedData } from './magic.js'\n\n/**\n * The data-packing system uses this interface to turn\n * bridgeable objects into packedId's and vice-versa.\n */\nexport interface ObjectTable {\n getPackedId(o: Object): number | null;\n getObject(packedId: number): Object | void;\n}\n\n/**\n * The bridge tries to send values as-is, but that isn't always possible.\n * If this data structure is non-null, the strings indicate what changes\n * need to take place to the value. This data structure is recursive,\n * so it matches the \"shape\" of the value.\n */\nexport type DataMap =\n | { +[name: string]: DataMap }\n | Array<DataMap>\n | '' // No change\n | '?' // Invalid value\n | 'd' // Date\n | 'e' // Error\n | 'o' // Object\n | 's' // Shared data\n | 'u' // Undefined\n | 'u8' // Uint8Array\n\n/**\n * A pure JSON value type.\n */\nexport type JsonValue =\n | { +[name: string]: JsonValue }\n | Array<JsonValue>\n | false\n | null\n | number\n | string\n | true\n\n/**\n * A value for sending over the wire.\n * If the `value` needs to be modified on the client side,\n * those modifications are in the `map` structure.\n * If this value was thrown, `throw` will be true.\n */\nexport type PackedData = {\n +map?: DataMap,\n +raw: JsonValue,\n +throw?: true\n}\n\n/**\n * The bridge turns errors into these objects.\n */\nexport type PackedError = {\n +base: string | null\n} & PackedData // Object properties\n\n/**\n * Prepares a value for sending over the wire.\n */\nexport function packData(table: ObjectTable, data: mixed): PackedData {\n try {\n const map = mapData(table, data)\n const raw = packItem(table, map, data)\n return map !== '' ? { map, raw } : { raw }\n } catch (data) {\n return packThrow(table, data)\n }\n}\n\n/**\n * Prepares a thrown value for sending over the wire.\n */\nexport function packThrow(table: ObjectTable, data: mixed): PackedData {\n const map = mapData(table, data)\n const raw = packItem(table, map, data)\n return { map, raw, throw: true }\n}\n\n/**\n * Restores a value that has been sent over the wire.\n */\nexport function unpackData(\n table: ObjectTable,\n data: PackedData,\n path: string\n): any {\n const { map, raw } = data\n const out = map != null ? unpackItem(table, map, raw, path) : raw\n if (data.throw) throw out\n return out\n}\n\n/**\n * Searches through a value, looking for data we can't send directly.\n * Returns a map showing where fixes need to take place.\n */\nfunction mapData(table: ObjectTable, data: mixed): DataMap {\n switch (typeof data) {\n case 'boolean':\n case 'number':\n case 'string':\n return ''\n\n case 'object': {\n if (data === null) return ''\n if (data instanceof Date) return 'd'\n if (data instanceof Error) return 'e'\n if (data instanceof Uint8Array) return 'u8'\n if (data[MAGIC_KEY] != null) {\n return data[MAGIC_KEY].shareId != null ? 's' : 'o'\n }\n\n // Arrays:\n if (Array.isArray(data)) {\n let out: Array<DataMap> | '' = ''\n for (let i = 0; i < data.length; ++i) {\n const map = mapData(table, data[i])\n if (map !== '' && out === '') {\n out = []\n for (let j = 0; j < i; ++j) out[j] = ''\n }\n if (out !== '') out[i] = map\n }\n return out\n }\n\n // Data objects:\n let out: { [name: string]: DataMap } | '' = ''\n for (const n in data) {\n const map = mapData(table, data[n])\n if (map !== '') {\n if (out === '') out = {}\n out[n] = map\n }\n }\n return out\n }\n\n case 'undefined':\n return 'u'\n\n case 'function':\n // $FlowFixMe - MAGIC_KEY isn't a known property here\n return data[MAGIC_KEY] != null && data[MAGIC_KEY].shareId != null\n ? 's'\n : '?'\n\n default:\n return '?'\n }\n}\n\n/**\n * Breaks down an error object into a JSON representation.\n */\nfunction packError(table: ObjectTable, o: Object): PackedError {\n // Grab the properties off the object:\n const { message, stack } = o\n const props = { message, stack, ...o }\n\n let base = null\n if (o instanceof EvalError) base = 'EvalError'\n else if (o instanceof RangeError) base = 'RangeError'\n else if (o instanceof ReferenceError) base = 'ReferenceError'\n else if (o instanceof SyntaxError) base = 'SyntaxError'\n else if (o instanceof TypeError) base = 'TypeError'\n else if (o instanceof URIError) base = 'URIError'\n\n // Build the JSON value:\n return { base, ...packData(table, props) }\n}\n\n/**\n * Copies a value, removing any API objects identified in the types.\n */\nfunction packItem(table: ObjectTable, map: DataMap, data: any): JsonValue {\n switch (map) {\n case '':\n return data\n\n case '?':\n return typeof data\n\n case 'd':\n return data.toISOString()\n\n case 'e':\n return packError(table, data)\n\n case 'o':\n return table.getPackedId(data)\n\n case 's':\n return data[MAGIC_KEY].shareId\n\n case 'u':\n return null\n\n case 'u8':\n return base64.stringify(data)\n\n default: {\n // Arrays:\n if (Array.isArray(map)) {\n const out = []\n for (let i = 0; i < map.length; ++i) {\n out[i] = packItem(table, map[i], data[i])\n }\n return out\n }\n\n // Objects:\n const out = {}\n for (const n in data) {\n out[n] = n in map ? packItem(table, map[n], data[n]) : data[n]\n }\n return out\n }\n }\n}\n\n/**\n * Restores an error object from its JSON representation.\n */\nfunction unpackError(\n table: ObjectTable,\n value: PackedError,\n path: string\n): Error {\n const bases = {\n EvalError,\n RangeError,\n ReferenceError,\n SyntaxError,\n TypeError,\n URIError\n }\n\n // Make the object:\n const Base = value.base != null ? bases[value.base] || Error : Error\n const out: Object = new Base()\n\n // Restore the properties:\n const props = unpackData(table, value, path)\n for (const n in props) out[n] = props[n]\n\n return out\n}\n\n/**\n * Restores a value that has been sent over the wire.\n */\nfunction unpackItem(\n table: ObjectTable,\n map: DataMap,\n raw: any,\n path: string\n): any {\n switch (map) {\n case '':\n return raw\n\n case '?': {\n const type = typeof raw === 'string' ? raw : '?'\n throw new TypeError(`Unsupported value of type ${type} at ${path}`)\n }\n\n case 'd':\n return new Date(raw)\n\n case 'e':\n if (typeof raw !== 'object' || raw === null) {\n throw new TypeError(`Expecting an error description at ${path}`)\n }\n return unpackError(table, raw, path)\n\n case 'o': {\n if (raw === null) {\n throw new TypeError(`Closed bridge object at ${path}`)\n }\n if (typeof raw !== 'number') {\n throw new TypeError(`Expecting a packedId at ${path}`)\n }\n const o = table.getObject(-raw)\n if (o == null) throw new RangeError(`Invalid packedId ${raw} at ${path}`)\n return o\n }\n\n case 's': {\n if (typeof raw !== 'string') {\n throw new TypeError(`Expecting a shareId at ${path}`)\n }\n const s = sharedData[raw]\n if (s == null) throw new RangeError(`Invalid shareId '${raw}' at ${path}`)\n return s\n }\n\n case 'u':\n return undefined\n\n case 'u8':\n if (typeof raw !== 'string') {\n throw new TypeError(`Expecting a base64 string at ${path}`)\n }\n return base64.parse(raw)\n\n default: {\n if (typeof map !== 'object' || map === null) {\n throw new TypeError(`Invalid type information ${map} at ${path}`)\n }\n if (typeof raw !== 'object' || raw === null) {\n throw new TypeError(`Expecting an array or object at ${path}`)\n }\n\n // Arrays:\n if (Array.isArray(map)) {\n if (!Array.isArray(raw)) {\n throw new TypeError(`Expecting an array at ${path}`)\n }\n const out = []\n for (let i = 0; i < map.length; ++i) {\n out[i] = unpackItem(table, map[i], raw[i], `${path}[${i}]`)\n }\n return out\n }\n\n // Objects:\n const out = {}\n for (const n in raw) {\n out[n] =\n n in map ? unpackItem(table, map[n], raw[n], `${path}.${n}`) : raw[n]\n }\n return out\n }\n }\n}\n","// @flow\n/**\n * @file\n * Functions for managing updates, events, and object lifetime.\n */\n\nimport { getInstanceMagic } from './magic.js'\n\n/**\n * Undoes the effect of `on`.\n */\nexport type CallbackRemover = () => mixed\n\n/**\n * Signature of the `on` method.\n */\nexport type Subscriber<Events: {} = {}> = <Name: $Keys<Events>>(\n name: Name,\n f: (v: $ElementType<Events, Name>) => mixed\n) => CallbackRemover\n\n// No user-supplied value will ever be identical to this.\nexport const dirtyValue = {}\n\n/**\n * Subscribes to an event on a bridgeable object.\n */\nexport function addListener(\n o: Object,\n name: string,\n f: Function\n): CallbackRemover {\n const { closed, listeners } = getInstanceMagic(o)\n\n if (closed) return () => {}\n if (listeners[name] == null) listeners[name] = [f]\n else listeners[name].push(f)\n\n return function unsubscribe() {\n listeners[name] = listeners[name].filter(i => i !== f)\n }\n}\n\n/**\n * Subscribes to property changes on a bridgeable object.\n */\nexport function addWatcher(\n o: Object,\n name: string,\n f: Function\n): CallbackRemover {\n const { closed, watchers } = getInstanceMagic(o)\n\n // Don't catch access errors, since we want the user to see them:\n const data = o[name]\n\n if (closed) return () => {}\n if (watchers[name] == null) watchers[name] = { data, fs: [f] }\n else watchers[name].fs.push(f)\n\n return function unsubscribe() {\n watchers[name].fs = watchers[name].fs.filter(i => i !== f)\n }\n}\n\n/**\n * Destroys a proxy.\n * The remote client will completely forget about this object,\n * and accessing it will become an error.\n */\nexport function close(o: Object): mixed {\n const magic = getInstanceMagic(o)\n\n // Call local callbacks:\n const listeners = magic.listeners.close\n if (listeners != null) {\n for (const f of listeners) {\n callCallback(o, f, undefined, true)\n }\n }\n\n magic.closed = true\n for (const bridge of magic.bridges) {\n bridge.emitClose(magic.localId)\n }\n magic.bridges = []\n magic.listeners = {}\n magic.watchers = {}\n}\n\n/**\n * Emits an event on a bridgeable object.\n */\nexport function emit(o: Object, name: string, payload: mixed): mixed {\n const magic = getInstanceMagic(o)\n if (magic.closed) throw new Error('Cannot emit event on closed object')\n\n // Schedule outgoing event messages:\n for (const bridge of magic.bridges) {\n bridge.emitEvent(magic.localId, name, payload)\n }\n\n // Call local callbacks:\n const listeners = magic.listeners[name]\n if (listeners != null) {\n for (const f of listeners) {\n callCallback(o, f, payload, name !== 'error')\n }\n }\n}\n\n/**\n * Marks an object as having changes. The proxy server will send an update.\n */\nexport function update<T: {}>(o: T, name?: $Keys<T>): mixed {\n const magic = getInstanceMagic(o)\n if (magic.closed) throw new Error('Cannot update closed object')\n\n for (const bridge of magic.bridges) {\n bridge.markDirty(magic.localId, name)\n }\n\n // Blow away the cache if we have a name:\n if (name != null && magic.watchers[name] != null) {\n magic.watchers[name].data = dirtyValue\n }\n\n // Call watcher callbacks:\n for (const n in magic.watchers) {\n const cache = magic.watchers[n]\n try {\n const data = o[n]\n if (data !== cache.data) {\n cache.data = data\n for (const f of cache.fs) callCallback(o, f, cache.data, true)\n }\n } catch (e) {}\n }\n}\n\n/**\n * Calls a user-supplied callback function with error checking.\n */\nexport function callCallback(\n o: Object,\n f: Function,\n payload: mixed,\n emitError: boolean\n) {\n try {\n const out = f(payload)\n\n // If the function returns a promise, emit an error if it rejects:\n if (emitError && out != null && typeof out.then === 'function') {\n out.then(undefined, e => emit(o, 'error', e))\n }\n } catch (e) {\n if (emitError) emit(o, 'error', e)\n }\n}\n","// @flow\n/**\n * @file\n * Routines for breaking bridgeable objects into messages,\n * and then restoring those messages into proxies on the other side.\n */\n\nimport { packData, packThrow, unpackData } from './data.js'\nimport {\n type ProxyMagic,\n getInstanceMagic,\n MAGIC_KEY,\n makeProxyMagic\n} from './magic.js'\nimport type { CreateMessage, PackedProps } from './protocol.js'\nimport type { BridgeState } from './state.js'\n\nexport type ValueCache = { [name: string]: mixed }\n\n// No user-supplied value will ever be identical to this.\nexport const dirtyValue = {}\n\n/**\n * Examines a bridgeable object and prepares it for sending of the wire.\n * Returns a creation method an the initial value cache.\n */\nexport function packObject(\n state: BridgeState,\n o: Object\n): {\n cache: ValueCache,\n create: CreateMessage\n} {\n // Iterate the prototype chain, looking for property names:\n const allNames: { [name: string]: true } = {}\n const end = Object.prototype\n for (let p = o; p !== end && p != null; p = Object.getPrototypeOf(p)) {\n for (const name of Object.getOwnPropertyNames(p)) {\n if (name !== MAGIC_KEY && !/^_/.test(name) && name !== 'constructor') {\n allNames[name] = true\n }\n }\n }\n\n // Iterate over the object's properties and add their names to\n // the method list or the value cache.\n const cache: ValueCache = {}\n const methods: Array<string> = []\n const props: PackedProps = {}\n for (const n in allNames) {\n try {\n const data = o[n]\n if (\n typeof data === 'function' &&\n (data[MAGIC_KEY] == null || data[MAGIC_KEY].shareId == null)\n ) {\n methods.push(n)\n } else {\n cache[n] = data\n props[n] = packData(state, data)\n }\n } catch (e) {\n cache[n] = dirtyValue\n props[n] = packThrow(state, e)\n }\n }\n\n const { localId } = getInstanceMagic(o)\n const create: CreateMessage = { localId, methods, props }\n return { cache, create }\n}\n\n/**\n * Checks an object for changes.\n * Updates the cache, and returns an object with the necessary changes.\n */\nexport function diffObject(\n state: BridgeState,\n o: Object,\n cache: ValueCache\n): { dirty: boolean, props: PackedProps } {\n let dirty = false\n const props: PackedProps = {}\n\n for (const n in cache) {\n try {\n const value = o[n]\n if (value !== cache[n]) {\n dirty = true\n props[n] = packData(state, value)\n cache[n] = value\n }\n } catch (e) {\n props[n] = packThrow(state, e)\n cache[n] = dirtyValue\n }\n }\n\n return { dirty, props }\n}\n\n/**\n * Creates an object proxy.\n * The object will have the same values and methods as the original,\n * but will send everything over the bridge.\n */\nexport function makeProxy(state: BridgeState, create: CreateMessage): Object {\n const props = {}\n\n // Make the magic property descriptor:\n const magic = makeProxyMagic(create.localId)\n props[MAGIC_KEY] = { value: magic }\n\n // Add the getters:\n for (const n in create.props) {\n props[n] = { enumerable: true, get: makeProxyGetter(magic, n) }\n }\n\n // Add the methods:\n for (const n of create.methods) {\n props[n] = { value: makeProxyMethod(state, magic, n) }\n }\n\n // Make the object:\n return Object.create(Object.prototype, props)\n}\n\n/**\n * Unpacks a proxy's properties into the magic storage area.\n */\nexport function updateObjectProps(\n state: BridgeState,\n o: Object,\n props: PackedProps\n): mixed {\n const magic: ProxyMagic = o[MAGIC_KEY]\n\n for (const n in props) {\n try {\n magic.props[n] = unpackData(state, props[n], n)\n magic.errors[n] = false\n } catch (e) {\n magic.props[n] = e\n magic.errors[n] = true\n }\n }\n}\n\nfunction makeProxyGetter(magic: ProxyMagic, name: string) {\n return function get() {\n if (magic.errors[name]) throw magic.props[name]\n return magic.props[name]\n }\n}\n\nfunction makeProxyMethod(state: BridgeState, magic: ProxyMagic, name: string) {\n return function method(...args) {\n if (magic.closed) {\n return Promise.reject(\n new TypeError(`Cannot call method '${name}' of closed proxy`)\n )\n }\n return state.emitCall(magic.remoteId, name, args)\n }\n}\n","/* global setTimeout */\n// @flow\n\nimport type { BridgeOptions, SendMessage } from './bridge.js'\nimport { type ObjectTable, packData, packThrow, unpackData } from './data.js'\nimport { bridgifyClass, getInstanceMagic } from './magic.js'\nimport { close, emit, update } from './manage.js'\nimport {\n type ValueCache,\n diffObject,\n dirtyValue,\n makeProxy,\n packObject,\n updateObjectProps\n} from './objects.js'\nimport type {\n CallMessage,\n ChangeMessage,\n CreateMessage,\n EventMessage,\n Message,\n ReturnMessage\n} from './protocol.js'\n\nexport class BridgeState implements ObjectTable {\n // Objects:\n +proxies: { [objectId: number]: Object }\n +objects: { [localId: number]: Object }\n +caches: { [localId: number]: ValueCache }\n\n // Outgoing method calls:\n nextCallId: number\n pendingCalls: {\n [callId: number]: { name: string, resolve: Function, reject: Function }\n }\n\n // Pending message:\n dirty: { [localId: number]: { cache: ValueCache, object: Object } }\n message: Message\n\n // Update scheduling:\n closed: boolean\n +throttleMs: number\n lastUpdate: number\n sendPending: boolean\n +sendMessage: SendMessage\n\n constructor(opts: BridgeOptions) {\n const { sendMessage, throttleMs = 0 } = opts\n\n // Objects:\n this.proxies = {}\n this.objects = {}\n this.caches = {}\n\n // Outgoing method calls:\n this.nextCallId = 0\n this.pendingCalls = {}\n\n // Pending message:\n this.dirty = {}\n this.message = {}\n\n // Update scheduling:\n this.throttleMs = throttleMs\n this.lastUpdate = 0\n this.sendPending = false\n this.sendMessage = sendMessage\n }\n\n /**\n * Close the bridge, so it will no longer send messages.\n * This also closes all proxies created by the bridge and rejects\n * all pending calls.\n */\n close(error: Error) {\n for (const callId in this.pendingCalls) {\n const call = this.pendingCalls[Number(callId)]\n call.reject(error)\n }\n for (const objectId in this.proxies) {\n close(this.proxies[Number(objectId)])\n }\n this.closed = true\n }\n\n /**\n * Grabs an object by its proxy id.\n */\n getObject(packedId: number): Object | void {\n return packedId < 0 ? this.proxies[-packedId] : this.objects[packedId]\n }\n\n /**\n * Returns an object's id relative to this bridge.\n * The id is positive for objects created on this side of the bridge,\n * and negative for proxy objects reflecting things on the other side.\n */\n getPackedId(o: Object): number | null {\n const magic = getInstanceMagic(o)\n if (magic.closed) return null\n if (magic.remoteId != null && this.proxies[magic.remoteId] != null) {\n return -magic.remoteId\n }\n if (this.objects[magic.localId] == null) {\n // Add unknown objects to the bridge:\n this.objects[magic.localId] = o\n\n const { cache, create } = packObject(this, o)\n this.caches[magic.localId] = cache\n magic.bridges.push(this)\n this.emitCreate(create, o)\n }\n return magic.localId\n }\n\n /**\n * Marks an object as needing changes.\n */\n markDirty(localId: number, name?: string): void {\n const cache = this.caches[localId]\n if (name != null && name in cache) cache[name] = dirtyValue\n\n this.dirty[localId] = { cache, object: this.objects[localId] }\n this.wakeup()\n }\n\n /**\n * Marks an object as being deleted.\n */\n emitClose(localId: number): void {\n delete this.objects[localId]\n delete this.caches[localId]\n if (this.message.closed == null) this.message.closed = []\n this.message.closed.push(localId)\n this.wakeup()\n }\n\n /**\n * Attaches an object to this bridge, sending a creation message.\n */\n emitCreate(create: CreateMessage, o: Object): void {\n if (this.message.created == null) this.message.created = []\n this.message.created.push(create)\n // this.wakeup() not needed, since this is part of data packing.\n }\n\n /**\n * Enqueues a proxy call message.\n */\n emitCall(remoteId: number, name: string, args: mixed): Promise<mixed> {\n const callId = this.nextCallId++\n const message: CallMessage = {\n callId,\n remoteId,\n name,\n ...packData(this, args)\n }\n if (this.message.calls == null) this.message.calls = []\n this.message.calls.push(message)\n this.wakeup()\n\n return new Promise((resolve, reject) => {\n this.pendingCalls[callId] = { name, resolve, reject }\n })\n }\n\n /**\n * Enqueues an event message.\n */\n emitEvent(localId: number, name: string, payload: mixed): void {\n const message: EventMessage = {\n localId,\n name,\n ...packData(this, payload)\n }\n if (this.message.events == null) this.message.events = []\n this.message.events.push(message)\n this.wakeup()\n }\n\n /**\n * Enqueues a function return message.\n */\n emitReturn(callId: number, fail: boolean, value: mixed): void {\n const message: ReturnMessage = {\n callId,\n ...(fail ? packThrow(this, value) : packData(this, value))\n }\n if (this.message.returns == null) this.message.returns = []\n this.message.returns.push(message)\n this.wakeup()\n }\n\n /**\n * Handles an incoming message,\n * updating state and triggering side-effects as needed.\n */\n handleMessage(message: Message): void {\n // ----------------------------------------\n // Phase 1: Get our proxies up to date.\n // ----------------------------------------\n\n // Handle newly-created objects:\n if (message.created) {\n // Pass 1: Create proxies for the new objects:\n for (const create of message.created) {\n this.proxies[create.localId] = makeProxy(this, create)\n }\n\n // Pass 2: Fill in the values:\n for (const create of message.created) {\n updateObjectProps(this, this.proxies[create.localId], create.props)\n }\n }\n\n // Handle updated objects:\n if (message.changed) {\n // Pass 1: Update all the proxies:\n for (const change of message.changed) {\n const { localId, props } = change\n const o = this.proxies[localId]\n if (o == null) {\n throw new RangeError(`Invalid localId ${localId}`)\n }\n updateObjectProps(this, o, props)\n }\n\n // Pass 2: Fire the callbacks:\n for (const change of message.changed) {\n update(this.proxies[change.localId])\n }\n }\n\n // ----------------------------------------\n // Phase 2: Handle events & method calls\n // ----------------------------------------\n\n // Handle events:\n if (message.events) {\n for (const event of message.events) {\n const { localId, name } = event\n const o = localId === 0 ? this : this.proxies[localId]\n if (o == null) continue\n try {\n emit(o, name, unpackData(this, event, name))\n } catch (e) {\n emit(o, 'error', e) // Payload unpacking problem\n }\n }\n }\n\n // Handle method calls:\n if (message.calls) {\n for (const call of message.calls) {\n const { callId, remoteId, name } = call\n\n try {\n const o = this.objects[remoteId]\n if (o == null) {\n throw new TypeError(\n `Cannot call method '${name}' of closed proxy (remote)`\n )\n }\n if (typeof o[name] !== 'function') {\n throw new TypeError(`'${name}' is not a function`)\n }\n const args = unpackData(this, call, `${name}.arguments`)\n Promise.resolve(o[name].apply(o, args)).then(\n value => this.emitReturn(callId, false, value),\n e => this.emitReturn(callId, true, e)\n )\n } catch (e) {\n this.emitReturn(callId, true, e)\n }\n }\n }\n\n // Handle method returns:\n if (message.returns) {\n for (const ret of message.returns) {\n const { callId } = ret\n const pendingCall = this.pendingCalls[callId]\n if (pendingCall == null) {\n throw new RangeError(`Invalid callId ${callId}`)\n }\n try {\n pendingCall.resolve(\n unpackData(this, ret, `${pendingCall.name}.return`)\n )\n } catch (e) {\n pendingCall.reject(e)\n } finally {\n delete this.pendingCalls[callId]\n }\n }\n }\n\n // ----------------------------------------\n // Phase 3: Clean up closed objects\n // ----------------------------------------\n\n if (message.closed) {\n for (const localId of message.closed) {\n const o = this.proxies[localId]\n if (o == null) return\n delete this.proxies[localId]\n close(o)\n }\n }\n }\n\n /**\n * Sends the current message.\n */\n sendNow(): void {\n if (this.closed) return\n\n // Build change messages:\n for (const id in this.dirty) {\n const localId = Number(id)\n const { object, cache } = this.dirty[localId]\n const { dirty, props } = diffObject(this, object, cache)\n if (dirty) {\n const message: ChangeMessage = { localId, props }\n if (this.message.changed == null) this.message.changed = []\n this.message.changed.push(message)\n }\n }\n\n const message = this.message\n this.dirty = {}\n this.message = {}\n this.sendMessage(message)\n }\n\n /**\n * Something has changed, so prepare to send the pending message:\n */\n wakeup(): void {\n if (this.sendPending) return\n\n this.sendPending = true\n const task = () => {\n this.sendPending = false\n this.lastUpdate = Date.now()\n this.sendNow()\n }\n\n // We really do want `setTimeout` here, even if the delay is 0,\n // since promises and other micro tasks should fire first.\n const delay = this.lastUpdate + this.throttleMs - Date.now()\n setTimeout(task, delay < 0 ? 0 : delay)\n }\n}\n\nbridgifyClass(BridgeState)\n","// @flow\n\nimport { packData, unpackData } from './data.js'\nimport { addListener } from './manage.js'\nimport { type Message } from './protocol.js'\nimport { BridgeState } from './state.js'\n\n/**\n * The bridge sends messages using this function.\n */\nexport type SendMessage = (message: Object) => mixed\n\n/**\n * Options used to create a new bridge.\n */\nexport type BridgeOptions = {\n sendMessage: SendMessage,\n throttleMs?: number\n}\n\n/**\n * Options used to create a new local bridge.\n */\nexport type LocalBridgeOptions = {\n cloneMessage?: (x: Object) => Object,\n throttleMs?: number\n}\n\n/**\n * An object bridge.\n */\nexport class Bridge {\n +_state: BridgeState\n +_rootPromise: Promise<Object>\n\n constructor(opts: BridgeOptions) {\n this._state = new BridgeState(opts)\n this._rootPromise = new Promise(resolve =>\n addListener(this._state, 'root', resolve)\n )\n }\n\n handleMessage(message: Message): mixed {\n this._state.handleMessage(message)\n }\n\n getRoot() {\n return this._rootPromise\n }\n\n sendRoot(root: Object) {\n this._state.emitEvent(0, 'root', root)\n }\n\n close(error: Error) {\n this._state.close(error)\n }\n}\n\n/**\n * Bridges a single object locally. This is great for unit tests,\n * where you want to verify that your API works correctly over a bridge,\n * but don't want to actually spawn a separate process.\n */\nexport function makeLocalBridge<T>(o: T, opts: LocalBridgeOptions = {}): T {\n function nopClone(m: Object): Object {\n return m\n }\n const { cloneMessage = nopClone, throttleMs } = opts\n\n const serverState = new BridgeState({\n sendMessage(message) {\n clientState.handleMessage(cloneMessage(message))\n },\n throttleMs\n })\n const clientState = new BridgeState({\n sendMessage(message) {\n serverState.handleMessage(cloneMessage(message))\n },\n throttleMs\n })\n\n const data = cloneMessage(packData(serverState, o))\n serverState.sendNow()\n return unpackData(clientState, cloneMessage(data), 'root')\n}\n","// @flow\n\nimport { bridgifyClass, shareData } from './magic.js'\nimport type { Subscriber } from './manage.js'\nimport { addListener, addWatcher, close, emit, update } from './manage.js'\n\n/**\n * The `on` function,\n * but packaged as a method and ready to be placed on an object.\n */\nexport const onMethod: Function = function on(name, f) {\n return addListener(this, name, f)\n}\n\n/**\n * The `watch` function,\n * but packaged as a method and ready to be placed on an object.\n */\nexport const watchMethod: Function = function watch(name, f) {\n return addWatcher(this, name, f)\n}\n\nshareData({ onMethod, watchMethod })\n\n/**\n * The base class for all bridgeable API's. Provides callback capability.\n */\nexport class Bridgeable<Props: {} = {}, Events: {} = {}> {\n +on: Subscriber<Events>\n +watch: Subscriber<Props>\n\n _close() {\n close(this)\n }\n\n _emit<Name: $Keys<Events>>(\n name: Name,\n payload: $ElementType<Events, Name>\n ): mixed {\n return emit(this, name, payload)\n }\n\n _update(name?: $Keys<Props>) {\n update(this, name)\n }\n}\n\n// Put the shared methods onto the prototype:\nconst hack: any = Bridgeable.prototype\nhack.on = onMethod\nhack.watch = watchMethod\n\nbridgifyClass(Bridgeable)\n"],"names":["MAGIC_KEY","nextLocalId","sharedData","addMagic","o","magic","Object","prototype","hasOwnProperty","call","defineProperty","value","bridgifyClass","Class","bridgifyObject","localId","bridges","listeners","watchers","getInstanceMagic","TypeError","makeProxyMagic","remoteId","errors","props","shareData","table","namespace","getOwnPropertyNames","n","shareId","Error","packData","data","map","mapData","raw","packItem","packThrow","unpackData","path","out","unpackItem","Date","Uint8Array","Array","isArray","i","length","j","packError","message","stack","base","EvalError","RangeError","ReferenceError","SyntaxError","URIError","toISOString","getPackedId","base64","stringify","unpackError","bases","Base","type","getObject","s","undefined","parse","dirtyValue","addListener","name","f","closed","push","unsubscribe","filter","addWatcher","fs","close","callCallback","bridge","emitClose","emit","payload","emitEvent","update","markDirty","cache","e","emitError","then","packObject","state","allNames","end","p","getPrototypeOf","test","methods","create","diffObject","dirty","makeProxy","enumerable","get","makeProxyGetter","makeProxyMethod","updateObjectProps","method","Promise","reject","args","emitCall","BridgeState","opts","sendMessage","throttleMs","proxies","objects","caches","nextCallId","pendingCalls","lastUpdate","sendPending","error","callId","Number","objectId","packedId","emitCreate","object","wakeup","created","calls","resolve","events","emitReturn","fail","returns","handleMessage","changed","change","event","apply","ret","pendingCall","sendNow","id","task","now","delay","setTimeout","Bridge","_state","_rootPromise","getRoot","sendRoot","root","makeLocalBridge","nopClone","m","cloneMessage","serverState","clientState","onMethod","on","watchMethod","watch","Bridgeable","_close","_emit","_update","hack"],"mappings":"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"} |
+127
-116
@@ -26,3 +26,2 @@ import { base64 } from 'rfc4648'; | ||
| */ | ||
| // An object is bridgeable if it has this key: | ||
| var MAGIC_KEY = '_yaob'; | ||
@@ -163,3 +162,3 @@ /** | ||
| raw: raw, | ||
| throw: true | ||
| "throw": true | ||
| }; | ||
@@ -175,3 +174,3 @@ } | ||
| var out = map != null ? unpackItem(table, map, raw, path) : raw; | ||
| if (data.throw) throw out; | ||
| if (data["throw"]) throw out; | ||
| return out; | ||
@@ -192,46 +191,48 @@ } | ||
| case 'object': | ||
| if (data === null) return ''; | ||
| if (data instanceof Date) return 'd'; | ||
| if (data instanceof Error) return 'e'; | ||
| if (data instanceof Uint8Array) return 'u8'; | ||
| { | ||
| if (data === null) return ''; | ||
| if (data instanceof Date) return 'd'; | ||
| if (data instanceof Error) return 'e'; | ||
| if (data instanceof Uint8Array) return 'u8'; | ||
| if (data[MAGIC_KEY] != null) { | ||
| return data[MAGIC_KEY].shareId != null ? 's' : 'o'; | ||
| } // Arrays: | ||
| if (data[MAGIC_KEY] != null) { | ||
| return data[MAGIC_KEY].shareId != null ? 's' : 'o'; | ||
| } // Arrays: | ||
| if (Array.isArray(data)) { | ||
| var _out = ''; | ||
| if (Array.isArray(data)) { | ||
| var _out = ''; | ||
| for (var i = 0; i < data.length; ++i) { | ||
| var map = mapData(table, data[i]); | ||
| for (var i = 0; i < data.length; ++i) { | ||
| var map = mapData(table, data[i]); | ||
| if (map !== '' && _out === '') { | ||
| _out = []; | ||
| if (map !== '' && _out === '') { | ||
| _out = []; | ||
| for (var j = 0; j < i; ++j) { | ||
| _out[j] = ''; | ||
| for (var j = 0; j < i; ++j) { | ||
| _out[j] = ''; | ||
| } | ||
| } | ||
| if (_out !== '') _out[i] = map; | ||
| } | ||
| if (_out !== '') _out[i] = map; | ||
| } | ||
| return _out; | ||
| } // Data objects: | ||
| return _out; | ||
| } // Data objects: | ||
| var out = ''; | ||
| var out = ''; | ||
| for (var n in data) { | ||
| var _map = mapData(table, data[n]); | ||
| for (var n in data) { | ||
| var _map = mapData(table, data[n]); | ||
| if (_map !== '') { | ||
| if (out === '') out = {}; | ||
| out[n] = _map; | ||
| } | ||
| } | ||
| if (_map !== '') { | ||
| if (out === '') out = {}; | ||
| out[n] = _map; | ||
| } | ||
| return out; | ||
| } | ||
| return out; | ||
| case 'undefined': | ||
@@ -241,2 +242,3 @@ return 'u'; | ||
| case 'function': | ||
| // $FlowFixMe - MAGIC_KEY isn't a known property here | ||
| return data[MAGIC_KEY] != null && data[MAGIC_KEY].shareId != null ? 's' : '?'; | ||
@@ -302,21 +304,23 @@ | ||
| default: | ||
| // Arrays: | ||
| if (Array.isArray(map)) { | ||
| var _out2 = []; | ||
| { | ||
| // Arrays: | ||
| if (Array.isArray(map)) { | ||
| var _out2 = []; | ||
| for (var i = 0; i < map.length; ++i) { | ||
| _out2[i] = packItem(table, map[i], data[i]); | ||
| } | ||
| for (var i = 0; i < map.length; ++i) { | ||
| _out2[i] = packItem(table, map[i], data[i]); | ||
| } | ||
| return _out2; | ||
| } // Objects: | ||
| return _out2; | ||
| } // Objects: | ||
| var out = {}; | ||
| var out = {}; | ||
| for (var n in data) { | ||
| out[n] = n in map ? packItem(table, map[n], data[n]) : data[n]; | ||
| for (var n in data) { | ||
| out[n] = n in map ? packItem(table, map[n], data[n]) : data[n]; | ||
| } | ||
| return out; | ||
| } | ||
| return out; | ||
| } | ||
@@ -336,5 +340,5 @@ } | ||
| TypeError: TypeError, | ||
| URIError: URIError // Make the object: | ||
| URIError: URIError | ||
| }; // Make the object: | ||
| }; | ||
| var Base = value.base != null ? bases[value.base] || Error : Error; | ||
@@ -362,4 +366,6 @@ var out = new Base(); // Restore the properties: | ||
| case '?': | ||
| var type = typeof raw === 'string' ? raw : '?'; | ||
| throw new TypeError("Unsupported value of type " + type + " at " + path); | ||
| { | ||
| var type = typeof raw === 'string' ? raw : '?'; | ||
| throw new TypeError("Unsupported value of type " + type + " at " + path); | ||
| } | ||
@@ -377,26 +383,30 @@ case 'd': | ||
| case 'o': | ||
| if (raw === null) { | ||
| throw new TypeError("Closed bridge object at " + path); | ||
| } | ||
| { | ||
| if (raw === null) { | ||
| throw new TypeError("Closed bridge object at " + path); | ||
| } | ||
| if (typeof raw !== 'number') { | ||
| throw new TypeError("Expecting a packedId at " + path); | ||
| } | ||
| if (typeof raw !== 'number') { | ||
| throw new TypeError("Expecting a packedId at " + path); | ||
| } | ||
| var _o = table.getObject(-raw); | ||
| var _o = table.getObject(-raw); | ||
| if (_o == null) throw new RangeError("Invalid packedId " + raw + " at " + path); | ||
| return _o; | ||
| if (_o == null) throw new RangeError("Invalid packedId " + raw + " at " + path); | ||
| return _o; | ||
| } | ||
| case 's': | ||
| if (typeof raw !== 'string') { | ||
| throw new TypeError("Expecting a shareId at " + path); | ||
| { | ||
| if (typeof raw !== 'string') { | ||
| throw new TypeError("Expecting a shareId at " + path); | ||
| } | ||
| var s = sharedData[raw]; | ||
| if (s == null) throw new RangeError("Invalid shareId '" + raw + "' at " + path); | ||
| return s; | ||
| } | ||
| var s = sharedData[raw]; | ||
| if (s == null) throw new RangeError("Invalid shareId '" + raw + "' at " + path); | ||
| return s; | ||
| case 'u': | ||
| return void 0; | ||
| return undefined; | ||
@@ -411,33 +421,35 @@ case 'u8': | ||
| default: | ||
| if (typeof map !== 'object' || map === null) { | ||
| throw new TypeError("Invalid type information " + map + " at " + path); | ||
| } | ||
| { | ||
| if (typeof map !== 'object' || map === null) { | ||
| throw new TypeError("Invalid type information " + map + " at " + path); | ||
| } | ||
| if (typeof raw !== 'object' || raw === null) { | ||
| throw new TypeError("Expecting an array or object at " + path); | ||
| } // Arrays: | ||
| if (typeof raw !== 'object' || raw === null) { | ||
| throw new TypeError("Expecting an array or object at " + path); | ||
| } // Arrays: | ||
| if (Array.isArray(map)) { | ||
| if (!Array.isArray(raw)) { | ||
| throw new TypeError("Expecting an array at " + path); | ||
| } | ||
| if (Array.isArray(map)) { | ||
| if (!Array.isArray(raw)) { | ||
| throw new TypeError("Expecting an array at " + path); | ||
| } | ||
| var _out3 = []; | ||
| var _out3 = []; | ||
| for (var i = 0; i < map.length; ++i) { | ||
| _out3[i] = unpackItem(table, map[i], raw[i], path + "[" + i + "]"); | ||
| } | ||
| for (var i = 0; i < map.length; ++i) { | ||
| _out3[i] = unpackItem(table, map[i], raw[i], path + "[" + i + "]"); | ||
| } | ||
| return _out3; | ||
| } // Objects: | ||
| return _out3; | ||
| } // Objects: | ||
| var out = {}; | ||
| var out = {}; | ||
| for (var n in raw) { | ||
| out[n] = n in map ? unpackItem(table, map[n], raw[n], path + "." + n) : raw[n]; | ||
| for (var n in raw) { | ||
| out[n] = n in map ? unpackItem(table, map[n], raw[n], path + "." + n) : raw[n]; | ||
| } | ||
| return out; | ||
| } | ||
| return out; | ||
| } | ||
@@ -504,3 +516,3 @@ } | ||
| var listeners = magic.listeners['close']; | ||
| var listeners = magic.listeners.close; | ||
@@ -510,3 +522,3 @@ if (listeners != null) { | ||
| var _f = listeners[_i2]; | ||
| callCallback(o, _f, void 0, true); | ||
| callCallback(o, _f, undefined, true); | ||
| } | ||
@@ -594,3 +606,3 @@ } | ||
| if (emitError && out != null && typeof out.then === 'function') { | ||
| out.then(void 0, function (e) { | ||
| out.then(undefined, function (e) { | ||
| return emit(o, 'error', e); | ||
@@ -706,6 +718,5 @@ }); | ||
| props[MAGIC_KEY] = { | ||
| value: magic // Add the getters: | ||
| value: magic | ||
| }; // Add the getters: | ||
| }; | ||
| for (var n in create.props) { | ||
@@ -804,3 +815,3 @@ props[n] = { | ||
| _proto.close = function close$$1(error) { | ||
| _proto.close = function close$1(error) { | ||
| for (var _callId in this.pendingCalls) { | ||
@@ -816,11 +827,11 @@ var call = this.pendingCalls[Number(_callId)]; | ||
| this.closed = true; | ||
| }; | ||
| } | ||
| /** | ||
| * Grabs an object by its proxy id. | ||
| */ | ||
| ; | ||
| _proto.getObject = function getObject(packedId) { | ||
| return packedId < 0 ? this.proxies[-packedId] : this.objects[packedId]; | ||
| }; | ||
| } | ||
| /** | ||
@@ -831,4 +842,4 @@ * Returns an object's id relative to this bridge. | ||
| */ | ||
| ; | ||
| _proto.getPackedId = function getPackedId(o) { | ||
@@ -856,8 +867,8 @@ var magic = getInstanceMagic(o); | ||
| return magic.localId; | ||
| }; | ||
| } | ||
| /** | ||
| * Marks an object as needing changes. | ||
| */ | ||
| ; | ||
| _proto.markDirty = function markDirty(localId, name) { | ||
@@ -871,8 +882,8 @@ var cache = this.caches[localId]; | ||
| this.wakeup(); | ||
| }; | ||
| } | ||
| /** | ||
| * Marks an object as being deleted. | ||
| */ | ||
| ; | ||
| _proto.emitClose = function emitClose(localId) { | ||
@@ -884,17 +895,17 @@ delete this.objects[localId]; | ||
| this.wakeup(); | ||
| }; | ||
| } | ||
| /** | ||
| * Attaches an object to this bridge, sending a creation message. | ||
| */ | ||
| ; | ||
| _proto.emitCreate = function emitCreate(create, o) { | ||
| if (this.message.created == null) this.message.created = []; | ||
| this.message.created.push(create); // this.wakeup() not needed, since this is part of data packing. | ||
| }; | ||
| } | ||
| /** | ||
| * Enqueues a proxy call message. | ||
| */ | ||
| ; | ||
| _proto.emitCall = function emitCall(remoteId, name, args) { | ||
@@ -921,8 +932,8 @@ var _this = this; | ||
| }); | ||
| }; | ||
| } | ||
| /** | ||
| * Enqueues an event message. | ||
| */ | ||
| ; | ||
| _proto.emitEvent = function emitEvent(localId, name, payload) { | ||
@@ -937,8 +948,8 @@ var message = _extends({ | ||
| this.wakeup(); | ||
| }; | ||
| } | ||
| /** | ||
| * Enqueues a function return message. | ||
| */ | ||
| ; | ||
| _proto.emitReturn = function emitReturn(callId, fail, value) { | ||
@@ -952,3 +963,3 @@ var message = _extends({ | ||
| this.wakeup(); | ||
| }; | ||
| } | ||
| /** | ||
@@ -958,4 +969,4 @@ * Handles an incoming message, | ||
| */ | ||
| ; | ||
| _proto.handleMessage = function handleMessage(message) { | ||
@@ -1096,8 +1107,8 @@ var _this2 = this; | ||
| } | ||
| }; | ||
| } | ||
| /** | ||
| * Sends the current message. | ||
| */ | ||
| ; | ||
| _proto.sendNow = function sendNow() { | ||
@@ -1131,8 +1142,8 @@ if (this.closed) return; // Build change messages: | ||
| this.sendMessage(message); | ||
| }; | ||
| } | ||
| /** | ||
| * Something has changed, so prepare to send the pending message: | ||
| */ | ||
| ; | ||
| _proto.wakeup = function wakeup() { | ||
@@ -1194,3 +1205,3 @@ var _this3 = this; | ||
| _proto.close = function close$$1(error) { | ||
| _proto.close = function close(error) { | ||
| this._state.close(error); | ||
@@ -1288,3 +1299,3 @@ }; | ||
| export { onMethod, shareData, watchMethod, Bridgeable, bridgifyClass, bridgifyObject, close, emit, update, Bridge, makeLocalBridge }; | ||
| export { Bridge, Bridgeable, bridgifyClass, bridgifyObject, close, emit, makeLocalBridge, onMethod, shareData, update, watchMethod }; | ||
| //# sourceMappingURL=yaob.js.map |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"yaob.js","sources":["../src/magic.js","../src/data.js","../src/manage.js","../src/objects.js","../src/state.js","../src/bridge.js","../src/bridgeable.js"],"sourcesContent":["// @flow\n/**\n * @file\n * Bridgeable objects have a special \"magic\" property.\n * This file contains routines for working with these magic properties.\n */\n\nimport type { BridgeState } from './state.js'\n\n// An object is bridgeable if it has this key:\nexport const MAGIC_KEY = '_yaob'\n\n/**\n * Magic data used to mark classes as bridgeable.\n */\nexport type ClassMagic = {}\n\n/**\n * Magic data shared by all object instances.\n */\ntype ObjectMagic = {\n // The object id on this side of the bridge:\n +localId: number,\n\n // The object is no longer bridgeable when set:\n closed?: true,\n\n // Bridges subscribed to this object:\n bridges: Array<BridgeState>,\n\n // Event listeners subscribed to this object:\n listeners: { [name: string]: Array<Function> },\n\n // Property watchers subscribed to this object:\n watchers: { [name: string]: { data: mixed, fs: Array<Function> } }\n}\n\n/**\n * Magic data found on user-facing object instances.\n */\nexport type InstanceMagic = ObjectMagic & {\n // This is a proxy object if set. See ProxyMagic for other properties:\n +remoteId?: number\n}\n\n/**\n * Magic data found on proxy objects.\n */\nexport type ProxyMagic = ObjectMagic & {\n +remoteId: number,\n\n // True if the property getter should throw the value:\n +errors: { [name: string]: boolean },\n\n // Values for property getters to return:\n +props: { [name: string]: mixed }\n}\n\n/**\n * Magic data found on shared props.\n */\nexport type SharedMagic = {\n +shareId: string\n}\n\nlet nextLocalId = 1\nexport const sharedData: { [sharedId: string]: mixed } = {}\n\n/**\n * Adds or updates an object's magic data.\n */\nfunction addMagic (o: Object, magic: ClassMagic | ObjectMagic | SharedMagic) {\n if (Object.prototype.hasOwnProperty.call(o, MAGIC_KEY)) {\n Object.assign(o[MAGIC_KEY], magic)\n } else {\n Object.defineProperty(o, MAGIC_KEY, { value: magic })\n }\n}\n\n/**\n * Makes a class bridgeable, including anything derived from it.\n */\nexport function bridgifyClass<Type: Function> (Class: Type): Type {\n const o = Class.prototype\n if (!Object.prototype.hasOwnProperty.call(o, MAGIC_KEY)) {\n const magic: ClassMagic = {}\n addMagic(o, magic)\n }\n return Class\n}\n\n/**\n * Makes an object instance bridgeable.\n */\nexport function bridgifyObject<Type: Object> (o: Type): Type {\n if (\n !Object.prototype.hasOwnProperty.call(o, MAGIC_KEY) ||\n o[MAGIC_KEY].localId == null\n ) {\n const magic: InstanceMagic = {\n localId: nextLocalId++,\n bridges: [],\n listeners: {},\n watchers: {}\n }\n addMagic(o, magic)\n }\n return o\n}\n\n/**\n * Gets the magic data from an object instance.\n */\nexport function getInstanceMagic (o: Object): InstanceMagic {\n // We only want to look at bridgeable objects:\n if (o[MAGIC_KEY] == null) throw new TypeError('Not a bridgeable object')\n\n bridgifyObject(o)\n return o[MAGIC_KEY]\n}\n\n/**\n * Creates a new `ProxyMagic` object.\n */\nexport function makeProxyMagic (remoteId: number): ProxyMagic {\n return {\n // InstanceMagic:\n localId: nextLocalId++,\n bridges: [],\n listeners: {},\n watchers: {},\n // ProxyMagic:\n remoteId,\n errors: {},\n props: {}\n }\n}\n\n/**\n * Adds items to the global shared data table.\n */\nexport function shareData (\n table: { [name: string]: Object },\n namespace?: string\n) {\n if (namespace == null) namespace = ''\n else namespace += '.'\n\n for (const n of Object.getOwnPropertyNames(table)) {\n const shareId = namespace + n\n if (sharedData[shareId] != null) {\n throw new Error(`A shared value named ${shareId} already exists`)\n }\n sharedData[shareId] = table[n]\n addMagic(table[n], { shareId })\n }\n}\n","// @flow\n/**\n * @file\n * Routines for breaking primitive values into messages,\n * and then restoring those messages into values on the other side.\n */\n\nimport { base64 } from 'rfc4648'\n\nimport { MAGIC_KEY, sharedData } from './magic.js'\n\n/**\n * The data-packing system uses this interface to turn\n * bridgeable objects into packedId's and vice-versa.\n */\nexport interface ObjectTable {\n getPackedId(o: Object): number | null;\n getObject(packedId: number): Object | void;\n}\n\n/**\n * The bridge tries to send values as-is, but that isn't always possible.\n * If this data structure is non-null, the strings indicate what changes\n * need to take place to the value. This data structure is recursive,\n * so it matches the \"shape\" of the value.\n */\nexport type DataMap =\n | { +[name: string]: DataMap }\n | Array<DataMap>\n | '' // No change\n | '?' // Invalid value\n | 'd' // Date\n | 'e' // Error\n | 'o' // Object\n | 's' // Shared data\n | 'u' // Undefined\n | 'u8' // Uint8Array\n\n/**\n * A pure JSON value type.\n */\nexport type JsonValue =\n | { +[name: string]: JsonValue }\n | Array<JsonValue>\n | false\n | null\n | number\n | string\n | true\n\n/**\n * A value for sending over the wire.\n * If the `value` needs to be modified on the client side,\n * those modifications are in the `map` structure.\n * If this value was thrown, `throw` will be true.\n */\nexport type PackedData = {\n +map?: DataMap,\n +raw: JsonValue,\n +throw?: true\n}\n\n/**\n * The bridge turns errors into these objects.\n */\nexport type PackedError = {\n +base: string | null\n} & PackedData // Object properties\n\n/**\n * Prepares a value for sending over the wire.\n */\nexport function packData (table: ObjectTable, data: mixed): PackedData {\n try {\n const map = mapData(table, data)\n const raw = packItem(table, map, data)\n return map !== '' ? { map, raw } : { raw }\n } catch (data) {\n return packThrow(table, data)\n }\n}\n\n/**\n * Prepares a thrown value for sending over the wire.\n */\nexport function packThrow (table: ObjectTable, data: mixed): PackedData {\n const map = mapData(table, data)\n const raw = packItem(table, map, data)\n return { map, raw, throw: true }\n}\n\n/**\n * Restores a value that has been sent over the wire.\n */\nexport function unpackData (\n table: ObjectTable,\n data: PackedData,\n path: string\n): any {\n const { map, raw } = data\n const out = map != null ? unpackItem(table, map, raw, path) : raw\n if (data.throw) throw out\n return out\n}\n\n/**\n * Searches through a value, looking for data we can't send directly.\n * Returns a map showing where fixes need to take place.\n */\nfunction mapData (table: ObjectTable, data: mixed): DataMap {\n switch (typeof data) {\n case 'boolean':\n case 'number':\n case 'string':\n return ''\n\n case 'object':\n if (data === null) return ''\n if (data instanceof Date) return 'd'\n if (data instanceof Error) return 'e'\n if (data instanceof Uint8Array) return 'u8'\n if (data[MAGIC_KEY] != null) {\n return data[MAGIC_KEY].shareId != null ? 's' : 'o'\n }\n\n // Arrays:\n if (Array.isArray(data)) {\n let out: Array<DataMap> | '' = ''\n for (let i = 0; i < data.length; ++i) {\n const map = mapData(table, data[i])\n if (map !== '' && out === '') {\n out = []\n for (let j = 0; j < i; ++j) out[j] = ''\n }\n if (out !== '') out[i] = map\n }\n return out\n }\n\n // Data objects:\n let out: { [name: string]: DataMap } | '' = ''\n for (const n in data) {\n const map = mapData(table, data[n])\n if (map !== '') {\n if (out === '') out = {}\n out[n] = map\n }\n }\n return out\n\n case 'undefined':\n return 'u'\n\n case 'function':\n return data[MAGIC_KEY] != null && data[MAGIC_KEY].shareId != null\n ? 's'\n : '?'\n\n default:\n return '?'\n }\n}\n\n/**\n * Breaks down an error object into a JSON representation.\n */\nfunction packError (table: ObjectTable, o: Object): PackedError {\n // Grab the properties off the object:\n const { message, stack } = o\n const props = { message, stack, ...o }\n\n let base = null\n if (o instanceof EvalError) base = 'EvalError'\n else if (o instanceof RangeError) base = 'RangeError'\n else if (o instanceof ReferenceError) base = 'ReferenceError'\n else if (o instanceof SyntaxError) base = 'SyntaxError'\n else if (o instanceof TypeError) base = 'TypeError'\n else if (o instanceof URIError) base = 'URIError'\n\n // Build the JSON value:\n return { base, ...packData(table, props) }\n}\n\n/**\n * Copies a value, removing any API objects identified in the types.\n */\nfunction packItem (table: ObjectTable, map: DataMap, data: any): JsonValue {\n switch (map) {\n case '':\n return data\n\n case '?':\n return typeof data\n\n case 'd':\n return data.toISOString()\n\n case 'e':\n return packError(table, data)\n\n case 'o':\n return table.getPackedId(data)\n\n case 's':\n return data[MAGIC_KEY].shareId\n\n case 'u':\n return null\n\n case 'u8':\n return base64.stringify(data)\n\n default:\n // Arrays:\n if (Array.isArray(map)) {\n const out = []\n for (let i = 0; i < map.length; ++i) {\n out[i] = packItem(table, map[i], data[i])\n }\n return out\n }\n\n // Objects:\n const out = {}\n for (const n in data) {\n out[n] = n in map ? packItem(table, map[n], data[n]) : data[n]\n }\n return out\n }\n}\n\n/**\n * Restores an error object from its JSON representation.\n */\nfunction unpackError (\n table: ObjectTable,\n value: PackedError,\n path: string\n): Error {\n const bases = {\n EvalError,\n RangeError,\n ReferenceError,\n SyntaxError,\n TypeError,\n URIError\n }\n\n // Make the object:\n const Base = value.base != null ? bases[value.base] || Error : Error\n const out: Object = new Base()\n\n // Restore the properties:\n const props = unpackData(table, value, path)\n for (const n in props) out[n] = props[n]\n\n return out\n}\n\n/**\n * Restores a value that has been sent over the wire.\n */\nfunction unpackItem (\n table: ObjectTable,\n map: DataMap,\n raw: any,\n path: string\n): any {\n switch (map) {\n case '':\n return raw\n\n case '?':\n const type = typeof raw === 'string' ? raw : '?'\n throw new TypeError(`Unsupported value of type ${type} at ${path}`)\n\n case 'd':\n return new Date(raw)\n\n case 'e':\n if (typeof raw !== 'object' || raw === null) {\n throw new TypeError(`Expecting an error description at ${path}`)\n }\n return unpackError(table, raw, path)\n\n case 'o':\n if (raw === null) {\n throw new TypeError(`Closed bridge object at ${path}`)\n }\n if (typeof raw !== 'number') {\n throw new TypeError(`Expecting a packedId at ${path}`)\n }\n const o = table.getObject(-raw)\n if (o == null) throw new RangeError(`Invalid packedId ${raw} at ${path}`)\n return o\n\n case 's':\n if (typeof raw !== 'string') {\n throw new TypeError(`Expecting a shareId at ${path}`)\n }\n const s = sharedData[raw]\n if (s == null) throw new RangeError(`Invalid shareId '${raw}' at ${path}`)\n return s\n\n case 'u':\n return void 0\n\n case 'u8':\n if (typeof raw !== 'string') {\n throw new TypeError(`Expecting a base64 string at ${path}`)\n }\n return base64.parse(raw)\n\n default:\n if (typeof map !== 'object' || map === null) {\n throw new TypeError(`Invalid type information ${map} at ${path}`)\n }\n if (typeof raw !== 'object' || raw === null) {\n throw new TypeError(`Expecting an array or object at ${path}`)\n }\n\n // Arrays:\n if (Array.isArray(map)) {\n if (!Array.isArray(raw)) {\n throw new TypeError(`Expecting an array at ${path}`)\n }\n const out = []\n for (let i = 0; i < map.length; ++i) {\n out[i] = unpackItem(table, map[i], raw[i], `${path}[${i}]`)\n }\n return out\n }\n\n // Objects:\n const out = {}\n for (const n in raw) {\n out[n] =\n n in map ? unpackItem(table, map[n], raw[n], `${path}.${n}`) : raw[n]\n }\n return out\n }\n}\n","// @flow\n/**\n * @file\n * Functions for managing updates, events, and object lifetime.\n */\n\nimport { getInstanceMagic } from './magic.js'\n\n/**\n * Undoes the effect of `on`.\n */\nexport type CallbackRemover = () => mixed\n\n/**\n * Signature of the `on` method.\n */\nexport type Subscriber<Events: {} = {}> = <Name: $Keys<Events>>(\n name: Name,\n f: (v: $ElementType<Events, Name>) => mixed\n) => CallbackRemover\n\n// No user-supplied value will ever be identical to this.\nexport const dirtyValue = {}\n\n/**\n * Subscribes to an event on a bridgeable object.\n */\nexport function addListener (\n o: Object,\n name: string,\n f: Function\n): CallbackRemover {\n const { closed, listeners } = getInstanceMagic(o)\n\n if (closed) return () => {}\n if (listeners[name] == null) listeners[name] = [f]\n else listeners[name].push(f)\n\n return function unsubscribe () {\n listeners[name] = listeners[name].filter(i => i !== f)\n }\n}\n\n/**\n * Subscribes to property changes on a bridgeable object.\n */\nexport function addWatcher (\n o: Object,\n name: string,\n f: Function\n): CallbackRemover {\n const { closed, watchers } = getInstanceMagic(o)\n\n // Don't catch access errors, since we want the user to see them:\n const data = o[name]\n\n if (closed) return () => {}\n if (watchers[name] == null) watchers[name] = { data, fs: [f] }\n else watchers[name].fs.push(f)\n\n return function unsubscribe () {\n watchers[name].fs = watchers[name].fs.filter(i => i !== f)\n }\n}\n\n/**\n * Destroys a proxy.\n * The remote client will completely forget about this object,\n * and accessing it will become an error.\n */\nexport function close (o: Object): mixed {\n const magic = getInstanceMagic(o)\n\n // Call local callbacks:\n const listeners = magic.listeners['close']\n if (listeners != null) {\n for (const f of listeners) {\n callCallback(o, f, void 0, true)\n }\n }\n\n magic.closed = true\n for (const bridge of magic.bridges) {\n bridge.emitClose(magic.localId)\n }\n magic.bridges = []\n magic.listeners = {}\n magic.watchers = {}\n}\n\n/**\n * Emits an event on a bridgeable object.\n */\nexport function emit (o: Object, name: string, payload: mixed): mixed {\n const magic = getInstanceMagic(o)\n if (magic.closed) throw new Error('Cannot emit event on closed object')\n\n // Schedule outgoing event messages:\n for (const bridge of magic.bridges) {\n bridge.emitEvent(magic.localId, name, payload)\n }\n\n // Call local callbacks:\n const listeners = magic.listeners[name]\n if (listeners != null) {\n for (const f of listeners) {\n callCallback(o, f, payload, name !== 'error')\n }\n }\n}\n\n/**\n * Marks an object as having changes. The proxy server will send an update.\n */\nexport function update<T: {}> (o: T, name?: $Keys<T>): mixed {\n const magic = getInstanceMagic(o)\n if (magic.closed) throw new Error('Cannot update closed object')\n\n for (const bridge of magic.bridges) {\n bridge.markDirty(magic.localId, name)\n }\n\n // Blow away the cache if we have a name:\n if (name != null && magic.watchers[name] != null) {\n magic.watchers[name].data = dirtyValue\n }\n\n // Call watcher callbacks:\n for (const n in magic.watchers) {\n const cache = magic.watchers[n]\n try {\n const data = o[n]\n if (data !== cache.data) {\n cache.data = data\n for (const f of cache.fs) callCallback(o, f, cache.data, true)\n }\n } catch (e) {}\n }\n}\n\n/**\n * Calls a user-supplied callback function with error checking.\n */\nexport function callCallback (\n o: Object,\n f: Function,\n payload: mixed,\n emitError: boolean\n) {\n try {\n const out = f(payload)\n\n // If the function returns a promise, emit an error if it rejects:\n if (emitError && out != null && typeof out.then === 'function') {\n out.then(void 0, e => emit(o, 'error', e))\n }\n } catch (e) {\n if (emitError) emit(o, 'error', e)\n }\n}\n","// @flow\n/**\n * @file\n * Routines for breaking bridgeable objects into messages,\n * and then restoring those messages into proxies on the other side.\n */\n\nimport { packData, packThrow, unpackData } from './data.js'\nimport {\n MAGIC_KEY,\n type ProxyMagic,\n getInstanceMagic,\n makeProxyMagic\n} from './magic.js'\nimport type { CreateMessage, PackedProps } from './protocol.js'\nimport type { BridgeState } from './state.js'\n\nexport type ValueCache = { [name: string]: mixed }\n\n// No user-supplied value will ever be identical to this.\nexport const dirtyValue = {}\n\n/**\n * Examines a bridgeable object and prepares it for sending of the wire.\n * Returns a creation method an the initial value cache.\n */\nexport function packObject (\n state: BridgeState,\n o: Object\n): {\n cache: ValueCache,\n create: CreateMessage\n} {\n // Iterate the prototype chain, looking for property names:\n const allNames: { [name: string]: true } = {}\n const end = Object.prototype\n for (let p = o; p !== end && p != null; p = Object.getPrototypeOf(p)) {\n for (const name of Object.getOwnPropertyNames(p)) {\n if (name !== MAGIC_KEY && !/^_/.test(name) && name !== 'constructor') {\n allNames[name] = true\n }\n }\n }\n\n // Iterate over the object's properties and add their names to\n // the method list or the value cache.\n const cache: ValueCache = {}\n const methods: Array<string> = []\n const props: PackedProps = {}\n for (const n in allNames) {\n try {\n const data = o[n]\n if (\n typeof data === 'function' &&\n (data[MAGIC_KEY] == null || data[MAGIC_KEY].shareId == null)\n ) {\n methods.push(n)\n } else {\n cache[n] = data\n props[n] = packData(state, data)\n }\n } catch (e) {\n cache[n] = dirtyValue\n props[n] = packThrow(state, e)\n }\n }\n\n const { localId } = getInstanceMagic(o)\n const create: CreateMessage = { localId, methods, props }\n return { cache, create }\n}\n\n/**\n * Checks an object for changes.\n * Updates the cache, and returns an object with the necessary changes.\n */\nexport function diffObject (\n state: BridgeState,\n o: Object,\n cache: ValueCache\n): { dirty: boolean, props: PackedProps } {\n let dirty = false\n const props: PackedProps = {}\n\n for (const n in cache) {\n try {\n const value = o[n]\n if (value !== cache[n]) {\n dirty = true\n props[n] = packData(state, value)\n cache[n] = value\n }\n } catch (e) {\n props[n] = packThrow(state, e)\n cache[n] = dirtyValue\n }\n }\n\n return { dirty, props }\n}\n\n/**\n * Creates an object proxy.\n * The object will have the same values and methods as the original,\n * but will send everything over the bridge.\n */\nexport function makeProxy (state: BridgeState, create: CreateMessage): Object {\n const props = {}\n\n // Make the magic property descriptor:\n const magic = makeProxyMagic(create.localId)\n props[MAGIC_KEY] = { value: magic }\n\n // Add the getters:\n for (const n in create.props) {\n props[n] = { enumerable: true, get: makeProxyGetter(magic, n) }\n }\n\n // Add the methods:\n for (const n of create.methods) {\n props[n] = { value: makeProxyMethod(state, magic, n) }\n }\n\n // Make the object:\n return Object.create(Object.prototype, props)\n}\n\n/**\n * Unpacks a proxy's properties into the magic storage area.\n */\nexport function updateObjectProps (\n state: BridgeState,\n o: Object,\n props: PackedProps\n): mixed {\n const magic: ProxyMagic = o[MAGIC_KEY]\n\n for (const n in props) {\n try {\n magic.props[n] = unpackData(state, props[n], n)\n magic.errors[n] = false\n } catch (e) {\n magic.props[n] = e\n magic.errors[n] = true\n }\n }\n}\n\nfunction makeProxyGetter (magic: ProxyMagic, name: string) {\n return function get () {\n if (magic.errors[name]) throw magic.props[name]\n return magic.props[name]\n }\n}\n\nfunction makeProxyMethod (state: BridgeState, magic: ProxyMagic, name: string) {\n return function method (...args) {\n if (magic.closed) {\n return Promise.reject(\n new TypeError(`Cannot call method '${name}' of closed proxy`)\n )\n }\n return state.emitCall(magic.remoteId, name, args)\n }\n}\n","// @flow\n\nimport type { BridgeOptions, SendMessage } from './bridge.js'\nimport { type ObjectTable, packData, packThrow, unpackData } from './data.js'\nimport { bridgifyClass, getInstanceMagic } from './magic.js'\nimport { close, emit, update } from './manage.js'\nimport {\n type ValueCache,\n diffObject,\n dirtyValue,\n makeProxy,\n packObject,\n updateObjectProps\n} from './objects.js'\nimport type {\n CallMessage,\n ChangeMessage,\n CreateMessage,\n EventMessage,\n Message,\n ReturnMessage\n} from './protocol.js'\n\nexport class BridgeState implements ObjectTable {\n // Objects:\n +proxies: { [objectId: number]: Object }\n +objects: { [localId: number]: Object }\n +caches: { [localId: number]: ValueCache }\n\n // Outgoing method calls:\n nextCallId: number\n pendingCalls: {\n [callId: number]: { name: string, resolve: Function, reject: Function }\n }\n\n // Pending message:\n dirty: { [localId: number]: { cache: ValueCache, object: Object } }\n message: Message\n\n // Update scheduling:\n closed: boolean\n +throttleMs: number\n lastUpdate: number\n sendPending: boolean\n +sendMessage: SendMessage\n\n constructor (opts: BridgeOptions) {\n const { sendMessage, throttleMs = 0 } = opts\n\n // Objects:\n this.proxies = {}\n this.objects = {}\n this.caches = {}\n\n // Outgoing method calls:\n this.nextCallId = 0\n this.pendingCalls = {}\n\n // Pending message:\n this.dirty = {}\n this.message = {}\n\n // Update scheduling:\n this.throttleMs = throttleMs\n this.lastUpdate = 0\n this.sendPending = false\n this.sendMessage = sendMessage\n }\n\n /**\n * Close the bridge, so it will no longer send messages.\n * This also closes all proxies created by the bridge and rejects\n * all pending calls.\n */\n close (error: Error) {\n for (const callId in this.pendingCalls) {\n const call = this.pendingCalls[Number(callId)]\n call.reject(error)\n }\n for (const objectId in this.proxies) {\n close(this.proxies[Number(objectId)])\n }\n this.closed = true\n }\n\n /**\n * Grabs an object by its proxy id.\n */\n getObject (packedId: number): Object | void {\n return packedId < 0 ? this.proxies[-packedId] : this.objects[packedId]\n }\n\n /**\n * Returns an object's id relative to this bridge.\n * The id is positive for objects created on this side of the bridge,\n * and negative for proxy objects reflecting things on the other side.\n */\n getPackedId (o: Object): number | null {\n const magic = getInstanceMagic(o)\n if (magic.closed) return null\n if (magic.remoteId != null && this.proxies[magic.remoteId] != null) {\n return -magic.remoteId\n }\n if (this.objects[magic.localId] == null) {\n // Add unknown objects to the bridge:\n this.objects[magic.localId] = o\n\n const { cache, create } = packObject(this, o)\n this.caches[magic.localId] = cache\n magic.bridges.push(this)\n this.emitCreate(create, o)\n }\n return magic.localId\n }\n\n /**\n * Marks an object as needing changes.\n */\n markDirty (localId: number, name?: string) {\n const cache = this.caches[localId]\n if (name != null && name in cache) cache[name] = dirtyValue\n\n this.dirty[localId] = { cache, object: this.objects[localId] }\n this.wakeup()\n }\n\n /**\n * Marks an object as being deleted.\n */\n emitClose (localId: number) {\n delete this.objects[localId]\n delete this.caches[localId]\n if (this.message.closed == null) this.message.closed = []\n this.message.closed.push(localId)\n this.wakeup()\n }\n\n /**\n * Attaches an object to this bridge, sending a creation message.\n */\n emitCreate (create: CreateMessage, o: Object) {\n if (this.message.created == null) this.message.created = []\n this.message.created.push(create)\n // this.wakeup() not needed, since this is part of data packing.\n }\n\n /**\n * Enqueues a proxy call message.\n */\n emitCall (remoteId: number, name: string, args: mixed): Promise<mixed> {\n const callId = this.nextCallId++\n const message: CallMessage = {\n callId,\n remoteId,\n name,\n ...packData(this, args)\n }\n if (this.message.calls == null) this.message.calls = []\n this.message.calls.push(message)\n this.wakeup()\n\n return new Promise((resolve, reject) => {\n this.pendingCalls[callId] = { name, resolve, reject }\n })\n }\n\n /**\n * Enqueues an event message.\n */\n emitEvent (localId: number, name: string, payload: mixed) {\n const message: EventMessage = {\n localId,\n name,\n ...packData(this, payload)\n }\n if (this.message.events == null) this.message.events = []\n this.message.events.push(message)\n this.wakeup()\n }\n\n /**\n * Enqueues a function return message.\n */\n emitReturn (callId: number, fail: boolean, value: mixed) {\n const message: ReturnMessage = {\n callId,\n ...(fail ? packThrow(this, value) : packData(this, value))\n }\n if (this.message.returns == null) this.message.returns = []\n this.message.returns.push(message)\n this.wakeup()\n }\n\n /**\n * Handles an incoming message,\n * updating state and triggering side-effects as needed.\n */\n handleMessage (message: Message) {\n // ----------------------------------------\n // Phase 1: Get our proxies up to date.\n // ----------------------------------------\n\n // Handle newly-created objects:\n if (message.created) {\n // Pass 1: Create proxies for the new objects:\n for (const create of message.created) {\n this.proxies[create.localId] = makeProxy(this, create)\n }\n\n // Pass 2: Fill in the values:\n for (const create of message.created) {\n updateObjectProps(this, this.proxies[create.localId], create.props)\n }\n }\n\n // Handle updated objects:\n if (message.changed) {\n // Pass 1: Update all the proxies:\n for (const change of message.changed) {\n const { localId, props } = change\n const o = this.proxies[localId]\n if (o == null) {\n throw new RangeError(`Invalid localId ${localId}`)\n }\n updateObjectProps(this, o, props)\n }\n\n // Pass 2: Fire the callbacks:\n for (const change of message.changed) {\n update(this.proxies[change.localId])\n }\n }\n\n // ----------------------------------------\n // Phase 2: Handle events & method calls\n // ----------------------------------------\n\n // Handle events:\n if (message.events) {\n for (const event of message.events) {\n const { localId, name } = event\n const o = localId === 0 ? this : this.proxies[localId]\n if (o == null) continue\n try {\n emit(o, name, unpackData(this, event, name))\n } catch (e) {\n emit(o, 'error', e) // Payload unpacking problem\n }\n }\n }\n\n // Handle method calls:\n if (message.calls) {\n for (const call of message.calls) {\n const { callId, remoteId, name } = call\n\n try {\n const o = this.objects[remoteId]\n if (o == null) {\n throw new TypeError(\n `Cannot call method '${name}' of closed proxy (remote)`\n )\n }\n if (typeof o[name] !== 'function') {\n throw new TypeError(`'${name}' is not a function`)\n }\n const args = unpackData(this, call, `${name}.arguments`)\n Promise.resolve(o[name].apply(o, args)).then(\n value => this.emitReturn(callId, false, value),\n e => this.emitReturn(callId, true, e)\n )\n } catch (e) {\n this.emitReturn(callId, true, e)\n }\n }\n }\n\n // Handle method returns:\n if (message.returns) {\n for (const ret of message.returns) {\n const { callId } = ret\n const pendingCall = this.pendingCalls[callId]\n if (pendingCall == null) {\n throw new RangeError(`Invalid callId ${callId}`)\n }\n try {\n pendingCall.resolve(\n unpackData(this, ret, `${pendingCall.name}.return`)\n )\n } catch (e) {\n pendingCall.reject(e)\n } finally {\n delete this.pendingCalls[callId]\n }\n }\n }\n\n // ----------------------------------------\n // Phase 3: Clean up closed objects\n // ----------------------------------------\n\n if (message.closed) {\n for (const localId of message.closed) {\n const o = this.proxies[localId]\n if (o == null) return\n delete this.proxies[localId]\n close(o)\n }\n }\n }\n\n /**\n * Sends the current message.\n */\n sendNow () {\n if (this.closed) return\n\n // Build change messages:\n for (const id in this.dirty) {\n const localId = Number(id)\n const { object, cache } = this.dirty[localId]\n const { dirty, props } = diffObject(this, object, cache)\n if (dirty) {\n const message: ChangeMessage = { localId, props }\n if (this.message.changed == null) this.message.changed = []\n this.message.changed.push(message)\n }\n }\n\n const message = this.message\n this.dirty = {}\n this.message = {}\n this.sendMessage(message)\n }\n\n /**\n * Something has changed, so prepare to send the pending message:\n */\n wakeup () {\n if (this.sendPending) return\n\n this.sendPending = true\n const task = () => {\n this.sendPending = false\n this.lastUpdate = Date.now()\n this.sendNow()\n }\n\n // We really do want `setTimeout` here, even if the delay is 0,\n // since promises and other micro tasks should fire first.\n const delay = this.lastUpdate + this.throttleMs - Date.now()\n setTimeout(task, delay < 0 ? 0 : delay)\n }\n}\n\nbridgifyClass(BridgeState)\n","// @flow\n\nimport { packData, unpackData } from './data.js'\nimport { addListener } from './manage.js'\nimport { type Message } from './protocol.js'\nimport { BridgeState } from './state.js'\n\n/**\n * The bridge sends messages using this function.\n */\nexport type SendMessage = (message: Object) => mixed\n\n/**\n * Options used to create a new bridge.\n */\nexport type BridgeOptions = {\n sendMessage: SendMessage,\n throttleMs?: number\n}\n\n/**\n * Options used to create a new local bridge.\n */\nexport type LocalBridgeOptions = {\n cloneMessage?: (x: Object) => Object,\n throttleMs?: number\n}\n\n/**\n * An object bridge.\n */\nexport class Bridge {\n +_state: BridgeState\n +_rootPromise: Promise<Object>\n\n constructor (opts: BridgeOptions) {\n this._state = new BridgeState(opts)\n this._rootPromise = new Promise(resolve =>\n addListener(this._state, 'root', resolve)\n )\n }\n\n handleMessage (message: Message): mixed {\n this._state.handleMessage(message)\n }\n\n getRoot () {\n return this._rootPromise\n }\n\n sendRoot (root: Object) {\n this._state.emitEvent(0, 'root', root)\n }\n\n close (error: Error) {\n this._state.close(error)\n }\n}\n\n/**\n * Bridges a single object locally. This is great for unit tests,\n * where you want to verify that your API works correctly over a bridge,\n * but don't want to actually spawn a separate process.\n */\nexport function makeLocalBridge<T> (o: T, opts: LocalBridgeOptions = {}): T {\n function nopClone (m: Object): Object {\n return m\n }\n const { cloneMessage = nopClone, throttleMs } = opts\n\n const serverState = new BridgeState({\n sendMessage (message) {\n clientState.handleMessage(cloneMessage(message))\n },\n throttleMs\n })\n const clientState = new BridgeState({\n sendMessage (message) {\n serverState.handleMessage(cloneMessage(message))\n },\n throttleMs\n })\n\n const data = cloneMessage(packData(serverState, o))\n serverState.sendNow()\n return unpackData(clientState, cloneMessage(data), 'root')\n}\n","// @flow\n\nimport { bridgifyClass, shareData } from './magic.js'\nimport type { Subscriber } from './manage.js'\nimport { addListener, addWatcher, close, emit, update } from './manage.js'\n\n/**\n * The `on` function,\n * but packaged as a method and ready to be placed on an object.\n */\nexport const onMethod: Function = function on (name, f) {\n return addListener(this, name, f)\n}\n\n/**\n * The `watch` function,\n * but packaged as a method and ready to be placed on an object.\n */\nexport const watchMethod: Function = function watch (name, f) {\n return addWatcher(this, name, f)\n}\n\nshareData({ onMethod, watchMethod })\n\n/**\n * The base class for all bridgeable API's. Provides callback capability.\n */\nexport class Bridgeable<Props: {} = {}, Events: {} = {}> {\n +on: Subscriber<Events>\n +watch: Subscriber<Props>\n\n _close () {\n close(this)\n }\n\n _emit<Name: $Keys<Events>> (\n name: Name,\n payload: $ElementType<Events, Name>\n ): mixed {\n return emit(this, name, payload)\n }\n\n _update (name?: $Keys<Props>) {\n update(this, name)\n }\n}\n\n// Put the shared methods onto the prototype:\nconst hack: any = Bridgeable.prototype\nhack.on = onMethod\nhack.watch = watchMethod\n\nbridgifyClass(Bridgeable)\n"],"names":["MAGIC_KEY","nextLocalId","sharedData","addMagic","o","magic","Object","prototype","hasOwnProperty","call","defineProperty","value","bridgifyClass","Class","bridgifyObject","localId","bridges","listeners","watchers","getInstanceMagic","TypeError","makeProxyMagic","remoteId","errors","props","shareData","table","namespace","getOwnPropertyNames","n","shareId","Error","packData","data","map","mapData","raw","packItem","packThrow","throw","unpackData","path","out","unpackItem","Date","Uint8Array","Array","isArray","i","length","j","packError","message","stack","base","EvalError","RangeError","ReferenceError","SyntaxError","URIError","toISOString","getPackedId","base64","stringify","unpackError","bases","Base","type","getObject","s","parse","dirtyValue","addListener","name","f","closed","push","unsubscribe","filter","addWatcher","fs","close","callCallback","bridge","emitClose","emit","payload","emitEvent","update","markDirty","cache","e","emitError","then","packObject","state","allNames","end","p","getPrototypeOf","test","methods","create","diffObject","dirty","makeProxy","enumerable","get","makeProxyGetter","makeProxyMethod","updateObjectProps","method","Promise","reject","args","emitCall","BridgeState","opts","sendMessage","throttleMs","proxies","objects","caches","nextCallId","pendingCalls","lastUpdate","sendPending","error","callId","Number","objectId","packedId","emitCreate","object","wakeup","created","calls","resolve","events","emitReturn","fail","returns","handleMessage","changed","change","event","apply","ret","pendingCall","sendNow","id","task","now","delay","setTimeout","Bridge","_state","_rootPromise","getRoot","sendRoot","root","makeLocalBridge","nopClone","m","cloneMessage","serverState","clientState","onMethod","on","watchMethod","watch","Bridgeable","_close","_emit","_update","hack"],"mappings":"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"} | ||
| {"version":3,"file":"yaob.js","sources":["../src/magic.js","../src/data.js","../src/manage.js","../src/objects.js","../src/state.js","../src/bridge.js","../src/bridgeable.js"],"sourcesContent":["// @flow\n/**\n * @file\n * Bridgeable objects have a special \"magic\" property.\n * This file contains routines for working with these magic properties.\n */\n\nimport type { BridgeState } from './state.js'\n\n// An object is bridgeable if it has this key:\nexport const MAGIC_KEY = '_yaob'\n\n/**\n * Magic data used to mark classes as bridgeable.\n */\nexport type ClassMagic = {}\n\n/**\n * Magic data shared by all object instances.\n */\ntype ObjectMagic = {\n // The object id on this side of the bridge:\n +localId: number,\n\n // The object is no longer bridgeable when set:\n closed?: true,\n\n // Bridges subscribed to this object:\n bridges: Array<BridgeState>,\n\n // Event listeners subscribed to this object:\n listeners: { [name: string]: Array<Function> },\n\n // Property watchers subscribed to this object:\n watchers: { [name: string]: { data: mixed, fs: Array<Function> } }\n}\n\n/**\n * Magic data found on user-facing object instances.\n */\nexport type InstanceMagic = ObjectMagic & {\n // This is a proxy object if set. See ProxyMagic for other properties:\n +remoteId?: number\n}\n\n/**\n * Magic data found on proxy objects.\n */\nexport type ProxyMagic = ObjectMagic & {\n +remoteId: number,\n\n // True if the property getter should throw the value:\n +errors: { [name: string]: boolean },\n\n // Values for property getters to return:\n +props: { [name: string]: mixed }\n}\n\n/**\n * Magic data found on shared props.\n */\nexport type SharedMagic = {\n +shareId: string\n}\n\nlet nextLocalId = 1\nexport const sharedData: { [sharedId: string]: mixed } = {}\n\n/**\n * Adds or updates an object's magic data.\n */\nfunction addMagic(o: Object, magic: ClassMagic | ObjectMagic | SharedMagic) {\n if (Object.prototype.hasOwnProperty.call(o, MAGIC_KEY)) {\n Object.assign(o[MAGIC_KEY], magic)\n } else {\n Object.defineProperty(o, MAGIC_KEY, { value: magic })\n }\n}\n\n/**\n * Makes a class bridgeable, including anything derived from it.\n */\nexport function bridgifyClass<Type: Function>(Class: Type): Type {\n const o = Class.prototype\n if (!Object.prototype.hasOwnProperty.call(o, MAGIC_KEY)) {\n const magic: ClassMagic = {}\n addMagic(o, magic)\n }\n return Class\n}\n\n/**\n * Makes an object instance bridgeable.\n */\nexport function bridgifyObject<Type: Object>(o: Type): Type {\n if (\n !Object.prototype.hasOwnProperty.call(o, MAGIC_KEY) ||\n o[MAGIC_KEY].localId == null\n ) {\n const magic: InstanceMagic = {\n localId: nextLocalId++,\n bridges: [],\n listeners: {},\n watchers: {}\n }\n addMagic(o, magic)\n }\n return o\n}\n\n/**\n * Gets the magic data from an object instance.\n */\nexport function getInstanceMagic(o: Object): InstanceMagic {\n // We only want to look at bridgeable objects:\n if (o[MAGIC_KEY] == null) throw new TypeError('Not a bridgeable object')\n\n bridgifyObject(o)\n return o[MAGIC_KEY]\n}\n\n/**\n * Creates a new `ProxyMagic` object.\n */\nexport function makeProxyMagic(remoteId: number): ProxyMagic {\n return {\n // InstanceMagic:\n localId: nextLocalId++,\n bridges: [],\n listeners: {},\n watchers: {},\n // ProxyMagic:\n remoteId,\n errors: {},\n props: {}\n }\n}\n\n/**\n * Adds items to the global shared data table.\n */\nexport function shareData(\n table: { [name: string]: Object },\n namespace?: string\n) {\n if (namespace == null) namespace = ''\n else namespace += '.'\n\n for (const n of Object.getOwnPropertyNames(table)) {\n const shareId = namespace + n\n if (sharedData[shareId] != null) {\n throw new Error(`A shared value named ${shareId} already exists`)\n }\n sharedData[shareId] = table[n]\n addMagic(table[n], { shareId })\n }\n}\n","// @flow\n/**\n * @file\n * Routines for breaking primitive values into messages,\n * and then restoring those messages into values on the other side.\n */\n\nimport { base64 } from 'rfc4648'\n\nimport { MAGIC_KEY, sharedData } from './magic.js'\n\n/**\n * The data-packing system uses this interface to turn\n * bridgeable objects into packedId's and vice-versa.\n */\nexport interface ObjectTable {\n getPackedId(o: Object): number | null;\n getObject(packedId: number): Object | void;\n}\n\n/**\n * The bridge tries to send values as-is, but that isn't always possible.\n * If this data structure is non-null, the strings indicate what changes\n * need to take place to the value. This data structure is recursive,\n * so it matches the \"shape\" of the value.\n */\nexport type DataMap =\n | { +[name: string]: DataMap }\n | Array<DataMap>\n | '' // No change\n | '?' // Invalid value\n | 'd' // Date\n | 'e' // Error\n | 'o' // Object\n | 's' // Shared data\n | 'u' // Undefined\n | 'u8' // Uint8Array\n\n/**\n * A pure JSON value type.\n */\nexport type JsonValue =\n | { +[name: string]: JsonValue }\n | Array<JsonValue>\n | false\n | null\n | number\n | string\n | true\n\n/**\n * A value for sending over the wire.\n * If the `value` needs to be modified on the client side,\n * those modifications are in the `map` structure.\n * If this value was thrown, `throw` will be true.\n */\nexport type PackedData = {\n +map?: DataMap,\n +raw: JsonValue,\n +throw?: true\n}\n\n/**\n * The bridge turns errors into these objects.\n */\nexport type PackedError = {\n +base: string | null\n} & PackedData // Object properties\n\n/**\n * Prepares a value for sending over the wire.\n */\nexport function packData(table: ObjectTable, data: mixed): PackedData {\n try {\n const map = mapData(table, data)\n const raw = packItem(table, map, data)\n return map !== '' ? { map, raw } : { raw }\n } catch (data) {\n return packThrow(table, data)\n }\n}\n\n/**\n * Prepares a thrown value for sending over the wire.\n */\nexport function packThrow(table: ObjectTable, data: mixed): PackedData {\n const map = mapData(table, data)\n const raw = packItem(table, map, data)\n return { map, raw, throw: true }\n}\n\n/**\n * Restores a value that has been sent over the wire.\n */\nexport function unpackData(\n table: ObjectTable,\n data: PackedData,\n path: string\n): any {\n const { map, raw } = data\n const out = map != null ? unpackItem(table, map, raw, path) : raw\n if (data.throw) throw out\n return out\n}\n\n/**\n * Searches through a value, looking for data we can't send directly.\n * Returns a map showing where fixes need to take place.\n */\nfunction mapData(table: ObjectTable, data: mixed): DataMap {\n switch (typeof data) {\n case 'boolean':\n case 'number':\n case 'string':\n return ''\n\n case 'object': {\n if (data === null) return ''\n if (data instanceof Date) return 'd'\n if (data instanceof Error) return 'e'\n if (data instanceof Uint8Array) return 'u8'\n if (data[MAGIC_KEY] != null) {\n return data[MAGIC_KEY].shareId != null ? 's' : 'o'\n }\n\n // Arrays:\n if (Array.isArray(data)) {\n let out: Array<DataMap> | '' = ''\n for (let i = 0; i < data.length; ++i) {\n const map = mapData(table, data[i])\n if (map !== '' && out === '') {\n out = []\n for (let j = 0; j < i; ++j) out[j] = ''\n }\n if (out !== '') out[i] = map\n }\n return out\n }\n\n // Data objects:\n let out: { [name: string]: DataMap } | '' = ''\n for (const n in data) {\n const map = mapData(table, data[n])\n if (map !== '') {\n if (out === '') out = {}\n out[n] = map\n }\n }\n return out\n }\n\n case 'undefined':\n return 'u'\n\n case 'function':\n // $FlowFixMe - MAGIC_KEY isn't a known property here\n return data[MAGIC_KEY] != null && data[MAGIC_KEY].shareId != null\n ? 's'\n : '?'\n\n default:\n return '?'\n }\n}\n\n/**\n * Breaks down an error object into a JSON representation.\n */\nfunction packError(table: ObjectTable, o: Object): PackedError {\n // Grab the properties off the object:\n const { message, stack } = o\n const props = { message, stack, ...o }\n\n let base = null\n if (o instanceof EvalError) base = 'EvalError'\n else if (o instanceof RangeError) base = 'RangeError'\n else if (o instanceof ReferenceError) base = 'ReferenceError'\n else if (o instanceof SyntaxError) base = 'SyntaxError'\n else if (o instanceof TypeError) base = 'TypeError'\n else if (o instanceof URIError) base = 'URIError'\n\n // Build the JSON value:\n return { base, ...packData(table, props) }\n}\n\n/**\n * Copies a value, removing any API objects identified in the types.\n */\nfunction packItem(table: ObjectTable, map: DataMap, data: any): JsonValue {\n switch (map) {\n case '':\n return data\n\n case '?':\n return typeof data\n\n case 'd':\n return data.toISOString()\n\n case 'e':\n return packError(table, data)\n\n case 'o':\n return table.getPackedId(data)\n\n case 's':\n return data[MAGIC_KEY].shareId\n\n case 'u':\n return null\n\n case 'u8':\n return base64.stringify(data)\n\n default: {\n // Arrays:\n if (Array.isArray(map)) {\n const out = []\n for (let i = 0; i < map.length; ++i) {\n out[i] = packItem(table, map[i], data[i])\n }\n return out\n }\n\n // Objects:\n const out = {}\n for (const n in data) {\n out[n] = n in map ? packItem(table, map[n], data[n]) : data[n]\n }\n return out\n }\n }\n}\n\n/**\n * Restores an error object from its JSON representation.\n */\nfunction unpackError(\n table: ObjectTable,\n value: PackedError,\n path: string\n): Error {\n const bases = {\n EvalError,\n RangeError,\n ReferenceError,\n SyntaxError,\n TypeError,\n URIError\n }\n\n // Make the object:\n const Base = value.base != null ? bases[value.base] || Error : Error\n const out: Object = new Base()\n\n // Restore the properties:\n const props = unpackData(table, value, path)\n for (const n in props) out[n] = props[n]\n\n return out\n}\n\n/**\n * Restores a value that has been sent over the wire.\n */\nfunction unpackItem(\n table: ObjectTable,\n map: DataMap,\n raw: any,\n path: string\n): any {\n switch (map) {\n case '':\n return raw\n\n case '?': {\n const type = typeof raw === 'string' ? raw : '?'\n throw new TypeError(`Unsupported value of type ${type} at ${path}`)\n }\n\n case 'd':\n return new Date(raw)\n\n case 'e':\n if (typeof raw !== 'object' || raw === null) {\n throw new TypeError(`Expecting an error description at ${path}`)\n }\n return unpackError(table, raw, path)\n\n case 'o': {\n if (raw === null) {\n throw new TypeError(`Closed bridge object at ${path}`)\n }\n if (typeof raw !== 'number') {\n throw new TypeError(`Expecting a packedId at ${path}`)\n }\n const o = table.getObject(-raw)\n if (o == null) throw new RangeError(`Invalid packedId ${raw} at ${path}`)\n return o\n }\n\n case 's': {\n if (typeof raw !== 'string') {\n throw new TypeError(`Expecting a shareId at ${path}`)\n }\n const s = sharedData[raw]\n if (s == null) throw new RangeError(`Invalid shareId '${raw}' at ${path}`)\n return s\n }\n\n case 'u':\n return undefined\n\n case 'u8':\n if (typeof raw !== 'string') {\n throw new TypeError(`Expecting a base64 string at ${path}`)\n }\n return base64.parse(raw)\n\n default: {\n if (typeof map !== 'object' || map === null) {\n throw new TypeError(`Invalid type information ${map} at ${path}`)\n }\n if (typeof raw !== 'object' || raw === null) {\n throw new TypeError(`Expecting an array or object at ${path}`)\n }\n\n // Arrays:\n if (Array.isArray(map)) {\n if (!Array.isArray(raw)) {\n throw new TypeError(`Expecting an array at ${path}`)\n }\n const out = []\n for (let i = 0; i < map.length; ++i) {\n out[i] = unpackItem(table, map[i], raw[i], `${path}[${i}]`)\n }\n return out\n }\n\n // Objects:\n const out = {}\n for (const n in raw) {\n out[n] =\n n in map ? unpackItem(table, map[n], raw[n], `${path}.${n}`) : raw[n]\n }\n return out\n }\n }\n}\n","// @flow\n/**\n * @file\n * Functions for managing updates, events, and object lifetime.\n */\n\nimport { getInstanceMagic } from './magic.js'\n\n/**\n * Undoes the effect of `on`.\n */\nexport type CallbackRemover = () => mixed\n\n/**\n * Signature of the `on` method.\n */\nexport type Subscriber<Events: {} = {}> = <Name: $Keys<Events>>(\n name: Name,\n f: (v: $ElementType<Events, Name>) => mixed\n) => CallbackRemover\n\n// No user-supplied value will ever be identical to this.\nexport const dirtyValue = {}\n\n/**\n * Subscribes to an event on a bridgeable object.\n */\nexport function addListener(\n o: Object,\n name: string,\n f: Function\n): CallbackRemover {\n const { closed, listeners } = getInstanceMagic(o)\n\n if (closed) return () => {}\n if (listeners[name] == null) listeners[name] = [f]\n else listeners[name].push(f)\n\n return function unsubscribe() {\n listeners[name] = listeners[name].filter(i => i !== f)\n }\n}\n\n/**\n * Subscribes to property changes on a bridgeable object.\n */\nexport function addWatcher(\n o: Object,\n name: string,\n f: Function\n): CallbackRemover {\n const { closed, watchers } = getInstanceMagic(o)\n\n // Don't catch access errors, since we want the user to see them:\n const data = o[name]\n\n if (closed) return () => {}\n if (watchers[name] == null) watchers[name] = { data, fs: [f] }\n else watchers[name].fs.push(f)\n\n return function unsubscribe() {\n watchers[name].fs = watchers[name].fs.filter(i => i !== f)\n }\n}\n\n/**\n * Destroys a proxy.\n * The remote client will completely forget about this object,\n * and accessing it will become an error.\n */\nexport function close(o: Object): mixed {\n const magic = getInstanceMagic(o)\n\n // Call local callbacks:\n const listeners = magic.listeners.close\n if (listeners != null) {\n for (const f of listeners) {\n callCallback(o, f, undefined, true)\n }\n }\n\n magic.closed = true\n for (const bridge of magic.bridges) {\n bridge.emitClose(magic.localId)\n }\n magic.bridges = []\n magic.listeners = {}\n magic.watchers = {}\n}\n\n/**\n * Emits an event on a bridgeable object.\n */\nexport function emit(o: Object, name: string, payload: mixed): mixed {\n const magic = getInstanceMagic(o)\n if (magic.closed) throw new Error('Cannot emit event on closed object')\n\n // Schedule outgoing event messages:\n for (const bridge of magic.bridges) {\n bridge.emitEvent(magic.localId, name, payload)\n }\n\n // Call local callbacks:\n const listeners = magic.listeners[name]\n if (listeners != null) {\n for (const f of listeners) {\n callCallback(o, f, payload, name !== 'error')\n }\n }\n}\n\n/**\n * Marks an object as having changes. The proxy server will send an update.\n */\nexport function update<T: {}>(o: T, name?: $Keys<T>): mixed {\n const magic = getInstanceMagic(o)\n if (magic.closed) throw new Error('Cannot update closed object')\n\n for (const bridge of magic.bridges) {\n bridge.markDirty(magic.localId, name)\n }\n\n // Blow away the cache if we have a name:\n if (name != null && magic.watchers[name] != null) {\n magic.watchers[name].data = dirtyValue\n }\n\n // Call watcher callbacks:\n for (const n in magic.watchers) {\n const cache = magic.watchers[n]\n try {\n const data = o[n]\n if (data !== cache.data) {\n cache.data = data\n for (const f of cache.fs) callCallback(o, f, cache.data, true)\n }\n } catch (e) {}\n }\n}\n\n/**\n * Calls a user-supplied callback function with error checking.\n */\nexport function callCallback(\n o: Object,\n f: Function,\n payload: mixed,\n emitError: boolean\n) {\n try {\n const out = f(payload)\n\n // If the function returns a promise, emit an error if it rejects:\n if (emitError && out != null && typeof out.then === 'function') {\n out.then(undefined, e => emit(o, 'error', e))\n }\n } catch (e) {\n if (emitError) emit(o, 'error', e)\n }\n}\n","// @flow\n/**\n * @file\n * Routines for breaking bridgeable objects into messages,\n * and then restoring those messages into proxies on the other side.\n */\n\nimport { packData, packThrow, unpackData } from './data.js'\nimport {\n type ProxyMagic,\n getInstanceMagic,\n MAGIC_KEY,\n makeProxyMagic\n} from './magic.js'\nimport type { CreateMessage, PackedProps } from './protocol.js'\nimport type { BridgeState } from './state.js'\n\nexport type ValueCache = { [name: string]: mixed }\n\n// No user-supplied value will ever be identical to this.\nexport const dirtyValue = {}\n\n/**\n * Examines a bridgeable object and prepares it for sending of the wire.\n * Returns a creation method an the initial value cache.\n */\nexport function packObject(\n state: BridgeState,\n o: Object\n): {\n cache: ValueCache,\n create: CreateMessage\n} {\n // Iterate the prototype chain, looking for property names:\n const allNames: { [name: string]: true } = {}\n const end = Object.prototype\n for (let p = o; p !== end && p != null; p = Object.getPrototypeOf(p)) {\n for (const name of Object.getOwnPropertyNames(p)) {\n if (name !== MAGIC_KEY && !/^_/.test(name) && name !== 'constructor') {\n allNames[name] = true\n }\n }\n }\n\n // Iterate over the object's properties and add their names to\n // the method list or the value cache.\n const cache: ValueCache = {}\n const methods: Array<string> = []\n const props: PackedProps = {}\n for (const n in allNames) {\n try {\n const data = o[n]\n if (\n typeof data === 'function' &&\n (data[MAGIC_KEY] == null || data[MAGIC_KEY].shareId == null)\n ) {\n methods.push(n)\n } else {\n cache[n] = data\n props[n] = packData(state, data)\n }\n } catch (e) {\n cache[n] = dirtyValue\n props[n] = packThrow(state, e)\n }\n }\n\n const { localId } = getInstanceMagic(o)\n const create: CreateMessage = { localId, methods, props }\n return { cache, create }\n}\n\n/**\n * Checks an object for changes.\n * Updates the cache, and returns an object with the necessary changes.\n */\nexport function diffObject(\n state: BridgeState,\n o: Object,\n cache: ValueCache\n): { dirty: boolean, props: PackedProps } {\n let dirty = false\n const props: PackedProps = {}\n\n for (const n in cache) {\n try {\n const value = o[n]\n if (value !== cache[n]) {\n dirty = true\n props[n] = packData(state, value)\n cache[n] = value\n }\n } catch (e) {\n props[n] = packThrow(state, e)\n cache[n] = dirtyValue\n }\n }\n\n return { dirty, props }\n}\n\n/**\n * Creates an object proxy.\n * The object will have the same values and methods as the original,\n * but will send everything over the bridge.\n */\nexport function makeProxy(state: BridgeState, create: CreateMessage): Object {\n const props = {}\n\n // Make the magic property descriptor:\n const magic = makeProxyMagic(create.localId)\n props[MAGIC_KEY] = { value: magic }\n\n // Add the getters:\n for (const n in create.props) {\n props[n] = { enumerable: true, get: makeProxyGetter(magic, n) }\n }\n\n // Add the methods:\n for (const n of create.methods) {\n props[n] = { value: makeProxyMethod(state, magic, n) }\n }\n\n // Make the object:\n return Object.create(Object.prototype, props)\n}\n\n/**\n * Unpacks a proxy's properties into the magic storage area.\n */\nexport function updateObjectProps(\n state: BridgeState,\n o: Object,\n props: PackedProps\n): mixed {\n const magic: ProxyMagic = o[MAGIC_KEY]\n\n for (const n in props) {\n try {\n magic.props[n] = unpackData(state, props[n], n)\n magic.errors[n] = false\n } catch (e) {\n magic.props[n] = e\n magic.errors[n] = true\n }\n }\n}\n\nfunction makeProxyGetter(magic: ProxyMagic, name: string) {\n return function get() {\n if (magic.errors[name]) throw magic.props[name]\n return magic.props[name]\n }\n}\n\nfunction makeProxyMethod(state: BridgeState, magic: ProxyMagic, name: string) {\n return function method(...args) {\n if (magic.closed) {\n return Promise.reject(\n new TypeError(`Cannot call method '${name}' of closed proxy`)\n )\n }\n return state.emitCall(magic.remoteId, name, args)\n }\n}\n","/* global setTimeout */\n// @flow\n\nimport type { BridgeOptions, SendMessage } from './bridge.js'\nimport { type ObjectTable, packData, packThrow, unpackData } from './data.js'\nimport { bridgifyClass, getInstanceMagic } from './magic.js'\nimport { close, emit, update } from './manage.js'\nimport {\n type ValueCache,\n diffObject,\n dirtyValue,\n makeProxy,\n packObject,\n updateObjectProps\n} from './objects.js'\nimport type {\n CallMessage,\n ChangeMessage,\n CreateMessage,\n EventMessage,\n Message,\n ReturnMessage\n} from './protocol.js'\n\nexport class BridgeState implements ObjectTable {\n // Objects:\n +proxies: { [objectId: number]: Object }\n +objects: { [localId: number]: Object }\n +caches: { [localId: number]: ValueCache }\n\n // Outgoing method calls:\n nextCallId: number\n pendingCalls: {\n [callId: number]: { name: string, resolve: Function, reject: Function }\n }\n\n // Pending message:\n dirty: { [localId: number]: { cache: ValueCache, object: Object } }\n message: Message\n\n // Update scheduling:\n closed: boolean\n +throttleMs: number\n lastUpdate: number\n sendPending: boolean\n +sendMessage: SendMessage\n\n constructor(opts: BridgeOptions) {\n const { sendMessage, throttleMs = 0 } = opts\n\n // Objects:\n this.proxies = {}\n this.objects = {}\n this.caches = {}\n\n // Outgoing method calls:\n this.nextCallId = 0\n this.pendingCalls = {}\n\n // Pending message:\n this.dirty = {}\n this.message = {}\n\n // Update scheduling:\n this.throttleMs = throttleMs\n this.lastUpdate = 0\n this.sendPending = false\n this.sendMessage = sendMessage\n }\n\n /**\n * Close the bridge, so it will no longer send messages.\n * This also closes all proxies created by the bridge and rejects\n * all pending calls.\n */\n close(error: Error) {\n for (const callId in this.pendingCalls) {\n const call = this.pendingCalls[Number(callId)]\n call.reject(error)\n }\n for (const objectId in this.proxies) {\n close(this.proxies[Number(objectId)])\n }\n this.closed = true\n }\n\n /**\n * Grabs an object by its proxy id.\n */\n getObject(packedId: number): Object | void {\n return packedId < 0 ? this.proxies[-packedId] : this.objects[packedId]\n }\n\n /**\n * Returns an object's id relative to this bridge.\n * The id is positive for objects created on this side of the bridge,\n * and negative for proxy objects reflecting things on the other side.\n */\n getPackedId(o: Object): number | null {\n const magic = getInstanceMagic(o)\n if (magic.closed) return null\n if (magic.remoteId != null && this.proxies[magic.remoteId] != null) {\n return -magic.remoteId\n }\n if (this.objects[magic.localId] == null) {\n // Add unknown objects to the bridge:\n this.objects[magic.localId] = o\n\n const { cache, create } = packObject(this, o)\n this.caches[magic.localId] = cache\n magic.bridges.push(this)\n this.emitCreate(create, o)\n }\n return magic.localId\n }\n\n /**\n * Marks an object as needing changes.\n */\n markDirty(localId: number, name?: string): void {\n const cache = this.caches[localId]\n if (name != null && name in cache) cache[name] = dirtyValue\n\n this.dirty[localId] = { cache, object: this.objects[localId] }\n this.wakeup()\n }\n\n /**\n * Marks an object as being deleted.\n */\n emitClose(localId: number): void {\n delete this.objects[localId]\n delete this.caches[localId]\n if (this.message.closed == null) this.message.closed = []\n this.message.closed.push(localId)\n this.wakeup()\n }\n\n /**\n * Attaches an object to this bridge, sending a creation message.\n */\n emitCreate(create: CreateMessage, o: Object): void {\n if (this.message.created == null) this.message.created = []\n this.message.created.push(create)\n // this.wakeup() not needed, since this is part of data packing.\n }\n\n /**\n * Enqueues a proxy call message.\n */\n emitCall(remoteId: number, name: string, args: mixed): Promise<mixed> {\n const callId = this.nextCallId++\n const message: CallMessage = {\n callId,\n remoteId,\n name,\n ...packData(this, args)\n }\n if (this.message.calls == null) this.message.calls = []\n this.message.calls.push(message)\n this.wakeup()\n\n return new Promise((resolve, reject) => {\n this.pendingCalls[callId] = { name, resolve, reject }\n })\n }\n\n /**\n * Enqueues an event message.\n */\n emitEvent(localId: number, name: string, payload: mixed): void {\n const message: EventMessage = {\n localId,\n name,\n ...packData(this, payload)\n }\n if (this.message.events == null) this.message.events = []\n this.message.events.push(message)\n this.wakeup()\n }\n\n /**\n * Enqueues a function return message.\n */\n emitReturn(callId: number, fail: boolean, value: mixed): void {\n const message: ReturnMessage = {\n callId,\n ...(fail ? packThrow(this, value) : packData(this, value))\n }\n if (this.message.returns == null) this.message.returns = []\n this.message.returns.push(message)\n this.wakeup()\n }\n\n /**\n * Handles an incoming message,\n * updating state and triggering side-effects as needed.\n */\n handleMessage(message: Message): void {\n // ----------------------------------------\n // Phase 1: Get our proxies up to date.\n // ----------------------------------------\n\n // Handle newly-created objects:\n if (message.created) {\n // Pass 1: Create proxies for the new objects:\n for (const create of message.created) {\n this.proxies[create.localId] = makeProxy(this, create)\n }\n\n // Pass 2: Fill in the values:\n for (const create of message.created) {\n updateObjectProps(this, this.proxies[create.localId], create.props)\n }\n }\n\n // Handle updated objects:\n if (message.changed) {\n // Pass 1: Update all the proxies:\n for (const change of message.changed) {\n const { localId, props } = change\n const o = this.proxies[localId]\n if (o == null) {\n throw new RangeError(`Invalid localId ${localId}`)\n }\n updateObjectProps(this, o, props)\n }\n\n // Pass 2: Fire the callbacks:\n for (const change of message.changed) {\n update(this.proxies[change.localId])\n }\n }\n\n // ----------------------------------------\n // Phase 2: Handle events & method calls\n // ----------------------------------------\n\n // Handle events:\n if (message.events) {\n for (const event of message.events) {\n const { localId, name } = event\n const o = localId === 0 ? this : this.proxies[localId]\n if (o == null) continue\n try {\n emit(o, name, unpackData(this, event, name))\n } catch (e) {\n emit(o, 'error', e) // Payload unpacking problem\n }\n }\n }\n\n // Handle method calls:\n if (message.calls) {\n for (const call of message.calls) {\n const { callId, remoteId, name } = call\n\n try {\n const o = this.objects[remoteId]\n if (o == null) {\n throw new TypeError(\n `Cannot call method '${name}' of closed proxy (remote)`\n )\n }\n if (typeof o[name] !== 'function') {\n throw new TypeError(`'${name}' is not a function`)\n }\n const args = unpackData(this, call, `${name}.arguments`)\n Promise.resolve(o[name].apply(o, args)).then(\n value => this.emitReturn(callId, false, value),\n e => this.emitReturn(callId, true, e)\n )\n } catch (e) {\n this.emitReturn(callId, true, e)\n }\n }\n }\n\n // Handle method returns:\n if (message.returns) {\n for (const ret of message.returns) {\n const { callId } = ret\n const pendingCall = this.pendingCalls[callId]\n if (pendingCall == null) {\n throw new RangeError(`Invalid callId ${callId}`)\n }\n try {\n pendingCall.resolve(\n unpackData(this, ret, `${pendingCall.name}.return`)\n )\n } catch (e) {\n pendingCall.reject(e)\n } finally {\n delete this.pendingCalls[callId]\n }\n }\n }\n\n // ----------------------------------------\n // Phase 3: Clean up closed objects\n // ----------------------------------------\n\n if (message.closed) {\n for (const localId of message.closed) {\n const o = this.proxies[localId]\n if (o == null) return\n delete this.proxies[localId]\n close(o)\n }\n }\n }\n\n /**\n * Sends the current message.\n */\n sendNow(): void {\n if (this.closed) return\n\n // Build change messages:\n for (const id in this.dirty) {\n const localId = Number(id)\n const { object, cache } = this.dirty[localId]\n const { dirty, props } = diffObject(this, object, cache)\n if (dirty) {\n const message: ChangeMessage = { localId, props }\n if (this.message.changed == null) this.message.changed = []\n this.message.changed.push(message)\n }\n }\n\n const message = this.message\n this.dirty = {}\n this.message = {}\n this.sendMessage(message)\n }\n\n /**\n * Something has changed, so prepare to send the pending message:\n */\n wakeup(): void {\n if (this.sendPending) return\n\n this.sendPending = true\n const task = () => {\n this.sendPending = false\n this.lastUpdate = Date.now()\n this.sendNow()\n }\n\n // We really do want `setTimeout` here, even if the delay is 0,\n // since promises and other micro tasks should fire first.\n const delay = this.lastUpdate + this.throttleMs - Date.now()\n setTimeout(task, delay < 0 ? 0 : delay)\n }\n}\n\nbridgifyClass(BridgeState)\n","// @flow\n\nimport { packData, unpackData } from './data.js'\nimport { addListener } from './manage.js'\nimport { type Message } from './protocol.js'\nimport { BridgeState } from './state.js'\n\n/**\n * The bridge sends messages using this function.\n */\nexport type SendMessage = (message: Object) => mixed\n\n/**\n * Options used to create a new bridge.\n */\nexport type BridgeOptions = {\n sendMessage: SendMessage,\n throttleMs?: number\n}\n\n/**\n * Options used to create a new local bridge.\n */\nexport type LocalBridgeOptions = {\n cloneMessage?: (x: Object) => Object,\n throttleMs?: number\n}\n\n/**\n * An object bridge.\n */\nexport class Bridge {\n +_state: BridgeState\n +_rootPromise: Promise<Object>\n\n constructor(opts: BridgeOptions) {\n this._state = new BridgeState(opts)\n this._rootPromise = new Promise(resolve =>\n addListener(this._state, 'root', resolve)\n )\n }\n\n handleMessage(message: Message): mixed {\n this._state.handleMessage(message)\n }\n\n getRoot() {\n return this._rootPromise\n }\n\n sendRoot(root: Object) {\n this._state.emitEvent(0, 'root', root)\n }\n\n close(error: Error) {\n this._state.close(error)\n }\n}\n\n/**\n * Bridges a single object locally. This is great for unit tests,\n * where you want to verify that your API works correctly over a bridge,\n * but don't want to actually spawn a separate process.\n */\nexport function makeLocalBridge<T>(o: T, opts: LocalBridgeOptions = {}): T {\n function nopClone(m: Object): Object {\n return m\n }\n const { cloneMessage = nopClone, throttleMs } = opts\n\n const serverState = new BridgeState({\n sendMessage(message) {\n clientState.handleMessage(cloneMessage(message))\n },\n throttleMs\n })\n const clientState = new BridgeState({\n sendMessage(message) {\n serverState.handleMessage(cloneMessage(message))\n },\n throttleMs\n })\n\n const data = cloneMessage(packData(serverState, o))\n serverState.sendNow()\n return unpackData(clientState, cloneMessage(data), 'root')\n}\n","// @flow\n\nimport { bridgifyClass, shareData } from './magic.js'\nimport type { Subscriber } from './manage.js'\nimport { addListener, addWatcher, close, emit, update } from './manage.js'\n\n/**\n * The `on` function,\n * but packaged as a method and ready to be placed on an object.\n */\nexport const onMethod: Function = function on(name, f) {\n return addListener(this, name, f)\n}\n\n/**\n * The `watch` function,\n * but packaged as a method and ready to be placed on an object.\n */\nexport const watchMethod: Function = function watch(name, f) {\n return addWatcher(this, name, f)\n}\n\nshareData({ onMethod, watchMethod })\n\n/**\n * The base class for all bridgeable API's. Provides callback capability.\n */\nexport class Bridgeable<Props: {} = {}, Events: {} = {}> {\n +on: Subscriber<Events>\n +watch: Subscriber<Props>\n\n _close() {\n close(this)\n }\n\n _emit<Name: $Keys<Events>>(\n name: Name,\n payload: $ElementType<Events, Name>\n ): mixed {\n return emit(this, name, payload)\n }\n\n _update(name?: $Keys<Props>) {\n update(this, name)\n }\n}\n\n// Put the shared methods onto the prototype:\nconst hack: any = Bridgeable.prototype\nhack.on = onMethod\nhack.watch = watchMethod\n\nbridgifyClass(Bridgeable)\n"],"names":["MAGIC_KEY","nextLocalId","sharedData","addMagic","o","magic","Object","prototype","hasOwnProperty","call","defineProperty","value","bridgifyClass","Class","bridgifyObject","localId","bridges","listeners","watchers","getInstanceMagic","TypeError","makeProxyMagic","remoteId","errors","props","shareData","table","namespace","getOwnPropertyNames","n","shareId","Error","packData","data","map","mapData","raw","packItem","packThrow","unpackData","path","out","unpackItem","Date","Uint8Array","Array","isArray","i","length","j","packError","message","stack","base","EvalError","RangeError","ReferenceError","SyntaxError","URIError","toISOString","getPackedId","base64","stringify","unpackError","bases","Base","type","getObject","s","undefined","parse","dirtyValue","addListener","name","f","closed","push","unsubscribe","filter","addWatcher","fs","close","callCallback","bridge","emitClose","emit","payload","emitEvent","update","markDirty","cache","e","emitError","then","packObject","state","allNames","end","p","getPrototypeOf","test","methods","create","diffObject","dirty","makeProxy","enumerable","get","makeProxyGetter","makeProxyMethod","updateObjectProps","method","Promise","reject","args","emitCall","BridgeState","opts","sendMessage","throttleMs","proxies","objects","caches","nextCallId","pendingCalls","lastUpdate","sendPending","error","callId","Number","objectId","packedId","emitCreate","object","wakeup","created","calls","resolve","events","emitReturn","fail","returns","handleMessage","changed","change","event","apply","ret","pendingCall","sendNow","id","task","now","delay","setTimeout","Bridge","_state","_rootPromise","getRoot","sendRoot","root","makeLocalBridge","nopClone","m","cloneMessage","serverState","clientState","onMethod","on","watchMethod","watch","Bridgeable","_close","_emit","_update","hack"],"mappings":"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"} |
+35
-42
| { | ||
| "name": "yaob", | ||
| "version": "0.3.4", | ||
| "version": "0.3.5", | ||
| "description": "Bridges an object-oriented API across a messaging layer", | ||
@@ -20,8 +20,10 @@ "repository": { | ||
| "module": "lib/yaob.js", | ||
| "types": "src/index.d.ts", | ||
| "scripts": { | ||
| "build": "rimraf lib && rollup -c", | ||
| "build:test": "rollup -c test/rollup.config.js", | ||
| "fix": "npm run lint -- --fix", | ||
| "flow": "flow", | ||
| "format": "import-sort -l --write '*.js' 'src/**/*.js' 'test/**/*.js';prettier-eslint --write '*.js' 'src/**/*.js' 'test/**/*.js'", | ||
| "lint": "eslint '*.js' 'src/**/*.js' 'test/**/*.js'", | ||
| "lint": "eslint --ignore-path .gitignore .", | ||
| "precommit": "lint-staged && flow && npm test && npm run build", | ||
| "prepare": "npm run build", | ||
@@ -31,2 +33,10 @@ "pretest": "npm run build:test", | ||
| }, | ||
| "husky": { | ||
| "hooks": { | ||
| "pre-commit": "npm run precommit" | ||
| } | ||
| }, | ||
| "lint-staged": { | ||
| "*.js": "eslint" | ||
| }, | ||
| "dependencies": { | ||
@@ -40,44 +50,27 @@ "rfc4648": "^1.1.0" | ||
| "@babel/preset-flow": "^7.0.0", | ||
| "babel-eslint": "^8.2.5", | ||
| "@typescript-eslint/eslint-plugin": ">=2.0.0", | ||
| "@typescript-eslint/parser": "^2.0.0", | ||
| "babel-eslint": ">=10.0.0", | ||
| "chai": "^4.1.2", | ||
| "eslint": "^5.0.1", | ||
| "eslint-config-standard": "^11.0.0", | ||
| "eslint-plugin-flowtype": "^2.49.3", | ||
| "eslint-plugin-import": "^2.13.0", | ||
| "eslint-plugin-node": "^6.0.1", | ||
| "eslint-plugin-promise": "^3.8.0", | ||
| "eslint-plugin-standard": "^3.1.0", | ||
| "flow-bin": "^0.76.0", | ||
| "husky": "^1.1.3", | ||
| "import-sort-cli": "^5.0.0", | ||
| "import-sort-parser-babylon": "^5.0.0", | ||
| "import-sort-style-module": "^5.0.0", | ||
| "lint-staged": "^7.2.0", | ||
| "mocha": "^5.2.0", | ||
| "prettier-eslint-cli": "^4.7.1", | ||
| "eslint": ">=6.2.2", | ||
| "eslint-config-standard-kit": ">=0.14.2", | ||
| "eslint-plugin-flowtype": ">=4.3.0", | ||
| "eslint-plugin-import": ">=2.18.0", | ||
| "eslint-plugin-prettier": ">=3.0.0", | ||
| "eslint-plugin-promise": ">=4.2.1", | ||
| "eslint-plugin-simple-import-sort": ">=4.0.0", | ||
| "eslint-plugin-standard": ">=4.0.0", | ||
| "flow-bin": "^0.105.2", | ||
| "husky": ">=3.0.0", | ||
| "lint-staged": ">=9.0.0", | ||
| "mocha": "^6.2.1", | ||
| "prettier": ">=1.0.0", | ||
| "rimraf": "^2.6.2", | ||
| "rollup": "^0.61.2", | ||
| "rollup-plugin-babel": "^4.0.3", | ||
| "rollup-plugin-filesize": "^4.0.1", | ||
| "rollup-plugin-flow-entry": "^0.2.0", | ||
| "source-map-support": "^0.5.6" | ||
| }, | ||
| "husky": { | ||
| "hooks": { | ||
| "pre-commit": "lint-staged && flow && npm test && npm run build" | ||
| } | ||
| }, | ||
| "importSort": { | ||
| ".js, .es": { | ||
| "parser": "babylon", | ||
| "style": "module" | ||
| } | ||
| }, | ||
| "lint-staged": { | ||
| "*.js": [ | ||
| "eslint", | ||
| "import-sort --list-different", | ||
| "prettier-eslint --list-different" | ||
| ] | ||
| "rollup": "^1.0.0", | ||
| "rollup-plugin-babel": "^4.3.3", | ||
| "rollup-plugin-filesize": "^6.2.0", | ||
| "rollup-plugin-flow-entry": "^0.3.3", | ||
| "source-map-support": "^0.5.6", | ||
| "typescript": "^3.7.2" | ||
| } | ||
| } |
+9
-9
@@ -36,3 +36,3 @@ // @flow | ||
| constructor (opts: BridgeOptions) { | ||
| constructor(opts: BridgeOptions) { | ||
| this._state = new BridgeState(opts) | ||
@@ -44,15 +44,15 @@ this._rootPromise = new Promise(resolve => | ||
| handleMessage (message: Message): mixed { | ||
| handleMessage(message: Message): mixed { | ||
| this._state.handleMessage(message) | ||
| } | ||
| getRoot () { | ||
| getRoot() { | ||
| return this._rootPromise | ||
| } | ||
| sendRoot (root: Object) { | ||
| sendRoot(root: Object) { | ||
| this._state.emitEvent(0, 'root', root) | ||
| } | ||
| close (error: Error) { | ||
| close(error: Error) { | ||
| this._state.close(error) | ||
@@ -67,4 +67,4 @@ } | ||
| */ | ||
| export function makeLocalBridge<T> (o: T, opts: LocalBridgeOptions = {}): T { | ||
| function nopClone (m: Object): Object { | ||
| export function makeLocalBridge<T>(o: T, opts: LocalBridgeOptions = {}): T { | ||
| function nopClone(m: Object): Object { | ||
| return m | ||
@@ -75,3 +75,3 @@ } | ||
| const serverState = new BridgeState({ | ||
| sendMessage (message) { | ||
| sendMessage(message) { | ||
| clientState.handleMessage(cloneMessage(message)) | ||
@@ -82,3 +82,3 @@ }, | ||
| const clientState = new BridgeState({ | ||
| sendMessage (message) { | ||
| sendMessage(message) { | ||
| serverState.handleMessage(cloneMessage(message)) | ||
@@ -85,0 +85,0 @@ }, |
@@ -11,3 +11,3 @@ // @flow | ||
| */ | ||
| export const onMethod: Function = function on (name, f) { | ||
| export const onMethod: Function = function on(name, f) { | ||
| return addListener(this, name, f) | ||
@@ -20,3 +20,3 @@ } | ||
| */ | ||
| export const watchMethod: Function = function watch (name, f) { | ||
| export const watchMethod: Function = function watch(name, f) { | ||
| return addWatcher(this, name, f) | ||
@@ -34,7 +34,7 @@ } | ||
| _close () { | ||
| _close() { | ||
| close(this) | ||
| } | ||
| _emit<Name: $Keys<Events>> ( | ||
| _emit<Name: $Keys<Events>>( | ||
| name: Name, | ||
@@ -46,3 +46,3 @@ payload: $ElementType<Events, Name> | ||
| _update (name?: $Keys<Props>) { | ||
| _update(name?: $Keys<Props>) { | ||
| update(this, name) | ||
@@ -49,0 +49,0 @@ } |
+22
-15
@@ -73,3 +73,3 @@ // @flow | ||
| */ | ||
| export function packData (table: ObjectTable, data: mixed): PackedData { | ||
| export function packData(table: ObjectTable, data: mixed): PackedData { | ||
| try { | ||
@@ -87,3 +87,3 @@ const map = mapData(table, data) | ||
| */ | ||
| export function packThrow (table: ObjectTable, data: mixed): PackedData { | ||
| export function packThrow(table: ObjectTable, data: mixed): PackedData { | ||
| const map = mapData(table, data) | ||
@@ -97,3 +97,3 @@ const raw = packItem(table, map, data) | ||
| */ | ||
| export function unpackData ( | ||
| export function unpackData( | ||
| table: ObjectTable, | ||
@@ -113,3 +113,3 @@ data: PackedData, | ||
| */ | ||
| function mapData (table: ObjectTable, data: mixed): DataMap { | ||
| function mapData(table: ObjectTable, data: mixed): DataMap { | ||
| switch (typeof data) { | ||
@@ -121,3 +121,3 @@ case 'boolean': | ||
| case 'object': | ||
| case 'object': { | ||
| if (data === null) return '' | ||
@@ -155,2 +155,3 @@ if (data instanceof Date) return 'd' | ||
| return out | ||
| } | ||
@@ -161,2 +162,3 @@ case 'undefined': | ||
| case 'function': | ||
| // $FlowFixMe - MAGIC_KEY isn't a known property here | ||
| return data[MAGIC_KEY] != null && data[MAGIC_KEY].shareId != null | ||
@@ -174,3 +176,3 @@ ? 's' | ||
| */ | ||
| function packError (table: ObjectTable, o: Object): PackedError { | ||
| function packError(table: ObjectTable, o: Object): PackedError { | ||
| // Grab the properties off the object: | ||
@@ -195,3 +197,3 @@ const { message, stack } = o | ||
| */ | ||
| function packItem (table: ObjectTable, map: DataMap, data: any): JsonValue { | ||
| function packItem(table: ObjectTable, map: DataMap, data: any): JsonValue { | ||
| switch (map) { | ||
@@ -222,3 +224,3 @@ case '': | ||
| default: | ||
| default: { | ||
| // Arrays: | ||
@@ -239,2 +241,3 @@ if (Array.isArray(map)) { | ||
| return out | ||
| } | ||
| } | ||
@@ -246,3 +249,3 @@ } | ||
| */ | ||
| function unpackError ( | ||
| function unpackError( | ||
| table: ObjectTable, | ||
@@ -275,3 +278,3 @@ value: PackedError, | ||
| */ | ||
| function unpackItem ( | ||
| function unpackItem( | ||
| table: ObjectTable, | ||
@@ -286,5 +289,6 @@ map: DataMap, | ||
| case '?': | ||
| case '?': { | ||
| const type = typeof raw === 'string' ? raw : '?' | ||
| throw new TypeError(`Unsupported value of type ${type} at ${path}`) | ||
| } | ||
@@ -300,3 +304,3 @@ case 'd': | ||
| case 'o': | ||
| case 'o': { | ||
| if (raw === null) { | ||
@@ -311,4 +315,5 @@ throw new TypeError(`Closed bridge object at ${path}`) | ||
| return o | ||
| } | ||
| case 's': | ||
| case 's': { | ||
| if (typeof raw !== 'string') { | ||
@@ -320,5 +325,6 @@ throw new TypeError(`Expecting a shareId at ${path}`) | ||
| return s | ||
| } | ||
| case 'u': | ||
| return void 0 | ||
| return undefined | ||
@@ -331,3 +337,3 @@ case 'u8': | ||
| default: | ||
| default: { | ||
| if (typeof map !== 'object' || map === null) { | ||
@@ -359,3 +365,4 @@ throw new TypeError(`Invalid type information ${map} at ${path}`) | ||
| return out | ||
| } | ||
| } | ||
| } |
+1
-1
| // @flow | ||
| import { Bridge, makeLocalBridge } from './bridge.js' | ||
| import type { | ||
@@ -9,2 +8,3 @@ BridgeOptions, | ||
| } from './bridge.js' | ||
| import { Bridge, makeLocalBridge } from './bridge.js' | ||
| import { Bridgeable, onMethod, watchMethod } from './bridgeable.js' | ||
@@ -11,0 +11,0 @@ import { bridgifyClass, bridgifyObject, shareData } from './magic.js' |
+6
-6
@@ -72,3 +72,3 @@ // @flow | ||
| */ | ||
| function addMagic (o: Object, magic: ClassMagic | ObjectMagic | SharedMagic) { | ||
| function addMagic(o: Object, magic: ClassMagic | ObjectMagic | SharedMagic) { | ||
| if (Object.prototype.hasOwnProperty.call(o, MAGIC_KEY)) { | ||
@@ -84,3 +84,3 @@ Object.assign(o[MAGIC_KEY], magic) | ||
| */ | ||
| export function bridgifyClass<Type: Function> (Class: Type): Type { | ||
| export function bridgifyClass<Type: Function>(Class: Type): Type { | ||
| const o = Class.prototype | ||
@@ -97,3 +97,3 @@ if (!Object.prototype.hasOwnProperty.call(o, MAGIC_KEY)) { | ||
| */ | ||
| export function bridgifyObject<Type: Object> (o: Type): Type { | ||
| export function bridgifyObject<Type: Object>(o: Type): Type { | ||
| if ( | ||
@@ -117,3 +117,3 @@ !Object.prototype.hasOwnProperty.call(o, MAGIC_KEY) || | ||
| */ | ||
| export function getInstanceMagic (o: Object): InstanceMagic { | ||
| export function getInstanceMagic(o: Object): InstanceMagic { | ||
| // We only want to look at bridgeable objects: | ||
@@ -129,3 +129,3 @@ if (o[MAGIC_KEY] == null) throw new TypeError('Not a bridgeable object') | ||
| */ | ||
| export function makeProxyMagic (remoteId: number): ProxyMagic { | ||
| export function makeProxyMagic(remoteId: number): ProxyMagic { | ||
| return { | ||
@@ -147,3 +147,3 @@ // InstanceMagic: | ||
| */ | ||
| export function shareData ( | ||
| export function shareData( | ||
| table: { [name: string]: Object }, | ||
@@ -150,0 +150,0 @@ namespace?: string |
+11
-11
@@ -28,3 +28,3 @@ // @flow | ||
| */ | ||
| export function addListener ( | ||
| export function addListener( | ||
| o: Object, | ||
@@ -40,3 +40,3 @@ name: string, | ||
| return function unsubscribe () { | ||
| return function unsubscribe() { | ||
| listeners[name] = listeners[name].filter(i => i !== f) | ||
@@ -49,3 +49,3 @@ } | ||
| */ | ||
| export function addWatcher ( | ||
| export function addWatcher( | ||
| o: Object, | ||
@@ -64,3 +64,3 @@ name: string, | ||
| return function unsubscribe () { | ||
| return function unsubscribe() { | ||
| watchers[name].fs = watchers[name].fs.filter(i => i !== f) | ||
@@ -75,10 +75,10 @@ } | ||
| */ | ||
| export function close (o: Object): mixed { | ||
| export function close(o: Object): mixed { | ||
| const magic = getInstanceMagic(o) | ||
| // Call local callbacks: | ||
| const listeners = magic.listeners['close'] | ||
| const listeners = magic.listeners.close | ||
| if (listeners != null) { | ||
| for (const f of listeners) { | ||
| callCallback(o, f, void 0, true) | ||
| callCallback(o, f, undefined, true) | ||
| } | ||
@@ -99,3 +99,3 @@ } | ||
| */ | ||
| export function emit (o: Object, name: string, payload: mixed): mixed { | ||
| export function emit(o: Object, name: string, payload: mixed): mixed { | ||
| const magic = getInstanceMagic(o) | ||
@@ -121,3 +121,3 @@ if (magic.closed) throw new Error('Cannot emit event on closed object') | ||
| */ | ||
| export function update<T: {}> (o: T, name?: $Keys<T>): mixed { | ||
| export function update<T: {}>(o: T, name?: $Keys<T>): mixed { | ||
| const magic = getInstanceMagic(o) | ||
@@ -151,3 +151,3 @@ if (magic.closed) throw new Error('Cannot update closed object') | ||
| */ | ||
| export function callCallback ( | ||
| export function callCallback( | ||
| o: Object, | ||
@@ -163,3 +163,3 @@ f: Function, | ||
| if (emitError && out != null && typeof out.then === 'function') { | ||
| out.then(void 0, e => emit(o, 'error', e)) | ||
| out.then(undefined, e => emit(o, 'error', e)) | ||
| } | ||
@@ -166,0 +166,0 @@ } catch (e) { |
+9
-9
@@ -10,5 +10,5 @@ // @flow | ||
| import { | ||
| MAGIC_KEY, | ||
| type ProxyMagic, | ||
| getInstanceMagic, | ||
| MAGIC_KEY, | ||
| makeProxyMagic | ||
@@ -28,3 +28,3 @@ } from './magic.js' | ||
| */ | ||
| export function packObject ( | ||
| export function packObject( | ||
| state: BridgeState, | ||
@@ -79,3 +79,3 @@ o: Object | ||
| */ | ||
| export function diffObject ( | ||
| export function diffObject( | ||
| state: BridgeState, | ||
@@ -110,3 +110,3 @@ o: Object, | ||
| */ | ||
| export function makeProxy (state: BridgeState, create: CreateMessage): Object { | ||
| export function makeProxy(state: BridgeState, create: CreateMessage): Object { | ||
| const props = {} | ||
@@ -135,3 +135,3 @@ | ||
| */ | ||
| export function updateObjectProps ( | ||
| export function updateObjectProps( | ||
| state: BridgeState, | ||
@@ -154,4 +154,4 @@ o: Object, | ||
| function makeProxyGetter (magic: ProxyMagic, name: string) { | ||
| return function get () { | ||
| function makeProxyGetter(magic: ProxyMagic, name: string) { | ||
| return function get() { | ||
| if (magic.errors[name]) throw magic.props[name] | ||
@@ -162,4 +162,4 @@ return magic.props[name] | ||
| function makeProxyMethod (state: BridgeState, magic: ProxyMagic, name: string) { | ||
| return function method (...args) { | ||
| function makeProxyMethod(state: BridgeState, magic: ProxyMagic, name: string) { | ||
| return function method(...args) { | ||
| if (magic.closed) { | ||
@@ -166,0 +166,0 @@ return Promise.reject( |
+14
-13
@@ -0,1 +1,2 @@ | ||
| /* global setTimeout */ | ||
| // @flow | ||
@@ -47,3 +48,3 @@ | ||
| constructor (opts: BridgeOptions) { | ||
| constructor(opts: BridgeOptions) { | ||
| const { sendMessage, throttleMs = 0 } = opts | ||
@@ -76,3 +77,3 @@ | ||
| */ | ||
| close (error: Error) { | ||
| close(error: Error) { | ||
| for (const callId in this.pendingCalls) { | ||
@@ -91,3 +92,3 @@ const call = this.pendingCalls[Number(callId)] | ||
| */ | ||
| getObject (packedId: number): Object | void { | ||
| getObject(packedId: number): Object | void { | ||
| return packedId < 0 ? this.proxies[-packedId] : this.objects[packedId] | ||
@@ -101,3 +102,3 @@ } | ||
| */ | ||
| getPackedId (o: Object): number | null { | ||
| getPackedId(o: Object): number | null { | ||
| const magic = getInstanceMagic(o) | ||
@@ -123,3 +124,3 @@ if (magic.closed) return null | ||
| */ | ||
| markDirty (localId: number, name?: string) { | ||
| markDirty(localId: number, name?: string): void { | ||
| const cache = this.caches[localId] | ||
@@ -135,3 +136,3 @@ if (name != null && name in cache) cache[name] = dirtyValue | ||
| */ | ||
| emitClose (localId: number) { | ||
| emitClose(localId: number): void { | ||
| delete this.objects[localId] | ||
@@ -147,3 +148,3 @@ delete this.caches[localId] | ||
| */ | ||
| emitCreate (create: CreateMessage, o: Object) { | ||
| emitCreate(create: CreateMessage, o: Object): void { | ||
| if (this.message.created == null) this.message.created = [] | ||
@@ -157,3 +158,3 @@ this.message.created.push(create) | ||
| */ | ||
| emitCall (remoteId: number, name: string, args: mixed): Promise<mixed> { | ||
| emitCall(remoteId: number, name: string, args: mixed): Promise<mixed> { | ||
| const callId = this.nextCallId++ | ||
@@ -178,3 +179,3 @@ const message: CallMessage = { | ||
| */ | ||
| emitEvent (localId: number, name: string, payload: mixed) { | ||
| emitEvent(localId: number, name: string, payload: mixed): void { | ||
| const message: EventMessage = { | ||
@@ -193,3 +194,3 @@ localId, | ||
| */ | ||
| emitReturn (callId: number, fail: boolean, value: mixed) { | ||
| emitReturn(callId: number, fail: boolean, value: mixed): void { | ||
| const message: ReturnMessage = { | ||
@@ -208,3 +209,3 @@ callId, | ||
| */ | ||
| handleMessage (message: Message) { | ||
| handleMessage(message: Message): void { | ||
| // ---------------------------------------- | ||
@@ -326,3 +327,3 @@ // Phase 1: Get our proxies up to date. | ||
| */ | ||
| sendNow () { | ||
| sendNow(): void { | ||
| if (this.closed) return | ||
@@ -351,3 +352,3 @@ | ||
| */ | ||
| wakeup () { | ||
| wakeup(): void { | ||
| if (this.sendPending) return | ||
@@ -354,0 +355,0 @@ |
243266
2.65%22
15.79%3436
5.59%28
3.7%