ironflock 1.2.8 → 1.3.2
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 +44 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +26 -0
- package/dist/index.mjs +561 -447
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -167,6 +167,49 @@ await ironflock.appendToTable("sensordata", [{ temperature: 22.5, humidity: 60 }
|
|
|
167
167
|
|
|
168
168
|
---
|
|
169
169
|
|
|
170
|
+
### `publishRowsToTable(tablename, rows, kwargs?)`
|
|
171
|
+
|
|
172
|
+
Publishes **many rows in a single message** (bulk insert) to the dedicated topic `bulk.<SWARM_KEY>.<APP_KEY>.<tablename>`. The platform inserts the whole batch atomically (all-or-nothing) in one operation. Use this for high-frequency data where one round-trip per row is too costly. Like `publishToTable`, this is fire-and-forget — the ack confirms delivery to the router, not the DB insert.
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
await ironflock.publishRowsToTable("sensordata", [
|
|
176
|
+
{ tsp: "2024-01-15T10:30:00.000Z", temperature: 22.5 },
|
|
177
|
+
{ tsp: "2024-01-15T10:30:01.000Z", temperature: 22.7 },
|
|
178
|
+
]);
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
| Parameter | Type | Description |
|
|
182
|
+
|-----------|------|-------------|
|
|
183
|
+
| `tablename` | `string` | The name of the table, e.g. `"sensordata"` |
|
|
184
|
+
| `rows` | `Record<string, unknown>[]` | Non-empty array of row objects to insert |
|
|
185
|
+
| `kwargs` | `Record<string, unknown>`, optional | Extra arguments shared by the whole batch |
|
|
186
|
+
|
|
187
|
+
**Returns:** `Promise<unknown>` — The publication object (an acknowledged publish receipt).
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
### `appendRowsToTable(tablename, rows, kwargs?)`
|
|
192
|
+
|
|
193
|
+
Appends **many rows in a single RPC** (bulk insert) by calling the dedicated procedure `appendBulk.<SWARM_KEY>.<APP_KEY>.<tablename>`. The platform inserts the whole batch atomically (all-or-nothing): if any row is invalid the entire batch is rejected and nothing is persisted. Prefer this over `publishRowsToTable` when you need the insert outcome.
|
|
194
|
+
|
|
195
|
+
```ts
|
|
196
|
+
const result = await ironflock.appendRowsToTable("sensordata", [
|
|
197
|
+
{ tsp: "2024-01-15T10:30:00.000Z", temperature: 22.5 },
|
|
198
|
+
{ tsp: "2024-01-15T10:30:01.000Z", temperature: 22.7 },
|
|
199
|
+
]);
|
|
200
|
+
// result -> { success: true, count: 2 }
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
| Parameter | Type | Description |
|
|
204
|
+
|-----------|------|-------------|
|
|
205
|
+
| `tablename` | `string` | The name of the table, e.g. `"sensordata"` |
|
|
206
|
+
| `rows` | `Record<string, unknown>[]` | Non-empty array of row objects to insert |
|
|
207
|
+
| `kwargs` | `Record<string, unknown>`, optional | Extra arguments shared by the whole batch |
|
|
208
|
+
|
|
209
|
+
**Returns:** `Promise<unknown>` — The result of the remote procedure call (e.g. `{ success: true, count: N }`).
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
170
213
|
### `subscribe(topic, handler)`
|
|
171
214
|
|
|
172
215
|
Subscribes to a topic on the IronFlock message router.
|
|
@@ -190,7 +233,7 @@ const subscription = await ironflock.subscribe("com.myapp.mytopic", onMessage);
|
|
|
190
233
|
|
|
191
234
|
### `subscribeToTable(tablename, handler)`
|
|
192
235
|
|
|
193
|
-
Convenience function to subscribe to a fleet table. Automatically constructs the correct topic using the `SWARM_KEY` and `APP_KEY` environment variables.
|
|
236
|
+
Convenience function to subscribe to a fleet table. Automatically constructs the correct topic using the `SWARM_KEY` and `APP_KEY` environment variables. Receives rows written via both the single-row and the bulk insert paths — rows from a bulk insert are delivered to your handler one at a time, so handler code stays the same.
|
|
194
237
|
|
|
195
238
|
```ts
|
|
196
239
|
function onTableData(...args: any[]) {
|
package/dist/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
2
|
-
`))),d.push(a)),!1)},K=d=>Object.assign(d,{"~standard":{version:1,vendor:"typia",validate:r=>{const s=d(r);return s.success?{value:s.data}:{issues:s.errors.map(a=>({message:`expected ${a.expected}, got ${a.value}`,path:Z(a.path)}))}}}});var y;(function(d){d[d.Start=0]="Start",d[d.Property=1]="Property",d[d.StringKey=2]="StringKey",d[d.NumberKey=3]="NumberKey"})(y||(y={}));const Z=d=>{if(!d.startsWith("$input"))throw new Error(`Invalid path: ${JSON.stringify(d)}`);const r=[];let s="",a=y.Start,c=5;for(;c<d.length-1;){c++;const i=d[c];if(a===y.Property?i==="."||i==="["?(r.push({key:s}),a=y.Start):c===d.length-1?(s+=i,r.push({key:s}),c++,a=y.Start):s+=i:a===y.StringKey?i==='"'?(r.push({key:JSON.parse(s+i)}),c+=2,a=y.Start):i==="\\"?(s+=d[c],c++,s+=d[c]):s+=i:a===y.NumberKey&&(i==="]"?(r.push({key:Number.parseInt(s)}),c++,a=y.Start):s+=i),a===y.Start&&c<d.length-1){const u=d[c];if(s="",u==="[")d[c+1]==='"'?(a=y.StringKey,c++,s='"'):a=y.NumberKey;else if(u===".")a=y.Property;else throw new Error("Unreachable: pointer points invalid character")}}if(a!==y.Start)throw new Error(`Failed to parse path: ${JSON.stringify(d)}`);return r};var p=(d=>(d.DEVELOPMENT="dev",d.PRODUCTION="prod",d))(p||{});const P=(()=>{const d=e=>typeof e.limit=="number"&&M(e.limit)&&1<=e.limit&&e.limit<=1e4&&(e.offset===void 0||typeof e.offset=="number"&&M(e.offset)&&0<=e.offset)&&(e.timeRange===void 0||typeof e.timeRange=="object"&&e.timeRange!==null&&r(e.timeRange))&&(e.filterAnd===void 0||Array.isArray(e.filterAnd)&&e.filterAnd.every(n=>typeof n=="object"&&n!==null&&s(n))),r=e=>typeof e.start=="string"&&S(e.start)&&typeof e.end=="string"&&S(e.end),s=e=>typeof e.column=="string"&&1<=e.column.length&&typeof e.operator=="string"&&1<=e.operator.length&&e.value!==null&&e.value!==void 0&&(typeof e.value=="string"||typeof e.value=="number"||typeof e.value=="boolean"||Array.isArray(e.value)&&e.value.every(n=>typeof n=="string"||typeof n=="number")),a=(e,n,l=!0)=>[typeof e.limit=="number"&&(M(e.limit)||o(l,{path:n+".limit",expected:'number & Type<"uint32">',value:e.limit}))&&(1<=e.limit||o(l,{path:n+".limit",expected:"number & Minimum<1>",value:e.limit}))&&(e.limit<=1e4||o(l,{path:n+".limit",expected:"number & Maximum<10000>",value:e.limit}))||o(l,{path:n+".limit",expected:'(number & Type<"uint32"> & Minimum<1> & Maximum<10000>)',value:e.limit}),e.offset===void 0||typeof e.offset=="number"&&(M(e.offset)||o(l,{path:n+".offset",expected:'number & Type<"uint32">',value:e.offset}))&&(0<=e.offset||o(l,{path:n+".offset",expected:"number & Minimum<0>",value:e.offset}))||o(l,{path:n+".offset",expected:'((number & Type<"uint32"> & Minimum<0>) | undefined)',value:e.offset}),e.timeRange===void 0||(typeof e.timeRange=="object"&&e.timeRange!==null||o(l,{path:n+".timeRange",expected:"(ISOTimeRange | undefined)",value:e.timeRange}))&&c(e.timeRange,n+".timeRange",l)||o(l,{path:n+".timeRange",expected:"(ISOTimeRange | undefined)",value:e.timeRange}),e.filterAnd===void 0||(Array.isArray(e.filterAnd)||o(l,{path:n+".filterAnd",expected:"(Array<SQLFilterAnd> | undefined)",value:e.filterAnd}))&&e.filterAnd.map((h,v)=>(typeof h=="object"&&h!==null||o(l,{path:n+".filterAnd["+v+"]",expected:"SQLFilterAnd",value:h}))&&i(h,n+".filterAnd["+v+"]",l)||o(l,{path:n+".filterAnd["+v+"]",expected:"SQLFilterAnd",value:h})).every(h=>h)||o(l,{path:n+".filterAnd",expected:"(Array<SQLFilterAnd> | undefined)",value:e.filterAnd})].every(h=>h),c=(e,n,l=!0)=>[typeof e.start=="string"&&(S(e.start)||o(l,{path:n+".start",expected:'string & Format<"date-time">',value:e.start}))||o(l,{path:n+".start",expected:'(string & Format<"date-time">)',value:e.start}),typeof e.end=="string"&&(S(e.end)||o(l,{path:n+".end",expected:'string & Format<"date-time">',value:e.end}))||o(l,{path:n+".end",expected:'(string & Format<"date-time">)',value:e.end})].every(h=>h),i=(e,n,l=!0)=>[typeof e.column=="string"&&(1<=e.column.length||o(l,{path:n+".column",expected:"string & MinLength<1>",value:e.column}))||o(l,{path:n+".column",expected:"(string & MinLength<1>)",value:e.column}),typeof e.operator=="string"&&(1<=e.operator.length||o(l,{path:n+".operator",expected:"string & MinLength<1>",value:e.operator}))||o(l,{path:n+".operator",expected:"(string & MinLength<1>)",value:e.operator}),(e.value!==null||o(l,{path:n+".value",expected:"(Array<string | number> | boolean | number | string)",value:e.value}))&&(e.value!==void 0||o(l,{path:n+".value",expected:"(Array<string | number> | boolean | number | string)",value:e.value}))&&(typeof e.value=="string"||typeof e.value=="number"||typeof e.value=="boolean"||(Array.isArray(e.value)||o(l,{path:n+".value",expected:"(Array<string | number> | boolean | number | string)",value:e.value}))&&e.value.map((h,v)=>typeof h=="string"||typeof h=="number"||o(l,{path:n+".value["+v+"]",expected:"(number | string)",value:h})).every(h=>h)||o(l,{path:n+".value",expected:"(Array<string | number> | boolean | number | string)",value:e.value}))].every(h=>h),u=e=>typeof e=="object"&&e!==null&&d(e);let t,o;return K(e=>{if(u(e)===!1){t=[],o=R(t),((l,h,v=!0)=>(typeof l=="object"&&l!==null||o(!0,{path:h+"",expected:"TableQueryParams",value:l}))&&a(l,h+"",!0)||o(!0,{path:h+"",expected:"TableQueryParams",value:l}))(e,"$input",!0);const n=t.length===0;return n?{success:n,data:e}:{success:n,errors:t,data:e}}return{success:!0,data:e}})})(),L=(()=>{const d=i=>typeof i.longitude=="number"&&-180<=i.longitude&&i.longitude<=180&&typeof i.latitude=="number"&&-90<=i.latitude&&i.latitude<=90,r=(i,u,t=!0)=>[typeof i.longitude=="number"&&(-180<=i.longitude||c(t,{path:u+".longitude",expected:"number & Minimum<-180>",value:i.longitude}))&&(i.longitude<=180||c(t,{path:u+".longitude",expected:"number & Maximum<180>",value:i.longitude}))||c(t,{path:u+".longitude",expected:"(number & Minimum<-180> & Maximum<180>)",value:i.longitude}),typeof i.latitude=="number"&&(-90<=i.latitude||c(t,{path:u+".latitude",expected:"number & Minimum<-90>",value:i.latitude}))&&(i.latitude<=90||c(t,{path:u+".latitude",expected:"number & Maximum<90>",value:i.latitude}))||c(t,{path:u+".latitude",expected:"(number & Minimum<-90> & Maximum<90>)",value:i.latitude})].every(o=>o),s=i=>typeof i=="object"&&i!==null&&d(i);let a,c;return K(i=>{if(s(i)===!1){a=[],c=R(a),((t,o,e=!0)=>(typeof t=="object"&&t!==null||c(!0,{path:o+"",expected:"LocationParams",value:t}))&&r(t,o+"",!0)||c(!0,{path:o+"",expected:"LocationParams",value:t}))(i,"$input",!0);const u=a.length===0;return u?{success:u,data:i}:{success:u,errors:a,data:i}}return{success:!0,data:i}})})(),j=(()=>{const d=t=>typeof t.topic=="string"&&1<=t.topic.length&&(t.args===void 0||Array.isArray(t.args))&&(t.kwargs===void 0||typeof t.kwargs=="object"&&t.kwargs!==null&&Array.isArray(t.kwargs)===!1&&r(t.kwargs)),r=t=>Object.keys(t).every(o=>(t[o]===void 0,!0)),s=(t,o,e=!0)=>[typeof t.topic=="string"&&(1<=t.topic.length||u(e,{path:o+".topic",expected:"string & MinLength<1>",value:t.topic}))||u(e,{path:o+".topic",expected:"(string & MinLength<1>)",value:t.topic}),t.args===void 0||Array.isArray(t.args)||u(e,{path:o+".args",expected:"(Array<unknown> | undefined)",value:t.args}),t.kwargs===void 0||(typeof t.kwargs=="object"&&t.kwargs!==null&&Array.isArray(t.kwargs)===!1||u(e,{path:o+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs}))&&a(t.kwargs,o+".kwargs",e)||u(e,{path:o+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs})].every(n=>n),a=(t,o,e=!0)=>[e===!1||Object.keys(t).map(n=>(t[n]===void 0,!0)).every(n=>n)].every(n=>n),c=t=>typeof t=="object"&&t!==null&&d(t);let i,u;return K(t=>{if(c(t)===!1){i=[],u=R(i),((e,n,l=!0)=>(typeof e=="object"&&e!==null||u(!0,{path:n+"",expected:"PublishParams",value:e}))&&s(e,n+"",!0)||u(!0,{path:n+"",expected:"PublishParams",value:e}))(t,"$input",!0);const o=i.length===0;return o?{success:o,data:t}:{success:o,errors:i,data:t}}return{success:!0,data:t}})})(),z=(()=>{const d=t=>typeof t.deviceKey=="string"&&1<=t.deviceKey.length&&typeof t.topic=="string"&&1<=t.topic.length&&(t.args===void 0||Array.isArray(t.args))&&(t.kwargs===void 0||typeof t.kwargs=="object"&&t.kwargs!==null&&Array.isArray(t.kwargs)===!1&&r(t.kwargs)),r=t=>Object.keys(t).every(o=>(t[o]===void 0,!0)),s=(t,o,e=!0)=>[typeof t.deviceKey=="string"&&(1<=t.deviceKey.length||u(e,{path:o+".deviceKey",expected:"string & MinLength<1>",value:t.deviceKey}))||u(e,{path:o+".deviceKey",expected:"(string & MinLength<1>)",value:t.deviceKey}),typeof t.topic=="string"&&(1<=t.topic.length||u(e,{path:o+".topic",expected:"string & MinLength<1>",value:t.topic}))||u(e,{path:o+".topic",expected:"(string & MinLength<1>)",value:t.topic}),t.args===void 0||Array.isArray(t.args)||u(e,{path:o+".args",expected:"(Array<unknown> | undefined)",value:t.args}),t.kwargs===void 0||(typeof t.kwargs=="object"&&t.kwargs!==null&&Array.isArray(t.kwargs)===!1||u(e,{path:o+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs}))&&a(t.kwargs,o+".kwargs",e)||u(e,{path:o+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs})].every(n=>n),a=(t,o,e=!0)=>[e===!1||Object.keys(t).map(n=>(t[n]===void 0,!0)).every(n=>n)].every(n=>n),c=t=>typeof t=="object"&&t!==null&&d(t);let i,u;return K(t=>{if(c(t)===!1){i=[],u=R(i),((e,n,l=!0)=>(typeof e=="object"&&e!==null||u(!0,{path:n+"",expected:"CallParams",value:e}))&&s(e,n+"",!0)||u(!0,{path:n+"",expected:"CallParams",value:e}))(t,"$input",!0);const o=i.length===0;return o?{success:o,data:t}:{success:o,errors:i,data:t}}return{success:!0,data:t}})})(),C=(()=>{const d=t=>typeof t.tablename=="string"&&1<=t.tablename.length&&(t.args===void 0||Array.isArray(t.args))&&(t.kwargs===void 0||typeof t.kwargs=="object"&&t.kwargs!==null&&Array.isArray(t.kwargs)===!1&&r(t.kwargs)),r=t=>Object.keys(t).every(o=>(t[o]===void 0,!0)),s=(t,o,e=!0)=>[typeof t.tablename=="string"&&(1<=t.tablename.length||u(e,{path:o+".tablename",expected:"string & MinLength<1>",value:t.tablename}))||u(e,{path:o+".tablename",expected:"(string & MinLength<1>)",value:t.tablename}),t.args===void 0||Array.isArray(t.args)||u(e,{path:o+".args",expected:"(Array<unknown> | undefined)",value:t.args}),t.kwargs===void 0||(typeof t.kwargs=="object"&&t.kwargs!==null&&Array.isArray(t.kwargs)===!1||u(e,{path:o+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs}))&&a(t.kwargs,o+".kwargs",e)||u(e,{path:o+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs})].every(n=>n),a=(t,o,e=!0)=>[e===!1||Object.keys(t).map(n=>(t[n]===void 0,!0)).every(n=>n)].every(n=>n),c=t=>typeof t=="object"&&t!==null&&d(t);let i,u;return K(t=>{if(c(t)===!1){i=[],u=R(i),((e,n,l=!0)=>(typeof e=="object"&&e!==null||u(!0,{path:n+"",expected:"TableParams",value:e}))&&s(e,n+"",!0)||u(!0,{path:n+"",expected:"TableParams",value:e}))(t,"$input",!0);const o=i.length===0;return o?{success:o,data:t}:{success:o,errors:i,data:t}}return{success:!0,data:t}})})();function E(d){var r;return typeof process<"u"?(r=process.env)==null?void 0:r[d]:void 0}function ee(d){const r=d??E("DEVICE_SERIAL_NUMBER");if(!r)throw new Error("serialNumber option is required (or set DEVICE_SERIAL_NUMBER env var in Node.js)");return r}class T{constructor(r){this._isConfigured=!1,this._serialNumber=ee(r==null?void 0:r.serialNumber),this._deviceName=(r==null?void 0:r.deviceName)??E("DEVICE_NAME"),this._deviceKey=(r==null?void 0:r.deviceKey)??E("DEVICE_KEY"),this._appName=(r==null?void 0:r.appName)??E("APP_NAME"),this._swarmKey=(r==null?void 0:r.swarmKey)??parseInt(E("SWARM_KEY")??"0",10),this._appKey=(r==null?void 0:r.appKey)??parseInt(E("APP_KEY")??"0",10),this._env=(r==null?void 0:r.env)??E("ENV"),this._reswarmUrl=(r==null?void 0:r.reswarmUrl)??E("RESWARM_URL"),this._cburl=(r==null?void 0:r.ironFlockUrl)??(r==null?void 0:r.cburl),this._connection=new k;const s=[];this._deviceKey||s.push("DEVICE_KEY"),this._appName||s.push("APP_NAME"),this._swarmKey||s.push("SWARM_KEY"),this._appKey||s.push("APP_KEY"),s.length>0&&console.warn(`Warning: The following environment variables must be present: ${s.join(", ")}`)}get connection(){return this._connection}get isConnected(){return this._connection.is_open}configureConnection(r){if(this._isConfigured)return;const s=(this._env??"DEV").toUpperCase(),c={DEV:p.DEVELOPMENT,PROD:p.PRODUCTION}[s]??p.DEVELOPMENT,i=r??this._cburl??k.getWebSocketURI(this._reswarmUrl);this._connection.configure(this._swarmKey,this._appKey,c,this._serialNumber,i),this._isConfigured=!0}async start(r){this.configureConnection(r),await this._connection.start()}async stop(){this._connection.stop()}async publish(r,s,a){const c=j({topic:r,args:s,kwargs:a});if(!c.success)throw new Error(`Invalid publish parameters: ${c.errors.map(t=>t.path+": "+t.expected).join(", ")}`);const u={...{DEVICE_SERIAL_NUMBER:this._serialNumber,DEVICE_KEY:this._deviceKey,DEVICE_NAME:this._deviceName},...a??{}};return this._connection.publish(r,s,u,{acknowledge:!0})}async publishToTable(r,s,a){const c=C({tablename:r,args:s,kwargs:a});if(!c.success)throw new Error(`Invalid table parameters: ${c.errors.map(u=>u.path+": "+u.expected).join(", ")}`);if(!this._swarmKey)throw new Error("SWARM_KEY not set in environment variables!");if(!this._appKey)throw new Error("APP_KEY not set in environment variables!");const i=`${this._swarmKey}.${this._appKey}.${r}`;return this.publish(i,s,a)}async appendToTable(r,s,a){const c=C({tablename:r,args:s,kwargs:a});if(!c.success)throw new Error(`Invalid table parameters: ${c.errors.map(o=>o.path+": "+o.expected).join(", ")}`);if(!this._swarmKey)throw new Error("SWARM_KEY not set in environment variables!");if(!this._appKey)throw new Error("APP_KEY not set in environment variables!");const i=`append.${this._swarmKey}.${this._appKey}.${r}`,t={...{DEVICE_SERIAL_NUMBER:this._serialNumber,DEVICE_KEY:this._deviceKey,DEVICE_NAME:this._deviceName},...a??{}};return this._connection.call(i,s,t)}async subscribe(r,s,a){return this._connection.subscribe(r,s)}async subscribeToTable(r,s,a){if(!this._swarmKey)throw new Error("SWARM_KEY not set in environment variables!");if(!this._appKey)throw new Error("APP_KEY not set in environment variables!");const c=`${this._swarmKey}.${this._appKey}.${r}`;return this.subscribe(c,s,a)}async call(r,s,a,c){return this._connection.call(r,s,a,c)}async callDeviceFunction(r,s,a,c,i){const u=`${this._swarmKey}.${r}.${this._appKey}.${this._env}.${s}`;return this._connection.call(u,a,c,i)}async callFunction(r,s,a,c,i){return console.warn("callFunction() is deprecated and will be removed in a future version. Use callDeviceFunction() instead."),this.callDeviceFunction(r,s,a,c,i)}async registerDeviceFunction(r,s,a){const c=`${this._swarmKey}.${this._deviceKey}.${this._appKey}.${this._env}.${r}`,i=await this._connection.register(c,s,a);return console.log(`Function registered for IronFlock topic '${r}'. (Full WAMP topic: '${c}')`),i}async registerFunction(r,s,a){return console.warn("registerFunction() is deprecated and will be removed in a future version. Use registerDeviceFunction() instead."),this.registerDeviceFunction(r,s,a)}async register(r,s,a){return this.registerDeviceFunction(r,s,a)}async getHistory(r,s={limit:10}){if(!r)throw new Error("Tablename must not be empty!");s.offset==null&&(s.offset=0);const a=P(s);if(!a.success)throw new Error(`Invalid query parameters: ${a.errors.map(i=>i.path+": "+i.expected).join(", ")}`);const c=`history.transformed.app.${this._appKey}.${r}`;try{return await this._connection.call(c,[s])}catch(i){const u=String(i);return u.includes("no_such_procedure")||u.includes("no callee registered")?(console.error(`Get history failed: History service procedure '${c}' not registered`),null):(console.error(`Get history failed: ${i}`),null)}}async setDeviceLocation(r,s){const a=L({longitude:r,latitude:s});if(!a.success)throw new Error(`Invalid location parameters: ${a.errors.map(u=>u.path+": "+u.expected).join(", ")}`);const c={long:r,lat:s},i={DEVICE_SERIAL_NUMBER:this._serialNumber,DEVICE_KEY:this._deviceKey,DEVICE_NAME:this._deviceName};try{return await this._connection.call("ironflock.location_service.update",[c],i)}catch(u){return console.error(`Set location failed: ${u}`),null}}getRemoteAccessUrlForPort(r){return this._deviceKey&&this._appName?`https://${this._deviceKey}-${this._appName.toLowerCase()}-${r}.app.ironflock.com`:null}static async fromServer(r){const s=await fetch(r);if(!s.ok)throw new Error(`Failed to fetch IronFlock config from ${r}: ${s.status} ${s.statusText}`);const a=await s.json();return new T(a)}}exports.CrossbarConnection=k;exports.IronFlock=T;exports.Stage=p;exports.validateCallParams=z;exports.validateLocationParams=L;exports.validatePublishParams=j;exports.validateTableParams=C;exports.validateTableQueryParams=P;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const N=require("autobahn");function W(d){return d&&d.__esModule&&Object.prototype.hasOwnProperty.call(d,"default")?d.default:d}var S={exports:{}},O;function V(){return O||(O=1,(function(d){var t=Object.prototype.hasOwnProperty,s="~";function o(){}Object.create&&(o.prototype=Object.create(null),new o().__proto__||(s=!1));function l(a,r,n){this.fn=a,this.context=r,this.once=n||!1}function i(a,r,n,u,f){if(typeof n!="function")throw new TypeError("The listener must be a function");var v=new l(n,u||a,f),y=s?s+r:r;return a._events[y]?a._events[y].fn?a._events[y]=[a._events[y],v]:a._events[y].push(v):(a._events[y]=v,a._eventsCount++),a}function c(a,r){--a._eventsCount===0?a._events=new o:delete a._events[r]}function e(){this._events=new o,this._eventsCount=0}e.prototype.eventNames=function(){var r=[],n,u;if(this._eventsCount===0)return r;for(u in n=this._events)t.call(n,u)&&r.push(s?u.slice(1):u);return Object.getOwnPropertySymbols?r.concat(Object.getOwnPropertySymbols(n)):r},e.prototype.listeners=function(r){var n=s?s+r:r,u=this._events[n];if(!u)return[];if(u.fn)return[u.fn];for(var f=0,v=u.length,y=new Array(v);f<v;f++)y[f]=u[f].fn;return y},e.prototype.listenerCount=function(r){var n=s?s+r:r,u=this._events[n];return u?u.fn?1:u.length:0},e.prototype.emit=function(r,n,u,f,v,y){var w=s?s+r:r;if(!this._events[w])return!1;var h=this._events[w],b=arguments.length,A,g;if(h.fn){switch(h.once&&this.removeListener(r,h.fn,void 0,!0),b){case 1:return h.fn.call(h.context),!0;case 2:return h.fn.call(h.context,n),!0;case 3:return h.fn.call(h.context,n,u),!0;case 4:return h.fn.call(h.context,n,u,f),!0;case 5:return h.fn.call(h.context,n,u,f,v),!0;case 6:return h.fn.call(h.context,n,u,f,v,y),!0}for(g=1,A=new Array(b-1);g<b;g++)A[g-1]=arguments[g];h.fn.apply(h.context,A)}else{var F=h.length,R;for(g=0;g<F;g++)switch(h[g].once&&this.removeListener(r,h[g].fn,void 0,!0),b){case 1:h[g].fn.call(h[g].context);break;case 2:h[g].fn.call(h[g].context,n);break;case 3:h[g].fn.call(h[g].context,n,u);break;case 4:h[g].fn.call(h[g].context,n,u,f);break;default:if(!A)for(R=1,A=new Array(b-1);R<b;R++)A[R-1]=arguments[R];h[g].fn.apply(h[g].context,A)}}return!0},e.prototype.on=function(r,n,u){return i(this,r,n,u,!1)},e.prototype.once=function(r,n,u){return i(this,r,n,u,!0)},e.prototype.removeListener=function(r,n,u,f){var v=s?s+r:r;if(!this._events[v])return this;if(!n)return c(this,v),this;var y=this._events[v];if(y.fn)y.fn===n&&(!f||y.once)&&(!u||y.context===u)&&c(this,v);else{for(var w=0,h=[],b=y.length;w<b;w++)(y[w].fn!==n||f&&!y[w].once||u&&y[w].context!==u)&&h.push(y[w]);h.length?this._events[v]=h.length===1?h[0]:h:c(this,v)}return this},e.prototype.removeAllListeners=function(r){var n;return r?(n=s?s+r:r,this._events[n]&&c(this,n)):(this._events=new o,this._eventsCount=0),this},e.prototype.off=e.prototype.removeListener,e.prototype.addListener=e.prototype.on,e.prefixed=s,e.EventEmitter=e,d.exports=e})(S)),S.exports}var Y=V();const B=W(Y),Q="wss://cbw.datapods.io/ws-ua-usr",j="wss://cbw.ironflock.com/ws-ua-usr",J="wss://cbw.ironflock.dev/ws-ua-usr",H="wss://cbw.record-evolution.com/ws-ua-usr",$="ws://localhost:8080/ws-ua-usr",x={"https://studio.datapods.io":Q,"https://studio.ironflock.dev":J,"https://studio.ironflock.com":j,"https://studio.record-evolution.com":H,"http://localhost:8085":$,"http://localhost:8086":$,"http://host.docker.internal:8086":$},q=6e3;class K extends B{constructor(){super(),this.subscriptions=[],this.registrations=[],this.firstResolver=()=>{},this.firstRejecter=()=>{},this.shouldReconnect=!1,this.isReconnecting=!1,this.hasOpenedOnce=!1}static getWebSocketURI(t){var l;const s=typeof process<"u"?(l=process.env)==null?void 0:l.DEVICE_ENDPOINT_URL:void 0;if(s)try{const i=new URL(s);return i.pathname="/ws-ua-usr",i.toString().replace(/\/$/,"")}catch{}if(!t)return j;const o=x[t];if(o===void 0)throw new Error(`Cannot resolve WebSocket URI for reswarmUrl=${JSON.stringify(t)}. Set DEVICE_ENDPOINT_URL to the deployment's WAMP router URL (e.g. ws://<host>:18080/ws-re-dev) or pass ironFlockUrl=… to IronFlock(). Known cloud URLs: ${JSON.stringify(Object.keys(x))}`);return o}configure(t,s,o,l,i){this.realm=`realm-${t}-${s}-${o}`,this.serial_number=l,this.socketURI=i??K.getWebSocketURI()}async start(){if(!this.realm||!this.serial_number||!this.socketURI)throw new Error("CrossbarConnection must be configured before starting. Call configure() first.");return this.shouldReconnect=!0,this.firstConnection=new Promise((t,s)=>{this.firstResolver=t,this.firstRejecter=s}),this.connection=new N.Connection({realm:this.realm,url:this.socketURI,authmethods:["wampcra"],authid:this.serial_number,max_retries:-1,max_retry_delay:2,initial_retry_delay:1,autoping_interval:2,autoping_timeout:4,onchallenge:(t,s,o)=>N.auth_cra.sign(this.serial_number,o.challenge)}),this.connection.onopen=this.onOpen.bind(this),this.connection.onclose=this.onClose.bind(this),this.connection.open(),this.firstConnection}onOpen(t){this.session=t,this.session.caller_disclose_me=!0,this.hasOpenedOnce=!0,this.resubscribeAll(),this.reregisterAll(),this.emit("connected",this.serial_number),this.firstResolver(),this.firstResolver=()=>{}}onClose(t,s){return this.session=void 0,this.emit("disconnected"),this.firstRejecter(new Error(`Connection failed: ${t} - ${JSON.stringify(s,null,2)}`)),this.firstRejecter=()=>{},console.warn("Connection closed:",{reason:t,details:s,realm:this.realm,url:this.socketURI,authid:this.serial_number}),this.shouldReconnect&&this.hasOpenedOnce&&(s==null?void 0:s.will_retry)===!1&&this.handleManualReconnect((s==null?void 0:s.reason)??t),!1}async handleManualReconnect(t){if(!(this.isReconnecting||!this.shouldReconnect)){for(this.isReconnecting=!0;this.shouldReconnect&&!this.session;)if(await new Promise(s=>setTimeout(s,1e3)),this.shouldReconnect&&this.connection&&!this.session){console.log(`Manually retrying connection after ${t}...`);try{this.connection.open(),await new Promise(s=>setTimeout(s,500))}catch(s){console.error("Error during manual reconnection attempt:",s)}}this.isReconnecting=!1}}async sessionWait(){const t=Date.now();for(;!this.session;){if(Date.now()-t>q)throw new Error("Timeout waiting for session");await new Promise(s=>setTimeout(s,200))}}async waitForConnection(){return this.firstConnection}getSession(){return this.session}get is_open(){var t;return!!((t=this.session)!=null&&t.isOpen)}isConnected(){return this.is_open}stop(){var t;this.shouldReconnect=!1,(t=this.connection)==null||t.close("wamp.close.normal","Connection closed by client")}async subscribe(t,s){var l;await this.sessionWait();const o=await((l=this.session)==null?void 0:l.subscribe(t,s));return o&&this.subscriptions.push(o),o}async unsubscribe(t){var o;await this.sessionWait();const s=this.subscriptions.indexOf(t);s!==-1&&(this.subscriptions.splice(s,1),await((o=this.session)==null?void 0:o.unsubscribe(t)))}async unsubscribeTopic(t){const s=this.subscriptions.filter(o=>o.topic===t);for(const o of s)await this.unsubscribe(o)}async resubscribeAll(){const t=[...this.subscriptions];this.subscriptions=[],await Promise.all(t.map(s=>this.subscribe(s.topic,s.handler)))}async reregisterAll(){const t=[...this.registrations];this.registrations=[],await Promise.all(t.map(s=>this.register(s.procedure,s.endpoint,s.options)))}async register(t,s,o){var c;await this.sessionWait();const l={force_reregister:!0,...o??{}},i=await((c=this.session)==null?void 0:c.register(t,s,l));return i&&this.registrations.push(i),i}async unregister(t){var o;await this.sessionWait(),await((o=this.session)==null?void 0:o.unregister(t));const s=this.registrations.indexOf(t);s!==-1&&this.registrations.splice(s,1)}async call(t,s,o,l){var i;return await this.sessionWait(),(i=this.session)==null?void 0:i.call(t,s,o,l)}async publish(t,s,o,l){var i;return await this.sessionWait(),(i=this.session)==null?void 0:i.publish(t,s,o,l)}}const M=d=>Math.floor(d)===d&&G<=d&&d<=X,G=0,X=2**32-1,I=d=>Z.test(d),Z=/^[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,k=d=>{const t=s=>{if(d.length===0)return!0;const o=d[d.length-1].path;return s.length>o.length||o.substring(0,s.length)!==s};return(s,o)=>(s&&t(o.path)&&(o.value===void 0&&(o.description??(o.description=["The value at this path is `undefined`.","",`Please fill the \`${o.expected}\` typed value next time.`].join(`
|
|
2
|
+
`))),d.push(o)),!1)},_=d=>Object.assign(d,{"~standard":{version:1,vendor:"typia",validate:t=>{const s=d(t);return s.success?{value:s.data}:{issues:s.errors.map(o=>({message:`expected ${o.expected}, got ${o.value}`,path:z(o.path)}))}}}});var m;(function(d){d[d.Start=0]="Start",d[d.Property=1]="Property",d[d.StringKey=2]="StringKey",d[d.NumberKey=3]="NumberKey"})(m||(m={}));const z=d=>{if(!d.startsWith("$input"))throw new Error(`Invalid path: ${JSON.stringify(d)}`);const t=[];let s="",o=m.Start,l=5;for(;l<d.length-1;){l++;const i=d[l];if(o===m.Property?i==="."||i==="["?(t.push({key:s}),o=m.Start):l===d.length-1?(s+=i,t.push({key:s}),l++,o=m.Start):s+=i:o===m.StringKey?i==='"'?(t.push({key:JSON.parse(s+i)}),l+=2,o=m.Start):i==="\\"?(s+=d[l],l++,s+=d[l]):s+=i:o===m.NumberKey&&(i==="]"?(t.push({key:Number.parseInt(s)}),l++,o=m.Start):s+=i),o===m.Start&&l<d.length-1){const c=d[l];if(s="",c==="[")d[l+1]==='"'?(o=m.StringKey,l++,s='"'):o=m.NumberKey;else if(c===".")o=m.Property;else throw new Error("Unreachable: pointer points invalid character")}}if(o!==m.Start)throw new Error(`Failed to parse path: ${JSON.stringify(d)}`);return t};var p=(d=>(d.DEVELOPMENT="dev",d.PRODUCTION="prod",d))(p||{});const L=(()=>{const d=r=>typeof r.limit=="number"&&M(r.limit)&&1<=r.limit&&r.limit<=1e4&&(r.offset===void 0||typeof r.offset=="number"&&M(r.offset)&&0<=r.offset)&&(r.timeRange===void 0||typeof r.timeRange=="object"&&r.timeRange!==null&&t(r.timeRange))&&(r.filterAnd===void 0||Array.isArray(r.filterAnd)&&r.filterAnd.every(n=>typeof n=="object"&&n!==null&&s(n))),t=r=>typeof r.start=="string"&&I(r.start)&&typeof r.end=="string"&&I(r.end),s=r=>typeof r.column=="string"&&1<=r.column.length&&typeof r.operator=="string"&&1<=r.operator.length&&r.value!==null&&r.value!==void 0&&(typeof r.value=="string"||typeof r.value=="number"||typeof r.value=="boolean"||Array.isArray(r.value)&&r.value.every(n=>typeof n=="string"||typeof n=="number")),o=(r,n,u=!0)=>[typeof r.limit=="number"&&(M(r.limit)||a(u,{path:n+".limit",expected:'number & Type<"uint32">',value:r.limit}))&&(1<=r.limit||a(u,{path:n+".limit",expected:"number & Minimum<1>",value:r.limit}))&&(r.limit<=1e4||a(u,{path:n+".limit",expected:"number & Maximum<10000>",value:r.limit}))||a(u,{path:n+".limit",expected:'(number & Type<"uint32"> & Minimum<1> & Maximum<10000>)',value:r.limit}),r.offset===void 0||typeof r.offset=="number"&&(M(r.offset)||a(u,{path:n+".offset",expected:'number & Type<"uint32">',value:r.offset}))&&(0<=r.offset||a(u,{path:n+".offset",expected:"number & Minimum<0>",value:r.offset}))||a(u,{path:n+".offset",expected:'((number & Type<"uint32"> & Minimum<0>) | undefined)',value:r.offset}),r.timeRange===void 0||(typeof r.timeRange=="object"&&r.timeRange!==null||a(u,{path:n+".timeRange",expected:"(ISOTimeRange | undefined)",value:r.timeRange}))&&l(r.timeRange,n+".timeRange",u)||a(u,{path:n+".timeRange",expected:"(ISOTimeRange | undefined)",value:r.timeRange}),r.filterAnd===void 0||(Array.isArray(r.filterAnd)||a(u,{path:n+".filterAnd",expected:"(Array<SQLFilterAnd> | undefined)",value:r.filterAnd}))&&r.filterAnd.map((f,v)=>(typeof f=="object"&&f!==null||a(u,{path:n+".filterAnd["+v+"]",expected:"SQLFilterAnd",value:f}))&&i(f,n+".filterAnd["+v+"]",u)||a(u,{path:n+".filterAnd["+v+"]",expected:"SQLFilterAnd",value:f})).every(f=>f)||a(u,{path:n+".filterAnd",expected:"(Array<SQLFilterAnd> | undefined)",value:r.filterAnd})].every(f=>f),l=(r,n,u=!0)=>[typeof r.start=="string"&&(I(r.start)||a(u,{path:n+".start",expected:'string & Format<"date-time">',value:r.start}))||a(u,{path:n+".start",expected:'(string & Format<"date-time">)',value:r.start}),typeof r.end=="string"&&(I(r.end)||a(u,{path:n+".end",expected:'string & Format<"date-time">',value:r.end}))||a(u,{path:n+".end",expected:'(string & Format<"date-time">)',value:r.end})].every(f=>f),i=(r,n,u=!0)=>[typeof r.column=="string"&&(1<=r.column.length||a(u,{path:n+".column",expected:"string & MinLength<1>",value:r.column}))||a(u,{path:n+".column",expected:"(string & MinLength<1>)",value:r.column}),typeof r.operator=="string"&&(1<=r.operator.length||a(u,{path:n+".operator",expected:"string & MinLength<1>",value:r.operator}))||a(u,{path:n+".operator",expected:"(string & MinLength<1>)",value:r.operator}),(r.value!==null||a(u,{path:n+".value",expected:"(Array<string | number> | boolean | number | string)",value:r.value}))&&(r.value!==void 0||a(u,{path:n+".value",expected:"(Array<string | number> | boolean | number | string)",value:r.value}))&&(typeof r.value=="string"||typeof r.value=="number"||typeof r.value=="boolean"||(Array.isArray(r.value)||a(u,{path:n+".value",expected:"(Array<string | number> | boolean | number | string)",value:r.value}))&&r.value.map((f,v)=>typeof f=="string"||typeof f=="number"||a(u,{path:n+".value["+v+"]",expected:"(number | string)",value:f})).every(f=>f)||a(u,{path:n+".value",expected:"(Array<string | number> | boolean | number | string)",value:r.value}))].every(f=>f),c=r=>typeof r=="object"&&r!==null&&d(r);let e,a;return _(r=>{if(c(r)===!1){e=[],a=k(e),((u,f,v=!0)=>(typeof u=="object"&&u!==null||a(!0,{path:f+"",expected:"TableQueryParams",value:u}))&&o(u,f+"",!0)||a(!0,{path:f+"",expected:"TableQueryParams",value:u}))(r,"$input",!0);const n=e.length===0;return n?{success:n,data:r}:{success:n,errors:e,data:r}}return{success:!0,data:r}})})(),D=(()=>{const d=i=>typeof i.longitude=="number"&&-180<=i.longitude&&i.longitude<=180&&typeof i.latitude=="number"&&-90<=i.latitude&&i.latitude<=90,t=(i,c,e=!0)=>[typeof i.longitude=="number"&&(-180<=i.longitude||l(e,{path:c+".longitude",expected:"number & Minimum<-180>",value:i.longitude}))&&(i.longitude<=180||l(e,{path:c+".longitude",expected:"number & Maximum<180>",value:i.longitude}))||l(e,{path:c+".longitude",expected:"(number & Minimum<-180> & Maximum<180>)",value:i.longitude}),typeof i.latitude=="number"&&(-90<=i.latitude||l(e,{path:c+".latitude",expected:"number & Minimum<-90>",value:i.latitude}))&&(i.latitude<=90||l(e,{path:c+".latitude",expected:"number & Maximum<90>",value:i.latitude}))||l(e,{path:c+".latitude",expected:"(number & Minimum<-90> & Maximum<90>)",value:i.latitude})].every(a=>a),s=i=>typeof i=="object"&&i!==null&&d(i);let o,l;return _(i=>{if(s(i)===!1){o=[],l=k(o),((e,a,r=!0)=>(typeof e=="object"&&e!==null||l(!0,{path:a+"",expected:"LocationParams",value:e}))&&t(e,a+"",!0)||l(!0,{path:a+"",expected:"LocationParams",value:e}))(i,"$input",!0);const c=o.length===0;return c?{success:c,data:i}:{success:c,errors:o,data:i}}return{success:!0,data:i}})})(),U=(()=>{const d=e=>typeof e.topic=="string"&&1<=e.topic.length&&(e.args===void 0||Array.isArray(e.args))&&(e.kwargs===void 0||typeof e.kwargs=="object"&&e.kwargs!==null&&Array.isArray(e.kwargs)===!1&&t(e.kwargs)),t=e=>Object.keys(e).every(a=>(e[a]===void 0,!0)),s=(e,a,r=!0)=>[typeof e.topic=="string"&&(1<=e.topic.length||c(r,{path:a+".topic",expected:"string & MinLength<1>",value:e.topic}))||c(r,{path:a+".topic",expected:"(string & MinLength<1>)",value:e.topic}),e.args===void 0||Array.isArray(e.args)||c(r,{path:a+".args",expected:"(Array<unknown> | undefined)",value:e.args}),e.kwargs===void 0||(typeof e.kwargs=="object"&&e.kwargs!==null&&Array.isArray(e.kwargs)===!1||c(r,{path:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:e.kwargs}))&&o(e.kwargs,a+".kwargs",r)||c(r,{path:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:e.kwargs})].every(n=>n),o=(e,a,r=!0)=>[r===!1||Object.keys(e).map(n=>(e[n]===void 0,!0)).every(n=>n)].every(n=>n),l=e=>typeof e=="object"&&e!==null&&d(e);let i,c;return _(e=>{if(l(e)===!1){i=[],c=k(i),((r,n,u=!0)=>(typeof r=="object"&&r!==null||c(!0,{path:n+"",expected:"PublishParams",value:r}))&&s(r,n+"",!0)||c(!0,{path:n+"",expected:"PublishParams",value:r}))(e,"$input",!0);const a=i.length===0;return a?{success:a,data:e}:{success:a,errors:i,data:e}}return{success:!0,data:e}})})(),ee=(()=>{const d=e=>typeof e.deviceKey=="string"&&1<=e.deviceKey.length&&typeof e.topic=="string"&&1<=e.topic.length&&(e.args===void 0||Array.isArray(e.args))&&(e.kwargs===void 0||typeof e.kwargs=="object"&&e.kwargs!==null&&Array.isArray(e.kwargs)===!1&&t(e.kwargs)),t=e=>Object.keys(e).every(a=>(e[a]===void 0,!0)),s=(e,a,r=!0)=>[typeof e.deviceKey=="string"&&(1<=e.deviceKey.length||c(r,{path:a+".deviceKey",expected:"string & MinLength<1>",value:e.deviceKey}))||c(r,{path:a+".deviceKey",expected:"(string & MinLength<1>)",value:e.deviceKey}),typeof e.topic=="string"&&(1<=e.topic.length||c(r,{path:a+".topic",expected:"string & MinLength<1>",value:e.topic}))||c(r,{path:a+".topic",expected:"(string & MinLength<1>)",value:e.topic}),e.args===void 0||Array.isArray(e.args)||c(r,{path:a+".args",expected:"(Array<unknown> | undefined)",value:e.args}),e.kwargs===void 0||(typeof e.kwargs=="object"&&e.kwargs!==null&&Array.isArray(e.kwargs)===!1||c(r,{path:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:e.kwargs}))&&o(e.kwargs,a+".kwargs",r)||c(r,{path:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:e.kwargs})].every(n=>n),o=(e,a,r=!0)=>[r===!1||Object.keys(e).map(n=>(e[n]===void 0,!0)).every(n=>n)].every(n=>n),l=e=>typeof e=="object"&&e!==null&&d(e);let i,c;return _(e=>{if(l(e)===!1){i=[],c=k(i),((r,n,u=!0)=>(typeof r=="object"&&r!==null||c(!0,{path:n+"",expected:"CallParams",value:r}))&&s(r,n+"",!0)||c(!0,{path:n+"",expected:"CallParams",value:r}))(e,"$input",!0);const a=i.length===0;return a?{success:a,data:e}:{success:a,errors:i,data:e}}return{success:!0,data:e}})})(),T=(()=>{const d=e=>typeof e.tablename=="string"&&1<=e.tablename.length&&(e.args===void 0||Array.isArray(e.args))&&(e.kwargs===void 0||typeof e.kwargs=="object"&&e.kwargs!==null&&Array.isArray(e.kwargs)===!1&&t(e.kwargs)),t=e=>Object.keys(e).every(a=>(e[a]===void 0,!0)),s=(e,a,r=!0)=>[typeof e.tablename=="string"&&(1<=e.tablename.length||c(r,{path:a+".tablename",expected:"string & MinLength<1>",value:e.tablename}))||c(r,{path:a+".tablename",expected:"(string & MinLength<1>)",value:e.tablename}),e.args===void 0||Array.isArray(e.args)||c(r,{path:a+".args",expected:"(Array<unknown> | undefined)",value:e.args}),e.kwargs===void 0||(typeof e.kwargs=="object"&&e.kwargs!==null&&Array.isArray(e.kwargs)===!1||c(r,{path:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:e.kwargs}))&&o(e.kwargs,a+".kwargs",r)||c(r,{path:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:e.kwargs})].every(n=>n),o=(e,a,r=!0)=>[r===!1||Object.keys(e).map(n=>(e[n]===void 0,!0)).every(n=>n)].every(n=>n),l=e=>typeof e=="object"&&e!==null&&d(e);let i,c;return _(e=>{if(l(e)===!1){i=[],c=k(i),((r,n,u=!0)=>(typeof r=="object"&&r!==null||c(!0,{path:n+"",expected:"TableParams",value:r}))&&s(r,n+"",!0)||c(!0,{path:n+"",expected:"TableParams",value:r}))(e,"$input",!0);const a=i.length===0;return a?{success:a,data:e}:{success:a,errors:i,data:e}}return{success:!0,data:e}})})(),P=(()=>{const d=e=>typeof e.tablename=="string"&&1<=e.tablename.length&&Array.isArray(e.rows)&&1<=e.rows.length&&e.rows.every(a=>typeof a=="object"&&a!==null&&Array.isArray(a)===!1&&t(a))&&(e.kwargs===void 0||typeof e.kwargs=="object"&&e.kwargs!==null&&Array.isArray(e.kwargs)===!1&&t(e.kwargs)),t=e=>Object.keys(e).every(a=>(e[a]===void 0,!0)),s=(e,a,r=!0)=>[typeof e.tablename=="string"&&(1<=e.tablename.length||c(r,{path:a+".tablename",expected:"string & MinLength<1>",value:e.tablename}))||c(r,{path:a+".tablename",expected:"(string & MinLength<1>)",value:e.tablename}),(Array.isArray(e.rows)||c(r,{path:a+".rows",expected:"(Array<Record<string, unknown>> & MinItems<1>)",value:e.rows}))&&(1<=e.rows.length||c(r,{path:a+".rows",expected:"Array<> & MinItems<1>",value:e.rows}))&&e.rows.map((n,u)=>(typeof n=="object"&&n!==null&&Array.isArray(n)===!1||c(r,{path:a+".rows["+u+"]",expected:"Record<string, unknown>",value:n}))&&o(n,a+".rows["+u+"]",r)||c(r,{path:a+".rows["+u+"]",expected:"Record<string, unknown>",value:n})).every(n=>n)||c(r,{path:a+".rows",expected:"(Array<Record<string, unknown>> & MinItems<1>)",value:e.rows}),e.kwargs===void 0||(typeof e.kwargs=="object"&&e.kwargs!==null&&Array.isArray(e.kwargs)===!1||c(r,{path:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:e.kwargs}))&&o(e.kwargs,a+".kwargs",r)||c(r,{path:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:e.kwargs})].every(n=>n),o=(e,a,r=!0)=>[r===!1||Object.keys(e).map(n=>(e[n]===void 0,!0)).every(n=>n)].every(n=>n),l=e=>typeof e=="object"&&e!==null&&d(e);let i,c;return _(e=>{if(l(e)===!1){i=[],c=k(i),((r,n,u=!0)=>(typeof r=="object"&&r!==null||c(!0,{path:n+"",expected:"BulkTableParams",value:r}))&&s(r,n+"",!0)||c(!0,{path:n+"",expected:"BulkTableParams",value:r}))(e,"$input",!0);const a=i.length===0;return a?{success:a,data:e}:{success:a,errors:i,data:e}}return{success:!0,data:e}})})();function E(d){var t;return typeof process<"u"?(t=process.env)==null?void 0:t[d]:void 0}function re(d){const t=d??E("DEVICE_SERIAL_NUMBER");if(!t)throw new Error("serialNumber option is required (or set DEVICE_SERIAL_NUMBER env var in Node.js)");return t}class C{constructor(t){this._isConfigured=!1,this._serialNumber=re(t==null?void 0:t.serialNumber),this._deviceName=(t==null?void 0:t.deviceName)??E("DEVICE_NAME"),this._deviceKey=(t==null?void 0:t.deviceKey)??E("DEVICE_KEY"),this._appName=(t==null?void 0:t.appName)??E("APP_NAME"),this._swarmKey=(t==null?void 0:t.swarmKey)??parseInt(E("SWARM_KEY")??"0",10),this._appKey=(t==null?void 0:t.appKey)??parseInt(E("APP_KEY")??"0",10),this._env=(t==null?void 0:t.env)??E("ENV"),this._reswarmUrl=(t==null?void 0:t.reswarmUrl)??E("RESWARM_URL"),this._cburl=(t==null?void 0:t.ironFlockUrl)??(t==null?void 0:t.cburl),this._connection=new K;const s=[];this._deviceKey||s.push("DEVICE_KEY"),this._appName||s.push("APP_NAME"),this._swarmKey||s.push("SWARM_KEY"),this._appKey||s.push("APP_KEY"),s.length>0&&console.warn(`Warning: The following environment variables must be present: ${s.join(", ")}`)}get connection(){return this._connection}get isConnected(){return this._connection.is_open}configureConnection(t){if(this._isConfigured)return;const s=(this._env??"DEV").toUpperCase(),l={DEV:p.DEVELOPMENT,PROD:p.PRODUCTION}[s]??p.DEVELOPMENT,i=t??this._cburl??K.getWebSocketURI(this._reswarmUrl);this._connection.configure(this._swarmKey,this._appKey,l,this._serialNumber,i),this._isConfigured=!0}async start(t){this.configureConnection(t),await this._connection.start()}async stop(){this._connection.stop()}async publish(t,s,o){const l=U({topic:t,args:s,kwargs:o});if(!l.success)throw new Error(`Invalid publish parameters: ${l.errors.map(e=>e.path+": "+e.expected).join(", ")}`);const c={...{DEVICE_SERIAL_NUMBER:this._serialNumber,DEVICE_KEY:this._deviceKey,DEVICE_NAME:this._deviceName},...o??{}};return this._connection.publish(t,s,c,{acknowledge:!0})}async publishToTable(t,s,o){const l=T({tablename:t,args:s,kwargs:o});if(!l.success)throw new Error(`Invalid table parameters: ${l.errors.map(c=>c.path+": "+c.expected).join(", ")}`);if(!this._swarmKey)throw new Error("SWARM_KEY not set in environment variables!");if(!this._appKey)throw new Error("APP_KEY not set in environment variables!");const i=`${this._swarmKey}.${this._appKey}.${t}`;return this.publish(i,s,o)}async appendToTable(t,s,o){const l=T({tablename:t,args:s,kwargs:o});if(!l.success)throw new Error(`Invalid table parameters: ${l.errors.map(a=>a.path+": "+a.expected).join(", ")}`);if(!this._swarmKey)throw new Error("SWARM_KEY not set in environment variables!");if(!this._appKey)throw new Error("APP_KEY not set in environment variables!");const i=`append.${this._swarmKey}.${this._appKey}.${t}`,e={...{DEVICE_SERIAL_NUMBER:this._serialNumber,DEVICE_KEY:this._deviceKey,DEVICE_NAME:this._deviceName},...o??{}};return this._connection.call(i,s,e)}async publishRowsToTable(t,s,o){const l=P({tablename:t,rows:s,kwargs:o});if(!l.success)throw new Error(`Invalid bulk table parameters: ${l.errors.map(c=>c.path+": "+c.expected).join(", ")}`);if(!this._swarmKey)throw new Error("SWARM_KEY not set in environment variables!");if(!this._appKey)throw new Error("APP_KEY not set in environment variables!");const i=`bulk.${this._swarmKey}.${this._appKey}.${t}`;return this.publish(i,[s],o)}async appendRowsToTable(t,s,o){const l=P({tablename:t,rows:s,kwargs:o});if(!l.success)throw new Error(`Invalid bulk table parameters: ${l.errors.map(a=>a.path+": "+a.expected).join(", ")}`);if(!this._swarmKey)throw new Error("SWARM_KEY not set in environment variables!");if(!this._appKey)throw new Error("APP_KEY not set in environment variables!");const i=`appendBulk.${this._swarmKey}.${this._appKey}.${t}`,e={...{DEVICE_SERIAL_NUMBER:this._serialNumber,DEVICE_KEY:this._deviceKey,DEVICE_NAME:this._deviceName},...o??{}};return this._connection.call(i,[s],e)}async subscribe(t,s,o){return this._connection.subscribe(t,s)}async subscribeToTable(t,s,o){if(!this._swarmKey)throw new Error("SWARM_KEY not set in environment variables!");if(!this._appKey)throw new Error("APP_KEY not set in environment variables!");const l=`transformed.${t}`,i=await this.subscribe(l,s,o),c=(e,a,r)=>{const n=Array.isArray(e)?e[0]:e,u=Array.isArray(n)?n:n==null?[]:[n];for(const f of u)s([f],a,r)};return await this.subscribe(`transformed.bulk.${t}`,c,o),i}async call(t,s,o,l){return this._connection.call(t,s,o,l)}async callDeviceFunction(t,s,o,l,i){const c=`${this._swarmKey}.${t}.${this._appKey}.${this._env}.${s}`;return this._connection.call(c,o,l,i)}async callFunction(t,s,o,l,i){return console.warn("callFunction() is deprecated and will be removed in a future version. Use callDeviceFunction() instead."),this.callDeviceFunction(t,s,o,l,i)}async registerDeviceFunction(t,s,o){const l=`${this._swarmKey}.${this._deviceKey}.${this._appKey}.${this._env}.${t}`,i=await this._connection.register(l,s,o);return console.log(`Function registered for IronFlock topic '${t}'. (Full WAMP topic: '${l}')`),i}async registerFunction(t,s,o){return console.warn("registerFunction() is deprecated and will be removed in a future version. Use registerDeviceFunction() instead."),this.registerDeviceFunction(t,s,o)}async register(t,s,o){return this.registerDeviceFunction(t,s,o)}async getHistory(t,s={limit:10}){if(!t)throw new Error("Tablename must not be empty!");s.offset==null&&(s.offset=0);const o=L(s);if(!o.success)throw new Error(`Invalid query parameters: ${o.errors.map(i=>i.path+": "+i.expected).join(", ")}`);const l=`history.transformed.${t}`;try{return await this._connection.call(l,[s])}catch(i){const c=String(i);return c.includes("no_such_procedure")||c.includes("no callee registered")?(console.error(`Get history failed: History service procedure '${l}' not registered`),null):(console.error(`Get history failed: ${i}`),null)}}async setDeviceLocation(t,s){const o=D({longitude:t,latitude:s});if(!o.success)throw new Error(`Invalid location parameters: ${o.errors.map(c=>c.path+": "+c.expected).join(", ")}`);const l={long:t,lat:s},i={DEVICE_SERIAL_NUMBER:this._serialNumber,DEVICE_KEY:this._deviceKey,DEVICE_NAME:this._deviceName};try{return await this._connection.call("ironflock.location_service.update",[l],i)}catch(c){return console.error(`Set location failed: ${c}`),null}}getRemoteAccessUrlForPort(t){return this._deviceKey&&this._appName?`https://${this._deviceKey}-${this._appName.toLowerCase()}-${t}.app.ironflock.com`:null}static async fromServer(t){const s=await fetch(t);if(!s.ok)throw new Error(`Failed to fetch IronFlock config from ${t}: ${s.status} ${s.statusText}`);const o=await s.json();return new C(o)}}exports.CrossbarConnection=K;exports.IronFlock=C;exports.Stage=p;exports.validateBulkTableParams=P;exports.validateCallParams=ee;exports.validateLocationParams=D;exports.validatePublishParams=U;exports.validateTableParams=T;exports.validateTableQueryParams=L;
|
|
3
3
|
//# sourceMappingURL=index.cjs.map
|
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/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\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\": LOCALHOST_WS_URI,\n};\n\nconst SESSION_WAIT_TIMEOUT = 6000;\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 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 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 return socketURIMap[reswarmUrl] ?? STUDIO_WS_URI;\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 // 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 const validateTableQueryParams = typia.createValidate<TableQueryParams>();\nexport const validateLocationParams = typia.createValidate<LocationParams>();\nexport const validatePublishParams = typia.createValidate<PublishParams>();\nexport const validateCallParams = typia.createValidate<CallParams>();\nexport const validateTableParams = typia.createValidate<TableParams>();\n","import autobahn from \"autobahn\";\nimport { CrossbarConnection } from \"./crossbar\";\nimport {\n Stage,\n validatePublishParams,\n validateTableParams,\n validateLocationParams,\n validateTableQueryParams,\n type TableQueryParams,\n} from \"./types\";\n\nfunction getEnv(key: string): string | undefined {\n return typeof process !== \"undefined\" ? process.env?.[key] : undefined;\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 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 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 this._connection.stop();\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 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 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 = `${this._swarmKey}.${this._appKey}.${tablename}`;\n return this.subscribe(topic, handler, options);\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.app.${this._appKey}.${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 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 getRemoteAccessUrlForPort(port: number): string | null {\n if (this._deviceKey && this._appName) {\n return `https://${this._deviceKey}-${this._appName.toLowerCase()}-${port}.app.ironflock.com`;\n }\n return null;\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","socketURIMap","SESSION_WAIT_TIMEOUT","CrossbarConnection","reswarmUrl","deviceEndpoint","_a","url","swarmKey","appKey","stage","serialNumber","cburl","resolve","reject","autobahn","_session","_method","extra","session","reason","details","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","validateLocationParams","validatePublishParams","key","validateCallParams","validateTableParams","getEnv","getSerialNumber","sn","IronFlock","missing","envValue","resolvedUrl","validation","e","combinedKwargs","tablename","deviceKey","fullTopic","queryParams","errorStr","long","lat","payload","port","response"],"mappings":"8QAEA,IAAIA,EAAM,OAAO,UAAU,eACvBC,EAAS,IASb,SAASC,GAAS,CAAA,CASd,OAAO,SACTA,EAAO,UAAY,OAAO,OAAO,IAAI,EAMhC,IAAIA,EAAM,EAAG,YAAWD,EAAS,KAYxC,SAASE,EAAGC,EAAIC,EAASC,EAAM,CAC7B,KAAK,GAAKF,EACV,KAAK,QAAUC,EACf,KAAK,KAAOC,GAAQ,EACtB,CAaA,SAASC,EAAYC,EAASC,EAAOL,EAAIC,EAASC,EAAM,CACtD,GAAI,OAAOF,GAAO,WAChB,MAAM,IAAI,UAAU,iCAAiC,EAGvD,IAAIM,EAAW,IAAIP,EAAGC,EAAIC,GAAWG,EAASF,CAAI,EAC9CK,EAAMV,EAASA,EAASQ,EAAQA,EAEpC,OAAKD,EAAQ,QAAQG,CAAG,EACdH,EAAQ,QAAQG,CAAG,EAAE,GAC1BH,EAAQ,QAAQG,CAAG,EAAI,CAACH,EAAQ,QAAQG,CAAG,EAAGD,CAAQ,EADxBF,EAAQ,QAAQG,CAAG,EAAE,KAAKD,CAAQ,GAD1CF,EAAQ,QAAQG,CAAG,EAAID,EAAUF,EAAQ,gBAI7DA,CACT,CASA,SAASI,EAAWJ,EAASG,EAAK,CAC5B,EAAEH,EAAQ,eAAiB,EAAGA,EAAQ,QAAU,IAAIN,EACnD,OAAOM,EAAQ,QAAQG,CAAG,CACjC,CASA,SAASE,GAAe,CACtB,KAAK,QAAU,IAAIX,EACnB,KAAK,aAAe,CACtB,CASAW,EAAa,UAAU,WAAa,UAAsB,CACxD,IAAIC,EAAQ,CAAA,EACRC,EACAC,EAEJ,GAAI,KAAK,eAAiB,EAAG,OAAOF,EAEpC,IAAKE,KAASD,EAAS,KAAK,QACtBf,EAAI,KAAKe,EAAQC,CAAI,GAAGF,EAAM,KAAKb,EAASe,EAAK,MAAM,CAAC,EAAIA,CAAI,EAGtE,OAAI,OAAO,sBACFF,EAAM,OAAO,OAAO,sBAAsBC,CAAM,CAAC,EAGnDD,CACT,EASAD,EAAa,UAAU,UAAY,SAAmBJ,EAAO,CAC3D,IAAIE,EAAMV,EAASA,EAASQ,EAAQA,EAChCQ,EAAW,KAAK,QAAQN,CAAG,EAE/B,GAAI,CAACM,EAAU,MAAO,CAAA,EACtB,GAAIA,EAAS,GAAI,MAAO,CAACA,EAAS,EAAE,EAEpC,QAASC,EAAI,EAAGC,EAAIF,EAAS,OAAQG,EAAK,IAAI,MAAMD,CAAC,EAAGD,EAAIC,EAAGD,IAC7DE,EAAGF,CAAC,EAAID,EAASC,CAAC,EAAE,GAGtB,OAAOE,CACT,EASAP,EAAa,UAAU,cAAgB,SAAuBJ,EAAO,CACnE,IAAIE,EAAMV,EAASA,EAASQ,EAAQA,EAChCY,EAAY,KAAK,QAAQV,CAAG,EAEhC,OAAKU,EACDA,EAAU,GAAW,EAClBA,EAAU,OAFM,CAGzB,EASAR,EAAa,UAAU,KAAO,SAAcJ,EAAOa,EAAIC,EAAIC,EAAIC,EAAIC,EAAI,CACrE,IAAIf,EAAMV,EAASA,EAASQ,EAAQA,EAEpC,GAAI,CAAC,KAAK,QAAQE,CAAG,EAAG,MAAO,GAE/B,IAAIU,EAAY,KAAK,QAAQV,CAAG,EAC5BgB,EAAM,UAAU,OAChBC,EACAV,EAEJ,GAAIG,EAAU,GAAI,CAGhB,OAFIA,EAAU,MAAM,KAAK,eAAeZ,EAAOY,EAAU,GAAI,OAAW,EAAI,EAEpEM,EAAG,CACT,IAAK,GAAG,OAAON,EAAU,GAAG,KAAKA,EAAU,OAAO,EAAG,GACrD,IAAK,GAAG,OAAOA,EAAU,GAAG,KAAKA,EAAU,QAASC,CAAE,EAAG,GACzD,IAAK,GAAG,OAAOD,EAAU,GAAG,KAAKA,EAAU,QAASC,EAAIC,CAAE,EAAG,GAC7D,IAAK,GAAG,OAAOF,EAAU,GAAG,KAAKA,EAAU,QAASC,EAAIC,EAAIC,CAAE,EAAG,GACjE,IAAK,GAAG,OAAOH,EAAU,GAAG,KAAKA,EAAU,QAASC,EAAIC,EAAIC,EAAIC,CAAE,EAAG,GACrE,IAAK,GAAG,OAAOJ,EAAU,GAAG,KAAKA,EAAU,QAASC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,EAAG,EAC/E,CAEI,IAAKR,EAAI,EAAGU,EAAO,IAAI,MAAMD,EAAK,CAAC,EAAGT,EAAIS,EAAKT,IAC7CU,EAAKV,EAAI,CAAC,EAAI,UAAUA,CAAC,EAG3BG,EAAU,GAAG,MAAMA,EAAU,QAASO,CAAI,CAC9C,KAAS,CACL,IAAIC,EAASR,EAAU,OACnBS,EAEJ,IAAKZ,EAAI,EAAGA,EAAIW,EAAQX,IAGtB,OAFIG,EAAUH,CAAC,EAAE,MAAM,KAAK,eAAeT,EAAOY,EAAUH,CAAC,EAAE,GAAI,OAAW,EAAI,EAE1ES,EAAG,CACT,IAAK,GAAGN,EAAUH,CAAC,EAAE,GAAG,KAAKG,EAAUH,CAAC,EAAE,OAAO,EAAG,MACpD,IAAK,GAAGG,EAAUH,CAAC,EAAE,GAAG,KAAKG,EAAUH,CAAC,EAAE,QAASI,CAAE,EAAG,MACxD,IAAK,GAAGD,EAAUH,CAAC,EAAE,GAAG,KAAKG,EAAUH,CAAC,EAAE,QAASI,EAAIC,CAAE,EAAG,MAC5D,IAAK,GAAGF,EAAUH,CAAC,EAAE,GAAG,KAAKG,EAAUH,CAAC,EAAE,QAASI,EAAIC,EAAIC,CAAE,EAAG,MAChE,QACE,GAAI,CAACI,EAAM,IAAKE,EAAI,EAAGF,EAAO,IAAI,MAAMD,EAAK,CAAC,EAAGG,EAAIH,EAAKG,IACxDF,EAAKE,EAAI,CAAC,EAAI,UAAUA,CAAC,EAG3BT,EAAUH,CAAC,EAAE,GAAG,MAAMG,EAAUH,CAAC,EAAE,QAASU,CAAI,CAC1D,CAEA,CAEE,MAAO,EACT,EAWAf,EAAa,UAAU,GAAK,SAAYJ,EAAOL,EAAIC,EAAS,CAC1D,OAAOE,EAAY,KAAME,EAAOL,EAAIC,EAAS,EAAK,CACpD,EAWAQ,EAAa,UAAU,KAAO,SAAcJ,EAAOL,EAAIC,EAAS,CAC9D,OAAOE,EAAY,KAAME,EAAOL,EAAIC,EAAS,EAAI,CACnD,EAYAQ,EAAa,UAAU,eAAiB,SAAwBJ,EAAOL,EAAIC,EAASC,EAAM,CACxF,IAAIK,EAAMV,EAASA,EAASQ,EAAQA,EAEpC,GAAI,CAAC,KAAK,QAAQE,CAAG,EAAG,OAAO,KAC/B,GAAI,CAACP,EACH,OAAAQ,EAAW,KAAMD,CAAG,EACb,KAGT,IAAIU,EAAY,KAAK,QAAQV,CAAG,EAEhC,GAAIU,EAAU,GAEVA,EAAU,KAAOjB,IAChB,CAACE,GAAQe,EAAU,QACnB,CAAChB,GAAWgB,EAAU,UAAYhB,IAEnCO,EAAW,KAAMD,CAAG,MAEjB,CACL,QAASO,EAAI,EAAGH,EAAS,CAAA,EAAIc,EAASR,EAAU,OAAQH,EAAIW,EAAQX,KAEhEG,EAAUH,CAAC,EAAE,KAAOd,GACnBE,GAAQ,CAACe,EAAUH,CAAC,EAAE,MACtBb,GAAWgB,EAAUH,CAAC,EAAE,UAAYb,IAErCU,EAAO,KAAKM,EAAUH,CAAC,CAAC,EAOxBH,EAAO,OAAQ,KAAK,QAAQJ,CAAG,EAAII,EAAO,SAAW,EAAIA,EAAO,CAAC,EAAIA,EACpEH,EAAW,KAAMD,CAAG,CAC7B,CAEE,OAAO,IACT,EASAE,EAAa,UAAU,mBAAqB,SAA4BJ,EAAO,CAC7E,IAAIE,EAEJ,OAAIF,GACFE,EAAMV,EAASA,EAASQ,EAAQA,EAC5B,KAAK,QAAQE,CAAG,GAAGC,EAAW,KAAMD,CAAG,IAE3C,KAAK,QAAU,IAAIT,EACnB,KAAK,aAAe,GAGf,IACT,EAKAW,EAAa,UAAU,IAAMA,EAAa,UAAU,eACpDA,EAAa,UAAU,YAAcA,EAAa,UAAU,GAK5DA,EAAa,SAAWZ,EAKxBY,EAAa,aAAeA,EAM1BkB,UAAiBlB,yCC9TbmB,EAAkB,kCAClBC,EAAgB,oCAChBC,EAAoB,oCACpBC,EAAoB,2CACpBC,EAAmB,gCAEnBC,EAAuC,CAC3C,6BAA8BL,EAC9B,+BAAgCE,EAChC,+BAAgCD,EAChC,sCAAuCE,EACvC,wBAAyBC,EACzB,wBAAyBA,EACzB,mCAAoCA,CACtC,EAEME,EAAuB,IAEtB,MAAMC,UAA2B1B,CAAa,CAgBnD,aAAc,CACZ,MAAA,EAVF,KAAQ,cAAyC,CAAA,EACjD,KAAQ,cAAyC,CAAA,EAEjD,KAAQ,cAA4B,OACpC,KAAQ,cAAwC,OAChD,KAAQ,gBAA2B,GACnC,KAAQ,eAA0B,GAClC,KAAQ,cAAyB,EAIjC,CAEA,OAAO,gBAAgB2B,EAA6B,OAElD,MAAMC,EAAiB,OAAO,QAAY,KAAcC,EAAA,QAAQ,MAAR,YAAAA,EAAa,oBAAsB,OAC3F,GAAID,EACF,GAAI,CACF,MAAME,EAAM,IAAI,IAAIF,CAAc,EAClC,OAAAE,EAAI,SAAW,aACRA,EAAI,SAAA,EAAW,QAAQ,MAAO,EAAE,CACzC,MAAQ,CAER,CAGF,OAAKH,EACEH,EAAaG,CAAU,GAAKP,EADXA,CAE1B,CAEA,UACEW,EACAC,EACAC,EACAC,EACAC,EACA,CACA,KAAK,MAAQ,SAASJ,CAAQ,IAAIC,CAAM,IAAIC,CAAK,GACjD,KAAK,cAAgBC,EACrB,KAAK,UAAYC,GAAST,EAAmB,gBAAA,CAC/C,CAEA,MAAM,OAAuB,CAC3B,GAAI,CAAC,KAAK,OAAS,CAAC,KAAK,eAAiB,CAAC,KAAK,UAC9C,MAAM,IAAI,MAAM,gFAAgF,EAGlG,YAAK,gBAAkB,GACvB,KAAK,gBAAkB,IAAI,QAAQ,CAACU,EAASC,IAAW,CACtD,KAAK,cAAgBD,EACrB,KAAK,cAAgBC,CACvB,CAAC,EAED,KAAK,WAAa,IAAIC,EAAS,WAAW,CACxC,MAAO,KAAK,MACZ,IAAK,KAAK,UACV,YAAa,CAAC,SAAS,EACvB,OAAQ,KAAK,cACb,YAAa,GACb,gBAAiB,EACjB,oBAAqB,EAErB,kBAAmB,EACnB,iBAAkB,EAClB,YAAa,CAACC,EAAUC,EAASC,IACxBH,EAAS,SAAS,KAAK,KAAK,cAAgBG,EAAM,SAAS,CACpE,CACD,EAED,KAAK,WAAW,OAAS,KAAK,OAAO,KAAK,IAAI,EAC9C,KAAK,WAAW,QAAU,KAAK,QAAQ,KAAK,IAAI,EAChD,KAAK,WAAW,KAAA,EAET,KAAK,eACd,CAEQ,OAAOC,EAA2B,CACxC,KAAK,QAAUA,EACf,KAAK,QAAQ,mBAAqB,GAClC,KAAK,cAAgB,GAErB,KAAK,eAAA,EACL,KAAK,cAAA,EACL,KAAK,KAAK,YAAa,KAAK,aAAa,EAEzC,KAAK,cAAA,EACL,KAAK,cAAgB,MACvB,CAEQ,QAAQC,EAAgBC,EAAuB,CACrD,YAAK,QAAU,OACf,KAAK,KAAK,cAAc,EAExB,KAAK,cACH,IAAI,MACF,sBAAsBD,CAAM,MAAM,KAAK,UAAUC,EAAS,KAAM,CAAC,CAAC,EAAA,CACpE,EAEF,KAAK,cAAgB,OAErB,QAAQ,KAAK,qBAAsB,CACjC,OAAAD,EACA,QAAAC,EACA,MAAO,KAAK,MACZ,IAAK,KAAK,UACV,OAAQ,KAAK,aAAA,CACd,EASG,KAAK,iBAAmB,KAAK,gBAAiBA,GAAA,YAAAA,EAAS,cAAe,IACxE,KAAK,uBAAsBA,GAAA,YAAAA,EAAS,SAAUD,CAAM,EAI/C,EACT,CAEA,MAAc,sBAAsBA,EAAgB,CAClD,GAAI,OAAK,gBAAkB,CAAC,KAAK,iBAIjC,KADA,KAAK,eAAiB,GACf,KAAK,iBAAmB,CAAC,KAAK,SAEnC,GADA,MAAM,IAAI,QAASP,GAAY,WAAWA,EAAS,GAAI,CAAC,EACpD,KAAK,iBAAmB,KAAK,YAAc,CAAC,KAAK,QAAS,CAC5D,QAAQ,IAAI,sCAAsCO,CAAM,KAAK,EAC7D,GAAI,CACF,KAAK,WAAW,KAAA,EAChB,MAAM,IAAI,QAASP,GAAY,WAAWA,EAAS,GAAG,CAAC,CACzD,OAASS,EAAO,CACd,QAAQ,MAAM,4CAA6CA,CAAK,CAClE,CACF,CAEF,KAAK,eAAiB,GACxB,CAEA,MAAc,aAAc,CAC1B,MAAMC,EAAY,KAAK,IAAA,EACvB,KAAO,CAAC,KAAK,SAAS,CACpB,GAAI,KAAK,MAAQA,EAAYrB,EAC3B,MAAM,IAAI,MAAM,6BAA6B,EAE/C,MAAM,IAAI,QAASW,GAAY,WAAWA,EAAS,GAAG,CAAC,CACzD,CACF,CAEA,MAAM,mBAAoB,CACxB,OAAO,KAAK,eACd,CAEA,YAAa,CACX,OAAO,KAAK,OACd,CAEA,IAAI,SAAmB,OACrB,MAAO,CAAC,GAACP,EAAA,KAAK,UAAL,MAAAA,EAAc,OACzB,CAEA,aAAc,CACZ,OAAO,KAAK,OACd,CAEA,MAAO,OACL,KAAK,gBAAkB,IACvBA,EAAA,KAAK,aAAL,MAAAA,EAAiB,MAAM,oBAAqB,8BAC9C,CAEA,MAAM,UACJkB,EACAC,EAC4C,OAC5C,MAAM,KAAK,YAAA,EACX,MAAMC,EAAM,OAAMpB,EAAA,KAAK,UAAL,YAAAA,EAAc,UAAUkB,EAAOC,IACjD,OAAIC,GACF,KAAK,cAAc,KAAKA,CAAG,EAEtBA,CACT,CAEA,MAAM,YAAYA,EAA4B,OAC5C,MAAM,KAAK,YAAA,EACX,MAAMC,EAAM,KAAK,cAAc,QAAQD,CAAG,EACtCC,IAAQ,KACV,KAAK,cAAc,OAAOA,EAAK,CAAC,EAChC,OAAMrB,EAAA,KAAK,UAAL,YAAAA,EAAc,YAAYoB,IAEpC,CAEA,MAAM,iBAAiBF,EAAe,CACpC,MAAMI,EAAW,KAAK,cAAc,OAAQF,GAAQA,EAAI,QAAUF,CAAK,EACvE,UAAWE,KAAOE,EAChB,MAAM,KAAK,YAAYF,CAAG,CAE9B,CAEA,MAAc,gBAAiB,CAC7B,MAAMG,EAAW,CAAC,GAAG,KAAK,aAAa,EACvC,KAAK,cAAgB,CAAA,EACrB,MAAM,QAAQ,IACZA,EAAS,IAAKH,GAAQ,KAAK,UAAUA,EAAI,MAAOA,EAAI,OAAO,CAAC,CAAA,CAEhE,CAEA,MAAc,eAAgB,CAC5B,MAAMG,EAAW,CAAC,GAAG,KAAK,aAAa,EACvC,KAAK,cAAgB,CAAA,EACrB,MAAM,QAAQ,IACZA,EAAS,IAAKC,GAAQ,KAAK,SAASA,EAAI,UAAWA,EAAI,SAAUA,EAAI,OAAO,CAAC,CAAA,CAEjF,CAEA,MAAM,SACJN,EACAO,EACAC,EAC6C,OAC7C,MAAM,KAAK,YAAA,EACX,MAAMC,EAAmB,CAAE,iBAAkB,GAAM,GAAID,GAAW,CAAA,CAAC,EAC7DE,EAAe,OAAM5B,EAAA,KAAK,UAAL,YAAAA,EAAc,SAASkB,EAAOO,EAAUE,IACnE,OAAIC,GACF,KAAK,cAAc,KAAKA,CAAY,EAE/BA,CACT,CAEA,MAAM,WAAWA,EAAqC,OACpD,MAAM,KAAK,YAAA,EACX,OAAM5B,EAAA,KAAK,UAAL,YAAAA,EAAc,WAAW4B,IAC/B,MAAMP,EAAM,KAAK,cAAc,QAAQO,CAAY,EAC/CP,IAAQ,IACV,KAAK,cAAc,OAAOA,EAAK,CAAC,CAEpC,CAEA,MAAM,KACJQ,EACA3C,EACA4C,EACAJ,EACA,OACA,aAAM,KAAK,YAAA,GACJ1B,EAAA,KAAK,UAAL,YAAAA,EAAc,KAAQ6B,EAAW3C,EAAM4C,EAAQJ,EACxD,CAEA,MAAM,QACJR,EACAhC,EACA4C,EACAJ,EACA,OACA,aAAM,KAAK,YAAA,GACJ1B,EAAA,KAAK,UAAL,YAAAA,EAAc,QAAQkB,EAAOhC,EAAM4C,EAAQJ,EACpD,CACF,CC7SA,MAAMK,EAAiBC,GAAU,KAAK,MAAMA,CAAK,IAAMA,GAASC,GAAWD,GAASA,GAASE,EACvFD,EAAU,EACVC,EAAU,GAAK,GAAK,ECFpBC,EAAqBC,GAAQC,EAAQ,KAAKD,CAAG,EAC7CC,EAAU,2JCDVC,EAAmBC,GAAU,CAC/B,MAAMC,EAAcC,GAAS,CACzB,GAAIF,EAAM,SAAW,EACjB,MAAO,GACX,MAAMG,EAAOH,EAAMA,EAAM,OAAS,CAAC,EAAE,KACrC,OAAOE,EAAK,OAASC,EAAK,QAAUA,EAAK,UAAU,EAAGD,EAAK,MAAM,IAAMA,CAC3E,EACA,MAAO,CAACE,EAAY3B,KACZ2B,GAAcH,EAAWxB,EAAM,IAAI,IAC/BA,EAAM,QAAU,SAChBA,EAAM,cAANA,EAAM,YAAgB,CAClB,yCACA,GACA,qBAAqBA,EAAM,QAAQ,2BACvD,EAAkB,KAAK;AAAA,CAAI,IACfuB,EAAM,KAAKvB,CAAK,GAEb,GAEf,ECnBM4B,EAAyBlF,GAAO,OAAO,OAAOA,EAAI,CACpD,YAAa,CACT,QAAS,EACT,OAAQ,QACR,SAAWmF,GAAU,CACjB,MAAMC,EAASpF,EAAGmF,CAAK,EACvB,OAAIC,EAAO,QACA,CACH,MAAOA,EAAO,IAClC,EAGuB,CACH,OAAQA,EAAO,OAAO,IAAK9B,IAAW,CAClC,QAAS,YAAYA,EAAM,QAAQ,SAASA,EAAM,KAAK,GACvD,KAAM+B,EAA8B/B,EAAM,IAAI,CACtE,EAAsB,CACtB,CAEQ,CACR,CACA,CAAC,EACD,IAAIgC,GACH,SAAUA,EAAiB,CAIxBA,EAAgBA,EAAgB,MAAW,CAAC,EAAI,QAEhDA,EAAgBA,EAAgB,SAAc,CAAC,EAAI,WAEnDA,EAAgBA,EAAgB,UAAe,CAAC,EAAI,YAEpDA,EAAgBA,EAAgB,UAAe,CAAC,EAAI,WACxD,GAAGA,IAAoBA,EAAkB,CAAA,EAAG,EAC5C,MAAMD,EAAiCN,GAAS,CAC5C,GAAI,CAACA,EAAK,WAAW,QAAQ,EACzB,MAAM,IAAI,MAAM,iBAAiB,KAAK,UAAUA,CAAI,CAAC,EAAE,EAE3D,MAAMQ,EAAW,CAAA,EACjB,IAAIC,EAAiB,GACjBC,EAAQH,EAAgB,MACxBI,EAAQ,EACZ,KAAOA,EAAQX,EAAK,OAAS,GAAG,CAC5BW,IACA,MAAMC,EAAOZ,EAAKW,CAAK,EAuDvB,GAtDID,IAAUH,EAAgB,SACtBK,IAAS,KAAOA,IAAS,KAEzBJ,EAAS,KAAK,CACV,IAAKC,CACzB,CAAiB,EACDC,EAAQH,EAAgB,OAEnBI,IAAUX,EAAK,OAAS,GAE7BS,GAAkBG,EAClBJ,EAAS,KAAK,CACV,IAAKC,CACzB,CAAiB,EACDE,IACAD,EAAQH,EAAgB,OAGxBE,GAAkBG,EAGjBF,IAAUH,EAAgB,UAC3BK,IAAS,KAETJ,EAAS,KAAK,CACV,IAAK,KAAK,MAAMC,EAAiBG,CAAI,CACzD,CAAiB,EAEDD,GAAS,EACTD,EAAQH,EAAgB,OAEnBK,IAAS,MAEdH,GAAkBT,EAAKW,CAAK,EAC5BA,IACAF,GAAkBT,EAAKW,CAAK,GAG5BF,GAAkBG,EAGjBF,IAAUH,EAAgB,YAC3BK,IAAS,KAETJ,EAAS,KAAK,CACV,IAAK,OAAO,SAASC,CAAc,CACvD,CAAiB,EACDE,IACAD,EAAQH,EAAgB,OAGxBE,GAAkBG,GAGtBF,IAAUH,EAAgB,OAASI,EAAQX,EAAK,OAAS,EAAG,CAC5D,MAAMa,EAAUb,EAAKW,CAAK,EAE1B,GADAF,EAAiB,GACbI,IAAY,IACRb,EAAKW,EAAQ,CAAC,IAAM,KAGpBD,EAAQH,EAAgB,UACxBI,IACAF,EAAiB,KAIjBC,EAAQH,EAAgB,kBAGvBM,IAAY,IAEjBH,EAAQH,EAAgB,aAGxB,OAAM,IAAI,MAAM,+CAA+C,CAEvE,CACJ,CACA,GAAIG,IAAUH,EAAgB,MAC1B,MAAM,IAAI,MAAM,yBAAyB,KAAK,UAAUP,CAAI,CAAC,EAAE,EAEnE,OAAOQ,CACX,EC/HA,IAAAM,GAAAA,IACAA,EAAA,YAAA,MACAA,EAAA,WAAA,OAFAA,IAAAA,GAAA,CAAA,CAAA,EA8CA,MAAAC,GAAA,IAAA,CAAA,MAAAC,EAAAZ,GAAA,OAAAA,EAAA,OAAA,UAAAa,EAAAb,EAAA,KAAA,GAAA,GAAAA,EAAA,OAAAA,EAAA,OAAA,MAAAA,EAAA,SAAA,QAAA,OAAAA,EAAA,QAAA,UAAAa,EAAAb,EAAA,MAAA,GAAA,GAAAA,EAAA,UAAAA,EAAA,YAAA,QAAA,OAAAA,EAAA,WAAA,UAAAA,EAAA,YAAA,MAAAc,EAAAd,EAAA,SAAA,KAAAA,EAAA,YAAA,QAAA,MAAA,QAAAA,EAAA,SAAA,GAAAA,EAAA,UAAA,MAAAe,GAAA,OAAAA,GAAA,UAAAA,IAAA,MAAAC,EAAAD,CAAA,CAAA,GAAAD,EAAAd,GAAA,OAAAA,EAAA,OAAA,UAAAiB,EAAAjB,EAAA,KAAA,GAAA,OAAAA,EAAA,KAAA,UAAAiB,EAAAjB,EAAA,GAAA,EAAAgB,EAAAhB,GAAA,OAAAA,EAAA,QAAA,UAAA,GAAAA,EAAA,OAAA,QAAA,OAAAA,EAAA,UAAA,UAAA,GAAAA,EAAA,SAAA,QAAAA,EAAA,QAAA,MAAAA,EAAA,QAAA,SAAA,OAAAA,EAAA,OAAA,UAAA,OAAAA,EAAA,OAAA,UAAA,OAAAA,EAAA,OAAA,WAAA,MAAA,QAAAA,EAAA,KAAA,GAAAA,EAAA,MAAA,MAAAe,GAAA,OAAAA,GAAA,UAAA,OAAAA,GAAA,QAAA,GAAAG,EAAA,CAAAlB,EAAAmB,EAAAC,EAAA,KAAA,CAAA,OAAApB,EAAA,OAAA,WAAAa,EAAAb,EAAA,KAAA,GAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,SAAA,SAAA,0BAAA,MAAAnB,EAAA,KAAA,CAAA,KAAA,GAAAA,EAAA,OAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,SAAA,SAAA,sBAAA,MAAAnB,EAAA,KAAA,CAAA,KAAAA,EAAA,OAAA,KAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,SAAA,SAAA,0BAAA,MAAAnB,EAAA,KAAA,CAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,SAAA,SAAA,0DAAA,MAAAnB,EAAA,KAAA,CAAA,EAAAA,EAAA,SAAA,QAAA,OAAAA,EAAA,QAAA,WAAAa,EAAAb,EAAA,MAAA,GAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,UAAA,SAAA,0BAAA,MAAAnB,EAAA,MAAA,CAAA,KAAA,GAAAA,EAAA,QAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,UAAA,SAAA,sBAAA,MAAAnB,EAAA,MAAA,CAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,UAAA,SAAA,uDAAA,MAAAnB,EAAA,MAAA,CAAA,EAAAA,EAAA,YAAA,SAAA,OAAAA,EAAA,WAAA,UAAAA,EAAA,YAAA,MAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,aAAA,SAAA,6BAAA,MAAAnB,EAAA,SAAA,CAAA,IAAAsB,EAAAtB,EAAA,UAAAmB,EAAA,aAAAC,CAAA,GAAAC,EAAAD,EAAA,CAAA,KAAAD,EAAA,aAAA,SAAA,6BAAA,MAAAnB,EAAA,SAAA,CAAA,EAAAA,EAAA,YAAA,SAAA,MAAA,QAAAA,EAAA,SAAA,GAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,aAAA,SAAA,oCAAA,MAAAnB,EAAA,SAAA,CAAA,IAAAA,EAAA,UAAA,IAAA,CAAAe,EAAAQ,KAAA,OAAAR,GAAA,UAAAA,IAAA,MAAAM,EAAAD,EAAA,CAAA,KAAAD,EAAA,cAAAI,EAAA,IAAA,SAAA,eAAA,MAAAR,CAAA,CAAA,IAAAS,EAAAT,EAAAI,EAAA,cAAAI,EAAA,IAAAH,CAAA,GAAAC,EAAAD,EAAA,CAAA,KAAAD,EAAA,cAAAI,EAAA,IAAA,SAAA,eAAA,MAAAR,CAAA,CAAA,CAAA,EAAA,MAAAU,GAAAA,CAAA,GAAAJ,EAAAD,EAAA,CAAA,KAAAD,EAAA,aAAA,SAAA,oCAAA,MAAAnB,EAAA,SAAA,CAAA,CAAA,EAAA,MAAAyB,GAAAA,CAAA,EAAAH,EAAA,CAAAtB,EAAAmB,EAAAC,EAAA,KAAA,CAAA,OAAApB,EAAA,OAAA,WAAAiB,EAAAjB,EAAA,KAAA,GAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,SAAA,SAAA,+BAAA,MAAAnB,EAAA,KAAA,CAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,SAAA,SAAA,iCAAA,MAAAnB,EAAA,KAAA,CAAA,EAAA,OAAAA,EAAA,KAAA,WAAAiB,EAAAjB,EAAA,GAAA,GAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,OAAA,SAAA,+BAAA,MAAAnB,EAAA,GAAA,CAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,OAAA,SAAA,iCAAA,MAAAnB,EAAA,GAAA,CAAA,CAAA,EAAA,MAAAyB,GAAAA,CAAA,EAAAD,EAAA,CAAAxB,EAAAmB,EAAAC,EAAA,KAAA,CAAA,OAAApB,EAAA,QAAA,WAAA,GAAAA,EAAA,OAAA,QAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,UAAA,SAAA,wBAAA,MAAAnB,EAAA,MAAA,CAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,UAAA,SAAA,0BAAA,MAAAnB,EAAA,MAAA,CAAA,EAAA,OAAAA,EAAA,UAAA,WAAA,GAAAA,EAAA,SAAA,QAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,YAAA,SAAA,wBAAA,MAAAnB,EAAA,QAAA,CAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,YAAA,SAAA,0BAAA,MAAAnB,EAAA,QAAA,CAAA,GAAAA,EAAA,QAAA,MAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,SAAA,SAAA,uDAAA,MAAAnB,EAAA,KAAA,CAAA,KAAAA,EAAA,QAAA,QAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,SAAA,SAAA,uDAAA,MAAAnB,EAAA,KAAA,CAAA,KAAA,OAAAA,EAAA,OAAA,UAAA,OAAAA,EAAA,OAAA,UAAA,OAAAA,EAAA,OAAA,YAAA,MAAA,QAAAA,EAAA,KAAA,GAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,SAAA,SAAA,uDAAA,MAAAnB,EAAA,KAAA,CAAA,IAAAA,EAAA,MAAA,IAAA,CAAAe,EAAAW,IAAA,OAAAX,GAAA,UAAA,OAAAA,GAAA,UAAAM,EAAAD,EAAA,CAAA,KAAAD,EAAA,UAAAO,EAAA,IAAA,SAAA,oBAAA,MAAAX,CAAA,CAAA,CAAA,EAAA,MAAAU,GAAAA,CAAA,GAAAJ,EAAAD,EAAA,CAAA,KAAAD,EAAA,SAAA,SAAA,uDAAA,MAAAnB,EAAA,KAAA,CAAA,EAAA,EAAA,MAAAyB,GAAAA,CAAA,EAAAE,EAAA3B,GAAA,OAAAA,GAAA,UAAAA,IAAA,MAAAY,EAAAZ,CAAA,EAAA,IAAA4B,EAAAP,EAAA,OAAAQ,EAC8C7B,GAAgC,CAAA,GAAA2B,EAAA3B,CAAA,IAAA,GAAA,CAAA4B,EAAA,CAAA,EAAAP,EAAAS,EAAAF,CAAA,GAAA,CAAA5B,EAAAmB,EAAAC,EAAA,MAAA,OAAApB,GAAA,UAAAA,IAAA,MAAAqB,EAAA,GAAA,CAAA,KAAAF,EAAA,GAAA,SAAA,mBAAA,MAAAnB,CAAA,CAAA,IAAAkB,EAAAlB,EAAAmB,EAAA,GAAA,EAAA,GAAAE,EAAA,GAAA,CAAA,KAAAF,EAAA,GAAA,SAAA,mBAAA,MAAAnB,CAAA,CAAA,GAAAA,EAAA,SAAA,EAAA,EAAA,MAAA+B,EAAAH,EAAA,SAAA,EAAA,OAAAG,EAAA,CAAA,QAAAA,EAAA,KAAA/B,CAAA,EAAA,CAAA,QAAA+B,EAAA,OAAAH,EAAA,KAAA5B,CAAA,CAAA,CAAA,MAAA,CAAA,QAAA,GAAA,KAAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAAAgC,GAAA,IAAA,CAAA,MAAApB,EAAAZ,GAAA,OAAAA,EAAA,WAAA,UAAA,MAAAA,EAAA,WAAAA,EAAA,WAAA,KAAA,OAAAA,EAAA,UAAA,UAAA,KAAAA,EAAA,UAAAA,EAAA,UAAA,GAAAkB,EAAA,CAAAlB,EAAAmB,EAAAC,EAAA,KAAA,CAAA,OAAApB,EAAA,WAAA,WAAA,MAAAA,EAAA,WAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,aAAA,SAAA,yBAAA,MAAAnB,EAAA,SAAA,CAAA,KAAAA,EAAA,WAAA,KAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,aAAA,SAAA,wBAAA,MAAAnB,EAAA,SAAA,CAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,aAAA,SAAA,0CAAA,MAAAnB,EAAA,SAAA,CAAA,EAAA,OAAAA,EAAA,UAAA,WAAA,KAAAA,EAAA,UAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,YAAA,SAAA,wBAAA,MAAAnB,EAAA,QAAA,CAAA,KAAAA,EAAA,UAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,YAAA,SAAA,uBAAA,MAAAnB,EAAA,QAAA,CAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,YAAA,SAAA,wCAAA,MAAAnB,EAAA,QAAA,CAAA,CAAA,EAAA,MAAAyB,GAAAA,CAAA,EAAAE,EAAA3B,GAAA,OAAAA,GAAA,UAAAA,IAAA,MAAAY,EAAAZ,CAAA,EAAA,IAAA4B,EAAAP,EAAA,OAAAQ,EAAA7B,GAAA,CAAA,GAAA2B,EAAA3B,CAAA,IAAA,GAAA,CAAA4B,EAAA,CAAA,EAAAP,EAAAS,EAAAF,CAAA,GAAA,CAAA5B,EAAAmB,EAAAC,EAAA,MAAA,OAAApB,GAAA,UAAAA,IAAA,MAAAqB,EAAA,GAAA,CAAA,KAAAF,EAAA,GAAA,SAAA,iBAAA,MAAAnB,CAAA,CAAA,IAAAkB,EAAAlB,EAAAmB,EAAA,GAAA,EAAA,GAAAE,EAAA,GAAA,CAAA,KAAAF,EAAA,GAAA,SAAA,iBAAA,MAAAnB,CAAA,CAAA,GAAAA,EAAA,SAAA,EAAA,EAAA,MAAA+B,EAAAH,EAAA,SAAA,EAAA,OAAAG,EAAA,CAAA,QAAAA,EAAA,KAAA/B,CAAA,EAAA,CAAA,QAAA+B,EAAA,OAAAH,EAAA,KAAA5B,CAAA,CAAA,CAAA,MAAA,CAAA,QAAA,GAAA,KAAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAAAiC,GAAA,IAAA,CAAA,MAAArB,EAAAZ,GAAA,OAAAA,EAAA,OAAA,UAAA,GAAAA,EAAA,MAAA,SAAAA,EAAA,OAAA,QAAA,MAAA,QAAAA,EAAA,IAAA,KAAAA,EAAA,SAAA,QAAA,OAAAA,EAAA,QAAA,UAAAA,EAAA,SAAA,MAAA,MAAA,QAAAA,EAAA,MAAA,IAAA,IAAAc,EAAAd,EAAA,MAAA,GAAAc,EAAAd,GAAA,OAAA,KAAAA,CAAA,EAAA,MAAAkC,IAAAlC,EAAAkC,CAAA,IAAA,OAAA,GAAA,EAAAhB,EAAA,CAAAlB,EAAAmB,EAAAC,EAAA,KAAA,CAAA,OAAApB,EAAA,OAAA,WAAA,GAAAA,EAAA,MAAA,QAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,SAAA,SAAA,wBAAA,MAAAnB,EAAA,KAAA,CAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,SAAA,SAAA,0BAAA,MAAAnB,EAAA,KAAA,CAAA,EAAAA,EAAA,OAAA,QAAA,MAAA,QAAAA,EAAA,IAAA,GAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,QAAA,SAAA,+BAAA,MAAAnB,EAAA,IAAA,CAAA,EAAAA,EAAA,SAAA,SAAA,OAAAA,EAAA,QAAA,UAAAA,EAAA,SAAA,MAAA,MAAA,QAAAA,EAAA,MAAA,IAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,UAAA,SAAA,wCAAA,MAAAnB,EAAA,MAAA,CAAA,IAAAsB,EAAAtB,EAAA,OAAAmB,EAAA,UAAAC,CAAA,GAAAC,EAAAD,EAAA,CAAA,KAAAD,EAAA,UAAA,SAAA,wCAAA,MAAAnB,EAAA,MAAA,CAAA,CAAA,EAAA,MAAAyB,GAAAA,CAAA,EAAAH,EAAA,CAAAtB,EAAAmB,EAAAC,EAAA,KAAA,CAAAA,IAAA,IAAA,OAAA,KAAApB,CAAA,EAAA,IAAAkC,IAAAlC,EAAAkC,CAAA,IAAA,OAAA,GAAA,EAAA,MAAAT,GAAAA,CAAA,CAAA,EAAA,MAAAA,GAAAA,CAAA,EAAAE,EAAA3B,GAAA,OAAAA,GAAA,UAAAA,IAAA,MAAAY,EAAAZ,CAAA,EAAA,IAAA4B,EAAAP,EAAA,OAAAQ,EAAA7B,GAAA,CAAA,GAAA2B,EAAA3B,CAAA,IAAA,GAAA,CAAA4B,EAAA,CAAA,EAAAP,EAAAS,EAAAF,CAAA,GAAA,CAAA5B,EAAAmB,EAAAC,EAAA,MAAA,OAAApB,GAAA,UAAAA,IAAA,MAAAqB,EAAA,GAAA,CAAA,KAAAF,EAAA,GAAA,SAAA,gBAAA,MAAAnB,CAAA,CAAA,IAAAkB,EAAAlB,EAAAmB,EAAA,GAAA,EAAA,GAAAE,EAAA,GAAA,CAAA,KAAAF,EAAA,GAAA,SAAA,gBAAA,MAAAnB,CAAA,CAAA,GAAAA,EAAA,SAAA,EAAA,EAAA,MAAA+B,EAAAH,EAAA,SAAA,EAAA,OAAAG,EAAA,CAAA,QAAAA,EAAA,KAAA/B,CAAA,EAAA,CAAA,QAAA+B,EAAA,OAAAH,EAAA,KAAA5B,CAAA,CAAA,CAAA,MAAA,CAAA,QAAA,GAAA,KAAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAAAmC,GAAA,IAAA,CAAA,MAAAvB,EAAAZ,GAAA,OAAAA,EAAA,WAAA,UAAA,GAAAA,EAAA,UAAA,QAAA,OAAAA,EAAA,OAAA,UAAA,GAAAA,EAAA,MAAA,SAAAA,EAAA,OAAA,QAAA,MAAA,QAAAA,EAAA,IAAA,KAAAA,EAAA,SAAA,QAAA,OAAAA,EAAA,QAAA,UAAAA,EAAA,SAAA,MAAA,MAAA,QAAAA,EAAA,MAAA,IAAA,IAAAc,EAAAd,EAAA,MAAA,GAAAc,EAAAd,GAAA,OAAA,KAAAA,CAAA,EAAA,MAAAkC,IAAAlC,EAAAkC,CAAA,IAAA,OAAA,GAAA,EAAAhB,EAAA,CAAAlB,EAAAmB,EAAAC,EAAA,KAAA,CAAA,OAAApB,EAAA,WAAA,WAAA,GAAAA,EAAA,UAAA,QAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,aAAA,SAAA,wBAAA,MAAAnB,EAAA,SAAA,CAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,aAAA,SAAA,0BAAA,MAAAnB,EAAA,SAAA,CAAA,EAAA,OAAAA,EAAA,OAAA,WAAA,GAAAA,EAAA,MAAA,QAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,SAAA,SAAA,wBAAA,MAAAnB,EAAA,KAAA,CAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,SAAA,SAAA,0BAAA,MAAAnB,EAAA,KAAA,CAAA,EAAAA,EAAA,OAAA,QAAA,MAAA,QAAAA,EAAA,IAAA,GAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,QAAA,SAAA,+BAAA,MAAAnB,EAAA,IAAA,CAAA,EAAAA,EAAA,SAAA,SAAA,OAAAA,EAAA,QAAA,UAAAA,EAAA,SAAA,MAAA,MAAA,QAAAA,EAAA,MAAA,IAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,UAAA,SAAA,wCAAA,MAAAnB,EAAA,MAAA,CAAA,IAAAsB,EAAAtB,EAAA,OAAAmB,EAAA,UAAAC,CAAA,GAAAC,EAAAD,EAAA,CAAA,KAAAD,EAAA,UAAA,SAAA,wCAAA,MAAAnB,EAAA,MAAA,CAAA,CAAA,EAAA,MAAAyB,GAAAA,CAAA,EAAAH,EAAA,CAAAtB,EAAAmB,EAAAC,EAAA,KAAA,CAAAA,IAAA,IAAA,OAAA,KAAApB,CAAA,EAAA,IAAAkC,IAAAlC,EAAAkC,CAAA,IAAA,OAAA,GAAA,EAAA,MAAAT,GAAAA,CAAA,CAAA,EAAA,MAAAA,GAAAA,CAAA,EAAAE,EAAA3B,GAAA,OAAAA,GAAA,UAAAA,IAAA,MAAAY,EAAAZ,CAAA,EAAA,IAAA4B,EAAAP,EAAA,OAAAQ,EAAA7B,GAAA,CAAA,GAAA2B,EAAA3B,CAAA,IAAA,GAAA,CAAA4B,EAAA,CAAA,EAAAP,EAAAS,EAAAF,CAAA,GAAA,CAAA5B,EAAAmB,EAAAC,EAAA,MAAA,OAAApB,GAAA,UAAAA,IAAA,MAAAqB,EAAA,GAAA,CAAA,KAAAF,EAAA,GAAA,SAAA,aAAA,MAAAnB,CAAA,CAAA,IAAAkB,EAAAlB,EAAAmB,EAAA,GAAA,EAAA,GAAAE,EAAA,GAAA,CAAA,KAAAF,EAAA,GAAA,SAAA,aAAA,MAAAnB,CAAA,CAAA,GAAAA,EAAA,SAAA,EAAA,EAAA,MAAA+B,EAAAH,EAAA,SAAA,EAAA,OAAAG,EAAA,CAAA,QAAAA,EAAA,KAAA/B,CAAA,EAAA,CAAA,QAAA+B,EAAA,OAAAH,EAAA,KAAA5B,CAAA,CAAA,CAAA,MAAA,CAAA,QAAA,GAAA,KAAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EAAAoC,GAAA,IAAA,CAAA,MAAAxB,EAAAZ,GAAA,OAAAA,EAAA,WAAA,UAAA,GAAAA,EAAA,UAAA,SAAAA,EAAA,OAAA,QAAA,MAAA,QAAAA,EAAA,IAAA,KAAAA,EAAA,SAAA,QAAA,OAAAA,EAAA,QAAA,UAAAA,EAAA,SAAA,MAAA,MAAA,QAAAA,EAAA,MAAA,IAAA,IAAAc,EAAAd,EAAA,MAAA,GAAAc,EAAAd,GAAA,OAAA,KAAAA,CAAA,EAAA,MAAAkC,IAAAlC,EAAAkC,CAAA,IAAA,OAAA,GAAA,EAAAhB,EAAA,CAAAlB,EAAAmB,EAAAC,EAAA,KAAA,CAAA,OAAApB,EAAA,WAAA,WAAA,GAAAA,EAAA,UAAA,QAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,aAAA,SAAA,wBAAA,MAAAnB,EAAA,SAAA,CAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,aAAA,SAAA,0BAAA,MAAAnB,EAAA,SAAA,CAAA,EAAAA,EAAA,OAAA,QAAA,MAAA,QAAAA,EAAA,IAAA,GAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,QAAA,SAAA,+BAAA,MAAAnB,EAAA,IAAA,CAAA,EAAAA,EAAA,SAAA,SAAA,OAAAA,EAAA,QAAA,UAAAA,EAAA,SAAA,MAAA,MAAA,QAAAA,EAAA,MAAA,IAAA,IAAAqB,EAAAD,EAAA,CAAA,KAAAD,EAAA,UAAA,SAAA,wCAAA,MAAAnB,EAAA,MAAA,CAAA,IAAAsB,EAAAtB,EAAA,OAAAmB,EAAA,UAAAC,CAAA,GAAAC,EAAAD,EAAA,CAAA,KAAAD,EAAA,UAAA,SAAA,wCAAA,MAAAnB,EAAA,MAAA,CAAA,CAAA,EAAA,MAAAyB,GAAAA,CAAA,EAAAH,EAAA,CAAAtB,EAAAmB,EAAAC,EAAA,KAAA,CAAAA,IAAA,IAAA,OAAA,KAAApB,CAAA,EAAA,IAAAkC,IAAAlC,EAAAkC,CAAA,IAAA,OAAA,GAAA,EAAA,MAAAT,GAAAA,CAAA,CAAA,EAAA,MAAAA,GAAAA,CAAA,EAAAE,EAAA3B,GAAA,OAAAA,GAAA,UAAAA,IAAA,MAAAY,EAAAZ,CAAA,EAAA,IAAA4B,EAAAP,EAAA,OAAAQ,EAAA7B,GAAA,CAAA,GAAA2B,EAAA3B,CAAA,IAAA,GAAA,CAAA4B,EAAA,CAAA,EAAAP,EAAAS,EAAAF,CAAA,GAAA,CAAA5B,EAAAmB,EAAAC,EAAA,MAAA,OAAApB,GAAA,UAAAA,IAAA,MAAAqB,EAAA,GAAA,CAAA,KAAAF,EAAA,GAAA,SAAA,cAAA,MAAAnB,CAAA,CAAA,IAAAkB,EAAAlB,EAAAmB,EAAA,GAAA,EAAA,GAAAE,EAAA,GAAA,CAAA,KAAAF,EAAA,GAAA,SAAA,cAAA,MAAAnB,CAAA,CAAA,GAAAA,EAAA,SAAA,EAAA,EAAA,MAAA+B,EAAAH,EAAA,SAAA,EAAA,OAAAG,EAAA,CAAA,QAAAA,EAAA,KAAA/B,CAAA,EAAA,CAAA,QAAA+B,EAAA,OAAAH,EAAA,KAAA5B,CAAA,CAAA,CAAA,MAAA,CAAA,QAAA,GAAA,KAAAA,CAAA,CAAA,CAAA,CAAA,GAAA,ECtC9E,SAASqC,EAAOH,EAAiC,OAC/C,OAAO,OAAO,QAAY,KAAc/E,EAAA,QAAQ,MAAR,YAAAA,EAAc+E,GAAO,MAC/D,CAEA,SAASI,GAAgB9E,EAA+B,CACtD,MAAM+E,EAAK/E,GAAgB6E,EAAO,sBAAsB,EACxD,GAAI,CAACE,EACH,MAAM,IAAI,MAAM,kFAAkF,EAEpG,OAAOA,CACT,CAkBO,MAAMC,CAAU,CAcrB,YAAY3D,EAA4B,CALxC,KAAQ,cAAgB,GAMtB,KAAK,cAAgByD,GAAgBzD,GAAA,YAAAA,EAAS,YAAY,EAC1D,KAAK,aAAcA,GAAA,YAAAA,EAAS,aAAcwD,EAAO,aAAa,EAC9D,KAAK,YAAaxD,GAAA,YAAAA,EAAS,YAAawD,EAAO,YAAY,EAC3D,KAAK,UAAWxD,GAAA,YAAAA,EAAS,UAAWwD,EAAO,UAAU,EACrD,KAAK,WAAYxD,GAAA,YAAAA,EAAS,WAAY,SAASwD,EAAO,WAAW,GAAK,IAAK,EAAE,EAC7E,KAAK,SAAUxD,GAAA,YAAAA,EAAS,SAAU,SAASwD,EAAO,SAAS,GAAK,IAAK,EAAE,EACvE,KAAK,MAAOxD,GAAA,YAAAA,EAAS,MAAOwD,EAAO,KAAK,EACxC,KAAK,aAAcxD,GAAA,YAAAA,EAAS,aAAcwD,EAAO,aAAa,EAC9D,KAAK,QAASxD,GAAA,YAAAA,EAAS,gBAAgBA,GAAA,YAAAA,EAAS,OAChD,KAAK,YAAc,IAAI7B,EAEvB,MAAMyF,EAAoB,CAAA,EACrB,KAAK,YAAYA,EAAQ,KAAK,YAAY,EAC1C,KAAK,UAAUA,EAAQ,KAAK,UAAU,EACtC,KAAK,WAAWA,EAAQ,KAAK,WAAW,EACxC,KAAK,SAASA,EAAQ,KAAK,SAAS,EACrCA,EAAQ,OAAS,GACnB,QAAQ,KACN,iEAAiEA,EAAQ,KAAK,IAAI,CAAC,EAAA,CAGzF,CAEA,IAAI,YAAiC,CACnC,OAAO,KAAK,WACd,CAEA,IAAI,aAAuB,CACzB,OAAO,KAAK,YAAY,OAC1B,CAEQ,oBAAoBhF,EAAgB,CAC1C,GAAI,KAAK,cAAe,OAExB,MAAMiF,GAAY,KAAK,MAAQ,OAAO,YAAA,EAKhCnF,EAJkC,CACtC,IAAKmD,EAAM,YACX,KAAMA,EAAM,UAAA,EAESgC,CAAQ,GAAKhC,EAAM,YAEpCiC,EACJlF,GACA,KAAK,QACLT,EAAmB,gBAAgB,KAAK,WAAW,EAErD,KAAK,YAAY,UACf,KAAK,UACL,KAAK,QACLO,EACA,KAAK,cACLoF,CAAA,EAEF,KAAK,cAAgB,EACvB,CAEA,MAAM,MAAMlF,EAA+B,CACzC,KAAK,oBAAoBA,CAAK,EAC9B,MAAM,KAAK,YAAY,MAAA,CACzB,CAEA,MAAM,MAAsB,CAC1B,KAAK,YAAY,KAAA,CACnB,CAEA,MAAM,QACJY,EACAhC,EACA4C,EACkB,CAClB,MAAM2D,EAAaX,EAAsB,CAAE,MAAA5D,EAAO,KAAAhC,EAAM,OAAA4C,EAAQ,EAChE,GAAI,CAAC2D,EAAW,QACd,MAAM,IAAI,MAAM,+BAA+BA,EAAW,OAAO,IAAIC,GAAKA,EAAE,KAAO,KAAOA,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,EAQpH,MAAMC,EAAiB,CAAE,GALuB,CAC9C,qBAAsB,KAAK,cAC3B,WAAY,KAAK,WACjB,YAAa,KAAK,WAAA,EAEwB,GAAI7D,GAAU,CAAA,CAAC,EAE3D,OAAO,KAAK,YAAY,QAAQZ,EAAOhC,EAAMyG,EAAgB,CAC3D,YAAa,EAAA,CACd,CACH,CAEA,MAAM,eACJC,EACA1G,EACA4C,EACkB,CAClB,MAAM2D,EAAaR,EAAoB,CAAE,UAAAW,EAAW,KAAA1G,EAAM,OAAA4C,EAAQ,EAClE,GAAI,CAAC2D,EAAW,QACd,MAAM,IAAI,MAAM,6BAA6BA,EAAW,OAAO,IAAIC,GAAKA,EAAE,KAAO,KAAOA,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,EAGlH,GAAI,CAAC,KAAK,UAAW,MAAM,IAAI,MAAM,6CAA6C,EAClF,GAAI,CAAC,KAAK,QAAS,MAAM,IAAI,MAAM,2CAA2C,EAE9E,MAAMxE,EAAQ,GAAG,KAAK,SAAS,IAAI,KAAK,OAAO,IAAI0E,CAAS,GAC5D,OAAO,KAAK,QAAQ1E,EAAOhC,EAAM4C,CAAM,CACzC,CAEA,MAAM,cACJ8D,EACA1G,EACA4C,EACkB,CAClB,MAAM2D,EAAaR,EAAoB,CAAE,UAAAW,EAAW,KAAA1G,EAAM,OAAA4C,EAAQ,EAClE,GAAI,CAAC2D,EAAW,QACd,MAAM,IAAI,MAAM,6BAA6BA,EAAW,OAAO,IAAIC,GAAKA,EAAE,KAAO,KAAOA,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,EAGlH,GAAI,CAAC,KAAK,UAAW,MAAM,IAAI,MAAM,6CAA6C,EAClF,GAAI,CAAC,KAAK,QAAS,MAAM,IAAI,MAAM,2CAA2C,EAE9E,MAAMxE,EAAQ,UAAU,KAAK,SAAS,IAAI,KAAK,OAAO,IAAI0E,CAAS,GAO7DD,EAAiB,CAAE,GALuB,CAC9C,qBAAsB,KAAK,cAC3B,WAAY,KAAK,WACjB,YAAa,KAAK,WAAA,EAEwB,GAAI7D,GAAU,CAAA,CAAC,EAE3D,OAAO,KAAK,YAAY,KAAKZ,EAAOhC,EAAeyG,CAAc,CACnE,CAEA,MAAM,UACJzE,EACAC,EACAO,EACA,CACA,OAAO,KAAK,YAAY,UAAUR,EAAOC,CAAO,CAClD,CAEA,MAAM,iBACJyE,EACAzE,EACAO,EACA,CACA,GAAI,CAAC,KAAK,UAAW,MAAM,IAAI,MAAM,6CAA6C,EAClF,GAAI,CAAC,KAAK,QAAS,MAAM,IAAI,MAAM,2CAA2C,EAE9E,MAAMR,EAAQ,GAAG,KAAK,SAAS,IAAI,KAAK,OAAO,IAAI0E,CAAS,GAC5D,OAAO,KAAK,UAAU1E,EAAOC,EAASO,CAAO,CAC/C,CAEA,MAAM,KACJR,EACAhC,EACA4C,EACAJ,EACA,CACA,OAAO,KAAK,YAAY,KAAKR,EAAOhC,EAAe4C,EAAQJ,CAAO,CACpE,CAEA,MAAM,mBACJmE,EACA3E,EACAhC,EACA4C,EACAJ,EACA,CACA,MAAMoE,EAAY,GAAG,KAAK,SAAS,IAAID,CAAS,IAAI,KAAK,OAAO,IAAI,KAAK,IAAI,IAAI3E,CAAK,GACtF,OAAO,KAAK,YAAY,KAAK4E,EAAW5G,EAAe4C,EAAQJ,CAAO,CACxE,CAGA,MAAM,aACJmE,EACA3E,EACAhC,EACA4C,EACAJ,EACA,CACA,eAAQ,KAAK,yGAAyG,EAC/G,KAAK,mBAAmBmE,EAAW3E,EAAOhC,EAAM4C,EAAQJ,CAAO,CACxE,CAEA,MAAM,uBACJR,EACAO,EACAC,EACA,CACA,MAAMoE,EAAY,GAAG,KAAK,SAAS,IAAI,KAAK,UAAU,IAAI,KAAK,OAAO,IAAI,KAAK,IAAI,IAAI5E,CAAK,GAEtFM,EAAM,MAAM,KAAK,YAAY,SAASsE,EAAWrE,EAAUC,CAAO,EACxE,eAAQ,IAAI,4CAA4CR,CAAK,yBAAyB4E,CAAS,IAAI,EAC5FtE,CACT,CAGA,MAAM,iBACJN,EACAO,EACAC,EACA,CACA,eAAQ,KAAK,iHAAiH,EACvH,KAAK,uBAAuBR,EAAOO,EAAUC,CAAO,CAC7D,CAEA,MAAM,SACJR,EACAO,EACAC,EACA,CACA,OAAO,KAAK,uBAAuBR,EAAOO,EAAUC,CAAO,CAC7D,CAEA,MAAM,WACJkE,EACAG,EAAgC,CAAE,MAAO,IACzC,CACA,GAAI,CAACH,EAAW,MAAM,IAAI,MAAM,8BAA8B,EAG1DG,EAAY,QAAU,OACvBA,EAAoB,OAAS,GAGhC,MAAMN,EAAajC,EAAyBuC,CAAW,EACvD,GAAI,CAACN,EAAW,QACd,MAAM,IAAI,MAAM,6BAA6BA,EAAW,OAAO,IAAIC,GAAKA,EAAE,KAAO,KAAOA,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,EAGlH,MAAMxE,EAAQ,2BAA2B,KAAK,OAAO,IAAI0E,CAAS,GAClE,GAAI,CACF,OAAO,MAAM,KAAK,YAAY,KAAK1E,EAAO,CAAC6E,CAAW,CAAC,CACzD,OAASL,EAAQ,CACf,MAAMM,EAAW,OAAON,CAAC,EACzB,OACEM,EAAS,SAAS,mBAAmB,GACrCA,EAAS,SAAS,sBAAsB,GAExC,QAAQ,MAAM,kDAAkD9E,CAAK,kBAAkB,EAChF,OAET,QAAQ,MAAM,uBAAuBwE,CAAC,EAAE,EACjC,KACT,CACF,CAEA,MAAM,kBAAkBO,EAAcC,EAAa,CACjD,MAAMT,EAAaZ,EAAuB,CAAE,UAAWoB,EAAM,SAAUC,EAAK,EAC5E,GAAI,CAACT,EAAW,QACd,MAAM,IAAI,MAAM,gCAAgCA,EAAW,OAAO,IAAIC,GAAKA,EAAE,KAAO,KAAOA,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,EAGrH,MAAMS,EAAU,CAAE,KAAAF,EAAM,IAAAC,CAAA,EAClBtF,EAAiC,CACrC,qBAAsB,KAAK,cAC3B,WAAY,KAAK,WACjB,YAAa,KAAK,WAAA,EAGpB,GAAI,CACF,OAAO,MAAM,KAAK,YAAY,KAC5B,oCACA,CAACuF,CAAO,EACRvF,CAAA,CAEJ,OAAS8E,EAAG,CACV,eAAQ,MAAM,wBAAwBA,CAAC,EAAE,EAClC,IACT,CACF,CAEA,0BAA0BU,EAA6B,CACrD,OAAI,KAAK,YAAc,KAAK,SACnB,WAAW,KAAK,UAAU,IAAI,KAAK,SAAS,YAAA,CAAa,IAAIA,CAAI,qBAEnE,IACT,CAYA,aAAa,WAAWnG,EAAiC,CACvD,MAAMoG,EAAW,MAAM,MAAMpG,CAAG,EAChC,GAAI,CAACoG,EAAS,GACZ,MAAM,IAAI,MAAM,yCAAyCpG,CAAG,KAAKoG,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,EAE3G,MAAM3E,EAAW,MAAM2E,EAAS,KAAA,EAChC,OAAO,IAAIhB,EAAU3D,CAAO,CAC9B,CACF","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/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\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\": LOCALHOST_WS_URI,\n};\n\nconst SESSION_WAIT_TIMEOUT = 6000;\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 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 // 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\nexport const validateTableQueryParams = typia.createValidate<TableQueryParams>();\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 autobahn from \"autobahn\";\nimport { CrossbarConnection } from \"./crossbar\";\nimport {\n Stage,\n validatePublishParams,\n validateTableParams,\n validateBulkTableParams,\n validateLocationParams,\n validateTableQueryParams,\n type TableQueryParams,\n} from \"./types\";\n\nfunction getEnv(key: string): string | undefined {\n return typeof process !== \"undefined\" ? process.env?.[key] : undefined;\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 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 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 this._connection.stop();\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 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 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 getRemoteAccessUrlForPort(port: number): string | null {\n if (this._deviceKey && this._appName) {\n return `https://${this._deviceKey}-${this._appName.toLowerCase()}-${port}.app.ironflock.com`;\n }\n return null;\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","socketURIMap","SESSION_WAIT_TIMEOUT","CrossbarConnection","reswarmUrl","deviceEndpoint","_a","url","mapped","swarmKey","appKey","stage","serialNumber","cburl","resolve","reject","autobahn","_session","_method","extra","session","reason","details","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","validateLocationParams","validatePublishParams","key","validateCallParams","validateTableParams","validateBulkTableParams","_index2","getEnv","getSerialNumber","sn","IronFlock","missing","envValue","resolvedUrl","validation","combinedKwargs","tablename","e","rows","bulkHandler","rowList","row","deviceKey","fullTopic","queryParams","errorStr","long","lat","payload","port","response"],"mappings":"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","x_google_ignoreList":[0,2,3,4,5]}
|