ironflock 1.5.3 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -7
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +92 -6
- package/dist/index.mjs +977 -857
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../node_modules/eventemitter3/index.js","../src/crossbar/index.ts","../node_modules/typia/lib/internal/_isTypeUint32.mjs","../node_modules/typia/lib/internal/_isFormatDateTime.mjs","../node_modules/typia/lib/internal/_validateReport.mjs","../node_modules/typia/lib/internal/_createStandardSchema.mjs","../src/types.ts","../src/consumedApp.ts","../src/ironflock.ts"],"sourcesContent":["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import autobahn from \"autobahn\";\nimport { EventEmitter } from \"eventemitter3\";\nimport { Stage } from \"../types\";\n\nexport type Details = { caller_authid: string; caller_authrole: string };\n\nexport type AuthPayload = {\n success: boolean;\n role: string;\n realm: string;\n authid: string;\n extra: {\n username: string;\n };\n};\n\nconst DATAPODS_WS_URI = \"wss://cbw.datapods.io/ws-ua-usr\";\nconst STUDIO_WS_URI = \"wss://cbw.ironflock.com/ws-ua-usr\";\nconst STUDIO_DEV_WS_URI = \"wss://cbw.ironflock.dev/ws-ua-usr\";\nconst STUDIO_WS_URI_OLD = \"wss://cbw.record-evolution.com/ws-ua-usr\";\nconst LOCALHOST_WS_URI = \"ws://localhost:8080/ws-ua-usr\";\n// A RESWARM_URL of host.docker.internal means the app runs inside a\n// bridge-network container (mac/windows dev stack), where localhost is the\n// container itself — the router on the host is only reachable the same way.\nconst DOCKER_HOST_WS_URI = \"ws://host.docker.internal:8080/ws-ua-usr\";\n\nconst socketURIMap: Record<string, string> = {\n \"https://studio.datapods.io\": DATAPODS_WS_URI,\n \"https://studio.ironflock.dev\": STUDIO_DEV_WS_URI,\n \"https://studio.ironflock.com\": STUDIO_WS_URI,\n \"https://studio.record-evolution.com\": STUDIO_WS_URI_OLD,\n \"http://localhost:8085\": LOCALHOST_WS_URI,\n \"http://localhost:8086\": LOCALHOST_WS_URI,\n \"http://host.docker.internal:8086\": DOCKER_HOST_WS_URI,\n};\n\nconst SESSION_WAIT_TIMEOUT = 6000;\n\n// WAMP close reasons meaning the router rejected our credentials/role.\n// Retrying cannot succeed until the credential or grant changes.\nconst FATAL_AUTH_CLOSE_REASONS = [\n \"wamp.error.not_authorized\",\n \"wamp.error.authorization_failed\",\n \"wamp.error.authentication_failed\",\n \"wamp.error.no_auth_method\",\n];\n\nexport class CrossbarConnection extends EventEmitter {\n session?: autobahn.Session;\n connection?: autobahn.Connection;\n serial_number?: string;\n socketURI?: string;\n realm?: string;\n /**\n * Opt-in (used for consumed-app connections): treat an auth/authorization\n * denial on close as fatal — stop all reconnect attempts and emit\n * \"auth_failure\" instead of retrying forever. The primary own-realm\n * connection keeps the default (false): retry through every failure.\n */\n failOnAuthError = false;\n\n private subscriptions: autobahn.Subscription[] = [];\n private registrations: autobahn.Registration[] = [];\n private firstConnection?: Promise<void>;\n private firstResolver: () => void = () => undefined;\n private firstRejecter: (reason?: any) => void = () => undefined;\n private shouldReconnect: boolean = false;\n private isReconnecting: boolean = false;\n private hasOpenedOnce: boolean = false;\n\n constructor() {\n super();\n }\n\n static getWebSocketURI(reswarmUrl?: string): string {\n // Prefer DEVICE_ENDPOINT_URL: replace its path with /ws-ua-usr.\n // Set by the device agent for every app container it spawns.\n const deviceEndpoint = typeof process !== \"undefined\" ? process.env?.DEVICE_ENDPOINT_URL : undefined;\n if (deviceEndpoint) {\n try {\n const url = new URL(deviceEndpoint);\n url.pathname = \"/ws-ua-usr\";\n return url.toString().replace(/\\/$/, \"\");\n } catch {\n // Invalid URL, fall through to other methods\n }\n }\n\n if (!reswarmUrl) return STUDIO_WS_URI;\n\n const mapped = socketURIMap[reswarmUrl];\n if (mapped === undefined) {\n // Unknown reswarmUrl (typically an appliance / private deployment\n // whose URL isn't in the static cloud map). Falling back to the\n // public STUDIO_WS_URI would silently connect appliance apps to\n // the wrong router. Throw so the operator knows to set\n // DEVICE_ENDPOINT_URL (or pass ironFlockUrl=).\n throw new Error(\n `Cannot resolve WebSocket URI for reswarmUrl=${JSON.stringify(reswarmUrl)}. ` +\n `Set DEVICE_ENDPOINT_URL to the deployment's WAMP router URL ` +\n `(e.g. ws://<host>:18080/ws-re-dev) or pass ironFlockUrl=… ` +\n `to IronFlock(). Known cloud URLs: ${JSON.stringify(Object.keys(socketURIMap))}`\n );\n }\n return mapped;\n }\n\n configure(\n swarmKey: number,\n appKey: number,\n stage: Stage,\n serialNumber: string,\n cburl?: string\n ) {\n this.realm = `realm-${swarmKey}-${appKey}-${stage}`;\n this.serial_number = serialNumber;\n this.socketURI = cburl ?? CrossbarConnection.getWebSocketURI();\n }\n\n async start(): Promise<void> {\n if (!this.realm || !this.serial_number || !this.socketURI) {\n throw new Error(\"CrossbarConnection must be configured before starting. Call configure() first.\");\n }\n\n this.shouldReconnect = true;\n this.firstConnection = new Promise((resolve, reject) => {\n this.firstResolver = resolve;\n this.firstRejecter = reject;\n });\n\n this.connection = new autobahn.Connection({\n realm: this.realm,\n url: this.socketURI,\n authmethods: [\"wampcra\"],\n authid: this.serial_number,\n max_retries: -1,\n max_retry_delay: 2,\n initial_retry_delay: 1,\n // @ts-ignore\n autoping_interval: 2,\n autoping_timeout: 4,\n onchallenge: (_session, _method, extra) => {\n return autobahn.auth_cra.sign(this.serial_number!, extra.challenge);\n },\n });\n\n this.connection.onopen = this.onOpen.bind(this);\n this.connection.onclose = this.onClose.bind(this);\n this.connection.open();\n\n return this.firstConnection;\n }\n\n private onOpen(session: autobahn.Session) {\n this.session = session;\n this.session.caller_disclose_me = true;\n this.hasOpenedOnce = true;\n\n this.resubscribeAll();\n this.reregisterAll();\n this.emit(\"connected\", this.serial_number);\n\n this.firstResolver();\n this.firstResolver = () => undefined;\n }\n\n private onClose(reason: string, details: any): boolean {\n this.session = undefined;\n this.emit(\"disconnected\");\n\n this.firstRejecter(\n new Error(\n `Connection failed: ${reason} - ${JSON.stringify(details, null, 2)}`\n )\n );\n this.firstRejecter = () => undefined;\n\n console.warn(\"Connection closed:\", {\n reason,\n details,\n realm: this.realm,\n url: this.socketURI,\n authid: this.serial_number,\n });\n\n // Fatal-auth path (opt-in): the router refused our credentials/role\n // (WAMP ABORT surfaces here as details.reason = the error URI, e.g.\n // after a cross-app grant was revoked). Retrying can never succeed,\n // so stop autobahn's retry loop (return true) and skip the manual\n // reconnect below.\n const closeReason = details?.reason ?? reason;\n if (\n this.failOnAuthError &&\n typeof closeReason === \"string\" &&\n FATAL_AUTH_CLOSE_REASONS.includes(closeReason)\n ) {\n this.shouldReconnect = false;\n this.emit(\"auth_failure\", closeReason, details);\n return true;\n }\n\n // Autobahn disables auto-reconnect (`_retry = false`) whenever the\n // server sends a WAMP GOODBYE or ABORT — most importantly the\n // router's `wamp.close.system_shutdown` on restart. Drive\n // reconnection ourselves; `onOpen` will then re-run resubscribeAll\n // and reregisterAll. Gate on `hasOpenedOnce` so first-connect\n // failures (bad auth, no such realm) still surface to the awaiting\n // `start()` call instead of looping silently.\n if (this.shouldReconnect && this.hasOpenedOnce && details?.will_retry === false) {\n this.handleManualReconnect(details?.reason ?? reason);\n }\n\n // return false to let autobahn handle auto-reconnect\n return false;\n }\n\n private async handleManualReconnect(reason: string) {\n if (this.isReconnecting || !this.shouldReconnect) {\n return;\n }\n this.isReconnecting = true;\n while (this.shouldReconnect && !this.session) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n if (this.shouldReconnect && this.connection && !this.session) {\n console.log(`Manually retrying connection after ${reason}...`);\n try {\n this.connection.open();\n await new Promise((resolve) => setTimeout(resolve, 500));\n } catch (error) {\n console.error(\"Error during manual reconnection attempt:\", error);\n }\n }\n }\n this.isReconnecting = false;\n }\n\n private async sessionWait() {\n const startTime = Date.now();\n while (!this.session) {\n if (Date.now() - startTime > SESSION_WAIT_TIMEOUT) {\n throw new Error(\"Timeout waiting for session\");\n }\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n }\n\n async waitForConnection() {\n return this.firstConnection;\n }\n\n getSession() {\n return this.session;\n }\n\n get is_open(): boolean {\n return !!this.session?.isOpen;\n }\n\n isConnected() {\n return this.is_open;\n }\n\n stop() {\n this.shouldReconnect = false;\n this.connection?.close(\"wamp.close.normal\", \"Connection closed by client\");\n }\n\n async subscribe(\n topic: string,\n handler: autobahn.SubscribeHandler\n ): Promise<autobahn.Subscription | undefined> {\n await this.sessionWait();\n const sub = await this.session?.subscribe(topic, handler);\n if (sub) {\n this.subscriptions.push(sub);\n }\n return sub;\n }\n\n async unsubscribe(sub: autobahn.Subscription) {\n await this.sessionWait();\n const idx = this.subscriptions.indexOf(sub);\n if (idx !== -1) {\n this.subscriptions.splice(idx, 1);\n await this.session?.unsubscribe(sub);\n }\n }\n\n async unsubscribeTopic(topic: string) {\n const matching = this.subscriptions.filter((sub) => sub.topic === topic);\n for (const sub of matching) {\n await this.unsubscribe(sub);\n }\n }\n\n private async resubscribeAll() {\n const previous = [...this.subscriptions];\n this.subscriptions = [];\n await Promise.all(\n previous.map((sub) => this.subscribe(sub.topic, sub.handler))\n );\n }\n\n private async reregisterAll() {\n const previous = [...this.registrations];\n this.registrations = [];\n await Promise.all(\n previous.map((reg) => this.register(reg.procedure, reg.endpoint, reg.options))\n );\n }\n\n async register(\n topic: string,\n endpoint: autobahn.RegisterEndpoint,\n options?: autobahn.IRegisterOptions\n ): Promise<autobahn.IRegistration | undefined> {\n await this.sessionWait();\n const effectiveOptions = { force_reregister: true, ...(options ?? {}) };\n const registration = await this.session?.register(topic, endpoint, effectiveOptions);\n if (registration) {\n this.registrations.push(registration);\n }\n return registration;\n }\n\n async unregister(registration: autobahn.Registration) {\n await this.sessionWait();\n await this.session?.unregister(registration);\n const idx = this.registrations.indexOf(registration);\n if (idx !== -1) {\n this.registrations.splice(idx, 1);\n }\n }\n\n async call<T>(\n procedure: string,\n args?: any[],\n kwargs?: object,\n options?: any\n ) {\n await this.sessionWait();\n return this.session?.call<T>(procedure, args, kwargs, options);\n }\n\n async publish(\n topic: string,\n args?: any[],\n kwargs?: object,\n options?: any\n ) {\n await this.sessionWait();\n return this.session?.publish(topic, args, kwargs, options);\n }\n}\n","const _isTypeUint32 = (value) => Math.floor(value) === value && MINIMUM <= value && value <= MAXIMUM;\nconst MINIMUM = 0;\nconst MAXIMUM = 2 ** 32 - 1;\n\nexport { _isTypeUint32 };\n//# sourceMappingURL=_isTypeUint32.mjs.map\n","const _isFormatDateTime = (str) => PATTERN.test(str);\nconst PATTERN = /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])(T|\\s)([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]{1,9})?(Z|[+-]([01][0-9]|2[0-3]):[0-5][0-9])$/i;\n\nexport { _isFormatDateTime };\n//# sourceMappingURL=_isFormatDateTime.mjs.map\n","const _validateReport = (array) => {\n const reportable = (path) => {\n if (array.length === 0)\n return true;\n const last = array[array.length - 1].path;\n return path.length > last.length || last.substring(0, path.length) !== path;\n };\n return (exceptable, error) => {\n if (exceptable && reportable(error.path)) {\n if (error.value === undefined)\n error.description ??= [\n \"The value at this path is `undefined`.\",\n \"\",\n `Please fill the \\`${error.expected}\\` typed value next time.`,\n ].join(\"\\n\");\n array.push(error);\n }\n return false;\n };\n};\n\nexport { _validateReport };\n//# sourceMappingURL=_validateReport.mjs.map\n","const _createStandardSchema = (fn) => Object.assign(fn, {\n \"~standard\": {\n version: 1,\n vendor: \"typia\",\n validate: (input) => {\n const result = fn(input);\n if (result.success) {\n return {\n value: result.data,\n };\n }\n else {\n return {\n issues: result.errors.map((error) => ({\n message: `expected ${error.expected}, got ${error.value}`,\n path: typiaPathToStandardSchemaPath(error.path),\n })),\n };\n }\n },\n },\n});\nvar PathParserState;\n(function (PathParserState) {\n // Start of a new segment\n // When the parser is in this state,\n // the pointer must point `.` or `[` or equal to length of the path\n PathParserState[PathParserState[\"Start\"] = 0] = \"Start\";\n // Parsing a property key (`.hoge`)\n PathParserState[PathParserState[\"Property\"] = 1] = \"Property\";\n // Parsing a string key (`[\"fuga\"]`)\n PathParserState[PathParserState[\"StringKey\"] = 2] = \"StringKey\";\n // Parsing a number key (`[42]`)\n PathParserState[PathParserState[\"NumberKey\"] = 3] = \"NumberKey\";\n})(PathParserState || (PathParserState = {}));\nconst typiaPathToStandardSchemaPath = (path) => {\n if (!path.startsWith(\"$input\")) {\n throw new Error(`Invalid path: ${JSON.stringify(path)}`);\n }\n const segments = [];\n let currentSegment = \"\";\n let state = PathParserState.Start;\n let index = \"$input\".length - 1;\n while (index < path.length - 1) {\n index++;\n const char = path[index];\n if (state === PathParserState.Property) {\n if (char === \".\" || char === \"[\") {\n // End of property\n segments.push({\n key: currentSegment,\n });\n state = PathParserState.Start;\n }\n else if (index === path.length - 1) {\n // End of path\n currentSegment += char;\n segments.push({\n key: currentSegment,\n });\n index++;\n state = PathParserState.Start;\n }\n else {\n currentSegment += char;\n }\n }\n else if (state === PathParserState.StringKey) {\n if (char === '\"') {\n // End of string key\n segments.push({\n key: JSON.parse(currentSegment + char),\n });\n // Skip `\"` and `]`\n index += 2;\n state = PathParserState.Start;\n }\n else if (char === \"\\\\\") {\n // Skip the next character from parsing\n currentSegment += path[index];\n index++;\n currentSegment += path[index];\n }\n else {\n currentSegment += char;\n }\n }\n else if (state === PathParserState.NumberKey) {\n if (char === \"]\") {\n // End of number key\n segments.push({\n key: Number.parseInt(currentSegment),\n });\n index++;\n state = PathParserState.Start;\n }\n else {\n currentSegment += char;\n }\n }\n if (state === PathParserState.Start && index < path.length - 1) {\n const newChar = path[index];\n currentSegment = \"\";\n if (newChar === \"[\") {\n if (path[index + 1] === '\"') {\n // Start of string key\n // NOTE: Typia uses JSON.stringify for this kind of keys, so `'` will not used as a string delimiter\n state = PathParserState.StringKey;\n index++;\n currentSegment = '\"';\n }\n else {\n // Start of number key\n state = PathParserState.NumberKey;\n }\n }\n else if (newChar === \".\") {\n // Start of property\n state = PathParserState.Property;\n }\n else {\n throw new Error(\"Unreachable: pointer points invalid character\");\n }\n }\n }\n if (state !== PathParserState.Start) {\n throw new Error(`Failed to parse path: ${JSON.stringify(path)}`);\n }\n return segments;\n};\n\nexport { _createStandardSchema };\n//# sourceMappingURL=_createStandardSchema.mjs.map\n","import typia, { tags } from \"typia\";\n\nexport enum Stage {\n DEVELOPMENT = \"dev\",\n PRODUCTION = \"prod\",\n}\n\nexport interface ISOTimeRange {\n start: string & tags.Format<\"date-time\">;\n end: string & tags.Format<\"date-time\">;\n}\n\nexport interface SQLFilterAnd {\n column: string & tags.MinLength<1>;\n operator: string & tags.MinLength<1>;\n value: string | number | boolean | Array<string | number>;\n}\n\nexport interface TableQueryParams {\n limit: number & tags.Type<\"uint32\"> & tags.Minimum<1> & tags.Maximum<10000>;\n offset?: number & tags.Type<\"uint32\"> & tags.Minimum<0>;\n timeRange?: ISOTimeRange;\n filterAnd?: SQLFilterAnd[];\n}\n\nexport interface LocationParams {\n longitude: number & tags.Minimum<-180> & tags.Maximum<180>;\n latitude: number & tags.Minimum<-90> & tags.Maximum<90>;\n}\n\nexport interface PublishParams {\n topic: string & tags.MinLength<1>;\n args?: unknown[];\n kwargs?: Record<string, unknown>;\n}\n\nexport interface CallParams {\n deviceKey: string & tags.MinLength<1>;\n topic: string & tags.MinLength<1>;\n args?: unknown[];\n kwargs?: Record<string, unknown>;\n}\n\nexport interface TableParams {\n tablename: string & tags.MinLength<1>;\n args?: unknown[];\n kwargs?: Record<string, unknown>;\n}\n\nexport interface BulkTableParams {\n tablename: string & tags.MinLength<1>;\n rows: Record<string, unknown>[] & tags.MinItems<1>;\n kwargs?: Record<string, unknown>;\n}\n\n/** Down-sampling aggregation applied per time bucket in a series query. */\nexport type DownSampleMethod = \"AVG\" | \"SUM\" | \"COUNT\" | \"MIN\" | \"MAX\" | \"FIRST\" | \"LAST\";\n\n/**\n * [start, end] tuple — ISO date-time strings or epoch-ms numbers; null = open end.\n * Mirrors fleetdb's TimeRangeInput (a tuple, unlike TableQueryParams.timeRange).\n */\nexport type SeriesTimeRange = [string | null, string | null] | [number | null, number | null];\n\n/** Query parameters for `history.transformed.series.{tablename}` (mirrors fleetdb's SeriesQueryParams). */\nexport interface SeriesQueryParams {\n /** Numeric columns to down-sample. */\n metrics: string[];\n method: DownSampleMethod;\n limit: number & tags.Type<\"uint32\"> & tags.Minimum<1> & tags.Maximum<10000>;\n /** Required — the series RPC rejects queries without a time range. */\n timeRange: SeriesTimeRange;\n groupBy?: string[] | null;\n filterAnd?: SQLFilterAnd[] | null;\n}\n\n/** A non-private table or transform another app shares, as listed in its catalog. */\nexport interface ProviderTableInfo {\n tablename: string;\n description?: string;\n /** Column definitions as declared in the provider's data-template. */\n columns?: Array<Record<string, unknown>>;\n}\n\n/** Per-stage catalog of what a provider app shares. */\nexport interface ConsumedAppStageCatalog {\n tables: ProviderTableInfo[];\n transforms: ProviderTableInfo[];\n}\n\n/**\n * Result of `sys.appaccess.resolve`. A stage is present only when the provider's\n * data backend exists for that stage; catalogs list non-private entries only.\n */\nexport interface ConsumedAppInfo {\n app: string;\n provider_app_key: number;\n stages: {\n dev?: ConsumedAppStageCatalog;\n prod?: ConsumedAppStageCatalog;\n };\n}\n\nexport const validateTableQueryParams = typia.createValidate<TableQueryParams>();\nexport const validateSeriesQueryParams = typia.createValidate<SeriesQueryParams>();\nexport const validateLocationParams = typia.createValidate<LocationParams>();\nexport const validatePublishParams = typia.createValidate<PublishParams>();\nexport const validateCallParams = typia.createValidate<CallParams>();\nexport const validateTableParams = typia.createValidate<TableParams>();\nexport const validateBulkTableParams = typia.createValidate<BulkTableParams>();\n","import { CrossbarConnection } from \"./crossbar\";\nimport {\n validateTableQueryParams,\n validateSeriesQueryParams,\n type TableQueryParams,\n type SeriesQueryParams,\n type ProviderTableInfo,\n type ConsumedAppStageCatalog,\n} from \"./types\";\n\nexport type CrossAppAccessErrorCode =\n | \"NO_GRANT\"\n | \"PROVIDER_NOT_INSTALLED\"\n | \"UNKNOWN_APP\"\n | \"PRIVATE_TABLE\"\n | \"NOT_AUTHORIZED\";\n\nconst WAMP_ERROR_CODE_MAP: Record<string, CrossAppAccessErrorCode> = {\n \"sys.appaccess.error.no_grant\": \"NO_GRANT\",\n \"sys.appaccess.error.provider_not_installed\": \"PROVIDER_NOT_INSTALLED\",\n \"sys.appaccess.error.unknown_app\": \"UNKNOWN_APP\",\n \"wamp.error.not_authorized\": \"NOT_AUTHORIZED\",\n \"wamp.error.authorization_failed\": \"NOT_AUTHORIZED\",\n \"wamp.error.authentication_failed\": \"NOT_AUTHORIZED\",\n};\n\n/** Raised when reading another app's data backend is declined or misused. */\nexport class CrossAppAccessError extends Error {\n readonly code: CrossAppAccessErrorCode;\n\n constructor(code: CrossAppAccessErrorCode, message?: string) {\n super(message ?? code);\n this.name = \"CrossAppAccessError\";\n this.code = code;\n }\n}\n\n/**\n * Maps a WAMP rejection (autobahn Error: `{error: <uri>, args, kwargs}`) to a\n * CrossAppAccessError, or returns null when the URI is not a cross-app access\n * condition (caller should rethrow the original error).\n */\nexport function mapWampError(e: unknown): CrossAppAccessError | null {\n const uri = (e as { error?: unknown })?.error;\n if (typeof uri !== \"string\") return null;\n const code = WAMP_ERROR_CODE_MAP[uri];\n if (!code) return null;\n const args = (e as { args?: unknown[] }).args;\n const detail = Array.isArray(args) && args.length > 0 ? `: ${JSON.stringify(args[0])}` : \"\";\n return new CrossAppAccessError(code, `${uri}${detail}`);\n}\n\n/**\n * Read-only handle on another app's data backend, returned by\n * {@link IronFlock.connectToApp}. Wraps a dedicated WAMP connection to the\n * provider's realm; the router restricts it to subscribing `transformed.*`\n * and calling `history.transformed.*`. Transforms (views) are consumable\n * exactly like tables — same topic/RPC names — except for series history,\n * which exists for tables only.\n */\nexport class ConsumedApp {\n /** Provider app name, as declared in `consumes:`. */\n readonly app: string;\n /** Provider stage this handle is connected to. */\n readonly stage: \"dev\" | \"prod\";\n /** Non-private tables the provider shares on this stage. */\n readonly tables: ProviderTableInfo[];\n /** Non-private transforms (views) the provider shares on this stage. */\n readonly transforms: ProviderTableInfo[];\n\n private _connection: CrossbarConnection;\n private _onClosed?: () => void;\n\n constructor(\n app: string,\n stage: \"dev\" | \"prod\",\n catalog: ConsumedAppStageCatalog,\n connection: CrossbarConnection,\n onClosed?: () => void\n ) {\n this.app = app;\n this.stage = stage;\n this.tables = catalog.tables ?? [];\n this.transforms = catalog.transforms ?? [];\n this._connection = connection;\n this._onClosed = onClosed;\n }\n\n get connection(): CrossbarConnection {\n return this._connection;\n }\n\n get isConnected(): boolean {\n return this._connection.is_open;\n }\n\n // DX guard: names outside the shared catalog are either private or don't\n // exist — fail fast client-side instead of silently receiving nothing\n // (private publishes are filtered via exclude_authrole, not errors).\n private assertInCatalog(tablename: string) {\n if (!tablename) throw new Error(\"Tablename must not be empty!\");\n const known = [...this.tables, ...this.transforms].map((t) => t.tablename);\n if (!known.includes(tablename)) {\n throw new CrossAppAccessError(\n \"PRIVATE_TABLE\",\n `'${tablename}' is not shared by app '${this.app}' (${this.stage}). ` +\n `Available tables/transforms: ${known.length > 0 ? known.join(\", \") : \"none\"}`\n );\n }\n }\n\n /**\n * Subscribes to realtime rows of a shared table or transform. Bulk inserts\n * (`transformed.bulk.{t}`) are unrolled row-by-row through the same handler,\n * so caller code always sees the single-row shape.\n */\n async subscribeToTable(\n tablename: string,\n handler: (...args: any[]) => void,\n options?: object\n ) {\n this.assertInCatalog(tablename);\n\n const sub = await this._connection.subscribe(`transformed.${tablename}`, handler);\n\n const bulkHandler = (args?: any[], kwargs?: any, details?: any) => {\n const rows = Array.isArray(args) ? args[0] : args;\n const rowList = Array.isArray(rows) ? rows : rows == null ? [] : [rows];\n for (const row of rowList) {\n handler([row], kwargs, details);\n }\n };\n await this._connection.subscribe(`transformed.bulk.${tablename}`, bulkHandler);\n\n return sub;\n }\n\n /** Queries history rows of a shared table or transform. */\n async getHistory(\n tablename: string,\n queryParams: TableQueryParams = { limit: 10 }\n ) {\n this.assertInCatalog(tablename);\n\n if (queryParams.offset == null) {\n (queryParams as any).offset = 0;\n }\n\n const validation = validateTableQueryParams(queryParams);\n if (!validation.success) {\n throw new Error(`Invalid query parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n try {\n return await this._connection.call(`history.transformed.${tablename}`, [queryParams]);\n } catch (e) {\n throw mapWampError(e) ?? e;\n }\n }\n\n /** Queries down-sampled series history of a shared table (tables only — no series RPC exists for transforms). */\n async getSeriesHistory(tablename: string, params: SeriesQueryParams) {\n if (!tablename) throw new Error(\"Tablename must not be empty!\");\n const tableNames = this.tables.map((t) => t.tablename);\n if (!tableNames.includes(tablename)) {\n // Transforms pass the generic catalog guard but have no series RPC —\n // fail fast with a pointer instead of a raw no_such_procedure.\n if (this.transforms.some((t) => t.tablename === tablename)) {\n throw new CrossAppAccessError(\n \"PRIVATE_TABLE\",\n `'${tablename}' is a transform of app '${this.app}' (${this.stage}); ` +\n `series history is available for tables only — use getHistory() instead.`\n );\n }\n throw new CrossAppAccessError(\n \"PRIVATE_TABLE\",\n `'${tablename}' is not a shared table of app '${this.app}' (${this.stage}). ` +\n `Available tables: ${tableNames.length > 0 ? tableNames.join(\", \") : \"none\"}`\n );\n }\n\n const validation = validateSeriesQueryParams(params);\n if (!validation.success) {\n throw new Error(`Invalid series query parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n try {\n return await this._connection.call(`history.transformed.series.${tablename}`, [params]);\n } catch (e) {\n throw mapWampError(e) ?? e;\n }\n }\n\n /** Closes the underlying connection to the provider's realm. */\n async close(): Promise<void> {\n this._connection.stop();\n this._onClosed?.();\n this._onClosed = undefined;\n }\n}\n","import autobahn from \"autobahn\";\nimport { CrossbarConnection } from \"./crossbar\";\nimport { ConsumedApp, CrossAppAccessError, mapWampError } from \"./consumedApp\";\nimport {\n Stage,\n validatePublishParams,\n validateTableParams,\n validateBulkTableParams,\n validateLocationParams,\n validateTableQueryParams,\n validateSeriesQueryParams,\n type TableQueryParams,\n type SeriesQueryParams,\n type ConsumedAppInfo,\n} from \"./types\";\n\n/**\n * Name of the per-databackend system error table. Apps report errors into it via\n * {@link IronFlock.reportError}; it behaves like any normal table, so it can be\n * queried (getHistory) and streamed (subscribeToTable) and used in board-templates.\n */\nexport const ERROR_LOGS_TABLE = \"error-logs\";\n\n/** Severity level recorded alongside a reported error. */\nexport type ErrorLevel = \"error\" | \"warn\" | \"info\" | \"debug\";\n\nexport interface ReportErrorOptions {\n /** Severity level. Defaults to \"error\". */\n level?: ErrorLevel;\n /**\n * When true, use the RPC append path (resolves with the insert outcome).\n * Defaults to false: fire-and-forget publish, matching typical logging.\n */\n append?: boolean;\n /** ISO-8601 timestamp override. Defaults to the current time. */\n tsp?: string;\n}\n\nfunction getEnv(key: string): string | undefined {\n return typeof process !== \"undefined\" ? process.env?.[key] : undefined;\n}\n\n/**\n * Platform-injected value by name: the live env FILE first, env var second.\n *\n * The device agent mirrors every injected env var to `/data/env/{name}.txt`\n * (a bind mount, so the agent can update values in RUNNING containers — e.g.\n * the cloud port of an instance tunnel, allocated only after the tunnel first\n * connects). Env vars are the start-time snapshot and serve as the fallback.\n * File reads use `process.getBuiltinModule` so bundlers never see an fs\n * import; in browsers (and on runtimes without it) this degrades to env-only.\n * Directory overridable via `IRONFLOCK_ENV_DIR`.\n */\nfunction readInjectedValue(name: string): string | undefined {\n if (typeof process !== \"undefined\") {\n try {\n const fs = (process as any).getBuiltinModule?.(\"node:fs\");\n if (fs) {\n const dir = getEnv(\"IRONFLOCK_ENV_DIR\") ?? \"/data/env\";\n const value = fs.readFileSync(`${dir}/${name}.txt`, \"utf8\").trim();\n if (value) return value;\n }\n } catch {\n // missing file/dir or unreadable — fall through to the env var\n }\n }\n return getEnv(name);\n}\n\nfunction getSerialNumber(serialNumber?: string): string {\n const sn = serialNumber ?? getEnv(\"DEVICE_SERIAL_NUMBER\");\n if (!sn) {\n throw new Error(\"serialNumber option is required (or set DEVICE_SERIAL_NUMBER env var in Node.js)\");\n }\n return sn;\n}\n\nexport interface ConnectToAppOptions {\n /** Provider stage to connect to. Defaults to this app's own stage (ENV). */\n stage?: \"dev\" | \"prod\";\n /**\n * Invoked when the consumed-app connection is fatally denied AFTER\n * connectToApp resolved (e.g. the grant was revoked and the next reconnect\n * was refused). While connectToApp is still pending, the same condition\n * surfaces as a rejection instead.\n */\n onError?: (error: CrossAppAccessError) => void;\n}\n\nexport interface ConnectToAllAppsOptions {\n /** Provider stage to connect to. Defaults to this app's own stage (ENV). */\n stage?: \"dev\" | \"prod\";\n /**\n * Invoked with the failure of each provider that could not be opened (only\n * when continueOnError is true — otherwise the first failure rejects), and\n * with a {@link CrossAppAccessError} if an already-opened provider connection\n * is later fatally denied (grant revoked → refused reconnect).\n */\n onError?: (error: unknown) => void;\n /**\n * When true (the default) a provider that fails to open is reported via\n * onError and omitted from the result. When false the first failure rejects\n * connectToAllApps.\n */\n continueOnError?: boolean;\n}\n\nexport interface IronFlockOptions {\n serialNumber?: string;\n deviceName?: string;\n deviceKey?: string;\n appName?: string;\n swarmKey?: number;\n appKey?: number;\n env?: string;\n /** URL of the IronFlock studio instance (e.g. \"https://studio.ironflock.com\") used to resolve the WebSocket URI. */\n reswarmUrl?: string;\n /** Direct WebSocket URI override (e.g. \"wss://cbw.ironflock.com/ws-ua-usr\"). Takes precedence over reswarmUrl. */\n ironFlockUrl?: string;\n /** @deprecated Use ironFlockUrl instead. */\n cburl?: string;\n}\n\nexport class IronFlock {\n private _connection: CrossbarConnection;\n private _serialNumber: string;\n private _deviceName?: string;\n private _deviceKey?: string;\n private _appName?: string;\n private _swarmKey: number;\n private _appKey: number;\n private _env?: string;\n private _isConfigured = false;\n\n private _reswarmUrl?: string;\n private _cburl?: string;\n\n // Consumed-app connections keyed `${appName}:${stage}`. Caching the promise\n // (not the instance) dedupes concurrent connectToApp calls.\n private _consumedApps = new Map<string, Promise<ConsumedApp>>();\n\n constructor(options?: IronFlockOptions) {\n this._serialNumber = getSerialNumber(options?.serialNumber);\n this._deviceName = options?.deviceName ?? getEnv(\"DEVICE_NAME\");\n this._deviceKey = options?.deviceKey ?? getEnv(\"DEVICE_KEY\");\n this._appName = options?.appName ?? getEnv(\"APP_NAME\");\n this._swarmKey = options?.swarmKey ?? parseInt(getEnv(\"SWARM_KEY\") ?? \"0\", 10);\n this._appKey = options?.appKey ?? parseInt(getEnv(\"APP_KEY\") ?? \"0\", 10);\n this._env = options?.env ?? getEnv(\"ENV\");\n this._reswarmUrl = options?.reswarmUrl ?? getEnv(\"RESWARM_URL\");\n this._cburl = options?.ironFlockUrl ?? options?.cburl;\n this._connection = new CrossbarConnection();\n\n const missing: string[] = [];\n if (!this._deviceKey) missing.push(\"DEVICE_KEY\");\n if (!this._appName) missing.push(\"APP_NAME\");\n if (!this._swarmKey) missing.push(\"SWARM_KEY\");\n if (!this._appKey) missing.push(\"APP_KEY\");\n if (missing.length > 0) {\n console.warn(\n `Warning: The following environment variables must be present: ${missing.join(\", \")}`\n );\n }\n }\n\n get connection(): CrossbarConnection {\n return this._connection;\n }\n\n get isConnected(): boolean {\n return this._connection.is_open;\n }\n\n private configureConnection(cburl?: string) {\n if (this._isConfigured) return;\n\n const envValue = (this._env ?? \"DEV\").toUpperCase();\n const stageMap: Record<string, Stage> = {\n DEV: Stage.DEVELOPMENT,\n PROD: Stage.PRODUCTION,\n };\n const stage = stageMap[envValue] ?? Stage.DEVELOPMENT;\n\n const resolvedUrl =\n cburl ??\n this._cburl ??\n CrossbarConnection.getWebSocketURI(this._reswarmUrl);\n\n this._connection.configure(\n this._swarmKey,\n this._appKey,\n stage,\n this._serialNumber,\n resolvedUrl\n );\n this._isConfigured = true;\n }\n\n async start(cburl?: string): Promise<void> {\n this.configureConnection(cburl);\n await this._connection.start();\n }\n\n async stop(): Promise<void> {\n const consumed = [...this._consumedApps.values()];\n this._consumedApps.clear();\n await Promise.all(\n consumed.map((pending) => pending.then((app) => app.close()).catch(() => undefined))\n );\n this._connection.stop();\n }\n\n /**\n * Opens a read-only connection to another app's data backend in the same\n * project. The provider app must be declared in this app's data-template\n * `consumes:` section and the project user must have granted access.\n *\n * Resolves the provider via `sys.appaccess.resolve`, then connects to the\n * provider's realm with this device's credentials (router role\n * `app_reader`). Connections are cached per app+stage and closed by\n * {@link stop}.\n *\n * @throws {CrossAppAccessError} NO_GRANT | PROVIDER_NOT_INSTALLED |\n * UNKNOWN_APP | NOT_AUTHORIZED\n */\n async connectToApp(\n appName: string,\n opts?: ConnectToAppOptions\n ): Promise<ConsumedApp> {\n if (!appName) throw new Error(\"appName must not be empty!\");\n\n const ownStage = (this._env ?? \"DEV\").toUpperCase() === \"PROD\" ? \"prod\" : \"dev\";\n const stage = opts?.stage ?? ownStage;\n\n // Lowercase the name so this key matches the list-derived keys used by\n // connectToAllApps (fleetdb/resolve return app names lowercased): a later\n // connectToApp(\"MyProvider\") then reuses a warmed handle instead of opening\n // a duplicate connection.\n const cacheKey = `${appName.toLowerCase()}:${stage}`;\n const cached = this._consumedApps.get(cacheKey);\n if (cached) return cached;\n\n // Evicts this attempt only — never a newer connection cached later under\n // the same key (e.g. re-connect after close/revoke).\n let pending: Promise<ConsumedApp>;\n const evict = () => {\n if (this._consumedApps.get(cacheKey) === pending) {\n this._consumedApps.delete(cacheKey);\n }\n };\n pending = this.openConsumedApp(appName, stage, evict, opts?.onError);\n this._consumedApps.set(cacheKey, pending);\n // Failed attempts must not poison the cache — a later call retries fresh.\n pending.catch(evict);\n return pending;\n }\n\n /**\n * Lists every non-private provider catalog in this project for an app holding\n * the wildcard consume grant (`consumes: [{app: \"*\"}]`). One\n * `sys.appaccess.list` call; opens no consumed-app connections. A picker (e.g.\n * a Node-RED node) renders the returned catalogs, then calls\n * {@link connectToApp} per chosen provider; {@link connectToAllApps} opens\n * them all eagerly.\n *\n * @throws {CrossAppAccessError} NO_GRANT when this app holds no wildcard grant.\n */\n async listConsumableApps(): Promise<ConsumedAppInfo[]> {\n try {\n // The fleetdb handler derives the consumer from the arrival realm and\n // ignores call args, so no payload is needed.\n const infos = await this._connection.call<ConsumedAppInfo[]>(\n \"sys.appaccess.list\",\n []\n );\n return infos ?? [];\n } catch (e) {\n throw mapWampError(e) ?? e;\n }\n }\n\n /**\n * Opens read-only connections to every non-private provider in this project\n * (wildcard consumers only). Enumerates providers via {@link listConsumableApps}\n * and opens each directly from its resolved info — no per-app resolve\n * round-trip. Each handle is cached under the same `${app}:${stage}` key\n * {@link connectToApp} uses, so a later `connectToApp(name)` returns the warmed\n * handle. Providers lacking a data backend for the requested stage are skipped.\n *\n * @throws {CrossAppAccessError} NO_GRANT when this app holds no wildcard grant.\n */\n async connectToAllApps(\n opts?: ConnectToAllAppsOptions\n ): Promise<ConsumedApp[]> {\n const ownStage = (this._env ?? \"DEV\").toUpperCase() === \"PROD\" ? \"prod\" : \"dev\";\n const stage = opts?.stage ?? ownStage;\n const continueOnError = opts?.continueOnError ?? true;\n\n const infos = await this.listConsumableApps();\n\n const pending: Promise<ConsumedApp>[] = [];\n for (const info of infos) {\n // Skip providers with no data backend for the requested stage.\n if (!info.stages?.[stage]) continue;\n pending.push(this.openCachedFromInfo(info, stage, opts?.onError));\n }\n\n const settled = await Promise.allSettled(pending);\n const opened: ConsumedApp[] = [];\n for (const result of settled) {\n if (result.status === \"fulfilled\") {\n opened.push(result.value);\n } else if (continueOnError) {\n opts?.onError?.(result.reason);\n } else {\n throw result.reason;\n }\n }\n return opened;\n }\n\n private async openConsumedApp(\n appName: string,\n stage: \"dev\" | \"prod\",\n evict: () => void,\n onError?: (error: CrossAppAccessError) => void\n ): Promise<ConsumedApp> {\n let info: ConsumedAppInfo | undefined;\n try {\n info = await this._connection.call<ConsumedAppInfo>(\"sys.appaccess.resolve\", [\n { app: appName },\n ]);\n } catch (e) {\n throw mapWampError(e) ?? e;\n }\n\n if (!info) {\n throw new CrossAppAccessError(\n \"PROVIDER_NOT_INSTALLED\",\n `App '${appName}' has no ${stage} data backend in this project`\n );\n }\n\n return this.openFromInfo(info, stage, evict, onError);\n }\n\n /** Caches (or reuses) a connection opened directly from a resolved provider\n * info, using the same `${app}:${stage}` key as {@link connectToApp}. */\n private openCachedFromInfo(\n info: ConsumedAppInfo,\n stage: \"dev\" | \"prod\",\n onError?: (error: unknown) => void\n ): Promise<ConsumedApp> {\n const cacheKey = `${info.app}:${stage}`;\n const cached = this._consumedApps.get(cacheKey);\n if (cached) return cached;\n\n let pending: Promise<ConsumedApp>;\n const evict = () => {\n if (this._consumedApps.get(cacheKey) === pending) {\n this._consumedApps.delete(cacheKey);\n }\n };\n pending = this.openFromInfo(info, stage, evict, onError);\n this._consumedApps.set(cacheKey, pending);\n // Failed attempts must not poison the cache — a later call retries fresh.\n pending.catch(evict);\n return pending;\n }\n\n /**\n * Opens the second CrossbarConnection to a provider realm from an already\n * resolved {@link ConsumedAppInfo} — everything after the sys.appaccess.resolve\n * round-trip. Shared by {@link connectToApp} (which resolves one provider) and\n * {@link connectToAllApps} (which lists every provider in one call).\n */\n private async openFromInfo(\n info: ConsumedAppInfo,\n stage: \"dev\" | \"prod\",\n evict: () => void,\n onError?: (error: CrossAppAccessError) => void\n ): Promise<ConsumedApp> {\n const appName = info.app;\n const catalog = info.stages?.[stage];\n if (!catalog) {\n throw new CrossAppAccessError(\n \"PROVIDER_NOT_INSTALLED\",\n `App '${appName}' has no ${stage} data backend in this project`\n );\n }\n\n const connection = new CrossbarConnection();\n connection.failOnAuthError = true;\n connection.configure(\n this._swarmKey,\n info.provider_app_key,\n stage === \"prod\" ? Stage.PRODUCTION : Stage.DEVELOPMENT,\n this._serialNumber,\n // Reuse the own connection's resolved socket URI (set once start() ran).\n this._connection.socketURI ??\n this._cburl ??\n CrossbarConnection.getWebSocketURI(this._reswarmUrl)\n );\n\n let opened = false;\n let authFailure: CrossAppAccessError | undefined;\n connection.on(\"auth_failure\", (closeReason: string) => {\n authFailure = new CrossAppAccessError(\n \"NOT_AUTHORIZED\",\n `Access to app '${appName}' (${stage}) denied: ${closeReason}. The grant may have been revoked.`\n );\n // Evict so a later connectToApp (e.g. after the grant is restored)\n // opens a fresh connection instead of returning this dead one.\n evict();\n if (opened) onError?.(authFailure);\n });\n\n try {\n await connection.start();\n } catch (e) {\n throw authFailure ?? e;\n }\n opened = true;\n\n return new ConsumedApp(appName, stage, catalog, connection, evict);\n }\n\n async publish(\n topic: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>\n ): Promise<unknown> {\n const validation = validatePublishParams({ topic, args, kwargs });\n if (!validation.success) {\n throw new Error(`Invalid publish parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n const deviceMetadata: Record<string, unknown> = {\n DEVICE_SERIAL_NUMBER: this._serialNumber,\n DEVICE_KEY: this._deviceKey,\n DEVICE_NAME: this._deviceName,\n };\n const combinedKwargs = { ...deviceMetadata, ...(kwargs ?? {}) };\n\n return this._connection.publish(topic, args, combinedKwargs, {\n acknowledge: true,\n });\n }\n\n async publishToTable(\n tablename: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>\n ): Promise<unknown> {\n const validation = validateTableParams({ tablename, args, kwargs });\n if (!validation.success) {\n throw new Error(`Invalid table parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n if (!this._swarmKey) throw new Error(\"SWARM_KEY not set in environment variables!\");\n if (!this._appKey) throw new Error(\"APP_KEY not set in environment variables!\");\n\n const topic = `${this._swarmKey}.${this._appKey}.${tablename}`;\n return this.publish(topic, args, kwargs);\n }\n\n /**\n * Reports an application error into the databackend's `error-logs` table.\n *\n * This is a thin convenience wrapper over {@link publishToTable} /\n * {@link appendToTable}: it stamps the row with `source: \"app\"`, a severity\n * `level`, and a timestamp, then writes it like any normal table row. The error\n * therefore lands in the same `error-logs` table that fleetdb system errors use\n * (tagged `source: \"system\"`), and is delivered in realtime on\n * `transformed.error-logs` — the channel board-templates consume — without\n * touching the platform error-toast channel (`databackend.errors.*`).\n *\n * @param error An error message, or an Error whose stack/message is recorded.\n * @param opts Optional level (default \"error\"), append flag, and tsp override.\n */\n async reportError(\n error: string | Error,\n opts?: ReportErrorOptions\n ): Promise<unknown> {\n const msg = error instanceof Error ? (error.stack ?? error.message) : error;\n const row = {\n tsp: opts?.tsp ?? new Date().toISOString(),\n msg,\n source: \"app\",\n level: opts?.level ?? \"error\",\n };\n\n return opts?.append\n ? this.appendToTable(ERROR_LOGS_TABLE, [row])\n : this.publishToTable(ERROR_LOGS_TABLE, [row]);\n }\n\n async appendToTable(\n tablename: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>\n ): Promise<unknown> {\n const validation = validateTableParams({ tablename, args, kwargs });\n if (!validation.success) {\n throw new Error(`Invalid table parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n if (!this._swarmKey) throw new Error(\"SWARM_KEY not set in environment variables!\");\n if (!this._appKey) throw new Error(\"APP_KEY not set in environment variables!\");\n\n const topic = `append.${this._swarmKey}.${this._appKey}.${tablename}`;\n\n const deviceMetadata: Record<string, unknown> = {\n DEVICE_SERIAL_NUMBER: this._serialNumber,\n DEVICE_KEY: this._deviceKey,\n DEVICE_NAME: this._deviceName,\n };\n const combinedKwargs = { ...deviceMetadata, ...(kwargs ?? {}) };\n\n return this._connection.call(topic, args as any[], combinedKwargs);\n }\n\n /**\n * Publishes many rows in a single message (bulk insert) to the dedicated topic\n * `bulk.{swarmKey}.{appKey}.{tablename}`. The platform inserts the whole batch\n * atomically (all-or-nothing). Use for high-frequency data where one round-trip\n * per row is too costly. Like publishToTable this is fire-and-forget — the ack\n * confirms delivery to the router, not the DB insert. Use appendRowsToTable when\n * you need the insert outcome.\n */\n async publishRowsToTable(\n tablename: string,\n rows: Record<string, unknown>[],\n kwargs?: Record<string, unknown>\n ): Promise<unknown> {\n const validation = validateBulkTableParams({ tablename, rows, kwargs });\n if (!validation.success) {\n throw new Error(`Invalid bulk table parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n if (!this._swarmKey) throw new Error(\"SWARM_KEY not set in environment variables!\");\n if (!this._appKey) throw new Error(\"APP_KEY not set in environment variables!\");\n\n const topic = `bulk.${this._swarmKey}.${this._appKey}.${tablename}`;\n // Send the whole rows array as the single positional arg, so the backend\n // reads args[0] as the array of rows (mirrors the single-row contract).\n return this.publish(topic, [rows], kwargs);\n }\n\n /**\n * Appends many rows in a single RPC (bulk insert) by calling the dedicated\n * procedure `appendBulk.{swarmKey}.{appKey}.{tablename}`. The platform inserts\n * the whole batch atomically (all-or-nothing): if any row is invalid the entire\n * batch is rejected and nothing is persisted. Resolves with the RPC result\n * (e.g. { success: true, count: N }). Prefer over publishRowsToTable when you\n * need the insert outcome.\n */\n async appendRowsToTable(\n tablename: string,\n rows: Record<string, unknown>[],\n kwargs?: Record<string, unknown>\n ): Promise<unknown> {\n const validation = validateBulkTableParams({ tablename, rows, kwargs });\n if (!validation.success) {\n throw new Error(`Invalid bulk table parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n if (!this._swarmKey) throw new Error(\"SWARM_KEY not set in environment variables!\");\n if (!this._appKey) throw new Error(\"APP_KEY not set in environment variables!\");\n\n const topic = `appendBulk.${this._swarmKey}.${this._appKey}.${tablename}`;\n\n const deviceMetadata: Record<string, unknown> = {\n DEVICE_SERIAL_NUMBER: this._serialNumber,\n DEVICE_KEY: this._deviceKey,\n DEVICE_NAME: this._deviceName,\n };\n const combinedKwargs = { ...deviceMetadata, ...(kwargs ?? {}) };\n\n // args=[rows] => backend reads args[0] as the array of rows.\n return this._connection.call(topic, [rows] as any[], combinedKwargs);\n }\n\n async subscribe(\n topic: string,\n handler: (...args: any[]) => void,\n options?: object\n ) {\n return this._connection.subscribe(topic, handler);\n }\n\n async subscribeToTable(\n tablename: string,\n handler: (...args: any[]) => void,\n options?: object\n ) {\n if (!this._swarmKey) throw new Error(\"SWARM_KEY not set in environment variables!\");\n if (!this._appKey) throw new Error(\"APP_KEY not set in environment variables!\");\n\n const topic = `transformed.${tablename}`;\n const sub = await this.subscribe(topic, handler, options);\n\n // Also subscribe to the dedicated bulk realtime topic. Bulk inserts republish\n // the whole batch as a single array message ([rows]); deliver each row to the\n // same handler in the single-row shape, so caller code (one row per call)\n // stays unchanged and nobody has to sniff object-vs-array.\n const bulkHandler = (args?: any[], kwargs?: any, details?: any) => {\n const rows = Array.isArray(args) ? args[0] : args;\n const rowList = Array.isArray(rows) ? rows : rows == null ? [] : [rows];\n for (const row of rowList) {\n handler([row], kwargs, details);\n }\n };\n await this.subscribe(`transformed.bulk.${tablename}`, bulkHandler, options);\n\n return sub;\n }\n\n async call(\n topic: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>,\n options?: object\n ) {\n return this._connection.call(topic, args as any[], kwargs, options);\n }\n\n async callDeviceFunction(\n deviceKey: number,\n topic: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>,\n options?: object\n ) {\n const fullTopic = `${this._swarmKey}.${deviceKey}.${this._appKey}.${this._env}.${topic}`;\n return this._connection.call(fullTopic, args as any[], kwargs, options);\n }\n\n /** @deprecated Use callDeviceFunction() instead. */\n async callFunction(\n deviceKey: number,\n topic: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>,\n options?: object\n ) {\n console.warn(\"callFunction() is deprecated and will be removed in a future version. Use callDeviceFunction() instead.\");\n return this.callDeviceFunction(deviceKey, topic, args, kwargs, options);\n }\n\n async registerDeviceFunction(\n topic: string,\n endpoint: (...args: any[]) => any,\n options?: autobahn.IRegisterOptions\n ) {\n const fullTopic = `${this._swarmKey}.${this._deviceKey}.${this._appKey}.${this._env}.${topic}`;\n\n const reg = await this._connection.register(fullTopic, endpoint, options);\n console.log(`Function registered for IronFlock topic '${topic}'. (Full WAMP topic: '${fullTopic}')`);\n return reg;\n }\n\n /** @deprecated Use registerDeviceFunction() instead. */\n async registerFunction(\n topic: string,\n endpoint: (...args: any[]) => any,\n options?: autobahn.IRegisterOptions\n ) {\n console.warn(\"registerFunction() is deprecated and will be removed in a future version. Use registerDeviceFunction() instead.\");\n return this.registerDeviceFunction(topic, endpoint, options);\n }\n\n async register(\n topic: string,\n endpoint: (...args: any[]) => any,\n options?: autobahn.IRegisterOptions\n ) {\n return this.registerDeviceFunction(topic, endpoint, options);\n }\n\n async getHistory(\n tablename: string,\n queryParams: TableQueryParams = { limit: 10 }\n ) {\n if (!tablename) throw new Error(\"Tablename must not be empty!\");\n\n // Normalize null/undefined offset to 0\n if (queryParams.offset == null) {\n (queryParams as any).offset = 0;\n }\n\n const validation = validateTableQueryParams(queryParams);\n if (!validation.success) {\n throw new Error(`Invalid query parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n const topic = `history.transformed.${tablename}`;\n try {\n return await this._connection.call(topic, [queryParams]);\n } catch (e: any) {\n const errorStr = String(e);\n if (\n errorStr.includes(\"no_such_procedure\") ||\n errorStr.includes(\"no callee registered\")\n ) {\n console.error(`Get history failed: History service procedure '${topic}' not registered`);\n return null;\n }\n console.error(`Get history failed: ${e}`);\n return null;\n }\n }\n\n /**\n * Queries down-sampled series history of an own table by calling\n * `history.transformed.series.{tablename}` (tables only — no series RPC\n * exists for transforms).\n */\n async getSeriesHistory(tablename: string, params: SeriesQueryParams) {\n if (!tablename) throw new Error(\"Tablename must not be empty!\");\n\n const validation = validateSeriesQueryParams(params);\n if (!validation.success) {\n throw new Error(`Invalid series query parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n const topic = `history.transformed.series.${tablename}`;\n try {\n return await this._connection.call(topic, [params]);\n } catch (e: any) {\n const errorStr = String(e);\n if (\n errorStr.includes(\"no_such_procedure\") ||\n errorStr.includes(\"no callee registered\")\n ) {\n console.error(`Get series history failed: History service procedure '${topic}' not registered`);\n return null;\n }\n console.error(`Get series history failed: ${e}`);\n return null;\n }\n }\n\n async setDeviceLocation(long: number, lat: number) {\n const validation = validateLocationParams({ longitude: long, latitude: lat });\n if (!validation.success) {\n throw new Error(`Invalid location parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n const payload = { long, lat };\n const extra: Record<string, unknown> = {\n DEVICE_SERIAL_NUMBER: this._serialNumber,\n DEVICE_KEY: this._deviceKey,\n DEVICE_NAME: this._deviceName,\n };\n\n try {\n return await this._connection.call(\n \"ironflock.location_service.update\",\n [payload],\n extra\n );\n } catch (e) {\n console.error(`Set location failed: ${e}`);\n return null;\n }\n }\n\n /**\n * Public URL under which a declared port (port-template.yml) is reachable\n * from the internet once its tunnel is active.\n *\n * For `http`/`https` ports, composes the platform's tunnel label\n * `{device_key}-{app_name}-{port}` (`https` ports carry the platform's\n * `secure-` prefix) on the tunnel domain the device agent injects\n * (`TUNNEL_DOMAIN`; the cloud edge, or the operator's appliance domain).\n * On devices that belong to an instance (appliance), the agent injects\n * `INSTANCE_KEY` and the cloud-forwarded route\n * `https://i{instance_key}-{label}.{cloud edge}` is returned instead —\n * reachable while the instance forwards its tunnels to the cloud.\n *\n * For `tcp`/`udp` ports, the URL uses the tunnel-assigned public port,\n * which the platform injects under the port-template's\n * `remote_port_environment` name — pass that name here. On instance\n * devices the internet-facing port arrives as `{name}_CLOUD`; when it is\n * not (yet) present, the instance-local URL built from `{name}` is\n * returned as a fallback.\n *\n * Port values are read live from the agent-maintained files under\n * `/data/env` (falling back to the process environment), so this method\n * returns the CURRENT url: the instance cloud port is allocated shortly\n * after the tunnel first connects and appears here within seconds — call\n * the method again rather than caching its result.\n *\n * Returns null when the identity or required env vars are unavailable,\n * the protocol is unknown, or the label is not a valid DNS label (longer\n * than 63 characters, or a dot in the app name).\n */\n getRemoteAccessUrlForPort(\n port: number,\n protocol: string = \"http\",\n remotePortEnvironment?: string\n ): string | null {\n const instanceKey = getEnv(\"INSTANCE_KEY\");\n\n if (protocol === \"tcp\" || protocol === \"udp\") {\n if (!remotePortEnvironment) {\n return null;\n }\n\n if (instanceKey) {\n const cloudPort = readInjectedValue(`${remotePortEnvironment}_CLOUD`);\n if (cloudPort) {\n const domain = getEnv(\"CLOUD_TUNNEL_DOMAIN\") ?? \"app.ironflock.com\";\n return `${protocol}://${domain}:${cloudPort}`;\n }\n }\n\n const remotePort = readInjectedValue(remotePortEnvironment);\n if (!remotePort) {\n return null;\n }\n const domain = getEnv(\"TUNNEL_DOMAIN\") ?? \"app.ironflock.com\";\n return `${protocol}://${domain}:${remotePort}`;\n }\n\n if (protocol !== \"http\" && protocol !== \"https\") {\n return null;\n }\n\n if (!this._deviceKey || !this._appName) {\n return null;\n }\n\n let label = `${this._deviceKey}-${this._appName.toLowerCase()}-${port}`;\n if (protocol === \"https\") {\n // https-protocol tunnels get secure- prefixed subdomains platform-wide\n // (CreateSubdomain / CloudURLFor).\n label = `secure-${label}`;\n }\n\n let domain: string;\n if (instanceKey) {\n // Instance route: forwarded through the cloud tunnel edge.\n label = `i${instanceKey}-${label}`;\n domain = getEnv(\"CLOUD_TUNNEL_DOMAIN\") ?? \"app.ironflock.com\";\n } else {\n domain = getEnv(\"TUNNEL_DOMAIN\") ?? \"app.ironflock.com\";\n }\n\n // Mirror the platform's label constraints (CloudURLFor): a tunnel label\n // must be a single valid DNS label.\n if (label.length > 63 || label.includes(\".\")) {\n return null;\n }\n\n return `https://${label}.${domain}`;\n }\n\n /**\n * Create an IronFlock instance by fetching configuration from a server endpoint.\n * The endpoint should return JSON matching `IronFlockOptions`.\n *\n * Useful in browser environments where config is provided by a backend:\n * ```ts\n * const flock = await IronFlock.fromServer(\"/api/ironflock-config\");\n * await flock.start();\n * ```\n */\n static async fromServer(url: string): Promise<IronFlock> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch IronFlock config from ${url}: ${response.status} ${response.statusText}`);\n }\n const options = (await response.json()) as IronFlockOptions;\n return new IronFlock(options);\n }\n}\n"],"names":["has","prefix","Events","EE","fn","context","once","addListener","emitter","event","listener","evt","clearEvent","EventEmitter","names","events","name","handlers","i","l","ee","listeners","a1","a2","a3","a4","a5","len","args","length","j","module","DATAPODS_WS_URI","STUDIO_WS_URI","STUDIO_DEV_WS_URI","STUDIO_WS_URI_OLD","LOCALHOST_WS_URI","DOCKER_HOST_WS_URI","socketURIMap","SESSION_WAIT_TIMEOUT","FATAL_AUTH_CLOSE_REASONS","CrossbarConnection","reswarmUrl","deviceEndpoint","_a","url","mapped","swarmKey","appKey","stage","serialNumber","cburl","resolve","reject","autobahn","_session","_method","extra","session","reason","details","closeReason","error","startTime","topic","handler","sub","idx","matching","previous","reg","endpoint","options","effectiveOptions","registration","procedure","kwargs","_isTypeUint32","value","MINIMUM","MAXIMUM","_isFormatDateTime","str","PATTERN","_validateReport","array","reportable","path","last","exceptable","_createStandardSchema","input","result","typiaPathToStandardSchemaPath","PathParserState","segments","currentSegment","state","index","char","newChar","Stage","validateTableQueryParams","_io0","__typia_transform__isTypeUint32._isTypeUint32","_io1","elem","_io2","__typia_transform__isFormatDateTime._isFormatDateTime","_vo0","_path","_exceptionable","_report","_vo1","_index3","_vo2","flag","_index4","__is","errors","__typia_transform__createStandardSchema._createStandardSchema","__typia_transform__validateReport._validateReport","success","validateSeriesQueryParams","_ip0","tuplePredicators","top","entire","pred","_vp1","_index5","_index6","_index7","_index8","validateLocationParams","validatePublishParams","key","validateCallParams","validateTableParams","validateBulkTableParams","_index2","WAMP_ERROR_CODE_MAP","CrossAppAccessError","code","message","mapWampError","e","uri","detail","ConsumedApp","app","catalog","connection","onClosed","tablename","known","t","bulkHandler","rows","rowList","row","queryParams","validation","params","tableNames","ERROR_LOGS_TABLE","getEnv","readInjectedValue","fs","dir","getSerialNumber","sn","IronFlock","missing","envValue","resolvedUrl","consumed","pending","appName","opts","ownStage","cacheKey","cached","evict","continueOnError","infos","info","settled","opened","_b","onError","authFailure","combinedKwargs","msg","deviceKey","fullTopic","errorStr","long","lat","payload","port","protocol","remotePortEnvironment","instanceKey","cloudPort","domain","remotePort","label","response"],"mappings":"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","x_google_ignoreList":[0,2,3,4,5]}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../node_modules/eventemitter3/index.js","../src/crossbar/index.ts","../node_modules/typia/lib/internal/_isTypeUint32.mjs","../node_modules/typia/lib/internal/_isFormatDateTime.mjs","../node_modules/typia/lib/internal/_validateReport.mjs","../node_modules/typia/lib/internal/_createStandardSchema.mjs","../src/types.ts","../src/consumedApp.ts","../src/ironflock.ts"],"sourcesContent":["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import autobahn from \"autobahn\";\nimport { EventEmitter } from \"eventemitter3\";\nimport { Stage } from \"../types\";\n\nexport type Details = { caller_authid: string; caller_authrole: string };\n\nexport type AuthPayload = {\n success: boolean;\n role: string;\n realm: string;\n authid: string;\n extra: {\n username: string;\n };\n};\n\nconst DATAPODS_WS_URI = \"wss://cbw.datapods.io/ws-ua-usr\";\nconst STUDIO_WS_URI = \"wss://cbw.ironflock.com/ws-ua-usr\";\nconst STUDIO_DEV_WS_URI = \"wss://cbw.ironflock.dev/ws-ua-usr\";\nconst STUDIO_WS_URI_OLD = \"wss://cbw.record-evolution.com/ws-ua-usr\";\nconst LOCALHOST_WS_URI = \"ws://localhost:8080/ws-ua-usr\";\n// A RESWARM_URL of host.docker.internal means the app runs inside a\n// bridge-network container (mac/windows dev stack), where localhost is the\n// container itself — the router on the host is only reachable the same way.\nconst DOCKER_HOST_WS_URI = \"ws://host.docker.internal:8080/ws-ua-usr\";\n\nconst socketURIMap: Record<string, string> = {\n \"https://studio.datapods.io\": DATAPODS_WS_URI,\n \"https://studio.ironflock.dev\": STUDIO_DEV_WS_URI,\n \"https://studio.ironflock.com\": STUDIO_WS_URI,\n \"https://studio.record-evolution.com\": STUDIO_WS_URI_OLD,\n \"http://localhost:8085\": LOCALHOST_WS_URI,\n \"http://localhost:8086\": LOCALHOST_WS_URI,\n \"http://host.docker.internal:8086\": DOCKER_HOST_WS_URI,\n};\n\nconst SESSION_WAIT_TIMEOUT = 6000;\n\n/**\n * Error thrown when a WAMP operation (call/publish/subscribe/register) is\n * rejected by the router or the remote handler. autobahn rejects with a plain\n * `{error: <uri>, args, kwargs}` object that is not a native Error and prints\n * as \"[object Object]\" — this preserves the WAMP error URI and payload while\n * giving callers a readable message and a stack trace.\n */\nexport class WampError extends Error {\n /** WAMP error URI, e.g. \"wamp.error.no_such_procedure\". */\n readonly error: string;\n readonly args: unknown[];\n readonly kwargs: Record<string, unknown>;\n\n constructor(\n message: string,\n uri: string,\n args: unknown[] = [],\n kwargs: Record<string, unknown> = {}\n ) {\n super(message);\n this.name = \"WampError\";\n this.error = uri;\n this.args = args;\n this.kwargs = kwargs;\n }\n}\n\nfunction safeJson(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\n/**\n * Normalizes any rejection into a native Error with a readable message that\n * names the operation and topic. autobahn WAMP rejections become WampError\n * (URI + payload preserved); native Errors pass through untouched.\n */\nexport function toReadableError(operation: string, topic: string, e: unknown): Error {\n if (e instanceof Error) return e;\n const uri = (e as { error?: unknown } | null | undefined)?.error;\n if (typeof uri === \"string\") {\n const args = Array.isArray((e as { args?: unknown }).args)\n ? ((e as { args: unknown[] }).args)\n : [];\n const kwargs = ((e as { kwargs?: unknown }).kwargs ?? {}) as Record<string, unknown>;\n const detail = args.length > 0 ? ` — ${safeJson(args)}` : \"\";\n return new WampError(\n `${operation} '${topic}' failed with WAMP error '${uri}'${detail}`,\n uri,\n args,\n kwargs\n );\n }\n return new Error(`${operation} '${topic}' failed: ${safeJson(e)}`);\n}\n\n// WAMP close reasons meaning the router rejected our credentials/role.\n// Retrying cannot succeed until the credential or grant changes.\nconst FATAL_AUTH_CLOSE_REASONS = [\n \"wamp.error.not_authorized\",\n \"wamp.error.authorization_failed\",\n \"wamp.error.authentication_failed\",\n \"wamp.error.no_auth_method\",\n];\n\nexport class CrossbarConnection extends EventEmitter {\n session?: autobahn.Session;\n connection?: autobahn.Connection;\n serial_number?: string;\n socketURI?: string;\n realm?: string;\n /**\n * Opt-in (used for consumed-app connections): treat an auth/authorization\n * denial on close as fatal — stop all reconnect attempts and emit\n * \"auth_failure\" instead of retrying forever. The primary own-realm\n * connection keeps the default (false): retry through every failure.\n */\n failOnAuthError = false;\n\n private subscriptions: autobahn.Subscription[] = [];\n private registrations: autobahn.Registration[] = [];\n private firstConnection?: Promise<void>;\n private firstResolver: () => void = () => undefined;\n private firstRejecter: (reason?: any) => void = () => undefined;\n private shouldReconnect: boolean = false;\n private isReconnecting: boolean = false;\n private hasOpenedOnce: boolean = false;\n\n constructor() {\n super();\n }\n\n static getWebSocketURI(reswarmUrl?: string): string {\n // Prefer DEVICE_ENDPOINT_URL: replace its path with /ws-ua-usr.\n // Set by the device agent for every app container it spawns.\n const deviceEndpoint = typeof process !== \"undefined\" ? process.env?.DEVICE_ENDPOINT_URL : undefined;\n if (deviceEndpoint) {\n try {\n const url = new URL(deviceEndpoint);\n url.pathname = \"/ws-ua-usr\";\n return url.toString().replace(/\\/$/, \"\");\n } catch {\n // Invalid URL, fall through to other methods\n }\n }\n\n if (!reswarmUrl) return STUDIO_WS_URI;\n\n const mapped = socketURIMap[reswarmUrl];\n if (mapped === undefined) {\n // Unknown reswarmUrl (typically an appliance / private deployment\n // whose URL isn't in the static cloud map). Falling back to the\n // public STUDIO_WS_URI would silently connect appliance apps to\n // the wrong router. Throw so the operator knows to set\n // DEVICE_ENDPOINT_URL (or pass ironFlockUrl=).\n throw new Error(\n `Cannot resolve WebSocket URI for reswarmUrl=${JSON.stringify(reswarmUrl)}. ` +\n `Set DEVICE_ENDPOINT_URL to the deployment's WAMP router URL ` +\n `(e.g. ws://<host>:18080/ws-re-dev) or pass ironFlockUrl=… ` +\n `to IronFlock(). Known cloud URLs: ${JSON.stringify(Object.keys(socketURIMap))}`\n );\n }\n return mapped;\n }\n\n configure(\n swarmKey: number,\n appKey: number,\n stage: Stage,\n serialNumber: string,\n cburl?: string\n ) {\n this.realm = `realm-${swarmKey}-${appKey}-${stage}`;\n this.serial_number = serialNumber;\n this.socketURI = cburl ?? CrossbarConnection.getWebSocketURI();\n }\n\n async start(): Promise<void> {\n if (!this.realm || !this.serial_number || !this.socketURI) {\n throw new Error(\"CrossbarConnection must be configured before starting. Call configure() first.\");\n }\n\n this.shouldReconnect = true;\n this.firstConnection = new Promise((resolve, reject) => {\n this.firstResolver = resolve;\n this.firstRejecter = reject;\n });\n\n this.connection = new autobahn.Connection({\n realm: this.realm,\n url: this.socketURI,\n authmethods: [\"wampcra\"],\n authid: this.serial_number,\n max_retries: -1,\n max_retry_delay: 2,\n initial_retry_delay: 1,\n // @ts-ignore\n autoping_interval: 2,\n autoping_timeout: 4,\n onchallenge: (_session, _method, extra) => {\n return autobahn.auth_cra.sign(this.serial_number!, extra.challenge);\n },\n });\n\n this.connection.onopen = this.onOpen.bind(this);\n this.connection.onclose = this.onClose.bind(this);\n this.connection.open();\n\n return this.firstConnection;\n }\n\n private onOpen(session: autobahn.Session) {\n this.session = session;\n this.session.caller_disclose_me = true;\n this.hasOpenedOnce = true;\n\n // Restore failures must not become unhandled rejections that kill the\n // process — log and keep the session usable.\n this.resubscribeAll().catch((e) =>\n console.error(\"Failed to restore subscriptions after (re)connect:\", e)\n );\n this.reregisterAll().catch((e) =>\n console.error(\"Failed to restore registrations after (re)connect:\", e)\n );\n this.emit(\"connected\", this.serial_number);\n\n this.firstResolver();\n this.firstResolver = () => undefined;\n }\n\n private onClose(reason: string, details: any): boolean {\n this.session = undefined;\n this.emit(\"disconnected\");\n\n console.warn(\"Connection closed:\", {\n reason,\n details,\n realm: this.realm,\n url: this.socketURI,\n authid: this.serial_number,\n });\n\n const closeReason = details?.reason ?? reason;\n\n // Fatal-auth path (opt-in, consumed-app connections): the router refused\n // our credentials/role (WAMP ABORT surfaces here as details.reason = the\n // error URI, e.g. after a cross-app grant was revoked). Retrying can never\n // succeed, so surface it, stop autobahn's retry loop (return true) and skip\n // the manual reconnect below.\n if (\n this.failOnAuthError &&\n typeof closeReason === \"string\" &&\n FATAL_AUTH_CLOSE_REASONS.includes(closeReason)\n ) {\n this.shouldReconnect = false;\n this.firstRejecter(new Error(`Connection failed (auth denied): ${closeReason}`));\n this.firstRejecter = () => undefined;\n this.emit(\"auth_failure\", closeReason, details);\n return true;\n }\n\n // Consumed-app connections (failOnAuthError) fail fast on the FIRST\n // connect: a caller awaits connectToApp and should get a prompt error\n // instead of an indefinite retry when the provider realm is absent. They\n // still reconnect after a first success — see the manual-reconnect gate.\n if (this.failOnAuthError && !this.hasOpenedOnce) {\n this.firstRejecter(\n new Error(`Connection failed: ${reason} - ${JSON.stringify(details, null, 2)}`)\n );\n this.firstRejecter = () => undefined;\n return false;\n }\n\n // Primary own-realm connection: retry through EVERY failure until the first\n // join lands. The concurrent-install race boots the app container before\n // the databackend provisions the app realm, so the router ABORTs the join\n // with `wamp.error.no_such_realm` until the realm exists. We must NOT reject\n // `start()` here — `firstConnection` resolves only when `onOpen` fires, so\n // the app waits for its realm to come up instead of dying on boot.\n //\n // Autobahn disables its own auto-reconnect (`_retry = false`) whenever the\n // server sends a WAMP GOODBYE or ABORT (no_such_realm, or the router's\n // `wamp.close.system_shutdown` on restart), signalled by\n // `will_retry === false`. Drive reconnection ourselves in that case;\n // `onOpen` then re-runs resubscribeAll/reregisterAll. When autobahn WILL\n // auto-retry (e.g. transport unreachable, `will_retry !== false`) we leave\n // it to autobahn so we don't race two reconnect loops.\n if (this.shouldReconnect && details?.will_retry === false) {\n this.handleManualReconnect(closeReason);\n }\n\n // return false to let autobahn handle auto-reconnect\n return false;\n }\n\n private async handleManualReconnect(reason: string) {\n if (this.isReconnecting || !this.shouldReconnect) {\n return;\n }\n this.isReconnecting = true;\n while (this.shouldReconnect && !this.session) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n if (this.shouldReconnect && this.connection && !this.session) {\n console.log(`Manually retrying connection after ${reason}...`);\n try {\n this.connection.open();\n await new Promise((resolve) => setTimeout(resolve, 500));\n } catch (error) {\n console.error(\"Error during manual reconnection attempt:\", error);\n }\n }\n }\n this.isReconnecting = false;\n }\n\n /**\n * Waits for an open session; `context` names the pending operation so the\n * timeout error explains what could not be performed and why.\n */\n private async sessionWait(context: string): Promise<autobahn.Session> {\n const startTime = Date.now();\n while (!this.session) {\n if (Date.now() - startTime > SESSION_WAIT_TIMEOUT) {\n throw new Error(\n `Cannot ${context}: not connected to the IronFlock router ` +\n `(no session after ${SESSION_WAIT_TIMEOUT / 1000}s, realm ` +\n `'${this.realm ?? \"unconfigured\"}'). Ensure start() was called and ` +\n `the connection is established.`\n );\n }\n await new Promise((resolve) => setTimeout(resolve, 200));\n }\n return this.session;\n }\n\n async waitForConnection() {\n return this.firstConnection;\n }\n\n getSession() {\n return this.session;\n }\n\n get is_open(): boolean {\n return !!this.session?.isOpen;\n }\n\n isConnected() {\n return this.is_open;\n }\n\n stop() {\n this.shouldReconnect = false;\n // The primary connection no longer rejects firstConnection on close (it\n // waits indefinitely for its realm), so unblock any start() still awaiting\n // the first join when the app shuts down mid-connect. No-op once opened —\n // onOpen has already reset the rejecter.\n this.firstRejecter(new Error(\"Connection stopped before it opened\"));\n this.firstRejecter = () => undefined;\n this.connection?.close(\"wamp.close.normal\", \"Connection closed by client\");\n }\n\n async subscribe(\n topic: string,\n handler: autobahn.SubscribeHandler\n ): Promise<autobahn.Subscription | undefined> {\n const session = await this.sessionWait(`subscribe to topic '${topic}'`);\n let sub: autobahn.Subscription | undefined;\n try {\n sub = await session.subscribe(topic, handler);\n } catch (e) {\n throw toReadableError(\"Subscribe to topic\", topic, e);\n }\n if (sub) {\n this.subscriptions.push(sub);\n }\n return sub;\n }\n\n async unsubscribe(sub: autobahn.Subscription) {\n await this.sessionWait(`unsubscribe from topic '${sub.topic}'`);\n const idx = this.subscriptions.indexOf(sub);\n if (idx !== -1) {\n this.subscriptions.splice(idx, 1);\n await this.session?.unsubscribe(sub);\n }\n }\n\n async unsubscribeTopic(topic: string) {\n const matching = this.subscriptions.filter((sub) => sub.topic === topic);\n for (const sub of matching) {\n await this.unsubscribe(sub);\n }\n }\n\n private async resubscribeAll() {\n const previous = [...this.subscriptions];\n this.subscriptions = [];\n await Promise.all(\n previous.map((sub) => this.subscribe(sub.topic, sub.handler))\n );\n }\n\n private async reregisterAll() {\n const previous = [...this.registrations];\n this.registrations = [];\n await Promise.all(\n previous.map((reg) => this.register(reg.procedure, reg.endpoint, reg.options))\n );\n }\n\n async register(\n topic: string,\n endpoint: autobahn.RegisterEndpoint,\n options?: autobahn.IRegisterOptions\n ): Promise<autobahn.IRegistration | undefined> {\n const session = await this.sessionWait(`register procedure '${topic}'`);\n const effectiveOptions = { force_reregister: true, ...(options ?? {}) };\n let registration: autobahn.IRegistration | undefined;\n try {\n registration = await session.register(topic, endpoint, effectiveOptions);\n } catch (e) {\n throw toReadableError(\"Register of procedure\", topic, e);\n }\n if (registration) {\n this.registrations.push(registration);\n }\n return registration;\n }\n\n async unregister(registration: autobahn.Registration) {\n await this.sessionWait(`unregister procedure '${registration.procedure}'`);\n await this.session?.unregister(registration);\n const idx = this.registrations.indexOf(registration);\n if (idx !== -1) {\n this.registrations.splice(idx, 1);\n }\n }\n\n async call<T>(\n procedure: string,\n args?: any[],\n kwargs?: object,\n options?: any\n ) {\n const session = await this.sessionWait(`call procedure '${procedure}'`);\n try {\n return await session.call<T>(procedure, args, kwargs, options);\n } catch (e) {\n throw toReadableError(\"Call of procedure\", procedure, e);\n }\n }\n\n async publish(\n topic: string,\n args?: any[],\n kwargs?: object,\n options?: any\n ) {\n const session = await this.sessionWait(`publish to topic '${topic}'`);\n try {\n return await session.publish(topic, args, kwargs, options);\n } catch (e) {\n throw toReadableError(\"Publish to topic\", topic, e);\n }\n }\n}\n","const _isTypeUint32 = (value) => Math.floor(value) === value && MINIMUM <= value && value <= MAXIMUM;\nconst MINIMUM = 0;\nconst MAXIMUM = 2 ** 32 - 1;\n\nexport { _isTypeUint32 };\n//# sourceMappingURL=_isTypeUint32.mjs.map\n","const _isFormatDateTime = (str) => PATTERN.test(str);\nconst PATTERN = /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])(T|\\s)([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]{1,9})?(Z|[+-]([01][0-9]|2[0-3]):[0-5][0-9])$/i;\n\nexport { _isFormatDateTime };\n//# sourceMappingURL=_isFormatDateTime.mjs.map\n","const _validateReport = (array) => {\n const reportable = (path) => {\n if (array.length === 0)\n return true;\n const last = array[array.length - 1].path;\n return path.length > last.length || last.substring(0, path.length) !== path;\n };\n return (exceptable, error) => {\n if (exceptable && reportable(error.path)) {\n if (error.value === undefined)\n error.description ??= [\n \"The value at this path is `undefined`.\",\n \"\",\n `Please fill the \\`${error.expected}\\` typed value next time.`,\n ].join(\"\\n\");\n array.push(error);\n }\n return false;\n };\n};\n\nexport { _validateReport };\n//# sourceMappingURL=_validateReport.mjs.map\n","const _createStandardSchema = (fn) => Object.assign(fn, {\n \"~standard\": {\n version: 1,\n vendor: \"typia\",\n validate: (input) => {\n const result = fn(input);\n if (result.success) {\n return {\n value: result.data,\n };\n }\n else {\n return {\n issues: result.errors.map((error) => ({\n message: `expected ${error.expected}, got ${error.value}`,\n path: typiaPathToStandardSchemaPath(error.path),\n })),\n };\n }\n },\n },\n});\nvar PathParserState;\n(function (PathParserState) {\n // Start of a new segment\n // When the parser is in this state,\n // the pointer must point `.` or `[` or equal to length of the path\n PathParserState[PathParserState[\"Start\"] = 0] = \"Start\";\n // Parsing a property key (`.hoge`)\n PathParserState[PathParserState[\"Property\"] = 1] = \"Property\";\n // Parsing a string key (`[\"fuga\"]`)\n PathParserState[PathParserState[\"StringKey\"] = 2] = \"StringKey\";\n // Parsing a number key (`[42]`)\n PathParserState[PathParserState[\"NumberKey\"] = 3] = \"NumberKey\";\n})(PathParserState || (PathParserState = {}));\nconst typiaPathToStandardSchemaPath = (path) => {\n if (!path.startsWith(\"$input\")) {\n throw new Error(`Invalid path: ${JSON.stringify(path)}`);\n }\n const segments = [];\n let currentSegment = \"\";\n let state = PathParserState.Start;\n let index = \"$input\".length - 1;\n while (index < path.length - 1) {\n index++;\n const char = path[index];\n if (state === PathParserState.Property) {\n if (char === \".\" || char === \"[\") {\n // End of property\n segments.push({\n key: currentSegment,\n });\n state = PathParserState.Start;\n }\n else if (index === path.length - 1) {\n // End of path\n currentSegment += char;\n segments.push({\n key: currentSegment,\n });\n index++;\n state = PathParserState.Start;\n }\n else {\n currentSegment += char;\n }\n }\n else if (state === PathParserState.StringKey) {\n if (char === '\"') {\n // End of string key\n segments.push({\n key: JSON.parse(currentSegment + char),\n });\n // Skip `\"` and `]`\n index += 2;\n state = PathParserState.Start;\n }\n else if (char === \"\\\\\") {\n // Skip the next character from parsing\n currentSegment += path[index];\n index++;\n currentSegment += path[index];\n }\n else {\n currentSegment += char;\n }\n }\n else if (state === PathParserState.NumberKey) {\n if (char === \"]\") {\n // End of number key\n segments.push({\n key: Number.parseInt(currentSegment),\n });\n index++;\n state = PathParserState.Start;\n }\n else {\n currentSegment += char;\n }\n }\n if (state === PathParserState.Start && index < path.length - 1) {\n const newChar = path[index];\n currentSegment = \"\";\n if (newChar === \"[\") {\n if (path[index + 1] === '\"') {\n // Start of string key\n // NOTE: Typia uses JSON.stringify for this kind of keys, so `'` will not used as a string delimiter\n state = PathParserState.StringKey;\n index++;\n currentSegment = '\"';\n }\n else {\n // Start of number key\n state = PathParserState.NumberKey;\n }\n }\n else if (newChar === \".\") {\n // Start of property\n state = PathParserState.Property;\n }\n else {\n throw new Error(\"Unreachable: pointer points invalid character\");\n }\n }\n }\n if (state !== PathParserState.Start) {\n throw new Error(`Failed to parse path: ${JSON.stringify(path)}`);\n }\n return segments;\n};\n\nexport { _createStandardSchema };\n//# sourceMappingURL=_createStandardSchema.mjs.map\n","import typia, { tags } from \"typia\";\n\nexport enum Stage {\n DEVELOPMENT = \"dev\",\n PRODUCTION = \"prod\",\n}\n\nexport interface ISOTimeRange {\n start: string & tags.Format<\"date-time\">;\n end: string & tags.Format<\"date-time\">;\n}\n\nexport interface SQLFilterAnd {\n column: string & tags.MinLength<1>;\n operator: string & tags.MinLength<1>;\n value: string | number | boolean | Array<string | number>;\n}\n\n/**\n * Mode marker for `filterAnd`: requests \"latest row per entity\" instead of\n * adding a WHERE predicate. fleetdb derives the latest rows in SQL\n * (DISTINCT ON over the entity key the table declares via\n * `maintainLatestFlagFor` in its data-template; a table without an entity key\n * yields the single most recent row). Replaces the removed physical\n * `latest_flag` column — a legacy `{column: \"latest_flag\", operator: \"=\",\n * value: true}` predicate is still accepted by the server and treated as this\n * marker.\n */\nexport interface LatestMarker {\n latest: true;\n}\n\n/** One entry of `filterAnd`: a WHERE predicate or the `latest` mode marker. */\nexport type TableFilter = SQLFilterAnd | LatestMarker;\n\nexport interface TableQueryParams {\n limit: number & tags.Type<\"uint32\"> & tags.Minimum<1> & tags.Maximum<10000>;\n offset?: number & tags.Type<\"uint32\"> & tags.Minimum<0>;\n timeRange?: ISOTimeRange;\n filterAnd?: TableFilter[];\n /**\n * Columns to return (the system columns tsp, device_key and authid are\n * always included). Omit for all columns.\n */\n columns?: string[];\n}\n\nexport interface LocationParams {\n longitude: number & tags.Minimum<-180> & tags.Maximum<180>;\n latitude: number & tags.Minimum<-90> & tags.Maximum<90>;\n}\n\nexport interface PublishParams {\n topic: string & tags.MinLength<1>;\n args?: unknown[];\n kwargs?: Record<string, unknown>;\n}\n\nexport interface CallParams {\n deviceKey: string & tags.MinLength<1>;\n topic: string & tags.MinLength<1>;\n args?: unknown[];\n kwargs?: Record<string, unknown>;\n}\n\nexport interface TableParams {\n tablename: string & tags.MinLength<1>;\n args?: unknown[];\n kwargs?: Record<string, unknown>;\n}\n\nexport interface BulkTableParams {\n tablename: string & tags.MinLength<1>;\n rows: Record<string, unknown>[] & tags.MinItems<1>;\n kwargs?: Record<string, unknown>;\n}\n\n/** Down-sampling aggregation applied per time bucket in a series query. */\nexport type DownSampleMethod = \"AVG\" | \"SUM\" | \"COUNT\" | \"MIN\" | \"MAX\" | \"FIRST\" | \"LAST\";\n\n/**\n * [start, end] tuple — ISO date-time strings or epoch-ms numbers; null = open end.\n * Mirrors fleetdb's TimeRangeInput (a tuple, unlike TableQueryParams.timeRange).\n */\nexport type SeriesTimeRange = [string | null, string | null] | [number | null, number | null];\n\n/** Query parameters for `history.transformed.series.{tablename}` (mirrors fleetdb's SeriesQueryParams). */\nexport interface SeriesQueryParams {\n /** Numeric columns to down-sample. */\n metrics: string[];\n method: DownSampleMethod;\n limit: number & tags.Type<\"uint32\"> & tags.Minimum<1> & tags.Maximum<10000>;\n /** Required — the series RPC rejects queries without a time range. */\n timeRange: SeriesTimeRange;\n groupBy?: string[] | null;\n /** WHERE predicates only — the `latest` marker is not supported in series queries. */\n filterAnd?: SQLFilterAnd[] | null;\n}\n\n/** A non-private table or transform another app shares, as listed in its catalog. */\nexport interface ProviderTableInfo {\n tablename: string;\n description?: string;\n /** Column definitions as declared in the provider's data-template. */\n columns?: Array<Record<string, unknown>>;\n}\n\n/** Per-stage catalog of what a provider app shares. */\nexport interface ConsumedAppStageCatalog {\n tables: ProviderTableInfo[];\n transforms: ProviderTableInfo[];\n}\n\n/**\n * Result of `sys.appaccess.resolve`. A stage is present only when the provider's\n * data backend exists for that stage; catalogs list non-private entries only.\n */\nexport interface ConsumedAppInfo {\n app: string;\n provider_app_key: number;\n stages: {\n dev?: ConsumedAppStageCatalog;\n prod?: ConsumedAppStageCatalog;\n };\n}\n\n/**\n * Rejects a `latest` marker (or a legacy latest_flag predicate) in series\n * query filters before the request reaches the backend: the series SQL path\n * has no latest-per-entity mode and would generate invalid SQL. Read current\n * values with getHistory and `filterAnd: [{ latest: true }]` instead.\n */\nexport function assertNoLatestMarker(params: SeriesQueryParams | null | undefined): void {\n const filters = (params?.filterAnd ?? []) as unknown as Array<Record<string, unknown> | null>;\n for (const f of filters) {\n if (f && (f.latest === true || f.column === \"latest_flag\")) {\n throw new Error(\n \"The 'latest' marker (and the legacy latest_flag filter) is not supported in series queries — \" +\n \"use getHistory() with filterAnd: [{ latest: true }] to read current values.\"\n );\n }\n }\n}\n\nexport const validateTableQueryParams = typia.createValidate<TableQueryParams>();\nexport const validateSeriesQueryParams = typia.createValidate<SeriesQueryParams>();\nexport const validateLocationParams = typia.createValidate<LocationParams>();\nexport const validatePublishParams = typia.createValidate<PublishParams>();\nexport const validateCallParams = typia.createValidate<CallParams>();\nexport const validateTableParams = typia.createValidate<TableParams>();\nexport const validateBulkTableParams = typia.createValidate<BulkTableParams>();\n","import { CrossbarConnection } from \"./crossbar\";\nimport {\n assertNoLatestMarker,\n validateTableQueryParams,\n validateSeriesQueryParams,\n type TableQueryParams,\n type SeriesQueryParams,\n type ProviderTableInfo,\n type ConsumedAppStageCatalog,\n} from \"./types\";\n\nexport type CrossAppAccessErrorCode =\n | \"NO_GRANT\"\n | \"PROVIDER_NOT_INSTALLED\"\n | \"UNKNOWN_APP\"\n | \"PRIVATE_TABLE\"\n | \"NOT_AUTHORIZED\";\n\nconst WAMP_ERROR_CODE_MAP: Record<string, CrossAppAccessErrorCode> = {\n \"sys.appaccess.error.no_grant\": \"NO_GRANT\",\n \"sys.appaccess.error.provider_not_installed\": \"PROVIDER_NOT_INSTALLED\",\n \"sys.appaccess.error.unknown_app\": \"UNKNOWN_APP\",\n \"wamp.error.not_authorized\": \"NOT_AUTHORIZED\",\n \"wamp.error.authorization_failed\": \"NOT_AUTHORIZED\",\n \"wamp.error.authentication_failed\": \"NOT_AUTHORIZED\",\n};\n\n/** Raised when reading another app's data backend is declined or misused. */\nexport class CrossAppAccessError extends Error {\n readonly code: CrossAppAccessErrorCode;\n\n constructor(code: CrossAppAccessErrorCode, message?: string) {\n super(message ?? code);\n this.name = \"CrossAppAccessError\";\n this.code = code;\n }\n}\n\n/**\n * Maps a WAMP rejection (autobahn Error: `{error: <uri>, args, kwargs}`) to a\n * CrossAppAccessError, or returns null when the URI is not a cross-app access\n * condition (caller should rethrow the original error).\n */\nexport function mapWampError(e: unknown): CrossAppAccessError | null {\n const uri = (e as { error?: unknown })?.error;\n if (typeof uri !== \"string\") return null;\n const code = WAMP_ERROR_CODE_MAP[uri];\n if (!code) return null;\n const args = (e as { args?: unknown[] }).args;\n const detail = Array.isArray(args) && args.length > 0 ? `: ${JSON.stringify(args[0])}` : \"\";\n return new CrossAppAccessError(code, `${uri}${detail}`);\n}\n\n/**\n * Read-only handle on another app's data backend, returned by\n * {@link IronFlock.connectToApp}. Wraps a dedicated WAMP connection to the\n * provider's realm; the router restricts it to subscribing `transformed.*`\n * and calling `history.transformed.*`. Transforms (views) are consumable\n * exactly like tables — same topic/RPC names — except for series history,\n * which exists for tables only.\n */\nexport class ConsumedApp {\n /** Provider app name, as declared in `consumes:`. */\n readonly app: string;\n /** Provider stage this handle is connected to. */\n readonly stage: \"dev\" | \"prod\";\n /** Non-private tables the provider shares on this stage. */\n readonly tables: ProviderTableInfo[];\n /** Non-private transforms (views) the provider shares on this stage. */\n readonly transforms: ProviderTableInfo[];\n\n private _connection: CrossbarConnection;\n private _onClosed?: () => void;\n\n constructor(\n app: string,\n stage: \"dev\" | \"prod\",\n catalog: ConsumedAppStageCatalog,\n connection: CrossbarConnection,\n onClosed?: () => void\n ) {\n this.app = app;\n this.stage = stage;\n this.tables = catalog.tables ?? [];\n this.transforms = catalog.transforms ?? [];\n this._connection = connection;\n this._onClosed = onClosed;\n }\n\n get connection(): CrossbarConnection {\n return this._connection;\n }\n\n get isConnected(): boolean {\n return this._connection.is_open;\n }\n\n // DX guard: names outside the shared catalog are either private or don't\n // exist — fail fast client-side instead of silently receiving nothing\n // (private publishes are filtered via exclude_authrole, not errors).\n private assertInCatalog(tablename: string) {\n if (!tablename) throw new Error(\"Tablename must not be empty!\");\n const known = [...this.tables, ...this.transforms].map((t) => t.tablename);\n if (!known.includes(tablename)) {\n throw new CrossAppAccessError(\n \"PRIVATE_TABLE\",\n `'${tablename}' is not shared by app '${this.app}' (${this.stage}). ` +\n `Available tables/transforms: ${known.length > 0 ? known.join(\", \") : \"none\"}`\n );\n }\n }\n\n /**\n * Subscribes to realtime rows of a shared table or transform. Bulk inserts\n * (`transformed.bulk.{t}`) are unrolled row-by-row through the same handler,\n * so caller code always sees the single-row shape.\n */\n async subscribeToTable(\n tablename: string,\n handler: (...args: any[]) => void,\n options?: object\n ) {\n this.assertInCatalog(tablename);\n\n const sub = await this._connection.subscribe(`transformed.${tablename}`, handler);\n\n const bulkHandler = (args?: any[], kwargs?: any, details?: any) => {\n const rows = Array.isArray(args) ? args[0] : args;\n const rowList = Array.isArray(rows) ? rows : rows == null ? [] : [rows];\n for (const row of rowList) {\n handler([row], kwargs, details);\n }\n };\n await this._connection.subscribe(`transformed.bulk.${tablename}`, bulkHandler);\n\n return sub;\n }\n\n /**\n * Queries history rows of a shared table or transform. To read the CURRENT\n * value(s), add the `latest` marker to the filters:\n * `{ filterAnd: [{ latest: true }], limit: 100 }` — the provider's data\n * backend derives the latest row per entity in SQL (the physical\n * `latest_flag` column no longer exists).\n */\n async getHistory(\n tablename: string,\n queryParams: TableQueryParams = { limit: 10 }\n ) {\n this.assertInCatalog(tablename);\n\n if (queryParams.offset == null) {\n (queryParams as any).offset = 0;\n }\n\n const validation = validateTableQueryParams(queryParams);\n if (!validation.success) {\n throw new Error(`Invalid query parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n try {\n return await this._connection.call(`history.transformed.${tablename}`, [queryParams]);\n } catch (e) {\n throw mapWampError(e) ?? e;\n }\n }\n\n /**\n * Queries down-sampled series history of a shared table (tables only — no\n * series RPC exists for transforms). Series queries do not support the\n * `latest` marker; use {@link getHistory} with\n * `filterAnd: [{ latest: true }]` to read current values.\n */\n async getSeriesHistory(tablename: string, params: SeriesQueryParams) {\n if (!tablename) throw new Error(\"Tablename must not be empty!\");\n assertNoLatestMarker(params);\n const tableNames = this.tables.map((t) => t.tablename);\n if (!tableNames.includes(tablename)) {\n // Transforms pass the generic catalog guard but have no series RPC —\n // fail fast with a pointer instead of a raw no_such_procedure.\n if (this.transforms.some((t) => t.tablename === tablename)) {\n throw new CrossAppAccessError(\n \"PRIVATE_TABLE\",\n `'${tablename}' is a transform of app '${this.app}' (${this.stage}); ` +\n `series history is available for tables only — use getHistory() instead.`\n );\n }\n throw new CrossAppAccessError(\n \"PRIVATE_TABLE\",\n `'${tablename}' is not a shared table of app '${this.app}' (${this.stage}). ` +\n `Available tables: ${tableNames.length > 0 ? tableNames.join(\", \") : \"none\"}`\n );\n }\n\n const validation = validateSeriesQueryParams(params);\n if (!validation.success) {\n throw new Error(`Invalid series query parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n try {\n return await this._connection.call(`history.transformed.series.${tablename}`, [params]);\n } catch (e) {\n throw mapWampError(e) ?? e;\n }\n }\n\n /** Closes the underlying connection to the provider's realm. */\n async close(): Promise<void> {\n this._connection.stop();\n this._onClosed?.();\n this._onClosed = undefined;\n }\n}\n","import autobahn from \"autobahn\";\nimport { CrossbarConnection } from \"./crossbar\";\nimport { ConsumedApp, CrossAppAccessError, mapWampError } from \"./consumedApp\";\nimport {\n Stage,\n assertNoLatestMarker,\n validatePublishParams,\n validateTableParams,\n validateBulkTableParams,\n validateLocationParams,\n validateTableQueryParams,\n validateSeriesQueryParams,\n type TableQueryParams,\n type SeriesQueryParams,\n type ConsumedAppInfo,\n} from \"./types\";\n\n/**\n * Name of the per-databackend system error table. Apps report errors into it via\n * {@link IronFlock.reportError}; it behaves like any normal table, so it can be\n * queried (getHistory) and streamed (subscribeToTable) and used in board-templates.\n */\nexport const ERROR_LOGS_TABLE = \"error-logs\";\n\n/** Severity level recorded alongside a reported error. */\nexport type ErrorLevel = \"error\" | \"warn\" | \"info\" | \"debug\";\n\nexport interface ReportErrorOptions {\n /** Severity level. Defaults to \"error\". */\n level?: ErrorLevel;\n /**\n * When true, use the RPC append path (resolves with the insert outcome).\n * Defaults to false: fire-and-forget publish, matching typical logging.\n */\n append?: boolean;\n /** ISO-8601 timestamp override. Defaults to the current time. */\n tsp?: string;\n}\n\nfunction getEnv(key: string): string | undefined {\n return typeof process !== \"undefined\" ? process.env?.[key] : undefined;\n}\n\n/**\n * Platform-injected value by name: the live env FILE first, env var second.\n *\n * The device agent mirrors every injected env var to `/data/env/{name}.txt`\n * (a bind mount, so the agent can update values in RUNNING containers — e.g.\n * the cloud port of an instance tunnel, allocated only after the tunnel first\n * connects). Env vars are the start-time snapshot and serve as the fallback.\n * File reads use `process.getBuiltinModule` so bundlers never see an fs\n * import; in browsers (and on runtimes without it) this degrades to env-only.\n * Directory overridable via `IRONFLOCK_ENV_DIR`.\n */\nfunction readInjectedValue(name: string): string | undefined {\n if (typeof process !== \"undefined\") {\n try {\n const fs = (process as any).getBuiltinModule?.(\"node:fs\");\n if (fs) {\n const dir = getEnv(\"IRONFLOCK_ENV_DIR\") ?? \"/data/env\";\n const value = fs.readFileSync(`${dir}/${name}.txt`, \"utf8\").trim();\n if (value) return value;\n }\n } catch {\n // missing file/dir or unreadable — fall through to the env var\n }\n }\n return getEnv(name);\n}\n\nfunction getSerialNumber(serialNumber?: string): string {\n const sn = serialNumber ?? getEnv(\"DEVICE_SERIAL_NUMBER\");\n if (!sn) {\n throw new Error(\"serialNumber option is required (or set DEVICE_SERIAL_NUMBER env var in Node.js)\");\n }\n return sn;\n}\n\n/**\n * Wraps a failed history/series RPC into an error that explains the most\n * common cause — the procedure is not registered because the table is not\n * declared in the data-template or the app's data backend is not running —\n * instead of only a raw WAMP URI.\n */\nfunction describeHistoryError(operation: string, topic: string, e: unknown): Error {\n const uri = (e as { error?: unknown } | null | undefined)?.error;\n const text = e instanceof Error ? e.message : String(e);\n const notRegistered =\n (typeof uri === \"string\" && uri.includes(\"no_such_procedure\")) ||\n text.includes(\"no_such_procedure\") ||\n text.includes(\"no callee registered\");\n if (notRegistered) {\n return new Error(\n `${operation} failed: history procedure '${topic}' is not registered. ` +\n `Check that the table is declared in the app's data-template and that ` +\n `the app's data backend is running.`\n );\n }\n return e instanceof Error ? e : new Error(`${operation} failed: ${text}`);\n}\n\nexport interface ConnectToAppOptions {\n /** Provider stage to connect to. Defaults to this app's own stage (ENV). */\n stage?: \"dev\" | \"prod\";\n /**\n * Invoked when the consumed-app connection is fatally denied AFTER\n * connectToApp resolved (e.g. the grant was revoked and the next reconnect\n * was refused). While connectToApp is still pending, the same condition\n * surfaces as a rejection instead.\n */\n onError?: (error: CrossAppAccessError) => void;\n}\n\nexport interface ConnectToAllAppsOptions {\n /** Provider stage to connect to. Defaults to this app's own stage (ENV). */\n stage?: \"dev\" | \"prod\";\n /**\n * Invoked with the failure of each provider that could not be opened (only\n * when continueOnError is true — otherwise the first failure rejects), and\n * with a {@link CrossAppAccessError} if an already-opened provider connection\n * is later fatally denied (grant revoked → refused reconnect).\n */\n onError?: (error: unknown) => void;\n /**\n * When true (the default) a provider that fails to open is reported via\n * onError and omitted from the result. When false the first failure rejects\n * connectToAllApps.\n */\n continueOnError?: boolean;\n}\n\nexport interface IronFlockOptions {\n serialNumber?: string;\n deviceName?: string;\n deviceKey?: string;\n appName?: string;\n swarmKey?: number;\n appKey?: number;\n env?: string;\n /** URL of the IronFlock studio instance (e.g. \"https://studio.ironflock.com\") used to resolve the WebSocket URI. */\n reswarmUrl?: string;\n /** Direct WebSocket URI override (e.g. \"wss://cbw.ironflock.com/ws-ua-usr\"). Takes precedence over reswarmUrl. */\n ironFlockUrl?: string;\n /** @deprecated Use ironFlockUrl instead. */\n cburl?: string;\n}\n\nexport class IronFlock {\n private _connection: CrossbarConnection;\n private _serialNumber: string;\n private _deviceName?: string;\n private _deviceKey?: string;\n private _appName?: string;\n private _swarmKey: number;\n private _appKey: number;\n private _env?: string;\n private _isConfigured = false;\n\n private _reswarmUrl?: string;\n private _cburl?: string;\n\n // Consumed-app connections keyed `${appName}:${stage}`. Caching the promise\n // (not the instance) dedupes concurrent connectToApp calls.\n private _consumedApps = new Map<string, Promise<ConsumedApp>>();\n\n constructor(options?: IronFlockOptions) {\n this._serialNumber = getSerialNumber(options?.serialNumber);\n this._deviceName = options?.deviceName ?? getEnv(\"DEVICE_NAME\");\n this._deviceKey = options?.deviceKey ?? getEnv(\"DEVICE_KEY\");\n this._appName = options?.appName ?? getEnv(\"APP_NAME\");\n this._swarmKey = options?.swarmKey ?? parseInt(getEnv(\"SWARM_KEY\") ?? \"0\", 10);\n this._appKey = options?.appKey ?? parseInt(getEnv(\"APP_KEY\") ?? \"0\", 10);\n this._env = options?.env ?? getEnv(\"ENV\");\n this._reswarmUrl = options?.reswarmUrl ?? getEnv(\"RESWARM_URL\");\n this._cburl = options?.ironFlockUrl ?? options?.cburl;\n this._connection = new CrossbarConnection();\n\n const missing: string[] = [];\n if (!this._deviceKey) missing.push(\"DEVICE_KEY\");\n if (!this._appName) missing.push(\"APP_NAME\");\n if (!this._swarmKey) missing.push(\"SWARM_KEY\");\n if (!this._appKey) missing.push(\"APP_KEY\");\n if (missing.length > 0) {\n console.warn(\n `Warning: The following environment variables must be present: ${missing.join(\", \")}`\n );\n }\n }\n\n get connection(): CrossbarConnection {\n return this._connection;\n }\n\n get isConnected(): boolean {\n return this._connection.is_open;\n }\n\n private configureConnection(cburl?: string) {\n if (this._isConfigured) return;\n\n const envValue = (this._env ?? \"DEV\").toUpperCase();\n const stageMap: Record<string, Stage> = {\n DEV: Stage.DEVELOPMENT,\n PROD: Stage.PRODUCTION,\n };\n const stage = stageMap[envValue] ?? Stage.DEVELOPMENT;\n\n const resolvedUrl =\n cburl ??\n this._cburl ??\n CrossbarConnection.getWebSocketURI(this._reswarmUrl);\n\n this._connection.configure(\n this._swarmKey,\n this._appKey,\n stage,\n this._serialNumber,\n resolvedUrl\n );\n this._isConfigured = true;\n }\n\n async start(cburl?: string): Promise<void> {\n this.configureConnection(cburl);\n await this._connection.start();\n }\n\n async stop(): Promise<void> {\n const consumed = [...this._consumedApps.values()];\n this._consumedApps.clear();\n await Promise.all(\n consumed.map((pending) => pending.then((app) => app.close()).catch(() => undefined))\n );\n this._connection.stop();\n }\n\n /**\n * Opens a read-only connection to another app's data backend in the same\n * project. The provider app must be declared in this app's data-template\n * `consumes:` section and the project user must have granted access.\n *\n * Resolves the provider via `sys.appaccess.resolve`, then connects to the\n * provider's realm with this device's credentials (router role\n * `app_reader`). Connections are cached per app+stage and closed by\n * {@link stop}.\n *\n * @throws {CrossAppAccessError} NO_GRANT | PROVIDER_NOT_INSTALLED |\n * UNKNOWN_APP | NOT_AUTHORIZED\n */\n async connectToApp(\n appName: string,\n opts?: ConnectToAppOptions\n ): Promise<ConsumedApp> {\n if (!appName) throw new Error(\"appName must not be empty!\");\n\n const ownStage = (this._env ?? \"DEV\").toUpperCase() === \"PROD\" ? \"prod\" : \"dev\";\n const stage = opts?.stage ?? ownStage;\n\n // Lowercase the name so this key matches the list-derived keys used by\n // connectToAllApps (fleetdb/resolve return app names lowercased): a later\n // connectToApp(\"MyProvider\") then reuses a warmed handle instead of opening\n // a duplicate connection.\n const cacheKey = `${appName.toLowerCase()}:${stage}`;\n const cached = this._consumedApps.get(cacheKey);\n if (cached) return cached;\n\n // Evicts this attempt only — never a newer connection cached later under\n // the same key (e.g. re-connect after close/revoke).\n let pending: Promise<ConsumedApp>;\n const evict = () => {\n if (this._consumedApps.get(cacheKey) === pending) {\n this._consumedApps.delete(cacheKey);\n }\n };\n pending = this.openConsumedApp(appName, stage, evict, opts?.onError);\n this._consumedApps.set(cacheKey, pending);\n // Failed attempts must not poison the cache — a later call retries fresh.\n pending.catch(evict);\n return pending;\n }\n\n /**\n * Lists every non-private provider catalog in this project for an app holding\n * the wildcard consume grant (`consumes: [{app: \"*\"}]`). One\n * `sys.appaccess.list` call; opens no consumed-app connections. A picker (e.g.\n * a Node-RED node) renders the returned catalogs, then calls\n * {@link connectToApp} per chosen provider; {@link connectToAllApps} opens\n * them all eagerly.\n *\n * @throws {CrossAppAccessError} NO_GRANT when this app holds no wildcard grant.\n */\n async listConsumableApps(): Promise<ConsumedAppInfo[]> {\n try {\n // The fleetdb handler derives the consumer from the arrival realm and\n // ignores call args, so no payload is needed.\n const infos = await this._connection.call<ConsumedAppInfo[]>(\n \"sys.appaccess.list\",\n []\n );\n return infos ?? [];\n } catch (e) {\n throw mapWampError(e) ?? e;\n }\n }\n\n /**\n * Opens read-only connections to every non-private provider in this project\n * (wildcard consumers only). Enumerates providers via {@link listConsumableApps}\n * and opens each directly from its resolved info — no per-app resolve\n * round-trip. Each handle is cached under the same `${app}:${stage}` key\n * {@link connectToApp} uses, so a later `connectToApp(name)` returns the warmed\n * handle. Providers lacking a data backend for the requested stage are skipped.\n *\n * @throws {CrossAppAccessError} NO_GRANT when this app holds no wildcard grant.\n */\n async connectToAllApps(\n opts?: ConnectToAllAppsOptions\n ): Promise<ConsumedApp[]> {\n const ownStage = (this._env ?? \"DEV\").toUpperCase() === \"PROD\" ? \"prod\" : \"dev\";\n const stage = opts?.stage ?? ownStage;\n const continueOnError = opts?.continueOnError ?? true;\n\n const infos = await this.listConsumableApps();\n\n const pending: Promise<ConsumedApp>[] = [];\n for (const info of infos) {\n // Skip providers with no data backend for the requested stage.\n if (!info.stages?.[stage]) continue;\n pending.push(this.openCachedFromInfo(info, stage, opts?.onError));\n }\n\n const settled = await Promise.allSettled(pending);\n const opened: ConsumedApp[] = [];\n for (const result of settled) {\n if (result.status === \"fulfilled\") {\n opened.push(result.value);\n } else if (continueOnError) {\n opts?.onError?.(result.reason);\n } else {\n throw result.reason;\n }\n }\n return opened;\n }\n\n private async openConsumedApp(\n appName: string,\n stage: \"dev\" | \"prod\",\n evict: () => void,\n onError?: (error: CrossAppAccessError) => void\n ): Promise<ConsumedApp> {\n let info: ConsumedAppInfo | undefined;\n try {\n info = await this._connection.call<ConsumedAppInfo>(\"sys.appaccess.resolve\", [\n { app: appName },\n ]);\n } catch (e) {\n throw mapWampError(e) ?? e;\n }\n\n if (!info) {\n throw new CrossAppAccessError(\n \"PROVIDER_NOT_INSTALLED\",\n `App '${appName}' has no ${stage} data backend in this project`\n );\n }\n\n return this.openFromInfo(info, stage, evict, onError);\n }\n\n /** Caches (or reuses) a connection opened directly from a resolved provider\n * info, using the same `${app}:${stage}` key as {@link connectToApp}. */\n private openCachedFromInfo(\n info: ConsumedAppInfo,\n stage: \"dev\" | \"prod\",\n onError?: (error: unknown) => void\n ): Promise<ConsumedApp> {\n const cacheKey = `${info.app}:${stage}`;\n const cached = this._consumedApps.get(cacheKey);\n if (cached) return cached;\n\n let pending: Promise<ConsumedApp>;\n const evict = () => {\n if (this._consumedApps.get(cacheKey) === pending) {\n this._consumedApps.delete(cacheKey);\n }\n };\n pending = this.openFromInfo(info, stage, evict, onError);\n this._consumedApps.set(cacheKey, pending);\n // Failed attempts must not poison the cache — a later call retries fresh.\n pending.catch(evict);\n return pending;\n }\n\n /**\n * Opens the second CrossbarConnection to a provider realm from an already\n * resolved {@link ConsumedAppInfo} — everything after the sys.appaccess.resolve\n * round-trip. Shared by {@link connectToApp} (which resolves one provider) and\n * {@link connectToAllApps} (which lists every provider in one call).\n */\n private async openFromInfo(\n info: ConsumedAppInfo,\n stage: \"dev\" | \"prod\",\n evict: () => void,\n onError?: (error: CrossAppAccessError) => void\n ): Promise<ConsumedApp> {\n const appName = info.app;\n const catalog = info.stages?.[stage];\n if (!catalog) {\n throw new CrossAppAccessError(\n \"PROVIDER_NOT_INSTALLED\",\n `App '${appName}' has no ${stage} data backend in this project`\n );\n }\n\n const connection = new CrossbarConnection();\n connection.failOnAuthError = true;\n connection.configure(\n this._swarmKey,\n info.provider_app_key,\n stage === \"prod\" ? Stage.PRODUCTION : Stage.DEVELOPMENT,\n this._serialNumber,\n // Reuse the own connection's resolved socket URI (set once start() ran).\n this._connection.socketURI ??\n this._cburl ??\n CrossbarConnection.getWebSocketURI(this._reswarmUrl)\n );\n\n let opened = false;\n let authFailure: CrossAppAccessError | undefined;\n connection.on(\"auth_failure\", (closeReason: string) => {\n authFailure = new CrossAppAccessError(\n \"NOT_AUTHORIZED\",\n `Access to app '${appName}' (${stage}) denied: ${closeReason}. The grant may have been revoked.`\n );\n // Evict so a later connectToApp (e.g. after the grant is restored)\n // opens a fresh connection instead of returning this dead one.\n evict();\n if (opened) onError?.(authFailure);\n });\n\n try {\n await connection.start();\n } catch (e) {\n throw authFailure ?? e;\n }\n opened = true;\n\n return new ConsumedApp(appName, stage, catalog, connection, evict);\n }\n\n async publish(\n topic: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>\n ): Promise<unknown> {\n const validation = validatePublishParams({ topic, args, kwargs });\n if (!validation.success) {\n throw new Error(`Invalid publish parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n const deviceMetadata: Record<string, unknown> = {\n DEVICE_SERIAL_NUMBER: this._serialNumber,\n DEVICE_KEY: this._deviceKey,\n DEVICE_NAME: this._deviceName,\n };\n const combinedKwargs = { ...deviceMetadata, ...(kwargs ?? {}) };\n\n return this._connection.publish(topic, args, combinedKwargs, {\n acknowledge: true,\n });\n }\n\n async publishToTable(\n tablename: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>\n ): Promise<unknown> {\n const validation = validateTableParams({ tablename, args, kwargs });\n if (!validation.success) {\n throw new Error(`Invalid table parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n if (!this._swarmKey) throw new Error(\"SWARM_KEY not set in environment variables!\");\n if (!this._appKey) throw new Error(\"APP_KEY not set in environment variables!\");\n\n const topic = `${this._swarmKey}.${this._appKey}.${tablename}`;\n return this.publish(topic, args, kwargs);\n }\n\n /**\n * Reports an application error into the databackend's `error-logs` table.\n *\n * This is a thin convenience wrapper over {@link publishToTable} /\n * {@link appendToTable}: it stamps the row with `source: \"app\"`, a severity\n * `level`, and a timestamp, then writes it like any normal table row. The error\n * therefore lands in the same `error-logs` table that fleetdb system errors use\n * (tagged `source: \"system\"`), and is delivered in realtime on\n * `transformed.error-logs` — the channel board-templates consume — without\n * touching the platform error-toast channel (`databackend.errors.*`).\n *\n * @param error An error message, or an Error whose stack/message is recorded.\n * @param opts Optional level (default \"error\"), append flag, and tsp override.\n */\n async reportError(\n error: string | Error,\n opts?: ReportErrorOptions\n ): Promise<unknown> {\n const msg = error instanceof Error ? (error.stack ?? error.message) : error;\n const row = {\n tsp: opts?.tsp ?? new Date().toISOString(),\n msg,\n source: \"app\",\n level: opts?.level ?? \"error\",\n };\n\n return opts?.append\n ? this.appendToTable(ERROR_LOGS_TABLE, [row])\n : this.publishToTable(ERROR_LOGS_TABLE, [row]);\n }\n\n async appendToTable(\n tablename: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>\n ): Promise<unknown> {\n const validation = validateTableParams({ tablename, args, kwargs });\n if (!validation.success) {\n throw new Error(`Invalid table parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n if (!this._swarmKey) throw new Error(\"SWARM_KEY not set in environment variables!\");\n if (!this._appKey) throw new Error(\"APP_KEY not set in environment variables!\");\n\n const topic = `append.${this._swarmKey}.${this._appKey}.${tablename}`;\n\n const deviceMetadata: Record<string, unknown> = {\n DEVICE_SERIAL_NUMBER: this._serialNumber,\n DEVICE_KEY: this._deviceKey,\n DEVICE_NAME: this._deviceName,\n };\n const combinedKwargs = { ...deviceMetadata, ...(kwargs ?? {}) };\n\n return this._connection.call(topic, args as any[], combinedKwargs);\n }\n\n /**\n * Publishes many rows in a single message (bulk insert) to the dedicated topic\n * `bulk.{swarmKey}.{appKey}.{tablename}`. The platform inserts the whole batch\n * atomically (all-or-nothing). Use for high-frequency data where one round-trip\n * per row is too costly. Like publishToTable this is fire-and-forget — the ack\n * confirms delivery to the router, not the DB insert. Use appendRowsToTable when\n * you need the insert outcome.\n */\n async publishRowsToTable(\n tablename: string,\n rows: Record<string, unknown>[],\n kwargs?: Record<string, unknown>\n ): Promise<unknown> {\n const validation = validateBulkTableParams({ tablename, rows, kwargs });\n if (!validation.success) {\n throw new Error(`Invalid bulk table parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n if (!this._swarmKey) throw new Error(\"SWARM_KEY not set in environment variables!\");\n if (!this._appKey) throw new Error(\"APP_KEY not set in environment variables!\");\n\n const topic = `bulk.${this._swarmKey}.${this._appKey}.${tablename}`;\n // Send the whole rows array as the single positional arg, so the backend\n // reads args[0] as the array of rows (mirrors the single-row contract).\n return this.publish(topic, [rows], kwargs);\n }\n\n /**\n * Appends many rows in a single RPC (bulk insert) by calling the dedicated\n * procedure `appendBulk.{swarmKey}.{appKey}.{tablename}`. The platform inserts\n * the whole batch atomically (all-or-nothing): if any row is invalid the entire\n * batch is rejected and nothing is persisted. Resolves with the RPC result\n * (e.g. { success: true, count: N }). Prefer over publishRowsToTable when you\n * need the insert outcome.\n */\n async appendRowsToTable(\n tablename: string,\n rows: Record<string, unknown>[],\n kwargs?: Record<string, unknown>\n ): Promise<unknown> {\n const validation = validateBulkTableParams({ tablename, rows, kwargs });\n if (!validation.success) {\n throw new Error(`Invalid bulk table parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n if (!this._swarmKey) throw new Error(\"SWARM_KEY not set in environment variables!\");\n if (!this._appKey) throw new Error(\"APP_KEY not set in environment variables!\");\n\n const topic = `appendBulk.${this._swarmKey}.${this._appKey}.${tablename}`;\n\n const deviceMetadata: Record<string, unknown> = {\n DEVICE_SERIAL_NUMBER: this._serialNumber,\n DEVICE_KEY: this._deviceKey,\n DEVICE_NAME: this._deviceName,\n };\n const combinedKwargs = { ...deviceMetadata, ...(kwargs ?? {}) };\n\n // args=[rows] => backend reads args[0] as the array of rows.\n return this._connection.call(topic, [rows] as any[], combinedKwargs);\n }\n\n async subscribe(\n topic: string,\n handler: (...args: any[]) => void,\n options?: object\n ) {\n return this._connection.subscribe(topic, handler);\n }\n\n async subscribeToTable(\n tablename: string,\n handler: (...args: any[]) => void,\n options?: object\n ) {\n if (!this._swarmKey) throw new Error(\"SWARM_KEY not set in environment variables!\");\n if (!this._appKey) throw new Error(\"APP_KEY not set in environment variables!\");\n\n const topic = `transformed.${tablename}`;\n const sub = await this.subscribe(topic, handler, options);\n\n // Also subscribe to the dedicated bulk realtime topic. Bulk inserts republish\n // the whole batch as a single array message ([rows]); deliver each row to the\n // same handler in the single-row shape, so caller code (one row per call)\n // stays unchanged and nobody has to sniff object-vs-array.\n const bulkHandler = (args?: any[], kwargs?: any, details?: any) => {\n const rows = Array.isArray(args) ? args[0] : args;\n const rowList = Array.isArray(rows) ? rows : rows == null ? [] : [rows];\n for (const row of rowList) {\n handler([row], kwargs, details);\n }\n };\n await this.subscribe(`transformed.bulk.${tablename}`, bulkHandler, options);\n\n return sub;\n }\n\n async call(\n topic: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>,\n options?: object\n ) {\n return this._connection.call(topic, args as any[], kwargs, options);\n }\n\n async callDeviceFunction(\n deviceKey: number,\n topic: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>,\n options?: object\n ) {\n const fullTopic = `${this._swarmKey}.${deviceKey}.${this._appKey}.${this._env}.${topic}`;\n return this._connection.call(fullTopic, args as any[], kwargs, options);\n }\n\n /** @deprecated Use callDeviceFunction() instead. */\n async callFunction(\n deviceKey: number,\n topic: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>,\n options?: object\n ) {\n console.warn(\"callFunction() is deprecated and will be removed in a future version. Use callDeviceFunction() instead.\");\n return this.callDeviceFunction(deviceKey, topic, args, kwargs, options);\n }\n\n async registerDeviceFunction(\n topic: string,\n endpoint: (...args: any[]) => any,\n options?: autobahn.IRegisterOptions\n ) {\n const fullTopic = `${this._swarmKey}.${this._deviceKey}.${this._appKey}.${this._env}.${topic}`;\n\n const reg = await this._connection.register(fullTopic, endpoint, options);\n console.log(`Function registered for IronFlock topic '${topic}'. (Full WAMP topic: '${fullTopic}')`);\n return reg;\n }\n\n /** @deprecated Use registerDeviceFunction() instead. */\n async registerFunction(\n topic: string,\n endpoint: (...args: any[]) => any,\n options?: autobahn.IRegisterOptions\n ) {\n console.warn(\"registerFunction() is deprecated and will be removed in a future version. Use registerDeviceFunction() instead.\");\n return this.registerDeviceFunction(topic, endpoint, options);\n }\n\n async register(\n topic: string,\n endpoint: (...args: any[]) => any,\n options?: autobahn.IRegisterOptions\n ) {\n return this.registerDeviceFunction(topic, endpoint, options);\n }\n\n /**\n * Queries history rows of an own table or transform via\n * `history.transformed.{tablename}`.\n *\n * To read the CURRENT value(s) instead of raw history, add the `latest`\n * marker to `filterAnd`: `{ filterAnd: [{ latest: true }], limit: 100 }`.\n * The data backend then derives the latest row per entity in SQL (the\n * entity key is the table's `maintainLatestFlagFor` columns; without one,\n * the single most recent row is returned). The former physical\n * `latest_flag` column no longer exists.\n *\n * @throws {Error} on invalid parameters, when the history procedure is not\n * registered (table missing / data backend down), or when the call fails.\n */\n async getHistory(\n tablename: string,\n queryParams: TableQueryParams = { limit: 10 }\n ) {\n if (!tablename) throw new Error(\"Tablename must not be empty!\");\n\n // Normalize null/undefined offset to 0\n if (queryParams.offset == null) {\n (queryParams as any).offset = 0;\n }\n\n const validation = validateTableQueryParams(queryParams);\n if (!validation.success) {\n throw new Error(`Invalid query parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n const topic = `history.transformed.${tablename}`;\n try {\n return await this._connection.call(topic, [queryParams]);\n } catch (e) {\n throw describeHistoryError(`getHistory('${tablename}')`, topic, e);\n }\n }\n\n /**\n * Queries down-sampled series history of an own table by calling\n * `history.transformed.series.{tablename}` (tables only — no series RPC\n * exists for transforms). Series queries do not support the `latest`\n * marker; use {@link getHistory} with `filterAnd: [{ latest: true }]` to\n * read current values.\n *\n * @throws {Error} on invalid parameters, when the series procedure is not\n * registered (table missing / data backend down), or when the call fails.\n */\n async getSeriesHistory(tablename: string, params: SeriesQueryParams) {\n if (!tablename) throw new Error(\"Tablename must not be empty!\");\n\n assertNoLatestMarker(params);\n const validation = validateSeriesQueryParams(params);\n if (!validation.success) {\n throw new Error(`Invalid series query parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n const topic = `history.transformed.series.${tablename}`;\n try {\n return await this._connection.call(topic, [params]);\n } catch (e) {\n throw describeHistoryError(`getSeriesHistory('${tablename}')`, topic, e);\n }\n }\n\n /**\n * Updates the device's location in the platform master data.\n *\n * @throws {Error} on invalid coordinates or when the location service call\n * fails (e.g. not connected).\n */\n async setDeviceLocation(long: number, lat: number) {\n const validation = validateLocationParams({ longitude: long, latitude: lat });\n if (!validation.success) {\n throw new Error(`Invalid location parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n const payload = { long, lat };\n const extra: Record<string, unknown> = {\n DEVICE_SERIAL_NUMBER: this._serialNumber,\n DEVICE_KEY: this._deviceKey,\n DEVICE_NAME: this._deviceName,\n };\n\n // Failures propagate as readable errors (see CrossbarConnection.call).\n return this._connection.call(\n \"ironflock.location_service.update\",\n [payload],\n extra\n );\n }\n\n /**\n * Public URL under which a declared port (port-template.yml) is reachable\n * from the internet once its tunnel is active.\n *\n * For `http`/`https` ports, composes the platform's tunnel label\n * `{device_key}-{app_name}-{port}` (`https` ports carry the platform's\n * `secure-` prefix) on the tunnel domain the device agent injects\n * (`TUNNEL_DOMAIN`; the cloud edge, or the operator's appliance domain).\n * On devices that belong to an instance (appliance), the agent injects\n * `INSTANCE_KEY` and the cloud-forwarded route\n * `https://i{instance_key}-{label}.{cloud edge}` is returned instead —\n * reachable while the instance forwards its tunnels to the cloud.\n *\n * For `tcp`/`udp` ports, the URL uses the tunnel-assigned public port,\n * which the platform injects under the port-template's\n * `remote_port_environment` name — pass that name here. On instance\n * devices the internet-facing port arrives as `{name}_CLOUD`; when it is\n * not (yet) present, the instance-local URL built from `{name}` is\n * returned as a fallback.\n *\n * Port values are read live from the agent-maintained files under\n * `/data/env` (falling back to the process environment), so this method\n * returns the CURRENT url: the instance cloud port is allocated shortly\n * after the tunnel first connects and appears here within seconds — call\n * the method again rather than caching its result.\n *\n * Returns null when the identity or required env vars are unavailable,\n * the protocol is unknown, or the label is not a valid DNS label (longer\n * than 63 characters, or a dot in the app name).\n */\n getRemoteAccessUrlForPort(\n port: number,\n protocol: string = \"http\",\n remotePortEnvironment?: string\n ): string | null {\n const instanceKey = getEnv(\"INSTANCE_KEY\");\n\n if (protocol === \"tcp\" || protocol === \"udp\") {\n if (!remotePortEnvironment) {\n return null;\n }\n\n if (instanceKey) {\n const cloudPort = readInjectedValue(`${remotePortEnvironment}_CLOUD`);\n if (cloudPort) {\n const domain = getEnv(\"CLOUD_TUNNEL_DOMAIN\") ?? \"app.ironflock.com\";\n return `${protocol}://${domain}:${cloudPort}`;\n }\n }\n\n const remotePort = readInjectedValue(remotePortEnvironment);\n if (!remotePort) {\n return null;\n }\n const domain = getEnv(\"TUNNEL_DOMAIN\") ?? \"app.ironflock.com\";\n return `${protocol}://${domain}:${remotePort}`;\n }\n\n if (protocol !== \"http\" && protocol !== \"https\") {\n return null;\n }\n\n if (!this._deviceKey || !this._appName) {\n return null;\n }\n\n let label = `${this._deviceKey}-${this._appName.toLowerCase()}-${port}`;\n if (protocol === \"https\") {\n // https-protocol tunnels get secure- prefixed subdomains platform-wide\n // (CreateSubdomain / CloudURLFor).\n label = `secure-${label}`;\n }\n\n let domain: string;\n if (instanceKey) {\n // Instance route: forwarded through the cloud tunnel edge.\n label = `i${instanceKey}-${label}`;\n domain = getEnv(\"CLOUD_TUNNEL_DOMAIN\") ?? \"app.ironflock.com\";\n } else {\n domain = getEnv(\"TUNNEL_DOMAIN\") ?? \"app.ironflock.com\";\n }\n\n // Mirror the platform's label constraints (CloudURLFor): a tunnel label\n // must be a single valid DNS label.\n if (label.length > 63 || label.includes(\".\")) {\n return null;\n }\n\n return `https://${label}.${domain}`;\n }\n\n /**\n * Create an IronFlock instance by fetching configuration from a server endpoint.\n * The endpoint should return JSON matching `IronFlockOptions`.\n *\n * Useful in browser environments where config is provided by a backend:\n * ```ts\n * const flock = await IronFlock.fromServer(\"/api/ironflock-config\");\n * await flock.start();\n * ```\n */\n static async fromServer(url: string): Promise<IronFlock> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch IronFlock config from ${url}: ${response.status} ${response.statusText}`);\n }\n const options = (await response.json()) as IronFlockOptions;\n return new IronFlock(options);\n }\n}\n"],"names":["has","prefix","Events","EE","fn","context","once","addListener","emitter","event","listener","evt","clearEvent","EventEmitter","names","events","name","handlers","i","l","ee","listeners","a1","a2","a3","a4","a5","len","args","length","j","module","DATAPODS_WS_URI","STUDIO_WS_URI","STUDIO_DEV_WS_URI","STUDIO_WS_URI_OLD","LOCALHOST_WS_URI","DOCKER_HOST_WS_URI","socketURIMap","SESSION_WAIT_TIMEOUT","WampError","message","uri","kwargs","safeJson","value","toReadableError","operation","topic","detail","FATAL_AUTH_CLOSE_REASONS","CrossbarConnection","reswarmUrl","deviceEndpoint","_a","url","mapped","swarmKey","appKey","stage","serialNumber","cburl","resolve","reject","autobahn","_session","_method","extra","session","reason","details","closeReason","error","startTime","handler","sub","e","idx","matching","previous","reg","endpoint","options","effectiveOptions","registration","procedure","_isTypeUint32","MINIMUM","MAXIMUM","_isFormatDateTime","str","PATTERN","_validateReport","array","reportable","path","last","exceptable","_createStandardSchema","input","result","typiaPathToStandardSchemaPath","PathParserState","segments","currentSegment","state","index","char","newChar","Stage","assertNoLatestMarker","params","filters","f","validateTableQueryParams","_io0","__typia_transform__isTypeUint32._isTypeUint32","_io1","elem","_iu0","__typia_transform__isFormatDateTime._isFormatDateTime","_io2","_io3","_vo0","_path","_exceptionable","_report","_vo1","_index4","_vu0","flag","_index5","_vo2","_index6","_vo3","__is","errors","__typia_transform__createStandardSchema._createStandardSchema","__typia_transform__validateReport._validateReport","success","validateSeriesQueryParams","_ip0","tuplePredicators","top","entire","pred","_vp1","_index7","_index8","validateLocationParams","validatePublishParams","key","validateCallParams","validateTableParams","validateBulkTableParams","_index2","WAMP_ERROR_CODE_MAP","CrossAppAccessError","code","mapWampError","ConsumedApp","app","catalog","connection","onClosed","tablename","known","t","bulkHandler","rows","rowList","row","queryParams","validation","tableNames","ERROR_LOGS_TABLE","getEnv","readInjectedValue","fs","dir","getSerialNumber","sn","describeHistoryError","text","IronFlock","missing","envValue","resolvedUrl","consumed","pending","appName","opts","ownStage","cacheKey","cached","evict","continueOnError","infos","info","settled","opened","_b","onError","authFailure","combinedKwargs","msg","deviceKey","fullTopic","long","lat","payload","port","protocol","remotePortEnvironment","instanceKey","cloudPort","domain","remotePort","label","response"],"mappings":"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","x_google_ignoreList":[0,2,3,4,5]}
|