🚀 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.5
to
0.3.6
+5
-0
CHANGELOG.md
# Changelog
## 0.3.6 (2020-01-02)
- Add TypeScript type definitions.
- Add `ArrayBuffer` support.
## 0.3.5 (2019-11-23)

@@ -4,0 +9,0 @@

@@ -196,2 +196,3 @@ 'use strict';

if (data instanceof Error) return 'e';
if (data instanceof ArrayBuffer) return 'ab';
if (data instanceof Uint8Array) return 'u8';

@@ -300,2 +301,5 @@

case 'ab':
return rfc4648.base64.stringify(new Uint8Array(data));
case 'u8':

@@ -410,2 +414,9 @@ return rfc4648.base64.stringify(data);

case 'ab':
if (typeof raw !== 'string') {
throw new TypeError("Expecting a base64 string at " + path);
}
return rfc4648.base64.parse(raw).buffer;
case 'u8':

@@ -412,0 +423,0 @@ if (typeof raw !== 'string') {

+1
-1

@@ -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\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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"}
{"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 | 'ab' // ArrayBuffer\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 ArrayBuffer) return 'ab'\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 'ab':\n return base64.stringify(new Uint8Array(data))\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 'ab':\n if (typeof raw !== 'string') {\n throw new TypeError(`Expecting a base64 string at ${path}`)\n }\n return base64.parse(raw).buffer\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","ArrayBuffer","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","buffer","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":";;;;;;;;;;;;;;;;;;;;;;;;AACA;;;;;AASA,AAAO,IAAMA,SAAS,GAAG,OAAlB;;;;;AAuDP,IAAIC,WAAW,GAAG,CAAlB;AACA,AAAO,IAAMC,UAAyC,GAAG,EAAlD;;;;;AAKP,SAASC,QAAT,CAAkBC,CAAlB,EAA6BC,KAA7B,EAA4E;MACtEC,MAAM,CAACC,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCL,CAArC,EAAwCJ,SAAxC,CAAJ,EAAwD;aACxCI,CAAC,CAACJ,SAAD,CAAf,EAA4BK,KAA5B;GADF,MAEO;IACLC,MAAM,CAACI,cAAP,CAAsBN,CAAtB,EAAyBJ,SAAzB,EAAoC;MAAEW,KAAK,EAAEN;KAA7C;;;;;;;;AAOJ,AAAO,SAASO,aAAT,CAAuCC,KAAvC,EAA0D;MACzDT,CAAC,GAAGS,KAAK,CAACN,SAAhB;;MACI,CAACD,MAAM,CAACC,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCL,CAArC,EAAwCJ,SAAxC,CAAL,EAAyD;QACjDK,KAAiB,GAAG,EAA1B;IACAF,QAAQ,CAACC,CAAD,EAAIC,KAAJ,CAAR;;;SAEKQ,KAAP;;;;;;AAMF,AAAO,SAASC,cAAT,CAAsCV,CAAtC,EAAqD;MAExD,CAACE,MAAM,CAACC,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCL,CAArC,EAAwCJ,SAAxC,CAAD,IACAI,CAAC,CAACJ,SAAD,CAAD,CAAae,OAAb,IAAwB,IAF1B,EAGE;QACMV,KAAoB,GAAG;MAC3BU,OAAO,EAAEd,WAAW,EADO;MAE3Be,OAAO,EAAE,EAFkB;MAG3BC,SAAS,EAAE,EAHgB;MAI3BC,QAAQ,EAAE;KAJZ;IAMAf,QAAQ,CAACC,CAAD,EAAIC,KAAJ,CAAR;;;SAEKD,CAAP;;;;;;AAMF,AAAO,SAASe,gBAAT,CAA0Bf,CAA1B,EAAoD;;MAErDA,CAAC,CAACJ,SAAD,CAAD,IAAgB,IAApB,EAA0B,MAAM,IAAIoB,SAAJ,CAAc,yBAAd,CAAN;EAE1BN,cAAc,CAACV,CAAD,CAAd;SACOA,CAAC,CAACJ,SAAD,CAAR;;;;;;AAMF,AAAO,SAASqB,cAAT,CAAwBC,QAAxB,EAAsD;SACpD;;IAELP,OAAO,EAAEd,WAAW,EAFf;IAGLe,OAAO,EAAE,EAHJ;IAILC,SAAS,EAAE,EAJN;IAKLC,QAAQ,EAAE,EALL;;IAOLI,QAAQ,EAARA,QAPK;IAQLC,MAAM,EAAE,EARH;IASLC,KAAK,EAAE;GATT;;;;;;AAgBF,AAAO,SAASC,SAAT,CACLC,KADK,EAELC,SAFK,EAGL;MACIA,SAAS,IAAI,IAAjB,EAAuBA,SAAS,GAAG,EAAZ,CAAvB,KACKA,SAAS,IAAI,GAAb;;6CAEWrB,MAAM,CAACsB,mBAAP,CAA2BF,KAA3B,CAJhB,8CAImD;QAAxCG,CAAC,8BAAP;QACGC,OAAO,GAAGH,SAAS,GAAGE,CAA5B;;QACI3B,UAAU,CAAC4B,OAAD,CAAV,IAAuB,IAA3B,EAAiC;YACzB,IAAIC,KAAJ,2BAAkCD,OAAlC,qBAAN;;;IAEF5B,UAAU,CAAC4B,OAAD,CAAV,GAAsBJ,KAAK,CAACG,CAAD,CAA3B;IACA1B,QAAQ,CAACuB,KAAK,CAACG,CAAD,CAAN,EAAW;MAAEC,OAAO,EAAPA;KAAb,CAAR;;;;AC/IJ;;;;;;;;;;AA8DA,AAAO,SAASE,QAAT,CAAkBN,KAAlB,EAAsCO,IAAtC,EAA+D;MAChE;QACIC,GAAG,GAAGC,OAAO,CAACT,KAAD,EAAQO,IAAR,CAAnB;QACMG,GAAG,GAAGC,QAAQ,CAACX,KAAD,EAAQQ,GAAR,EAAaD,IAAb,CAApB;WACOC,GAAG,KAAK,EAAR,GAAa;MAAEA,GAAG,EAAHA,GAAF;MAAOE,GAAG,EAAHA;KAApB,GAA4B;MAAEA,GAAG,EAAHA;KAArC;GAHF,CAIE,OAAOH,IAAP,EAAa;WACNK,SAAS,CAACZ,KAAD,EAAQO,IAAR,CAAhB;;;;;;;AAOJ,AAAO,SAASK,SAAT,CAAmBZ,KAAnB,EAAuCO,IAAvC,EAAgE;MAC/DC,GAAG,GAAGC,OAAO,CAACT,KAAD,EAAQO,IAAR,CAAnB;MACMG,GAAG,GAAGC,QAAQ,CAACX,KAAD,EAAQQ,GAAR,EAAaD,IAAb,CAApB;SACO;IAAEC,GAAG,EAAHA,GAAF;IAAOE,GAAG,EAAHA,GAAP;aAAmB;GAA1B;;;;;;AAMF,AAAO,SAASG,UAAT,CACLb,KADK,EAELO,IAFK,EAGLO,IAHK,EAIA;MACGN,GADH,GACgBD,IADhB,CACGC,GADH;MACQE,GADR,GACgBH,IADhB,CACQG,GADR;MAECK,GAAG,GAAGP,GAAG,IAAI,IAAP,GAAcQ,UAAU,CAAChB,KAAD,EAAQQ,GAAR,EAAaE,GAAb,EAAkBI,IAAlB,CAAxB,GAAkDJ,GAA9D;MACIH,IAAI,SAAR,EAAgB,MAAMQ,GAAN;SACTA,GAAP;;;;;;;AAOF,SAASN,OAAT,CAAiBT,KAAjB,EAAqCO,IAArC,EAA2D;UACjD,OAAOA,IAAf;SACO,SAAL;SACK,QAAL;SACK,QAAL;aACS,EAAP;;SAEG,QAAL;;YACMA,IAAI,KAAK,IAAb,EAAmB,OAAO,EAAP;YACfA,IAAI,YAAYU,IAApB,EAA0B,OAAO,GAAP;YACtBV,IAAI,YAAYF,KAApB,EAA2B,OAAO,GAAP;YACvBE,IAAI,YAAYW,WAApB,EAAiC,OAAO,IAAP;YAC7BX,IAAI,YAAYY,UAApB,EAAgC,OAAO,IAAP;;YAC5BZ,IAAI,CAACjC,SAAD,CAAJ,IAAmB,IAAvB,EAA6B;iBACpBiC,IAAI,CAACjC,SAAD,CAAJ,CAAgB8B,OAAhB,IAA2B,IAA3B,GAAkC,GAAlC,GAAwC,GAA/C;SAPW;;;YAWTgB,KAAK,CAACC,OAAN,CAAcd,IAAd,CAAJ,EAAyB;cACnBQ,IAAwB,GAAG,EAA/B;;eACK,IAAIO,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGf,IAAI,CAACgB,MAAzB,EAAiC,EAAED,CAAnC,EAAsC;gBAC9Bd,GAAG,GAAGC,OAAO,CAACT,KAAD,EAAQO,IAAI,CAACe,CAAD,CAAZ,CAAnB;;gBACId,GAAG,KAAK,EAAR,IAAcO,IAAG,KAAK,EAA1B,EAA8B;cAC5BA,IAAG,GAAG,EAAN;;mBACK,IAAIS,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGF,CAApB,EAAuB,EAAEE,CAAzB;gBAA4BT,IAAG,CAACS,CAAD,CAAH,GAAS,EAAT;;;;gBAE1BT,IAAG,KAAK,EAAZ,EAAgBA,IAAG,CAACO,CAAD,CAAH,GAASd,GAAT;;;iBAEXO,IAAP;SArBW;;;YAyBTA,GAAqC,GAAG,EAA5C;;aACK,IAAMZ,CAAX,IAAgBI,IAAhB,EAAsB;cACdC,IAAG,GAAGC,OAAO,CAACT,KAAD,EAAQO,IAAI,CAACJ,CAAD,CAAZ,CAAnB;;cACIK,IAAG,KAAK,EAAZ,EAAgB;gBACVO,GAAG,KAAK,EAAZ,EAAgBA,GAAG,GAAG,EAAN;YAChBA,GAAG,CAACZ,CAAD,CAAH,GAASK,IAAT;;;;eAGGO,GAAP;;;SAGG,WAAL;aACS,GAAP;;SAEG,UAAL;;aAESR,IAAI,CAACjC,SAAD,CAAJ,IAAmB,IAAnB,IAA2BiC,IAAI,CAACjC,SAAD,CAAJ,CAAgB8B,OAAhB,IAA2B,IAAtD,GACH,GADG,GAEH,GAFJ;;;aAKO,GAAP;;;;;;;;AAON,SAASqB,SAAT,CAAmBzB,KAAnB,EAAuCtB,CAAvC,EAA+D;;MAErDgD,OAFqD,GAElChD,CAFkC,CAErDgD,OAFqD;MAE5CC,KAF4C,GAElCjD,CAFkC,CAE5CiD,KAF4C;;MAGvD7B,KAAK;IAAK4B,OAAO,EAAPA,OAAL;IAAcC,KAAK,EAALA;KAAUjD,CAAxB,CAAX;;MAEIkD,IAAI,GAAG,IAAX;MACIlD,CAAC,YAAYmD,SAAjB,EAA4BD,IAAI,GAAG,WAAP,CAA5B,KACK,IAAIlD,CAAC,YAAYoD,UAAjB,EAA6BF,IAAI,GAAG,YAAP,CAA7B,KACA,IAAIlD,CAAC,YAAYqD,cAAjB,EAAiCH,IAAI,GAAG,gBAAP,CAAjC,KACA,IAAIlD,CAAC,YAAYsD,WAAjB,EAA8BJ,IAAI,GAAG,aAAP,CAA9B,KACA,IAAIlD,CAAC,YAAYgB,SAAjB,EAA4BkC,IAAI,GAAG,WAAP,CAA5B,KACA,IAAIlD,CAAC,YAAYuD,QAAjB,EAA2BL,IAAI,GAAG,UAAP,CAX6B;;;IAcpDA,IAAI,EAAJA;KAAStB,QAAQ,CAACN,KAAD,EAAQF,KAAR,CAA1B;;;;;;;AAMF,SAASa,QAAT,CAAkBX,KAAlB,EAAsCQ,GAAtC,EAAoDD,IAApD,EAA0E;UAChEC,GAAR;SACO,EAAL;aACSD,IAAP;;SAEG,GAAL;aACS,OAAOA,IAAd;;SAEG,GAAL;aACSA,IAAI,CAAC2B,WAAL,EAAP;;SAEG,GAAL;aACST,SAAS,CAACzB,KAAD,EAAQO,IAAR,CAAhB;;SAEG,GAAL;aACSP,KAAK,CAACmC,WAAN,CAAkB5B,IAAlB,CAAP;;SAEG,GAAL;aACSA,IAAI,CAACjC,SAAD,CAAJ,CAAgB8B,OAAvB;;SAEG,GAAL;aACS,IAAP;;SAEG,IAAL;aACSgC,cAAM,CAACC,SAAP,CAAiB,IAAIlB,UAAJ,CAAeZ,IAAf,CAAjB,CAAP;;SAEG,IAAL;aACS6B,cAAM,CAACC,SAAP,CAAiB9B,IAAjB,CAAP;;;;;YAIIa,KAAK,CAACC,OAAN,CAAcb,GAAd,CAAJ,EAAwB;cAChBO,KAAG,GAAG,EAAZ;;eACK,IAAIO,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGd,GAAG,CAACe,MAAxB,EAAgC,EAAED,CAAlC,EAAqC;YACnCP,KAAG,CAACO,CAAD,CAAH,GAASX,QAAQ,CAACX,KAAD,EAAQQ,GAAG,CAACc,CAAD,CAAX,EAAgBf,IAAI,CAACe,CAAD,CAApB,CAAjB;;;iBAEKP,KAAP;SAPK;;;YAWDA,GAAG,GAAG,EAAZ;;aACK,IAAMZ,CAAX,IAAgBI,IAAhB,EAAsB;UACpBQ,GAAG,CAACZ,CAAD,CAAH,GAASA,CAAC,IAAIK,GAAL,GAAWG,QAAQ,CAACX,KAAD,EAAQQ,GAAG,CAACL,CAAD,CAAX,EAAgBI,IAAI,CAACJ,CAAD,CAApB,CAAnB,GAA8CI,IAAI,CAACJ,CAAD,CAA3D;;;eAEKY,GAAP;;;;;;;;;AAQN,SAASuB,WAAT,CACEtC,KADF,EAEEf,KAFF,EAGE6B,IAHF,EAIS;MACDyB,KAAK,GAAG;IACZV,SAAS,EAATA,SADY;IAEZC,UAAU,EAAVA,UAFY;IAGZC,cAAc,EAAdA,cAHY;IAIZC,WAAW,EAAXA,WAJY;IAKZtC,SAAS,EAATA,SALY;IAMZuC,QAAQ,EAARA;GANF,CADO;;MAWDO,IAAI,GAAGvD,KAAK,CAAC2C,IAAN,IAAc,IAAd,GAAqBW,KAAK,CAACtD,KAAK,CAAC2C,IAAP,CAAL,IAAqBvB,KAA1C,GAAkDA,KAA/D;MACMU,GAAW,GAAG,IAAIyB,IAAJ,EAApB,CAZO;;MAeD1C,KAAK,GAAGe,UAAU,CAACb,KAAD,EAAQf,KAAR,EAAe6B,IAAf,CAAxB;;OACK,IAAMX,CAAX,IAAgBL,KAAhB;IAAuBiB,GAAG,CAACZ,CAAD,CAAH,GAASL,KAAK,CAACK,CAAD,CAAd;;;SAEhBY,GAAP;;;;;;;AAMF,SAASC,UAAT,CACEhB,KADF,EAEEQ,GAFF,EAGEE,GAHF,EAIEI,IAJF,EAKO;UACGN,GAAR;SACO,EAAL;aACSE,GAAP;;SAEG,GAAL;;YACQ+B,IAAI,GAAG,OAAO/B,GAAP,KAAe,QAAf,GAA0BA,GAA1B,GAAgC,GAA7C;cACM,IAAIhB,SAAJ,gCAA2C+C,IAA3C,YAAsD3B,IAAtD,CAAN;;;SAGG,GAAL;aACS,IAAIG,IAAJ,CAASP,GAAT,CAAP;;SAEG,GAAL;UACM,OAAOA,GAAP,KAAe,QAAf,IAA2BA,GAAG,KAAK,IAAvC,EAA6C;cACrC,IAAIhB,SAAJ,wCAAmDoB,IAAnD,CAAN;;;aAEKwB,WAAW,CAACtC,KAAD,EAAQU,GAAR,EAAaI,IAAb,CAAlB;;SAEG,GAAL;;YACMJ,GAAG,KAAK,IAAZ,EAAkB;gBACV,IAAIhB,SAAJ,8BAAyCoB,IAAzC,CAAN;;;YAEE,OAAOJ,GAAP,KAAe,QAAnB,EAA6B;gBACrB,IAAIhB,SAAJ,8BAAyCoB,IAAzC,CAAN;;;YAEIpC,EAAC,GAAGsB,KAAK,CAAC0C,SAAN,CAAgB,CAAChC,GAAjB,CAAV;;YACIhC,EAAC,IAAI,IAAT,EAAe,MAAM,IAAIoD,UAAJ,uBAAmCpB,GAAnC,YAA6CI,IAA7C,CAAN;eACRpC,EAAP;;;SAGG,GAAL;;YACM,OAAOgC,GAAP,KAAe,QAAnB,EAA6B;gBACrB,IAAIhB,SAAJ,6BAAwCoB,IAAxC,CAAN;;;YAEI6B,CAAC,GAAGnE,UAAU,CAACkC,GAAD,CAApB;YACIiC,CAAC,IAAI,IAAT,EAAe,MAAM,IAAIb,UAAJ,uBAAmCpB,GAAnC,aAA8CI,IAA9C,CAAN;eACR6B,CAAP;;;SAGG,GAAL;aACSC,SAAP;;SAEG,IAAL;UACM,OAAOlC,GAAP,KAAe,QAAnB,EAA6B;cACrB,IAAIhB,SAAJ,mCAA8CoB,IAA9C,CAAN;;;aAEKsB,cAAM,CAACS,KAAP,CAAanC,GAAb,EAAkBoC,MAAzB;;SAEG,IAAL;UACM,OAAOpC,GAAP,KAAe,QAAnB,EAA6B;cACrB,IAAIhB,SAAJ,mCAA8CoB,IAA9C,CAAN;;;aAEKsB,cAAM,CAACS,KAAP,CAAanC,GAAb,CAAP;;;;YAGI,OAAOF,GAAP,KAAe,QAAf,IAA2BA,GAAG,KAAK,IAAvC,EAA6C;gBACrC,IAAId,SAAJ,+BAA0Cc,GAA1C,YAAoDM,IAApD,CAAN;;;YAEE,OAAOJ,GAAP,KAAe,QAAf,IAA2BA,GAAG,KAAK,IAAvC,EAA6C;gBACrC,IAAIhB,SAAJ,sCAAiDoB,IAAjD,CAAN;SALK;;;YASHM,KAAK,CAACC,OAAN,CAAcb,GAAd,CAAJ,EAAwB;cAClB,CAACY,KAAK,CAACC,OAAN,CAAcX,GAAd,CAAL,EAAyB;kBACjB,IAAIhB,SAAJ,4BAAuCoB,IAAvC,CAAN;;;cAEIC,KAAG,GAAG,EAAZ;;eACK,IAAIO,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGd,GAAG,CAACe,MAAxB,EAAgC,EAAED,CAAlC,EAAqC;YACnCP,KAAG,CAACO,CAAD,CAAH,GAASN,UAAU,CAAChB,KAAD,EAAQQ,GAAG,CAACc,CAAD,CAAX,EAAgBZ,GAAG,CAACY,CAAD,CAAnB,EAA2BR,IAA3B,SAAmCQ,CAAnC,OAAnB;;;iBAEKP,KAAP;SAjBK;;;YAqBDA,GAAG,GAAG,EAAZ;;aACK,IAAMZ,CAAX,IAAgBO,GAAhB,EAAqB;UACnBK,GAAG,CAACZ,CAAD,CAAH,GACEA,CAAC,IAAIK,GAAL,GAAWQ,UAAU,CAAChB,KAAD,EAAQQ,GAAG,CAACL,CAAD,CAAX,EAAgBO,GAAG,CAACP,CAAD,CAAnB,EAA2BW,IAA3B,SAAmCX,CAAnC,CAArB,GAA+DO,GAAG,CAACP,CAAD,CADpE;;;eAGKY,GAAP;;;;;ACnWN;;;;AAKA,AAEA;;;;;AAcA,AAAO,IAAMgC,UAAU,GAAG,EAAnB;;;;;AAKP,AAAO,SAASC,WAAT,CACLtE,CADK,EAELuE,IAFK,EAGLC,CAHK,EAIY;0BACazD,gBAAgB,CAACf,CAAD,CAD7B;MACTyE,MADS,qBACTA,MADS;MACD5D,SADC,qBACDA,SADC;;MAGb4D,MAAJ,EAAY,OAAO,YAAM,EAAb;MACR5D,SAAS,CAAC0D,IAAD,CAAT,IAAmB,IAAvB,EAA6B1D,SAAS,CAAC0D,IAAD,CAAT,GAAkB,CAACC,CAAD,CAAlB,CAA7B,KACK3D,SAAS,CAAC0D,IAAD,CAAT,CAAgBG,IAAhB,CAAqBF,CAArB;SAEE,SAASG,WAAT,GAAuB;IAC5B9D,SAAS,CAAC0D,IAAD,CAAT,GAAkB1D,SAAS,CAAC0D,IAAD,CAAT,CAAgBK,MAAhB,CAAuB,UAAAhC,CAAC;aAAIA,CAAC,KAAK4B,CAAV;KAAxB,CAAlB;GADF;;;;;;AAQF,AAAO,SAASK,UAAT,CACL7E,CADK,EAELuE,IAFK,EAGLC,CAHK,EAIY;2BACYzD,gBAAgB,CAACf,CAAD,CAD5B;MACTyE,MADS,sBACTA,MADS;MACD3D,QADC,sBACDA,QADC;;;MAIXe,IAAI,GAAG7B,CAAC,CAACuE,IAAD,CAAd;MAEIE,MAAJ,EAAY,OAAO,YAAM,EAAb;MACR3D,QAAQ,CAACyD,IAAD,CAAR,IAAkB,IAAtB,EAA4BzD,QAAQ,CAACyD,IAAD,CAAR,GAAiB;IAAE1C,IAAI,EAAJA,IAAF;IAAQiD,EAAE,EAAE,CAACN,CAAD;GAA7B,CAA5B,KACK1D,QAAQ,CAACyD,IAAD,CAAR,CAAeO,EAAf,CAAkBJ,IAAlB,CAAuBF,CAAvB;SAEE,SAASG,WAAT,GAAuB;IAC5B7D,QAAQ,CAACyD,IAAD,CAAR,CAAeO,EAAf,GAAoBhE,QAAQ,CAACyD,IAAD,CAAR,CAAeO,EAAf,CAAkBF,MAAlB,CAAyB,UAAAhC,CAAC;aAAIA,CAAC,KAAK4B,CAAV;KAA1B,CAApB;GADF;;;;;;;;AAUF,AAAO,SAASO,KAAT,CAAe/E,CAAf,EAAiC;MAChCC,KAAK,GAAGc,gBAAgB,CAACf,CAAD,CAA9B,CADsC;;MAIhCa,SAAS,GAAGZ,KAAK,CAACY,SAAN,CAAgBkE,KAAlC;;MACIlE,SAAS,IAAI,IAAjB,EAAuB;4BACLA,SADK,gBACM;UAAhB2D,EAAC,GAAI3D,SAAJ,KAAP;MACHmE,YAAY,CAAChF,CAAD,EAAIwE,EAAJ,EAAON,SAAP,EAAkB,IAAlB,CAAZ;;;;EAIJjE,KAAK,CAACwE,MAAN,GAAe,IAAf;;sCACqBxE,KAAK,CAACW,OAZW,uCAYF;QAAzBqE,MAAM,uBAAZ;IACHA,MAAM,CAACC,SAAP,CAAiBjF,KAAK,CAACU,OAAvB;;;EAEFV,KAAK,CAACW,OAAN,GAAgB,EAAhB;EACAX,KAAK,CAACY,SAAN,GAAkB,EAAlB;EACAZ,KAAK,CAACa,QAAN,GAAiB,EAAjB;;;;;;AAMF,AAAO,SAASqE,IAAT,CAAcnF,CAAd,EAAyBuE,IAAzB,EAAuCa,OAAvC,EAA8D;MAC7DnF,KAAK,GAAGc,gBAAgB,CAACf,CAAD,CAA9B;MACIC,KAAK,CAACwE,MAAV,EAAkB,MAAM,IAAI9C,KAAJ,CAAU,oCAAV,CAAN,CAFiD;;sCAK9C1B,KAAK,CAACW,OALwC,uCAK/B;QAAzBqE,MAAM,uBAAZ;IACHA,MAAM,CAACI,SAAP,CAAiBpF,KAAK,CAACU,OAAvB,EAAgC4D,IAAhC,EAAsCa,OAAtC;GANiE;;;MAU7DvE,SAAS,GAAGZ,KAAK,CAACY,SAAN,CAAgB0D,IAAhB,CAAlB;;MACI1D,SAAS,IAAI,IAAjB,EAAuB;4BACLA,SADK,gBACM;UAAhB2D,GAAC,GAAI3D,SAAJ,KAAP;MACHmE,YAAY,CAAChF,CAAD,EAAIwE,GAAJ,EAAOY,OAAP,EAAgBb,IAAI,KAAK,OAAzB,CAAZ;;;;;;;;AAQN,AAAO,SAASe,MAAT,CAAuBtF,CAAvB,EAA6BuE,IAA7B,EAAqD;MACpDtE,KAAK,GAAGc,gBAAgB,CAACf,CAAD,CAA9B;MACIC,KAAK,CAACwE,MAAV,EAAkB,MAAM,IAAI9C,KAAJ,CAAU,6BAAV,CAAN;;uCAEG1B,KAAK,CAACW,OAJ+B,yCAItB;QAAzBqE,MAAM,wBAAZ;IACHA,MAAM,CAACM,SAAP,CAAiBtF,KAAK,CAACU,OAAvB,EAAgC4D,IAAhC;GALwD;;;MAStDA,IAAI,IAAI,IAAR,IAAgBtE,KAAK,CAACa,QAAN,CAAeyD,IAAf,KAAwB,IAA5C,EAAkD;IAChDtE,KAAK,CAACa,QAAN,CAAeyD,IAAf,EAAqB1C,IAArB,GAA4BwC,UAA5B;GAVwD;;;OAcrD,IAAM5C,CAAX,IAAgBxB,KAAK,CAACa,QAAtB,EAAgC;QACxB0E,KAAK,GAAGvF,KAAK,CAACa,QAAN,CAAeW,CAAf,CAAd;;QACI;UACII,IAAI,GAAG7B,CAAC,CAACyB,CAAD,CAAd;;UACII,IAAI,KAAK2D,KAAK,CAAC3D,IAAnB,EAAyB;QACvB2D,KAAK,CAAC3D,IAAN,GAAaA,IAAb;;wCACgB2D,KAAK,CAACV,EAFC;cAEZN,GAAC,mBAAP;UAAqBQ,YAAY,CAAChF,CAAD,EAAIwE,GAAJ,EAAOgB,KAAK,CAAC3D,IAAb,EAAmB,IAAnB,CAAZ;;;KAJ9B,CAME,OAAO4D,CAAP,EAAU;;;;;;;AAOhB,AAAO,SAAST,YAAT,CACLhF,CADK,EAELwE,CAFK,EAGLY,OAHK,EAILM,SAJK,EAKL;MACI;QACIrD,GAAG,GAAGmC,CAAC,CAACY,OAAD,CAAb,CADE;;QAIEM,SAAS,IAAIrD,GAAG,IAAI,IAApB,IAA4B,OAAOA,GAAG,CAACsD,IAAX,KAAoB,UAApD,EAAgE;MAC9DtD,GAAG,CAACsD,IAAJ,CAASzB,SAAT,EAAoB,UAAAuB,CAAC;eAAIN,IAAI,CAACnF,CAAD,EAAI,OAAJ,EAAayF,CAAb,CAAR;OAArB;;GALJ,CAOE,OAAOA,CAAP,EAAU;QACNC,SAAJ,EAAeP,IAAI,CAACnF,CAAD,EAAI,OAAJ,EAAayF,CAAb,CAAJ;;;;AC5JnB;;;;;AAMA,AAYA;AACA,AAAO,IAAMpB,YAAU,GAAG,EAAnB;;;;;;AAMP,AAAO,SAASuB,UAAT,CACLC,KADK,EAEL7F,CAFK,EAML;;MAEM8F,QAAkC,GAAG,EAA3C;MACMC,GAAG,GAAG7F,MAAM,CAACC,SAAnB;;OACK,IAAI6F,CAAC,GAAGhG,CAAb,EAAgBgG,CAAC,KAAKD,GAAN,IAAaC,CAAC,IAAI,IAAlC,EAAwCA,CAAC,GAAG9F,MAAM,CAAC+F,cAAP,CAAsBD,CAAtB,CAA5C,EAAsE;+CACjD9F,MAAM,CAACsB,mBAAP,CAA2BwE,CAA3B,CADiD,8CAClB;UAAvCzB,KAAI,8BAAV;;UACCA,KAAI,KAAK3E,SAAT,IAAsB,CAAC,KAAKsG,IAAL,CAAU3B,KAAV,CAAvB,IAA0CA,KAAI,KAAK,aAAvD,EAAsE;QACpEuB,QAAQ,CAACvB,KAAD,CAAR,GAAiB,IAAjB;;;GAPN;;;;MAcMiB,KAAiB,GAAG,EAA1B;MACMW,OAAsB,GAAG,EAA/B;MACM/E,KAAkB,GAAG,EAA3B;;OACK,IAAMK,CAAX,IAAgBqE,QAAhB,EAA0B;QACpB;UACIjE,IAAI,GAAG7B,CAAC,CAACyB,CAAD,CAAd;;UAEE,OAAOI,IAAP,KAAgB,UAAhB,KACCA,IAAI,CAACjC,SAAD,CAAJ,IAAmB,IAAnB,IAA2BiC,IAAI,CAACjC,SAAD,CAAJ,CAAgB8B,OAAhB,IAA2B,IADvD,CADF,EAGE;QACAyE,OAAO,CAACzB,IAAR,CAAajD,CAAb;OAJF,MAKO;QACL+D,KAAK,CAAC/D,CAAD,CAAL,GAAWI,IAAX;QACAT,KAAK,CAACK,CAAD,CAAL,GAAWG,QAAQ,CAACiE,KAAD,EAAQhE,IAAR,CAAnB;;KATJ,CAWE,OAAO4D,CAAP,EAAU;MACVD,KAAK,CAAC/D,CAAD,CAAL,GAAW4C,YAAX;MACAjD,KAAK,CAACK,CAAD,CAAL,GAAWS,SAAS,CAAC2D,KAAD,EAAQJ,CAAR,CAApB;;;;0BAIgB1E,gBAAgB,CAACf,CAAD,CAnCpC;MAmCQW,OAnCR,qBAmCQA,OAnCR;;MAoCMyF,MAAqB,GAAG;IAAEzF,OAAO,EAAPA,OAAF;IAAWwF,OAAO,EAAPA,OAAX;IAAoB/E,KAAK,EAALA;GAAlD;SACO;IAAEoE,KAAK,EAALA,KAAF;IAASY,MAAM,EAANA;GAAhB;;;;;;;AAOF,AAAO,SAASC,UAAT,CACLR,KADK,EAEL7F,CAFK,EAGLwF,KAHK,EAImC;MACpCc,KAAK,GAAG,KAAZ;MACMlF,KAAkB,GAAG,EAA3B;;OAEK,IAAMK,CAAX,IAAgB+D,KAAhB,EAAuB;QACjB;UACIjF,KAAK,GAAGP,CAAC,CAACyB,CAAD,CAAf;;UACIlB,KAAK,KAAKiF,KAAK,CAAC/D,CAAD,CAAnB,EAAwB;QACtB6E,KAAK,GAAG,IAAR;QACAlF,KAAK,CAACK,CAAD,CAAL,GAAWG,QAAQ,CAACiE,KAAD,EAAQtF,KAAR,CAAnB;QACAiF,KAAK,CAAC/D,CAAD,CAAL,GAAWlB,KAAX;;KALJ,CAOE,OAAOkF,CAAP,EAAU;MACVrE,KAAK,CAACK,CAAD,CAAL,GAAWS,SAAS,CAAC2D,KAAD,EAAQJ,CAAR,CAApB;MACAD,KAAK,CAAC/D,CAAD,CAAL,GAAW4C,YAAX;;;;SAIG;IAAEiC,KAAK,EAALA,KAAF;IAASlF,KAAK,EAALA;GAAhB;;;;;;;;AAQF,AAAO,SAASmF,SAAT,CAAmBV,KAAnB,EAAuCO,MAAvC,EAAsE;MACrEhF,KAAK,GAAG,EAAd,CAD2E;;MAIrEnB,KAAK,GAAGgB,cAAc,CAACmF,MAAM,CAACzF,OAAR,CAA5B;EACAS,KAAK,CAACxB,SAAD,CAAL,GAAmB;IAAEW,KAAK,EAAEN;GAA5B,CAL2E;;OAQtE,IAAMwB,CAAX,IAAgB2E,MAAM,CAAChF,KAAvB,EAA8B;IAC5BA,KAAK,CAACK,CAAD,CAAL,GAAW;MAAE+E,UAAU,EAAE,IAAd;MAAoBC,GAAG,EAAEC,eAAe,CAACzG,KAAD,EAAQwB,CAAR;KAAnD;GATyE;;;uCAa3D2E,MAAM,CAACD,OAboD,wCAa3C;QAArB1E,EAAC,wBAAP;IACHL,KAAK,CAACK,EAAD,CAAL,GAAW;MAAElB,KAAK,EAAEoG,eAAe,CAACd,KAAD,EAAQ5F,KAAR,EAAewB,EAAf;KAAnC;GAdyE;;;SAkBpEvB,MAAM,CAACkG,MAAP,CAAclG,MAAM,CAACC,SAArB,EAAgCiB,KAAhC,CAAP;;;;;;AAMF,AAAO,SAASwF,iBAAT,CACLf,KADK,EAEL7F,CAFK,EAGLoB,KAHK,EAIE;MACDnB,KAAiB,GAAGD,CAAC,CAACJ,SAAD,CAA3B;;OAEK,IAAM6B,CAAX,IAAgBL,KAAhB,EAAuB;QACjB;MACFnB,KAAK,CAACmB,KAAN,CAAYK,CAAZ,IAAiBU,UAAU,CAAC0D,KAAD,EAAQzE,KAAK,CAACK,CAAD,CAAb,EAAkBA,CAAlB,CAA3B;MACAxB,KAAK,CAACkB,MAAN,CAAaM,CAAb,IAAkB,KAAlB;KAFF,CAGE,OAAOgE,CAAP,EAAU;MACVxF,KAAK,CAACmB,KAAN,CAAYK,CAAZ,IAAiBgE,CAAjB;MACAxF,KAAK,CAACkB,MAAN,CAAaM,CAAb,IAAkB,IAAlB;;;;;AAKN,SAASiF,eAAT,CAAyBzG,KAAzB,EAA4CsE,IAA5C,EAA0D;SACjD,SAASkC,GAAT,GAAe;QAChBxG,KAAK,CAACkB,MAAN,CAAaoD,IAAb,CAAJ,EAAwB,MAAMtE,KAAK,CAACmB,KAAN,CAAYmD,IAAZ,CAAN;WACjBtE,KAAK,CAACmB,KAAN,CAAYmD,IAAZ,CAAP;GAFF;;;AAMF,SAASoC,eAAT,CAAyBd,KAAzB,EAA6C5F,KAA7C,EAAgEsE,IAAhE,EAA8E;SACrE,SAASsC,MAAT,GAAyB;QAC1B5G,KAAK,CAACwE,MAAV,EAAkB;aACTqC,OAAO,CAACC,MAAR,CACL,IAAI/F,SAAJ,0BAAqCuD,IAArC,uBADK,CAAP;;;sCAFsByC,IAAM;MAANA,IAAM;;;WAMvBnB,KAAK,CAACoB,QAAN,CAAehH,KAAK,CAACiB,QAArB,EAA+BqD,IAA/B,EAAqCyC,IAArC,CAAP;GANF;;;ICpIWE,WAAb;;AAAA;;;;;uBAuBcC,IAAZ,EAAiC;QACvBC,WADuB,GACSD,IADT,CACvBC,WADuB;2BACSD,IADT,CACVE,UADU;QACVA,UADU,iCACG,CADH;;SAI1BC,OAAL,GAAe,EAAf;SACKC,OAAL,GAAe,EAAf;SACKC,MAAL,GAAc,EAAd,CAN+B;;SAS1BC,UAAL,GAAkB,CAAlB;SACKC,YAAL,GAAoB,EAApB,CAV+B;;SAa1BpB,KAAL,GAAa,EAAb;SACKtD,OAAL,GAAe,EAAf,CAd+B;;SAiB1BqE,UAAL,GAAkBA,UAAlB;SACKM,UAAL,GAAkB,CAAlB;SACKC,WAAL,GAAmB,KAAnB;SACKR,WAAL,GAAmBA,WAAnB;;;;;;;;;;;SAQFrC,KAnDF,GAmDE,iBAAM8C,KAAN,EAAoB;SACb,IAAMC,OAAX,IAAqB,KAAKJ,YAA1B,EAAwC;UAChCrH,IAAI,GAAG,KAAKqH,YAAL,CAAkBK,MAAM,CAACD,OAAD,CAAxB,CAAb;MACAzH,IAAI,CAAC0G,MAAL,CAAYc,KAAZ;;;SAEG,IAAMG,SAAX,IAAuB,KAAKV,OAA5B,EAAqC;MACnCvC,KAAK,CAAC,KAAKuC,OAAL,CAAaS,MAAM,CAACC,SAAD,CAAnB,CAAD,CAAL;;;SAEGvD,MAAL,GAAc,IAAd;;;;;;;SAMFT,SAjEF,GAiEE,mBAAUiE,QAAV,EAA2C;WAClCA,QAAQ,GAAG,CAAX,GAAe,KAAKX,OAAL,CAAa,CAACW,QAAd,CAAf,GAAyC,KAAKV,OAAL,CAAaU,QAAb,CAAhD;;;;;;;;;SAQFxE,WA1EF,GA0EE,qBAAYzD,CAAZ,EAAsC;QAC9BC,KAAK,GAAGc,gBAAgB,CAACf,CAAD,CAA9B;QACIC,KAAK,CAACwE,MAAV,EAAkB,OAAO,IAAP;;QACdxE,KAAK,CAACiB,QAAN,IAAkB,IAAlB,IAA0B,KAAKoG,OAAL,CAAarH,KAAK,CAACiB,QAAnB,KAAgC,IAA9D,EAAoE;aAC3D,CAACjB,KAAK,CAACiB,QAAd;;;QAEE,KAAKqG,OAAL,CAAatH,KAAK,CAACU,OAAnB,KAA+B,IAAnC,EAAyC;;WAElC4G,OAAL,CAAatH,KAAK,CAACU,OAAnB,IAA8BX,CAA9B;;wBAE0B4F,UAAU,CAAC,IAAD,EAAO5F,CAAP,CAJG;UAI/BwF,KAJ+B,eAI/BA,KAJ+B;UAIxBY,MAJwB,eAIxBA,MAJwB;;WAKlCoB,MAAL,CAAYvH,KAAK,CAACU,OAAlB,IAA6B6E,KAA7B;MACAvF,KAAK,CAACW,OAAN,CAAc8D,IAAd,CAAmB,IAAnB;WACKwD,UAAL,CAAgB9B,MAAhB,EAAwBpG,CAAxB;;;WAEKC,KAAK,CAACU,OAAb;;;;;;;SAMF4E,SA/FF,GA+FE,mBAAU5E,OAAV,EAA2B4D,IAA3B,EAAgD;QACxCiB,KAAK,GAAG,KAAKgC,MAAL,CAAY7G,OAAZ,CAAd;QACI4D,IAAI,IAAI,IAAR,IAAgBA,IAAI,IAAIiB,KAA5B,EAAmCA,KAAK,CAACjB,IAAD,CAAL,GAAcF,YAAd;SAE9BiC,KAAL,CAAW3F,OAAX,IAAsB;MAAE6E,KAAK,EAALA,KAAF;MAAS2C,MAAM,EAAE,KAAKZ,OAAL,CAAa5G,OAAb;KAAvC;SACKyH,MAAL;;;;;;;SAMFlD,SA1GF,GA0GE,mBAAUvE,OAAV,EAAiC;WACxB,KAAK4G,OAAL,CAAa5G,OAAb,CAAP;WACO,KAAK6G,MAAL,CAAY7G,OAAZ,CAAP;QACI,KAAKqC,OAAL,CAAayB,MAAb,IAAuB,IAA3B,EAAiC,KAAKzB,OAAL,CAAayB,MAAb,GAAsB,EAAtB;SAC5BzB,OAAL,CAAayB,MAAb,CAAoBC,IAApB,CAAyB/D,OAAzB;SACKyH,MAAL;;;;;;;SAMFF,UArHF,GAqHE,oBAAW9B,MAAX,EAAkCpG,CAAlC,EAAmD;QAC7C,KAAKgD,OAAL,CAAaqF,OAAb,IAAwB,IAA5B,EAAkC,KAAKrF,OAAL,CAAaqF,OAAb,GAAuB,EAAvB;SAC7BrF,OAAL,CAAaqF,OAAb,CAAqB3D,IAArB,CAA0B0B,MAA1B,EAFiD;;;;;;;SASnDa,QA9HF,GA8HE,kBAAS/F,QAAT,EAA2BqD,IAA3B,EAAyCyC,IAAzC,EAAsE;;;QAC9Dc,MAAM,GAAG,KAAKL,UAAL,EAAf;;QACMzE,OAAoB;MACxB8E,MAAM,EAANA,MADwB;MAExB5G,QAAQ,EAARA,QAFwB;MAGxBqD,IAAI,EAAJA;OACG3C,QAAQ,CAAC,IAAD,EAAOoF,IAAP,CAJa,CAA1B;;QAMI,KAAKhE,OAAL,CAAasF,KAAb,IAAsB,IAA1B,EAAgC,KAAKtF,OAAL,CAAasF,KAAb,GAAqB,EAArB;SAC3BtF,OAAL,CAAasF,KAAb,CAAmB5D,IAAnB,CAAwB1B,OAAxB;SACKoF,MAAL;WAEO,IAAItB,OAAJ,CAAY,UAACyB,OAAD,EAAUxB,MAAV,EAAqB;MACtC,KAAI,CAACW,YAAL,CAAkBI,MAAlB,IAA4B;QAAEvD,IAAI,EAAJA,IAAF;QAAQgE,OAAO,EAAPA,OAAR;QAAiBxB,MAAM,EAANA;OAA7C;KADK,CAAP;;;;;;;SAQF1B,SAlJF,GAkJE,mBAAU1E,OAAV,EAA2B4D,IAA3B,EAAyCa,OAAzC,EAA+D;QACvDpC,OAAqB;MACzBrC,OAAO,EAAPA,OADyB;MAEzB4D,IAAI,EAAJA;OACG3C,QAAQ,CAAC,IAAD,EAAOwD,OAAP,CAHc,CAA3B;;QAKI,KAAKpC,OAAL,CAAawF,MAAb,IAAuB,IAA3B,EAAiC,KAAKxF,OAAL,CAAawF,MAAb,GAAsB,EAAtB;SAC5BxF,OAAL,CAAawF,MAAb,CAAoB9D,IAApB,CAAyB1B,OAAzB;SACKoF,MAAL;;;;;;;SAMFK,UAhKF,GAgKE,oBAAWX,MAAX,EAA2BY,IAA3B,EAA0CnI,KAA1C,EAA8D;QACtDyC,OAAsB;MAC1B8E,MAAM,EAANA;OACIY,IAAI,GAAGxG,SAAS,CAAC,IAAD,EAAO3B,KAAP,CAAZ,GAA4BqB,QAAQ,CAAC,IAAD,EAAOrB,KAAP,CAFlB,CAA5B;;QAII,KAAKyC,OAAL,CAAa2F,OAAb,IAAwB,IAA5B,EAAkC,KAAK3F,OAAL,CAAa2F,OAAb,GAAuB,EAAvB;SAC7B3F,OAAL,CAAa2F,OAAb,CAAqBjE,IAArB,CAA0B1B,OAA1B;SACKoF,MAAL;;;;;;;;SAOFQ,aA9KF,GA8KE,uBAAc5F,OAAd,EAAsC;;;;;;;QAMhCA,OAAO,CAACqF,OAAZ,EAAqB;;4CAEErF,OAAO,CAACqF,OAFV,yCAEmB;YAA3BjC,MAAM,yBAAZ;aACEkB,OAAL,CAAalB,MAAM,CAACzF,OAApB,IAA+B4F,SAAS,CAAC,IAAD,EAAOH,MAAP,CAAxC;OAHiB;;;4CAOEpD,OAAO,CAACqF,OAPV,yCAOmB;YAA3BjC,OAAM,yBAAZ;QACHQ,iBAAiB,CAAC,IAAD,EAAO,KAAKU,OAAL,CAAalB,OAAM,CAACzF,OAApB,CAAP,EAAqCyF,OAAM,CAAChF,KAA5C,CAAjB;;KAdgC;;;QAmBhC4B,OAAO,CAAC6F,OAAZ,EAAqB;;4CAEE7F,OAAO,CAAC6F,OAFV,yCAEmB;YAA3BC,MAAM,yBAAZ;YACKnI,QAD4B,GACTmI,MADS,CAC5BnI,OAD4B;YACnBS,KADmB,GACT0H,MADS,CACnB1H,KADmB;YAE9BpB,CAAC,GAAG,KAAKsH,OAAL,CAAa3G,QAAb,CAAV;;YACIX,CAAC,IAAI,IAAT,EAAe;gBACP,IAAIoD,UAAJ,sBAAkCzC,QAAlC,CAAN;;;QAEFiG,iBAAiB,CAAC,IAAD,EAAO5G,CAAP,EAAUoB,KAAV,CAAjB;OARiB;;;4CAYE4B,OAAO,CAAC6F,OAZV,yCAYmB;YAA3BC,OAAM,yBAAZ;QACHxD,MAAM,CAAC,KAAKgC,OAAL,CAAawB,OAAM,CAACnI,OAApB,CAAD,CAAN;;KAhCgC;;;;;;QAyChCqC,OAAO,CAACwF,MAAZ,EAAoB;4CACExF,OAAO,CAACwF,MADV,0CACkB;YAAzBO,KAAK,yBAAX;YACKpI,SAD0B,GACRoI,KADQ,CAC1BpI,OAD0B;YACjB4D,IADiB,GACRwE,KADQ,CACjBxE,IADiB;;YAE5BvE,EAAC,GAAGW,SAAO,KAAK,CAAZ,GAAgB,IAAhB,GAAuB,KAAK2G,OAAL,CAAa3G,SAAb,CAAjC;;YACIX,EAAC,IAAI,IAAT,EAAe;;YACX;UACFmF,IAAI,CAACnF,EAAD,EAAIuE,IAAJ,EAAUpC,UAAU,CAAC,IAAD,EAAO4G,KAAP,EAAcxE,IAAd,CAApB,CAAJ;SADF,CAEE,OAAOkB,CAAP,EAAU;UACVN,IAAI,CAACnF,EAAD,EAAI,OAAJ,EAAayF,CAAb,CAAJ,CADU;;;KAhDoB;;;QAuDhCzC,OAAO,CAACsF,KAAZ,EAAmB;;YACNjI,IAAI,wBAAV;YACKyH,MAFO,GAEoBzH,IAFpB,CAEPyH,MAFO;YAEC5G,QAFD,GAEoBb,IAFpB,CAECa,QAFD;YAEWqD,IAFX,GAEoBlE,IAFpB,CAEWkE,IAFX;;YAIX;cACIvE,GAAC,GAAG,MAAI,CAACuH,OAAL,CAAarG,QAAb,CAAV;;cACIlB,GAAC,IAAI,IAAT,EAAe;kBACP,IAAIgB,SAAJ,0BACmBuD,IADnB,gCAAN;;;cAIE,OAAOvE,GAAC,CAACuE,IAAD,CAAR,KAAmB,UAAvB,EAAmC;kBAC3B,IAAIvD,SAAJ,OAAkBuD,IAAlB,yBAAN;;;cAEIyC,IAAI,GAAG7E,UAAU,CAAC,MAAD,EAAO9B,IAAP,EAAgBkE,IAAhB,gBAAvB;UACAuC,OAAO,CAACyB,OAAR,CAAgBvI,GAAC,CAACuE,IAAD,CAAD,CAAQyE,KAAR,CAAchJ,GAAd,EAAiBgH,IAAjB,CAAhB,EAAwCrB,IAAxC,CACE,UAAApF,KAAK;mBAAI,MAAI,CAACkI,UAAL,CAAgBX,MAAhB,EAAwB,KAAxB,EAA+BvH,KAA/B,CAAJ;WADP,EAEE,UAAAkF,CAAC;mBAAI,MAAI,CAACgD,UAAL,CAAgBX,MAAhB,EAAwB,IAAxB,EAA8BrC,CAA9B,CAAJ;WAFH;SAXF,CAeE,OAAOA,CAAP,EAAU;UACV,MAAI,CAACgD,UAAL,CAAgBX,MAAhB,EAAwB,IAAxB,EAA8BrC,CAA9B;;;;2CAnBezC,OAAO,CAACsF,KADV,yCACiB;;;KAxDA;;;QAiFhCtF,OAAO,CAAC2F,OAAZ,EAAqB;6CACD3F,OAAO,CAAC2F,OADP,2CACgB;YAAxBM,GAAG,0BAAT;YACKnB,QADyB,GACdmB,GADc,CACzBnB,MADyB;YAE3BoB,WAAW,GAAG,KAAKxB,YAAL,CAAkBI,QAAlB,CAApB;;YACIoB,WAAW,IAAI,IAAnB,EAAyB;gBACjB,IAAI9F,UAAJ,qBAAiC0E,QAAjC,CAAN;;;YAEE;UACFoB,WAAW,CAACX,OAAZ,CACEpG,UAAU,CAAC,IAAD,EAAO8G,GAAP,EAAeC,WAAW,CAAC3E,IAA3B,aADZ;SADF,CAIE,OAAOkB,CAAP,EAAU;UACVyD,WAAW,CAACnC,MAAZ,CAAmBtB,CAAnB;SALF,SAMU;iBACD,KAAKiC,YAAL,CAAkBI,QAAlB,CAAP;;;KA/F8B;;;;;QAwGhC9E,OAAO,CAACyB,MAAZ,EAAoB;4CACIzB,OAAO,CAACyB,MADZ,0CACoB;YAA3B9D,SAAO,yBAAb;YACGX,GAAC,GAAG,KAAKsH,OAAL,CAAa3G,SAAb,CAAV;YACIX,GAAC,IAAI,IAAT,EAAe;eACR,KAAKsH,OAAL,CAAa3G,SAAb,CAAP;;QACAoE,KAAK,CAAC/E,GAAD,CAAL;;;;;;;;;SAQNmJ,OAnSF,GAmSE,mBAAgB;QACV,KAAK1E,MAAT,EAAiB,OADH;;SAIT,IAAM2E,EAAX,IAAiB,KAAK9C,KAAtB,EAA6B;UACrB3F,SAAO,GAAGoH,MAAM,CAACqB,EAAD,CAAtB;;iCAC0B,KAAK9C,KAAL,CAAW3F,SAAX,CAFC;UAEnBwH,MAFmB,wBAEnBA,MAFmB;UAEX3C,KAFW,wBAEXA,KAFW;;wBAGFa,UAAU,CAAC,IAAD,EAAO8B,MAAP,EAAe3C,KAAf,CAHR;UAGnBc,KAHmB,eAGnBA,KAHmB;UAGZlF,KAHY,eAGZA,KAHY;;UAIvBkF,KAAJ,EAAW;YACHtD,QAAsB,GAAG;UAAErC,OAAO,EAAPA,SAAF;UAAWS,KAAK,EAALA;SAA1C;YACI,KAAK4B,OAAL,CAAa6F,OAAb,IAAwB,IAA5B,EAAkC,KAAK7F,OAAL,CAAa6F,OAAb,GAAuB,EAAvB;aAC7B7F,OAAL,CAAa6F,OAAb,CAAqBnE,IAArB,CAA0B1B,QAA1B;;;;QAIEA,OAAO,GAAG,KAAKA,OAArB;SACKsD,KAAL,GAAa,EAAb;SACKtD,OAAL,GAAe,EAAf;SACKoE,WAAL,CAAiBpE,OAAjB;;;;;;;SAMFoF,MA3TF,GA2TE,kBAAe;;;QACT,KAAKR,WAAT,EAAsB;SAEjBA,WAAL,GAAmB,IAAnB;;QACMyB,IAAI,GAAG,SAAPA,IAAO,GAAM;MACjB,MAAI,CAACzB,WAAL,GAAmB,KAAnB;MACA,MAAI,CAACD,UAAL,GAAkBpF,IAAI,CAAC+G,GAAL,EAAlB;;MACA,MAAI,CAACH,OAAL;KAHF,CAJa;;;;QAYPI,KAAK,GAAG,KAAK5B,UAAL,GAAkB,KAAKN,UAAvB,GAAoC9E,IAAI,CAAC+G,GAAL,EAAlD;IACAE,UAAU,CAACH,IAAD,EAAOE,KAAK,GAAG,CAAR,GAAY,CAAZ,GAAgBA,KAAvB,CAAV;GAxUJ;;;;AA4UA/I,aAAa,CAAC0G,WAAD,CAAb;;AC7VA;;;;;;;AAwBA,IAAauC,MAAb;;AAAA;kBAIctC,IAAZ,EAAiC;;;SAC1BuC,MAAL,GAAc,IAAIxC,WAAJ,CAAgBC,IAAhB,CAAd;SACKwC,YAAL,GAAoB,IAAI7C,OAAJ,CAAY,UAAAyB,OAAO;aACrCjE,WAAW,CAAC,KAAI,CAACoF,MAAN,EAAc,MAAd,EAAsBnB,OAAtB,CAD0B;KAAnB,CAApB;;;;;SAKFK,aAXF,GAWE,uBAAc5F,OAAd,EAAuC;SAChC0G,MAAL,CAAYd,aAAZ,CAA0B5F,OAA1B;GAZJ;;SAeE4G,OAfF,GAeE,mBAAU;WACD,KAAKD,YAAZ;GAhBJ;;SAmBEE,QAnBF,GAmBE,kBAASC,IAAT,EAAuB;SAChBJ,MAAL,CAAYrE,SAAZ,CAAsB,CAAtB,EAAyB,MAAzB,EAAiCyE,IAAjC;GApBJ;;SAuBE/E,KAvBF,GAuBE,eAAM8C,KAAN,EAAoB;SACb6B,MAAL,CAAY3E,KAAZ,CAAkB8C,KAAlB;GAxBJ;;;;;;;;;;AAiCA,AAAO,SAASkC,eAAT,CAA4B/J,CAA5B,EAAkCmH,IAAlC,EAAoE;MAAlCA,IAAkC;IAAlCA,IAAkC,GAAP,EAAO;;;WAChE6C,QAAT,CAAkBC,CAAlB,EAAqC;WAC5BA,CAAP;;;cAE8C9C,IAJyB;iCAIjE+C,YAJiE;MAIjEA,YAJiE,mCAIlDF,QAJkD;MAIxC3C,UAJwC,SAIxCA,UAJwC;MAMnE8C,WAAW,GAAG,IAAIjD,WAAJ,CAAgB;IAClCE,WADkC,uBACtBpE,OADsB,EACb;MACnBoH,WAAW,CAACxB,aAAZ,CAA0BsB,YAAY,CAAClH,OAAD,CAAtC;KAFgC;IAIlCqE,UAAU,EAAVA;GAJkB,CAApB;MAMM+C,WAAW,GAAG,IAAIlD,WAAJ,CAAgB;IAClCE,WADkC,uBACtBpE,OADsB,EACb;MACnBmH,WAAW,CAACvB,aAAZ,CAA0BsB,YAAY,CAAClH,OAAD,CAAtC;KAFgC;IAIlCqE,UAAU,EAAVA;GAJkB,CAApB;MAOMxF,IAAI,GAAGqI,YAAY,CAACtI,QAAQ,CAACuI,WAAD,EAAcnK,CAAd,CAAT,CAAzB;EACAmK,WAAW,CAAChB,OAAZ;SACOhH,UAAU,CAACiI,WAAD,EAAcF,YAAY,CAACrI,IAAD,CAA1B,EAAkC,MAAlC,CAAjB;;;AC/EF;;;;;AAIA,IAAawI,QAAkB,GAAG,SAASC,EAAT,CAAY/F,IAAZ,EAAkBC,CAAlB,EAAqB;SAC9CF,WAAW,CAAC,IAAD,EAAOC,IAAP,EAAaC,CAAb,CAAlB;CADK;;;;;;AAQP,IAAa+F,WAAqB,GAAG,SAASC,KAAT,CAAejG,IAAf,EAAqBC,CAArB,EAAwB;SACpDK,UAAU,CAAC,IAAD,EAAON,IAAP,EAAaC,CAAb,CAAjB;CADK;AAIPnD,SAAS,CAAC;EAAEgJ,QAAQ,EAARA,QAAF;EAAYE,WAAW,EAAXA;CAAb,CAAT;;;;;AAKA,IAAaE,UAAb;;AAAA;;;;;SAIEC,MAJF,GAIE,kBAAS;IACP3F,KAAK,CAAC,IAAD,CAAL;GALJ;;SAQE4F,KARF,GAQE,eACEpG,IADF,EAEEa,OAFF,EAGS;WACAD,IAAI,CAAC,IAAD,EAAOZ,IAAP,EAAaa,OAAb,CAAX;GAZJ;;SAeEwF,OAfF,GAeE,iBAAQrG,IAAR,EAA6B;IAC3Be,MAAM,CAAC,IAAD,EAAOf,IAAP,CAAN;GAhBJ;;;;;AAqBA,IAAMsG,IAAS,GAAGJ,UAAU,CAACtK,SAA7B;AACA0K,IAAI,CAACP,EAAL,GAAUD,QAAV;AACAQ,IAAI,CAACL,KAAL,GAAaD,WAAb;AAEA/J,aAAa,CAACiK,UAAD,CAAb;;;;;;;;;;;;;;"}

@@ -192,2 +192,3 @@ import { base64 } from 'rfc4648';

if (data instanceof Error) return 'e';
if (data instanceof ArrayBuffer) return 'ab';
if (data instanceof Uint8Array) return 'u8';

@@ -296,2 +297,5 @@

case 'ab':
return base64.stringify(new Uint8Array(data));
case 'u8':

@@ -406,2 +410,9 @@ return base64.stringify(data);

case 'ab':
if (typeof raw !== 'string') {
throw new TypeError("Expecting a base64 string at " + path);
}
return base64.parse(raw).buffer;
case 'u8':

@@ -408,0 +419,0 @@ if (typeof raw !== 'string') {

@@ -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\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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"}
{"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 | 'ab' // ArrayBuffer\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 ArrayBuffer) return 'ab'\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 'ab':\n return base64.stringify(new Uint8Array(data))\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 'ab':\n if (typeof raw !== 'string') {\n throw new TypeError(`Expecting a base64 string at ${path}`)\n }\n return base64.parse(raw).buffer\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","ArrayBuffer","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","buffer","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.5",
"version": "0.3.6",
"description": "Bridges an object-oriented API across a messaging layer",

@@ -26,3 +26,3 @@ "repository": {

"flow": "flow",
"lint": "eslint --ignore-path .gitignore .",
"lint": "eslint --ext .js,.ts .",
"precommit": "lint-staged && flow && npm test && npm run build",

@@ -39,3 +39,3 @@ "prepare": "npm run build",

"lint-staged": {
"*.js": "eslint"
"*.{js,ts}": "eslint"
},

@@ -52,2 +52,3 @@ "dependencies": {

"@typescript-eslint/parser": "^2.0.0",
"assert-log": "^0.2.1",
"babel-eslint": ">=10.0.0",

@@ -54,0 +55,0 @@ "chai": "^4.1.2",

@@ -37,2 +37,3 @@ // @flow

| 'u' // Undefined
| 'ab' // ArrayBuffer
| 'u8' // Uint8Array

@@ -122,2 +123,3 @@

if (data instanceof Error) return 'e'
if (data instanceof ArrayBuffer) return 'ab'
if (data instanceof Uint8Array) return 'u8'

@@ -214,2 +216,5 @@ if (data[MAGIC_KEY] != null) {

case 'ab':
return base64.stringify(new Uint8Array(data))
case 'u8':

@@ -317,2 +322,8 @@ return base64.stringify(data)

case 'ab':
if (typeof raw !== 'string') {
throw new TypeError(`Expecting a base64 string at ${path}`)
}
return base64.parse(raw).buffer
case 'u8':

@@ -319,0 +330,0 @@ if (typeof raw !== 'string') {

@@ -52,3 +52,3 @@ /**

*/
export declare const onMethod: Function
export declare function onMethod(name: string, f: Function): CallbackRemover

@@ -59,3 +59,3 @@ /**

*/
export declare const watchMethod: Function
export declare function watchMethod(name: string, f: Function): CallbackRemover

@@ -76,6 +76,3 @@ /**

export declare function bridgifyObject<Type extends object>(o: Type): Type
export declare function shareData(
table: { [name: string]: object },
namespace?: string
): void
export declare function shareData(table: object, namespace?: string): void

@@ -82,0 +79,0 @@ export declare function close(o: object): unknown

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