🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

yaob

Package Overview
Dependencies
Maintainers
1
Versions
18
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

yaob - npm Package Compare versions

Comparing version
0.3.4
to
0.3.5
+54
src/events/events.js
// @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 +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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"}
{
"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"
}
}

@@ -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 @@ }

@@ -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
}
}
}
// @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'

@@ -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

@@ -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) {

@@ -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(

@@ -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 @@