ironflock 1.2.1 → 1.2.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 CHANGED
@@ -1,5 +1,7 @@
1
1
  # ironflock
2
2
 
3
+ ![Coverage](https://img.shields.io/badge/coverage-91%25-brightgreen)
4
+
3
5
  ## About
4
6
 
5
7
  With this library you can publish data from your apps on your IoT edge hardware to the fleet data storage of the [IronFlock](https://studio.ironflock.com) devops platform.
@@ -147,6 +149,24 @@ await ironflock.publishToTable("sensordata", [{ temperature: 22.5, humidity: 60
147
149
 
148
150
  ---
149
151
 
152
+ ### `appendToTable(tablename, args?, kwargs?)`
153
+
154
+ Appends data to a fleet table by calling the registered append procedure at `append.<SWARM_KEY>.<APP_KEY>.<tablename>`. Unlike `publishToTable`, this uses a remote procedure call rather than a pub/sub event.
155
+
156
+ ```ts
157
+ await ironflock.appendToTable("sensordata", [{ temperature: 22.5, humidity: 60 }]);
158
+ ```
159
+
160
+ | Parameter | Type | Description |
161
+ |-----------|------|-------------|
162
+ | `tablename` | `string` | The name of the table, e.g. `"sensordata"` |
163
+ | `args` | `unknown[]`, optional | Row data to append |
164
+ | `kwargs` | `Record<string, unknown>`, optional | Row data as keyword arguments |
165
+
166
+ **Returns:** `Promise<unknown>` — The result of the remote procedure call.
167
+
168
+ ---
169
+
150
170
  ### `subscribe(topic, handler)`
151
171
 
152
172
  Subscribes to a topic on the IronFlock message router.
package/dist/index.cjs CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=require("autobahn");function W(d){return d&&d.__esModule&&Object.prototype.hasOwnProperty.call(d,"default")?d.default:d}var K={exports:{}},P;function F(){return P||(P=1,(function(d){var r=Object.prototype.hasOwnProperty,s="~";function o(){}Object.create&&(o.prototype=Object.create(null),new o().__proto__||(s=!1));function l(a,e,n){this.fn=a,this.context=e,this.once=n||!1}function i(a,e,n,c,f){if(typeof n!="function")throw new TypeError("The listener must be a function");var v=new l(n,c||a,f),g=s?s+e:e;return a._events[g]?a._events[g].fn?a._events[g]=[a._events[g],v]:a._events[g].push(v):(a._events[g]=v,a._eventsCount++),a}function u(a,e){--a._eventsCount===0?a._events=new o:delete a._events[e]}function t(){this._events=new o,this._eventsCount=0}t.prototype.eventNames=function(){var e=[],n,c;if(this._eventsCount===0)return e;for(c in n=this._events)r.call(n,c)&&e.push(s?c.slice(1):c);return Object.getOwnPropertySymbols?e.concat(Object.getOwnPropertySymbols(n)):e},t.prototype.listeners=function(e){var n=s?s+e:e,c=this._events[n];if(!c)return[];if(c.fn)return[c.fn];for(var f=0,v=c.length,g=new Array(v);f<v;f++)g[f]=c[f].fn;return g},t.prototype.listenerCount=function(e){var n=s?s+e:e,c=this._events[n];return c?c.fn?1:c.length:0},t.prototype.emit=function(e,n,c,f,v,g){var w=s?s+e:e;if(!this._events[w])return!1;var h=this._events[w],b=arguments.length,A,m;if(h.fn){switch(h.once&&this.removeListener(e,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,c),!0;case 4:return h.fn.call(h.context,n,c,f),!0;case 5:return h.fn.call(h.context,n,c,f,v),!0;case 6:return h.fn.call(h.context,n,c,f,v,g),!0}for(m=1,A=new Array(b-1);m<b;m++)A[m-1]=arguments[m];h.fn.apply(h.context,A)}else{var D=h.length,_;for(m=0;m<D;m++)switch(h[m].once&&this.removeListener(e,h[m].fn,void 0,!0),b){case 1:h[m].fn.call(h[m].context);break;case 2:h[m].fn.call(h[m].context,n);break;case 3:h[m].fn.call(h[m].context,n,c);break;case 4:h[m].fn.call(h[m].context,n,c,f);break;default:if(!A)for(_=1,A=new Array(b-1);_<b;_++)A[_-1]=arguments[_];h[m].fn.apply(h[m].context,A)}}return!0},t.prototype.on=function(e,n,c){return i(this,e,n,c,!1)},t.prototype.once=function(e,n,c){return i(this,e,n,c,!0)},t.prototype.removeListener=function(e,n,c,f){var v=s?s+e:e;if(!this._events[v])return this;if(!n)return u(this,v),this;var g=this._events[v];if(g.fn)g.fn===n&&(!f||g.once)&&(!c||g.context===c)&&u(this,v);else{for(var w=0,h=[],b=g.length;w<b;w++)(g[w].fn!==n||f&&!g[w].once||c&&g[w].context!==c)&&h.push(g[w]);h.length?this._events[v]=h.length===1?h[0]:h:u(this,v)}return this},t.prototype.removeAllListeners=function(e){var n;return e?(n=s?s+e:e,this._events[n]&&u(this,n)):(this._events=new o,this._eventsCount=0),this},t.prototype.off=t.prototype.removeListener,t.prototype.addListener=t.prototype.on,t.prefixed=s,t.EventEmitter=t,d.exports=t})(K)),K.exports}var V=F();const Y=W(V),Q="wss://cbw.datapods.io/ws-ua-usr",C="wss://cbw.ironflock.com/ws-ua-usr",q="wss://cbw.ironflock.dev/ws-ua-usr",B="wss://cbw.record-evolution.com/ws-ua-usr",I="ws://localhost:8080/ws-ua-usr",J={"https://studio.datapods.io":Q,"https://studio.ironflock.dev":q,"https://studio.ironflock.com":C,"https://studio.record-evolution.com":B,"http://localhost:8085":I,"http://localhost:8086":I,"http://host.docker.internal:8086":I},H=6e3;class p extends Y{constructor(){super(),this.subscriptions=[],this.registrations=[],this.firstResolver=()=>{},this.firstRejecter=()=>{}}static getWebSocketURI(r){return r?J[r]??C:C}configure(r,s,o,l,i){this.realm=`realm-${r}-${s}-${o}`,this.serial_number=l,this.socketURI=i??p.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.firstConnection=new Promise((r,s)=>{this.firstResolver=r,this.firstRejecter=s}),this.connection=new $.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:(r,s,o)=>$.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(r){this.session=r,this.session.caller_disclose_me=!0,this.resubscribeAll(),this.emit("connected",this.serial_number),this.firstResolver(),this.firstResolver=()=>{}}onClose(r,s){return this.session=void 0,this.emit("disconnected"),this.firstRejecter(new Error(`Connection failed: ${r} - ${JSON.stringify(s,null,2)}`)),this.firstRejecter=()=>{},console.warn("Connection closed:",{reason:r,details:s,realm:this.realm,url:this.socketURI,authid:this.serial_number}),!1}async sessionWait(){const r=Date.now();for(;!this.session;){if(Date.now()-r>H)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 r;return!!((r=this.session)!=null&&r.isOpen)}isConnected(){return this.is_open}stop(){var r;(r=this.connection)==null||r.close("wamp.close.normal","Connection closed by client")}async subscribe(r,s){var l;await this.sessionWait();const o=await((l=this.session)==null?void 0:l.subscribe(r,s));return o&&this.subscriptions.push(o),o}async unsubscribe(r){var o;await this.sessionWait();const s=this.subscriptions.indexOf(r);s!==-1&&(this.subscriptions.splice(s,1),await((o=this.session)==null?void 0:o.unsubscribe(r)))}async unsubscribeTopic(r){const s=this.subscriptions.filter(o=>o.topic===r);for(const o of s)await this.unsubscribe(o)}async resubscribeAll(){const r=[...this.subscriptions];this.subscriptions=[],await Promise.all(r.map(s=>this.subscribe(s.topic,s.handler)))}async register(r,s){var l;await this.sessionWait();const o=await((l=this.session)==null?void 0:l.register(r,s));return o&&this.registrations.push(o),o}async unregister(r){var o;await this.sessionWait(),await((o=this.session)==null?void 0:o.unregister(r));const s=this.registrations.indexOf(r);s!==-1&&this.registrations.splice(s,1)}async call(r,s,o,l){var i;return await this.sessionWait(),(i=this.session)==null?void 0:i.call(r,s,o,l)}async publish(r,s,o,l){var i;return await this.sessionWait(),(i=this.session)==null?void 0:i.publish(r,s,o,l)}}const S=d=>Math.floor(d)===d&&G<=d&&d<=X,G=0,X=2**32-1,x=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,R=d=>{const r=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&&r(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)},M=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(o=>({message:`expected ${o.expected}, got ${o.value}`,path:z(o.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="",o=y.Start,l=5;for(;l<d.length-1;){l++;const i=d[l];if(o===y.Property?i==="."||i==="["?(r.push({key:s}),o=y.Start):l===d.length-1?(s+=i,r.push({key:s}),l++,o=y.Start):s+=i:o===y.StringKey?i==='"'?(r.push({key:JSON.parse(s+i)}),l+=2,o=y.Start):i==="\\"?(s+=d[l],l++,s+=d[l]):s+=i:o===y.NumberKey&&(i==="]"?(r.push({key:Number.parseInt(s)}),l++,o=y.Start):s+=i),o===y.Start&&l<d.length-1){const u=d[l];if(s="",u==="[")d[l+1]==='"'?(o=y.StringKey,l++,s='"'):o=y.NumberKey;else if(u===".")o=y.Property;else throw new Error("Unreachable: pointer points invalid character")}}if(o!==y.Start)throw new Error(`Failed to parse path: ${JSON.stringify(d)}`);return r};var k=(d=>(d.DEVELOPMENT="dev",d.PRODUCTION="prod",d))(k||{});const N=(()=>{const d=e=>typeof e.limit=="number"&&S(e.limit)&&1<=e.limit&&e.limit<=1e4&&(e.offset===void 0||typeof e.offset=="number"&&S(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"&&x(e.start)&&typeof e.end=="string"&&x(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")),o=(e,n,c=!0)=>[typeof e.limit=="number"&&(S(e.limit)||a(c,{path:n+".limit",expected:'number & Type<"uint32">',value:e.limit}))&&(1<=e.limit||a(c,{path:n+".limit",expected:"number & Minimum<1>",value:e.limit}))&&(e.limit<=1e4||a(c,{path:n+".limit",expected:"number & Maximum<10000>",value:e.limit}))||a(c,{path:n+".limit",expected:'(number & Type<"uint32"> & Minimum<1> & Maximum<10000>)',value:e.limit}),e.offset===void 0||typeof e.offset=="number"&&(S(e.offset)||a(c,{path:n+".offset",expected:'number & Type<"uint32">',value:e.offset}))&&(0<=e.offset||a(c,{path:n+".offset",expected:"number & Minimum<0>",value:e.offset}))||a(c,{path:n+".offset",expected:'((number & Type<"uint32"> & Minimum<0>) | undefined)',value:e.offset}),e.timeRange===void 0||(typeof e.timeRange=="object"&&e.timeRange!==null||a(c,{path:n+".timeRange",expected:"(ISOTimeRange | undefined)",value:e.timeRange}))&&l(e.timeRange,n+".timeRange",c)||a(c,{path:n+".timeRange",expected:"(ISOTimeRange | undefined)",value:e.timeRange}),e.filterAnd===void 0||(Array.isArray(e.filterAnd)||a(c,{path:n+".filterAnd",expected:"(Array<SQLFilterAnd> | undefined)",value:e.filterAnd}))&&e.filterAnd.map((f,v)=>(typeof f=="object"&&f!==null||a(c,{path:n+".filterAnd["+v+"]",expected:"SQLFilterAnd",value:f}))&&i(f,n+".filterAnd["+v+"]",c)||a(c,{path:n+".filterAnd["+v+"]",expected:"SQLFilterAnd",value:f})).every(f=>f)||a(c,{path:n+".filterAnd",expected:"(Array<SQLFilterAnd> | undefined)",value:e.filterAnd})].every(f=>f),l=(e,n,c=!0)=>[typeof e.start=="string"&&(x(e.start)||a(c,{path:n+".start",expected:'string & Format<"date-time">',value:e.start}))||a(c,{path:n+".start",expected:'(string & Format<"date-time">)',value:e.start}),typeof e.end=="string"&&(x(e.end)||a(c,{path:n+".end",expected:'string & Format<"date-time">',value:e.end}))||a(c,{path:n+".end",expected:'(string & Format<"date-time">)',value:e.end})].every(f=>f),i=(e,n,c=!0)=>[typeof e.column=="string"&&(1<=e.column.length||a(c,{path:n+".column",expected:"string & MinLength<1>",value:e.column}))||a(c,{path:n+".column",expected:"(string & MinLength<1>)",value:e.column}),typeof e.operator=="string"&&(1<=e.operator.length||a(c,{path:n+".operator",expected:"string & MinLength<1>",value:e.operator}))||a(c,{path:n+".operator",expected:"(string & MinLength<1>)",value:e.operator}),(e.value!==null||a(c,{path:n+".value",expected:"(Array<string | number> | boolean | number | string)",value:e.value}))&&(e.value!==void 0||a(c,{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)||a(c,{path:n+".value",expected:"(Array<string | number> | boolean | number | string)",value:e.value}))&&e.value.map((f,v)=>typeof f=="string"||typeof f=="number"||a(c,{path:n+".value["+v+"]",expected:"(number | string)",value:f})).every(f=>f)||a(c,{path:n+".value",expected:"(Array<string | number> | boolean | number | string)",value:e.value}))].every(f=>f),u=e=>typeof e=="object"&&e!==null&&d(e);let t,a;return M(e=>{if(u(e)===!1){t=[],a=R(t),((c,f,v=!0)=>(typeof c=="object"&&c!==null||a(!0,{path:f+"",expected:"TableQueryParams",value:c}))&&o(c,f+"",!0)||a(!0,{path:f+"",expected:"TableQueryParams",value:c}))(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}})})(),O=(()=>{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||l(t,{path:u+".longitude",expected:"number & Minimum<-180>",value:i.longitude}))&&(i.longitude<=180||l(t,{path:u+".longitude",expected:"number & Maximum<180>",value:i.longitude}))||l(t,{path:u+".longitude",expected:"(number & Minimum<-180> & Maximum<180>)",value:i.longitude}),typeof i.latitude=="number"&&(-90<=i.latitude||l(t,{path:u+".latitude",expected:"number & Minimum<-90>",value:i.latitude}))&&(i.latitude<=90||l(t,{path:u+".latitude",expected:"number & Maximum<90>",value:i.latitude}))||l(t,{path:u+".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 M(i=>{if(s(i)===!1){o=[],l=R(o),((t,a,e=!0)=>(typeof t=="object"&&t!==null||l(!0,{path:a+"",expected:"LocationParams",value:t}))&&r(t,a+"",!0)||l(!0,{path:a+"",expected:"LocationParams",value:t}))(i,"$input",!0);const u=o.length===0;return u?{success:u,data:i}:{success:u,errors:o,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(a=>(t[a]===void 0,!0)),s=(t,a,e=!0)=>[typeof t.topic=="string"&&(1<=t.topic.length||u(e,{path:a+".topic",expected:"string & MinLength<1>",value:t.topic}))||u(e,{path:a+".topic",expected:"(string & MinLength<1>)",value:t.topic}),t.args===void 0||Array.isArray(t.args)||u(e,{path:a+".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:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs}))&&o(t.kwargs,a+".kwargs",e)||u(e,{path:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs})].every(n=>n),o=(t,a,e=!0)=>[e===!1||Object.keys(t).map(n=>(t[n]===void 0,!0)).every(n=>n)].every(n=>n),l=t=>typeof t=="object"&&t!==null&&d(t);let i,u;return M(t=>{if(l(t)===!1){i=[],u=R(i),((e,n,c=!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 a=i.length===0;return a?{success:a,data:t}:{success:a,errors:i,data:t}}return{success:!0,data:t}})})(),L=(()=>{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(a=>(t[a]===void 0,!0)),s=(t,a,e=!0)=>[typeof t.deviceKey=="string"&&(1<=t.deviceKey.length||u(e,{path:a+".deviceKey",expected:"string & MinLength<1>",value:t.deviceKey}))||u(e,{path:a+".deviceKey",expected:"(string & MinLength<1>)",value:t.deviceKey}),typeof t.topic=="string"&&(1<=t.topic.length||u(e,{path:a+".topic",expected:"string & MinLength<1>",value:t.topic}))||u(e,{path:a+".topic",expected:"(string & MinLength<1>)",value:t.topic}),t.args===void 0||Array.isArray(t.args)||u(e,{path:a+".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:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs}))&&o(t.kwargs,a+".kwargs",e)||u(e,{path:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs})].every(n=>n),o=(t,a,e=!0)=>[e===!1||Object.keys(t).map(n=>(t[n]===void 0,!0)).every(n=>n)].every(n=>n),l=t=>typeof t=="object"&&t!==null&&d(t);let i,u;return M(t=>{if(l(t)===!1){i=[],u=R(i),((e,n,c=!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 a=i.length===0;return a?{success:a,data:t}:{success:a,errors:i,data:t}}return{success:!0,data:t}})})(),U=(()=>{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(a=>(t[a]===void 0,!0)),s=(t,a,e=!0)=>[typeof t.tablename=="string"&&(1<=t.tablename.length||u(e,{path:a+".tablename",expected:"string & MinLength<1>",value:t.tablename}))||u(e,{path:a+".tablename",expected:"(string & MinLength<1>)",value:t.tablename}),t.args===void 0||Array.isArray(t.args)||u(e,{path:a+".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:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs}))&&o(t.kwargs,a+".kwargs",e)||u(e,{path:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs})].every(n=>n),o=(t,a,e=!0)=>[e===!1||Object.keys(t).map(n=>(t[n]===void 0,!0)).every(n=>n)].every(n=>n),l=t=>typeof t=="object"&&t!==null&&d(t);let i,u;return M(t=>{if(l(t)===!1){i=[],u=R(i),((e,n,c=!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 a=i.length===0;return a?{success:a,data:t}:{success:a,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.cburl,this._connection=new p;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(),l={DEV:k.DEVELOPMENT,PROD:k.PRODUCTION}[s]??k.DEVELOPMENT,i=r??this._cburl??p.getWebSocketURI(this._reswarmUrl);this._connection.configure(this._swarmKey,this._appKey,l,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,o){const l=j({topic:r,args:s,kwargs:o});if(!l.success)throw new Error(`Invalid publish parameters: ${l.errors.map(t=>t.path+": "+t.expected).join(", ")}`);const u={...{DEVICE_SERIAL_NUMBER:this._serialNumber,DEVICE_KEY:this._deviceKey,DEVICE_NAME:this._deviceName},...o??{}};return this._connection.publish(r,s,u,{acknowledge:!0})}async publishToTable(r,s,o){const l=U({tablename:r,args:s,kwargs:o});if(!l.success)throw new Error(`Invalid table parameters: ${l.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,o)}async subscribe(r,s,o){return this._connection.subscribe(r,s)}async subscribeToTable(r,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=`${this._swarmKey}.${this._appKey}.${r}`;return this.subscribe(l,s,o)}async call(r,s,o,l,i){const u=L({deviceKey:r,topic:s,args:o,kwargs:l});if(!u.success)throw new Error(`Invalid call parameters: ${u.errors.map(a=>a.path+": "+a.expected).join(", ")}`);const t=`${r}.${s}`;return this._connection.call(t,o,l,i)}async registerFunction(r,s,o){const l=`${this._swarmKey}.${this._deviceKey}.${this._appKey}.${this._env}.${r}`,i=await this._connection.register(l,s);return console.log(`Function registered for IronFlock topic '${r}'. (Full WAMP topic: '${l}')`),i}async register(r,s,o){return this.registerFunction(r,s,o)}async getHistory(r,s={limit:10}){if(!r)throw new Error("Tablename must not be empty!");const o=N(s);if(!o.success)throw new Error(`Invalid query parameters: ${o.errors.map(i=>i.path+": "+i.expected).join(", ")}`);const l=`history.transformed.app.${this._appKey}.${r}`;try{return await this._connection.call(l,[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 '${l}' not registered`),null):(console.error(`Get history failed: ${i}`),null)}}async setDeviceLocation(r,s){const o=O({longitude:r,latitude:s});if(!o.success)throw new Error(`Invalid location parameters: ${o.errors.map(u=>u.path+": "+u.expected).join(", ")}`);const l={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",[l],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 o=await s.json();return new T(o)}}exports.CrossbarConnection=p;exports.IronFlock=T;exports.Stage=k;exports.validateCallParams=L;exports.validateLocationParams=O;exports.validatePublishParams=j;exports.validateTableParams=U;exports.validateTableQueryParams=N;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const P=require("autobahn");function W(d){return d&&d.__esModule&&Object.prototype.hasOwnProperty.call(d,"default")?d.default:d}var x={exports:{}},N;function F(){return N||(N=1,(function(d){var r=Object.prototype.hasOwnProperty,s="~";function o(){}Object.create&&(o.prototype=Object.create(null),new o().__proto__||(s=!1));function l(a,e,n){this.fn=a,this.context=e,this.once=n||!1}function i(a,e,n,c,f){if(typeof n!="function")throw new TypeError("The listener must be a function");var v=new l(n,c||a,f),m=s?s+e:e;return a._events[m]?a._events[m].fn?a._events[m]=[a._events[m],v]:a._events[m].push(v):(a._events[m]=v,a._eventsCount++),a}function u(a,e){--a._eventsCount===0?a._events=new o:delete a._events[e]}function t(){this._events=new o,this._eventsCount=0}t.prototype.eventNames=function(){var e=[],n,c;if(this._eventsCount===0)return e;for(c in n=this._events)r.call(n,c)&&e.push(s?c.slice(1):c);return Object.getOwnPropertySymbols?e.concat(Object.getOwnPropertySymbols(n)):e},t.prototype.listeners=function(e){var n=s?s+e:e,c=this._events[n];if(!c)return[];if(c.fn)return[c.fn];for(var f=0,v=c.length,m=new Array(v);f<v;f++)m[f]=c[f].fn;return m},t.prototype.listenerCount=function(e){var n=s?s+e:e,c=this._events[n];return c?c.fn?1:c.length:0},t.prototype.emit=function(e,n,c,f,v,m){var w=s?s+e:e;if(!this._events[w])return!1;var h=this._events[w],b=arguments.length,_,g;if(h.fn){switch(h.once&&this.removeListener(e,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,c),!0;case 4:return h.fn.call(h.context,n,c,f),!0;case 5:return h.fn.call(h.context,n,c,f,v),!0;case 6:return h.fn.call(h.context,n,c,f,v,m),!0}for(g=1,_=new Array(b-1);g<b;g++)_[g-1]=arguments[g];h.fn.apply(h.context,_)}else{var D=h.length,A;for(g=0;g<D;g++)switch(h[g].once&&this.removeListener(e,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,c);break;case 4:h[g].fn.call(h[g].context,n,c,f);break;default:if(!_)for(A=1,_=new Array(b-1);A<b;A++)_[A-1]=arguments[A];h[g].fn.apply(h[g].context,_)}}return!0},t.prototype.on=function(e,n,c){return i(this,e,n,c,!1)},t.prototype.once=function(e,n,c){return i(this,e,n,c,!0)},t.prototype.removeListener=function(e,n,c,f){var v=s?s+e:e;if(!this._events[v])return this;if(!n)return u(this,v),this;var m=this._events[v];if(m.fn)m.fn===n&&(!f||m.once)&&(!c||m.context===c)&&u(this,v);else{for(var w=0,h=[],b=m.length;w<b;w++)(m[w].fn!==n||f&&!m[w].once||c&&m[w].context!==c)&&h.push(m[w]);h.length?this._events[v]=h.length===1?h[0]:h:u(this,v)}return this},t.prototype.removeAllListeners=function(e){var n;return e?(n=s?s+e:e,this._events[n]&&u(this,n)):(this._events=new o,this._eventsCount=0),this},t.prototype.off=t.prototype.removeListener,t.prototype.addListener=t.prototype.on,t.prefixed=s,t.EventEmitter=t,d.exports=t})(x)),x.exports}var V=F();const Y=W(V),Q="wss://cbw.datapods.io/ws-ua-usr",$="wss://cbw.ironflock.com/ws-ua-usr",q="wss://cbw.ironflock.dev/ws-ua-usr",B="wss://cbw.record-evolution.com/ws-ua-usr",I="ws://localhost:8080/ws-ua-usr",J={"https://studio.datapods.io":Q,"https://studio.ironflock.dev":q,"https://studio.ironflock.com":$,"https://studio.record-evolution.com":B,"http://localhost:8085":I,"http://localhost:8086":I,"http://host.docker.internal:8086":I},H=6e3;class p extends Y{constructor(){super(),this.subscriptions=[],this.registrations=[],this.firstResolver=()=>{},this.firstRejecter=()=>{}}static getWebSocketURI(r){return r?J[r]??$:$}configure(r,s,o,l,i){this.realm=`realm-${r}-${s}-${o}`,this.serial_number=l,this.socketURI=i??p.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.firstConnection=new Promise((r,s)=>{this.firstResolver=r,this.firstRejecter=s}),this.connection=new P.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:(r,s,o)=>P.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(r){this.session=r,this.session.caller_disclose_me=!0,this.resubscribeAll(),this.emit("connected",this.serial_number),this.firstResolver(),this.firstResolver=()=>{}}onClose(r,s){return this.session=void 0,this.emit("disconnected"),this.firstRejecter(new Error(`Connection failed: ${r} - ${JSON.stringify(s,null,2)}`)),this.firstRejecter=()=>{},console.warn("Connection closed:",{reason:r,details:s,realm:this.realm,url:this.socketURI,authid:this.serial_number}),!1}async sessionWait(){const r=Date.now();for(;!this.session;){if(Date.now()-r>H)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 r;return!!((r=this.session)!=null&&r.isOpen)}isConnected(){return this.is_open}stop(){var r;(r=this.connection)==null||r.close("wamp.close.normal","Connection closed by client")}async subscribe(r,s){var l;await this.sessionWait();const o=await((l=this.session)==null?void 0:l.subscribe(r,s));return o&&this.subscriptions.push(o),o}async unsubscribe(r){var o;await this.sessionWait();const s=this.subscriptions.indexOf(r);s!==-1&&(this.subscriptions.splice(s,1),await((o=this.session)==null?void 0:o.unsubscribe(r)))}async unsubscribeTopic(r){const s=this.subscriptions.filter(o=>o.topic===r);for(const o of s)await this.unsubscribe(o)}async resubscribeAll(){const r=[...this.subscriptions];this.subscriptions=[],await Promise.all(r.map(s=>this.subscribe(s.topic,s.handler)))}async register(r,s){var l;await this.sessionWait();const o=await((l=this.session)==null?void 0:l.register(r,s));return o&&this.registrations.push(o),o}async unregister(r){var o;await this.sessionWait(),await((o=this.session)==null?void 0:o.unregister(r));const s=this.registrations.indexOf(r);s!==-1&&this.registrations.splice(s,1)}async call(r,s,o,l){var i;return await this.sessionWait(),(i=this.session)==null?void 0:i.call(r,s,o,l)}async publish(r,s,o,l){var i;return await this.sessionWait(),(i=this.session)==null?void 0:i.publish(r,s,o,l)}}const M=d=>Math.floor(d)===d&&G<=d&&d<=X,G=0,X=2**32-1,S=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,R=d=>{const r=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&&r(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)},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(o=>({message:`expected ${o.expected}, got ${o.value}`,path:z(o.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="",o=y.Start,l=5;for(;l<d.length-1;){l++;const i=d[l];if(o===y.Property?i==="."||i==="["?(r.push({key:s}),o=y.Start):l===d.length-1?(s+=i,r.push({key:s}),l++,o=y.Start):s+=i:o===y.StringKey?i==='"'?(r.push({key:JSON.parse(s+i)}),l+=2,o=y.Start):i==="\\"?(s+=d[l],l++,s+=d[l]):s+=i:o===y.NumberKey&&(i==="]"?(r.push({key:Number.parseInt(s)}),l++,o=y.Start):s+=i),o===y.Start&&l<d.length-1){const u=d[l];if(s="",u==="[")d[l+1]==='"'?(o=y.StringKey,l++,s='"'):o=y.NumberKey;else if(u===".")o=y.Property;else throw new Error("Unreachable: pointer points invalid character")}}if(o!==y.Start)throw new Error(`Failed to parse path: ${JSON.stringify(d)}`);return r};var k=(d=>(d.DEVELOPMENT="dev",d.PRODUCTION="prod",d))(k||{});const O=(()=>{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")),o=(e,n,c=!0)=>[typeof e.limit=="number"&&(M(e.limit)||a(c,{path:n+".limit",expected:'number & Type<"uint32">',value:e.limit}))&&(1<=e.limit||a(c,{path:n+".limit",expected:"number & Minimum<1>",value:e.limit}))&&(e.limit<=1e4||a(c,{path:n+".limit",expected:"number & Maximum<10000>",value:e.limit}))||a(c,{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)||a(c,{path:n+".offset",expected:'number & Type<"uint32">',value:e.offset}))&&(0<=e.offset||a(c,{path:n+".offset",expected:"number & Minimum<0>",value:e.offset}))||a(c,{path:n+".offset",expected:'((number & Type<"uint32"> & Minimum<0>) | undefined)',value:e.offset}),e.timeRange===void 0||(typeof e.timeRange=="object"&&e.timeRange!==null||a(c,{path:n+".timeRange",expected:"(ISOTimeRange | undefined)",value:e.timeRange}))&&l(e.timeRange,n+".timeRange",c)||a(c,{path:n+".timeRange",expected:"(ISOTimeRange | undefined)",value:e.timeRange}),e.filterAnd===void 0||(Array.isArray(e.filterAnd)||a(c,{path:n+".filterAnd",expected:"(Array<SQLFilterAnd> | undefined)",value:e.filterAnd}))&&e.filterAnd.map((f,v)=>(typeof f=="object"&&f!==null||a(c,{path:n+".filterAnd["+v+"]",expected:"SQLFilterAnd",value:f}))&&i(f,n+".filterAnd["+v+"]",c)||a(c,{path:n+".filterAnd["+v+"]",expected:"SQLFilterAnd",value:f})).every(f=>f)||a(c,{path:n+".filterAnd",expected:"(Array<SQLFilterAnd> | undefined)",value:e.filterAnd})].every(f=>f),l=(e,n,c=!0)=>[typeof e.start=="string"&&(S(e.start)||a(c,{path:n+".start",expected:'string & Format<"date-time">',value:e.start}))||a(c,{path:n+".start",expected:'(string & Format<"date-time">)',value:e.start}),typeof e.end=="string"&&(S(e.end)||a(c,{path:n+".end",expected:'string & Format<"date-time">',value:e.end}))||a(c,{path:n+".end",expected:'(string & Format<"date-time">)',value:e.end})].every(f=>f),i=(e,n,c=!0)=>[typeof e.column=="string"&&(1<=e.column.length||a(c,{path:n+".column",expected:"string & MinLength<1>",value:e.column}))||a(c,{path:n+".column",expected:"(string & MinLength<1>)",value:e.column}),typeof e.operator=="string"&&(1<=e.operator.length||a(c,{path:n+".operator",expected:"string & MinLength<1>",value:e.operator}))||a(c,{path:n+".operator",expected:"(string & MinLength<1>)",value:e.operator}),(e.value!==null||a(c,{path:n+".value",expected:"(Array<string | number> | boolean | number | string)",value:e.value}))&&(e.value!==void 0||a(c,{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)||a(c,{path:n+".value",expected:"(Array<string | number> | boolean | number | string)",value:e.value}))&&e.value.map((f,v)=>typeof f=="string"||typeof f=="number"||a(c,{path:n+".value["+v+"]",expected:"(number | string)",value:f})).every(f=>f)||a(c,{path:n+".value",expected:"(Array<string | number> | boolean | number | string)",value:e.value}))].every(f=>f),u=e=>typeof e=="object"&&e!==null&&d(e);let t,a;return K(e=>{if(u(e)===!1){t=[],a=R(t),((c,f,v=!0)=>(typeof c=="object"&&c!==null||a(!0,{path:f+"",expected:"TableQueryParams",value:c}))&&o(c,f+"",!0)||a(!0,{path:f+"",expected:"TableQueryParams",value:c}))(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}})})(),j=(()=>{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||l(t,{path:u+".longitude",expected:"number & Minimum<-180>",value:i.longitude}))&&(i.longitude<=180||l(t,{path:u+".longitude",expected:"number & Maximum<180>",value:i.longitude}))||l(t,{path:u+".longitude",expected:"(number & Minimum<-180> & Maximum<180>)",value:i.longitude}),typeof i.latitude=="number"&&(-90<=i.latitude||l(t,{path:u+".latitude",expected:"number & Minimum<-90>",value:i.latitude}))&&(i.latitude<=90||l(t,{path:u+".latitude",expected:"number & Maximum<90>",value:i.latitude}))||l(t,{path:u+".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 K(i=>{if(s(i)===!1){o=[],l=R(o),((t,a,e=!0)=>(typeof t=="object"&&t!==null||l(!0,{path:a+"",expected:"LocationParams",value:t}))&&r(t,a+"",!0)||l(!0,{path:a+"",expected:"LocationParams",value:t}))(i,"$input",!0);const u=o.length===0;return u?{success:u,data:i}:{success:u,errors:o,data:i}}return{success:!0,data:i}})})(),L=(()=>{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(a=>(t[a]===void 0,!0)),s=(t,a,e=!0)=>[typeof t.topic=="string"&&(1<=t.topic.length||u(e,{path:a+".topic",expected:"string & MinLength<1>",value:t.topic}))||u(e,{path:a+".topic",expected:"(string & MinLength<1>)",value:t.topic}),t.args===void 0||Array.isArray(t.args)||u(e,{path:a+".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:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs}))&&o(t.kwargs,a+".kwargs",e)||u(e,{path:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs})].every(n=>n),o=(t,a,e=!0)=>[e===!1||Object.keys(t).map(n=>(t[n]===void 0,!0)).every(n=>n)].every(n=>n),l=t=>typeof t=="object"&&t!==null&&d(t);let i,u;return K(t=>{if(l(t)===!1){i=[],u=R(i),((e,n,c=!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 a=i.length===0;return a?{success:a,data:t}:{success:a,errors:i,data:t}}return{success:!0,data:t}})})(),U=(()=>{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(a=>(t[a]===void 0,!0)),s=(t,a,e=!0)=>[typeof t.deviceKey=="string"&&(1<=t.deviceKey.length||u(e,{path:a+".deviceKey",expected:"string & MinLength<1>",value:t.deviceKey}))||u(e,{path:a+".deviceKey",expected:"(string & MinLength<1>)",value:t.deviceKey}),typeof t.topic=="string"&&(1<=t.topic.length||u(e,{path:a+".topic",expected:"string & MinLength<1>",value:t.topic}))||u(e,{path:a+".topic",expected:"(string & MinLength<1>)",value:t.topic}),t.args===void 0||Array.isArray(t.args)||u(e,{path:a+".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:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs}))&&o(t.kwargs,a+".kwargs",e)||u(e,{path:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs})].every(n=>n),o=(t,a,e=!0)=>[e===!1||Object.keys(t).map(n=>(t[n]===void 0,!0)).every(n=>n)].every(n=>n),l=t=>typeof t=="object"&&t!==null&&d(t);let i,u;return K(t=>{if(l(t)===!1){i=[],u=R(i),((e,n,c=!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 a=i.length===0;return a?{success:a,data:t}:{success:a,errors:i,data:t}}return{success:!0,data:t}})})(),T=(()=>{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(a=>(t[a]===void 0,!0)),s=(t,a,e=!0)=>[typeof t.tablename=="string"&&(1<=t.tablename.length||u(e,{path:a+".tablename",expected:"string & MinLength<1>",value:t.tablename}))||u(e,{path:a+".tablename",expected:"(string & MinLength<1>)",value:t.tablename}),t.args===void 0||Array.isArray(t.args)||u(e,{path:a+".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:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs}))&&o(t.kwargs,a+".kwargs",e)||u(e,{path:a+".kwargs",expected:"(Record<string, unknown> | undefined)",value:t.kwargs})].every(n=>n),o=(t,a,e=!0)=>[e===!1||Object.keys(t).map(n=>(t[n]===void 0,!0)).every(n=>n)].every(n=>n),l=t=>typeof t=="object"&&t!==null&&d(t);let i,u;return K(t=>{if(l(t)===!1){i=[],u=R(i),((e,n,c=!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 a=i.length===0;return a?{success:a,data:t}:{success:a,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 C{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.cburl,this._connection=new p;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(),l={DEV:k.DEVELOPMENT,PROD:k.PRODUCTION}[s]??k.DEVELOPMENT,i=r??this._cburl??p.getWebSocketURI(this._reswarmUrl);this._connection.configure(this._swarmKey,this._appKey,l,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,o){const l=L({topic:r,args:s,kwargs:o});if(!l.success)throw new Error(`Invalid publish parameters: ${l.errors.map(t=>t.path+": "+t.expected).join(", ")}`);const u={...{DEVICE_SERIAL_NUMBER:this._serialNumber,DEVICE_KEY:this._deviceKey,DEVICE_NAME:this._deviceName},...o??{}};return this._connection.publish(r,s,u,{acknowledge:!0})}async publishToTable(r,s,o){const l=T({tablename:r,args:s,kwargs:o});if(!l.success)throw new Error(`Invalid table parameters: ${l.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,o)}async appendToTable(r,s,o){const l=T({tablename:r,args:s,kwargs:o});if(!l.success)throw new Error(`Invalid table parameters: ${l.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=`append.${this._swarmKey}.${this._appKey}.${r}`;return this._connection.call(i,s,o)}async subscribe(r,s,o){return this._connection.subscribe(r,s)}async subscribeToTable(r,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=`${this._swarmKey}.${this._appKey}.${r}`;return this.subscribe(l,s,o)}async call(r,s,o,l,i){const u=U({deviceKey:r,topic:s,args:o,kwargs:l});if(!u.success)throw new Error(`Invalid call parameters: ${u.errors.map(a=>a.path+": "+a.expected).join(", ")}`);const t=`${r}.${s}`;return this._connection.call(t,o,l,i)}async registerFunction(r,s,o){const l=`${this._swarmKey}.${this._deviceKey}.${this._appKey}.${this._env}.${r}`,i=await this._connection.register(l,s);return console.log(`Function registered for IronFlock topic '${r}'. (Full WAMP topic: '${l}')`),i}async register(r,s,o){return this.registerFunction(r,s,o)}async getHistory(r,s={limit:10}){if(!r)throw new Error("Tablename must not be empty!");const o=O(s);if(!o.success)throw new Error(`Invalid query parameters: ${o.errors.map(i=>i.path+": "+i.expected).join(", ")}`);const l=`history.transformed.app.${this._appKey}.${r}`;try{return await this._connection.call(l,[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 '${l}' not registered`),null):(console.error(`Get history failed: ${i}`),null)}}async setDeviceLocation(r,s){const o=j({longitude:r,latitude:s});if(!o.success)throw new Error(`Invalid location parameters: ${o.errors.map(u=>u.path+": "+u.expected).join(", ")}`);const l={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",[l],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 o=await s.json();return new C(o)}}exports.CrossbarConnection=p;exports.IronFlock=C;exports.Stage=k;exports.validateCallParams=U;exports.validateLocationParams=j;exports.validatePublishParams=L;exports.validateTableParams=T;exports.validateTableQueryParams=O;
3
3
  //# sourceMappingURL=index.cjs.map
@@ -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\n constructor() {\n super();\n }\n\n static getWebSocketURI(reswarmUrl?: string): string {\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.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\n this.resubscribeAll();\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 // return false to let autobahn handle auto-reconnect\n return 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.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 async register(\n topic: string,\n endpoint: autobahn.RegisterEndpoint\n ): Promise<autobahn.IRegistration | undefined> {\n await this.sessionWait();\n const registration = await this.session?.register(topic, endpoint);\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 { CrossbarConnection } from \"./crossbar\";\nimport {\n Stage,\n validatePublishParams,\n validateCallParams,\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 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?.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 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 deviceKey: string,\n topic: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>,\n options?: object\n ) {\n const validation = validateCallParams({ deviceKey, topic, args, kwargs });\n if (!validation.success) {\n throw new Error(`Invalid call parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n const callTopic = `${deviceKey}.${topic}`;\n return this._connection.call(callTopic, args as any[], kwargs, options);\n }\n\n async registerFunction(\n topic: string,\n endpoint: (...args: any[]) => any,\n options?: object\n ) {\n const fullTopic = `${this._swarmKey}.${this._deviceKey}.${this._appKey}.${this._env}.${topic}`;\n\n const reg = await this._connection.register(fullTopic, endpoint);\n console.log(`Function registered for IronFlock topic '${topic}'. (Full WAMP topic: '${fullTopic}')`);\n return reg;\n }\n\n async register(\n topic: string,\n endpoint: (...args: any[]) => any,\n options?: object\n ) {\n return this.registerFunction(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 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","swarmKey","appKey","stage","serialNumber","cburl","resolve","reject","autobahn","_session","_method","extra","session","reason","details","startTime","_a","topic","handler","sub","idx","matching","previous","endpoint","registration","procedure","kwargs","options","_isTypeUint32","value","MINIMUM","MAXIMUM","_isFormatDateTime","str","PATTERN","_validateReport","array","reportable","path","last","exceptable","error","_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","callTopic","fullTopic","reg","queryParams","errorStr","long","lat","payload","port","url","response"],"mappings":"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","x_google_ignoreList":[0,2,3,4,5]}
1
+ {"version":3,"file":"index.cjs","sources":["../node_modules/eventemitter3/index.js","../src/crossbar/index.ts","../node_modules/typia/lib/internal/_isTypeUint32.mjs","../node_modules/typia/lib/internal/_isFormatDateTime.mjs","../node_modules/typia/lib/internal/_validateReport.mjs","../node_modules/typia/lib/internal/_createStandardSchema.mjs","../src/types.ts","../src/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\n constructor() {\n super();\n }\n\n static getWebSocketURI(reswarmUrl?: string): string {\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.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\n this.resubscribeAll();\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 // return false to let autobahn handle auto-reconnect\n return 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.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 async register(\n topic: string,\n endpoint: autobahn.RegisterEndpoint\n ): Promise<autobahn.IRegistration | undefined> {\n await this.sessionWait();\n const registration = await this.session?.register(topic, endpoint);\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 { CrossbarConnection } from \"./crossbar\";\nimport {\n Stage,\n validatePublishParams,\n validateCallParams,\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 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?.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 return this._connection.call(topic, args as any[], kwargs);\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 deviceKey: string,\n topic: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>,\n options?: object\n ) {\n const validation = validateCallParams({ deviceKey, topic, args, kwargs });\n if (!validation.success) {\n throw new Error(`Invalid call parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n const callTopic = `${deviceKey}.${topic}`;\n return this._connection.call(callTopic, args as any[], kwargs, options);\n }\n\n async registerFunction(\n topic: string,\n endpoint: (...args: any[]) => any,\n options?: object\n ) {\n const fullTopic = `${this._swarmKey}.${this._deviceKey}.${this._appKey}.${this._env}.${topic}`;\n\n const reg = await this._connection.register(fullTopic, endpoint);\n console.log(`Function registered for IronFlock topic '${topic}'. (Full WAMP topic: '${fullTopic}')`);\n return reg;\n }\n\n async register(\n topic: string,\n endpoint: (...args: any[]) => any,\n options?: object\n ) {\n return this.registerFunction(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 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","swarmKey","appKey","stage","serialNumber","cburl","resolve","reject","autobahn","_session","_method","extra","session","reason","details","startTime","_a","topic","handler","sub","idx","matching","previous","endpoint","registration","procedure","kwargs","options","_isTypeUint32","value","MINIMUM","MAXIMUM","_isFormatDateTime","str","PATTERN","_validateReport","array","reportable","path","last","exceptable","error","_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","callTopic","fullTopic","reg","queryParams","errorStr","long","lat","payload","port","url","response"],"mappings":"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","x_google_ignoreList":[0,2,3,4,5]}
package/dist/index.d.ts CHANGED
@@ -81,6 +81,7 @@ export declare class IronFlock {
81
81
  stop(): Promise<void>;
82
82
  publish(topic: string, args?: unknown[], kwargs?: Record<string, unknown>): Promise<unknown>;
83
83
  publishToTable(tablename: string, args?: unknown[], kwargs?: Record<string, unknown>): Promise<unknown>;
84
+ appendToTable(tablename: string, args?: unknown[], kwargs?: Record<string, unknown>): Promise<unknown>;
84
85
  subscribe(topic: string, handler: (...args: any[]) => void, options?: object): Promise<Subscription<any[], any, string> | undefined>;
85
86
  subscribeToTable(tablename: string, handler: (...args: any[]) => void, options?: object): Promise<Subscription<any[], any, string> | undefined>;
86
87
  call(deviceKey: string, topic: string, args?: unknown[], kwargs?: Record<string, unknown>, options?: object): Promise<unknown>;
package/dist/index.mjs CHANGED
@@ -1,10 +1,10 @@
1
- import C from "autobahn";
2
- function j(d) {
1
+ import T from "autobahn";
2
+ function P(d) {
3
3
  return d && d.__esModule && Object.prototype.hasOwnProperty.call(d, "default") ? d.default : d;
4
4
  }
5
- var S = { exports: {} }, T;
5
+ var S = { exports: {} }, C;
6
6
  function L() {
7
- return T || (T = 1, (function(d) {
7
+ return C || (C = 1, (function(d) {
8
8
  var r = Object.prototype.hasOwnProperty, s = "~";
9
9
  function o() {
10
10
  }
@@ -15,8 +15,8 @@ function L() {
15
15
  function i(a, e, n, c, f) {
16
16
  if (typeof n != "function")
17
17
  throw new TypeError("The listener must be a function");
18
- var v = new l(n, c || a, f), g = s ? s + e : e;
19
- return a._events[g] ? a._events[g].fn ? a._events[g] = [a._events[g], v] : a._events[g].push(v) : (a._events[g] = v, a._eventsCount++), a;
18
+ var v = new l(n, c || a, f), m = s ? s + e : e;
19
+ return a._events[m] ? a._events[m].fn ? a._events[m] = [a._events[m], v] : a._events[m].push(v) : (a._events[m] = v, a._eventsCount++), a;
20
20
  }
21
21
  function u(a, e) {
22
22
  --a._eventsCount === 0 ? a._events = new o() : delete a._events[e];
@@ -34,16 +34,16 @@ function L() {
34
34
  var n = s ? s + e : e, c = this._events[n];
35
35
  if (!c) return [];
36
36
  if (c.fn) return [c.fn];
37
- for (var f = 0, v = c.length, g = new Array(v); f < v; f++)
38
- g[f] = c[f].fn;
39
- return g;
37
+ for (var f = 0, v = c.length, m = new Array(v); f < v; f++)
38
+ m[f] = c[f].fn;
39
+ return m;
40
40
  }, t.prototype.listenerCount = function(e) {
41
41
  var n = s ? s + e : e, c = this._events[n];
42
42
  return c ? c.fn ? 1 : c.length : 0;
43
- }, t.prototype.emit = function(e, n, c, f, v, g) {
43
+ }, t.prototype.emit = function(e, n, c, f, v, m) {
44
44
  var w = s ? s + e : e;
45
45
  if (!this._events[w]) return !1;
46
- var h = this._events[w], b = arguments.length, A, m;
46
+ var h = this._events[w], b = arguments.length, _, g;
47
47
  if (h.fn) {
48
48
  switch (h.once && this.removeListener(e, h.fn, void 0, !0), b) {
49
49
  case 1:
@@ -57,31 +57,31 @@ function L() {
57
57
  case 5:
58
58
  return h.fn.call(h.context, n, c, f, v), !0;
59
59
  case 6:
60
- return h.fn.call(h.context, n, c, f, v, g), !0;
60
+ return h.fn.call(h.context, n, c, f, v, m), !0;
61
61
  }
62
- for (m = 1, A = new Array(b - 1); m < b; m++)
63
- A[m - 1] = arguments[m];
64
- h.fn.apply(h.context, A);
62
+ for (g = 1, _ = new Array(b - 1); g < b; g++)
63
+ _[g - 1] = arguments[g];
64
+ h.fn.apply(h.context, _);
65
65
  } else {
66
- var O = h.length, _;
67
- for (m = 0; m < O; m++)
68
- switch (h[m].once && this.removeListener(e, h[m].fn, void 0, !0), b) {
66
+ var j = h.length, A;
67
+ for (g = 0; g < j; g++)
68
+ switch (h[g].once && this.removeListener(e, h[g].fn, void 0, !0), b) {
69
69
  case 1:
70
- h[m].fn.call(h[m].context);
70
+ h[g].fn.call(h[g].context);
71
71
  break;
72
72
  case 2:
73
- h[m].fn.call(h[m].context, n);
73
+ h[g].fn.call(h[g].context, n);
74
74
  break;
75
75
  case 3:
76
- h[m].fn.call(h[m].context, n, c);
76
+ h[g].fn.call(h[g].context, n, c);
77
77
  break;
78
78
  case 4:
79
- h[m].fn.call(h[m].context, n, c, f);
79
+ h[g].fn.call(h[g].context, n, c, f);
80
80
  break;
81
81
  default:
82
- if (!A) for (_ = 1, A = new Array(b - 1); _ < b; _++)
83
- A[_ - 1] = arguments[_];
84
- h[m].fn.apply(h[m].context, A);
82
+ if (!_) for (A = 1, _ = new Array(b - 1); A < b; A++)
83
+ _[A - 1] = arguments[A];
84
+ h[g].fn.apply(h[g].context, _);
85
85
  }
86
86
  }
87
87
  return !0;
@@ -94,12 +94,12 @@ function L() {
94
94
  if (!this._events[v]) return this;
95
95
  if (!n)
96
96
  return u(this, v), this;
97
- var g = this._events[v];
98
- if (g.fn)
99
- g.fn === n && (!f || g.once) && (!c || g.context === c) && u(this, v);
97
+ var m = this._events[v];
98
+ if (m.fn)
99
+ m.fn === n && (!f || m.once) && (!c || m.context === c) && u(this, v);
100
100
  else {
101
- for (var w = 0, h = [], b = g.length; w < b; w++)
102
- (g[w].fn !== n || f && !g[w].once || c && g[w].context !== c) && h.push(g[w]);
101
+ for (var w = 0, h = [], b = m.length; w < b; w++)
102
+ (m[w].fn !== n || f && !m[w].once || c && m[w].context !== c) && h.push(m[w]);
103
103
  h.length ? this._events[v] = h.length === 1 ? h[0] : h : u(this, v);
104
104
  }
105
105
  return this;
@@ -109,34 +109,34 @@ function L() {
109
109
  }, t.prototype.off = t.prototype.removeListener, t.prototype.addListener = t.prototype.on, t.prefixed = s, t.EventEmitter = t, d.exports = t;
110
110
  })(S)), S.exports;
111
111
  }
112
- var P = L();
113
- const U = /* @__PURE__ */ j(P), D = "wss://cbw.datapods.io/ws-ua-usr", $ = "wss://cbw.ironflock.com/ws-ua-usr", W = "wss://cbw.ironflock.dev/ws-ua-usr", F = "wss://cbw.record-evolution.com/ws-ua-usr", I = "ws://localhost:8080/ws-ua-usr", V = {
114
- "https://studio.datapods.io": D,
115
- "https://studio.ironflock.dev": W,
116
- "https://studio.ironflock.com": $,
117
- "https://studio.record-evolution.com": F,
118
- "http://localhost:8085": I,
119
- "http://localhost:8086": I,
120
- "http://host.docker.internal:8086": I
121
- }, Y = 6e3;
122
- class K extends U {
112
+ var U = L();
113
+ const D = /* @__PURE__ */ P(U), W = "wss://cbw.datapods.io/ws-ua-usr", I = "wss://cbw.ironflock.com/ws-ua-usr", F = "wss://cbw.ironflock.dev/ws-ua-usr", V = "wss://cbw.record-evolution.com/ws-ua-usr", $ = "ws://localhost:8080/ws-ua-usr", Y = {
114
+ "https://studio.datapods.io": W,
115
+ "https://studio.ironflock.dev": F,
116
+ "https://studio.ironflock.com": I,
117
+ "https://studio.record-evolution.com": V,
118
+ "http://localhost:8085": $,
119
+ "http://localhost:8086": $,
120
+ "http://host.docker.internal:8086": $
121
+ }, Q = 6e3;
122
+ class x extends D {
123
123
  constructor() {
124
124
  super(), this.subscriptions = [], this.registrations = [], this.firstResolver = () => {
125
125
  }, this.firstRejecter = () => {
126
126
  };
127
127
  }
128
128
  static getWebSocketURI(r) {
129
- return r ? V[r] ?? $ : $;
129
+ return r ? Y[r] ?? I : I;
130
130
  }
131
131
  configure(r, s, o, l, i) {
132
- this.realm = `realm-${r}-${s}-${o}`, this.serial_number = l, this.socketURI = i ?? K.getWebSocketURI();
132
+ this.realm = `realm-${r}-${s}-${o}`, this.serial_number = l, this.socketURI = i ?? x.getWebSocketURI();
133
133
  }
134
134
  async start() {
135
135
  if (!this.realm || !this.serial_number || !this.socketURI)
136
136
  throw new Error("CrossbarConnection must be configured before starting. Call configure() first.");
137
137
  return this.firstConnection = new Promise((r, s) => {
138
138
  this.firstResolver = r, this.firstRejecter = s;
139
- }), this.connection = new C.Connection({
139
+ }), this.connection = new T.Connection({
140
140
  realm: this.realm,
141
141
  url: this.socketURI,
142
142
  authmethods: ["wampcra"],
@@ -147,7 +147,7 @@ class K extends U {
147
147
  // @ts-ignore
148
148
  autoping_interval: 2,
149
149
  autoping_timeout: 4,
150
- onchallenge: (r, s, o) => C.auth_cra.sign(this.serial_number, o.challenge)
150
+ onchallenge: (r, s, o) => T.auth_cra.sign(this.serial_number, o.challenge)
151
151
  }), this.connection.onopen = this.onOpen.bind(this), this.connection.onclose = this.onClose.bind(this), this.connection.open(), this.firstConnection;
152
152
  }
153
153
  onOpen(r) {
@@ -171,7 +171,7 @@ class K extends U {
171
171
  async sessionWait() {
172
172
  const r = Date.now();
173
173
  for (; !this.session; ) {
174
- if (Date.now() - r > Y)
174
+ if (Date.now() - r > Q)
175
175
  throw new Error("Timeout waiting for session");
176
176
  await new Promise((s) => setTimeout(s, 200));
177
177
  }
@@ -237,7 +237,7 @@ class K extends U {
237
237
  return await this.sessionWait(), (i = this.session) == null ? void 0 : i.publish(r, s, o, l);
238
238
  }
239
239
  }
240
- const R = (d) => Math.floor(d) === d && Q <= d && d <= B, Q = 0, B = 2 ** 32 - 1, M = (d) => J.test(d), J = /^[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) => {
240
+ const R = (d) => Math.floor(d) === d && B <= d && d <= J, B = 0, J = 2 ** 32 - 1, K = (d) => q.test(d), q = /^[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) => {
241
241
  const r = (s) => {
242
242
  if (d.length === 0)
243
243
  return !0;
@@ -261,7 +261,7 @@ const R = (d) => Math.floor(d) === d && Q <= d && d <= B, Q = 0, B = 2 ** 32 - 1
261
261
  } : {
262
262
  issues: s.errors.map((o) => ({
263
263
  message: `expected ${o.expected}, got ${o.value}`,
264
- path: q(o.path)
264
+ path: H(o.path)
265
265
  }))
266
266
  };
267
267
  }
@@ -271,7 +271,7 @@ var y;
271
271
  (function(d) {
272
272
  d[d.Start = 0] = "Start", d[d.Property = 1] = "Property", d[d.StringKey = 2] = "StringKey", d[d.NumberKey = 3] = "NumberKey";
273
273
  })(y || (y = {}));
274
- const q = (d) => {
274
+ const H = (d) => {
275
275
  if (!d.startsWith("$input"))
276
276
  throw new Error(`Invalid path: ${JSON.stringify(d)}`);
277
277
  const r = [];
@@ -301,9 +301,9 @@ const q = (d) => {
301
301
  throw new Error(`Failed to parse path: ${JSON.stringify(d)}`);
302
302
  return r;
303
303
  };
304
- var x = /* @__PURE__ */ ((d) => (d.DEVELOPMENT = "dev", d.PRODUCTION = "prod", d))(x || {});
305
- const H = (() => {
306
- const d = (e) => typeof e.limit == "number" && R(e.limit) && 1 <= e.limit && e.limit <= 1e4 && (e.offset === void 0 || typeof e.offset == "number" && R(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" && M(e.start) && typeof e.end == "string" && M(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")), o = (e, n, c = !0) => [typeof e.limit == "number" && (R(e.limit) || a(c, {
304
+ var M = /* @__PURE__ */ ((d) => (d.DEVELOPMENT = "dev", d.PRODUCTION = "prod", d))(M || {});
305
+ const G = (() => {
306
+ const d = (e) => typeof e.limit == "number" && R(e.limit) && 1 <= e.limit && e.limit <= 1e4 && (e.offset === void 0 || typeof e.offset == "number" && R(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" && K(e.start) && typeof e.end == "string" && K(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")), o = (e, n, c = !0) => [typeof e.limit == "number" && (R(e.limit) || a(c, {
307
307
  path: n + ".limit",
308
308
  expected: 'number & Type<"uint32">',
309
309
  value: e.limit
@@ -355,7 +355,7 @@ const H = (() => {
355
355
  path: n + ".filterAnd",
356
356
  expected: "(Array<SQLFilterAnd> | undefined)",
357
357
  value: e.filterAnd
358
- })].every((f) => f), l = (e, n, c = !0) => [typeof e.start == "string" && (M(e.start) || a(c, {
358
+ })].every((f) => f), l = (e, n, c = !0) => [typeof e.start == "string" && (K(e.start) || a(c, {
359
359
  path: n + ".start",
360
360
  expected: 'string & Format<"date-time">',
361
361
  value: e.start
@@ -363,7 +363,7 @@ const H = (() => {
363
363
  path: n + ".start",
364
364
  expected: '(string & Format<"date-time">)',
365
365
  value: e.start
366
- }), typeof e.end == "string" && (M(e.end) || a(c, {
366
+ }), typeof e.end == "string" && (K(e.end) || a(c, {
367
367
  path: n + ".end",
368
368
  expected: 'string & Format<"date-time">',
369
369
  value: e.end
@@ -435,7 +435,7 @@ const H = (() => {
435
435
  data: e
436
436
  };
437
437
  });
438
- })(), G = (() => {
438
+ })(), X = (() => {
439
439
  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 || l(t, {
440
440
  path: u + ".longitude",
441
441
  expected: "number & Minimum<-180>",
@@ -488,7 +488,7 @@ const H = (() => {
488
488
  data: i
489
489
  };
490
490
  });
491
- })(), X = (() => {
491
+ })(), Z = (() => {
492
492
  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((a) => (t[a] === void 0, !0)), s = (t, a, e = !0) => [typeof t.topic == "string" && (1 <= t.topic.length || u(e, {
493
493
  path: a + ".topic",
494
494
  expected: "string & MinLength<1>",
@@ -537,7 +537,7 @@ const H = (() => {
537
537
  data: t
538
538
  };
539
539
  });
540
- })(), Z = (() => {
540
+ })(), z = (() => {
541
541
  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((a) => (t[a] === void 0, !0)), s = (t, a, e = !0) => [typeof t.deviceKey == "string" && (1 <= t.deviceKey.length || u(e, {
542
542
  path: a + ".deviceKey",
543
543
  expected: "string & MinLength<1>",
@@ -594,7 +594,7 @@ const H = (() => {
594
594
  data: t
595
595
  };
596
596
  });
597
- })(), z = (() => {
597
+ })(), N = (() => {
598
598
  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((a) => (t[a] === void 0, !0)), s = (t, a, e = !0) => [typeof t.tablename == "string" && (1 <= t.tablename.length || u(e, {
599
599
  path: a + ".tablename",
600
600
  expected: "string & MinLength<1>",
@@ -654,9 +654,9 @@ function ee(d) {
654
654
  throw new Error("serialNumber option is required (or set DEVICE_SERIAL_NUMBER env var in Node.js)");
655
655
  return r;
656
656
  }
657
- class N {
657
+ class O {
658
658
  constructor(r) {
659
- 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.cburl, this._connection = new K();
659
+ 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.cburl, this._connection = new x();
660
660
  const s = [];
661
661
  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(
662
662
  `Warning: The following environment variables must be present: ${s.join(", ")}`
@@ -671,9 +671,9 @@ class N {
671
671
  configureConnection(r) {
672
672
  if (this._isConfigured) return;
673
673
  const s = (this._env ?? "DEV").toUpperCase(), l = {
674
- DEV: x.DEVELOPMENT,
675
- PROD: x.PRODUCTION
676
- }[s] ?? x.DEVELOPMENT, i = r ?? this._cburl ?? K.getWebSocketURI(this._reswarmUrl);
674
+ DEV: M.DEVELOPMENT,
675
+ PROD: M.PRODUCTION
676
+ }[s] ?? M.DEVELOPMENT, i = r ?? this._cburl ?? x.getWebSocketURI(this._reswarmUrl);
677
677
  this._connection.configure(
678
678
  this._swarmKey,
679
679
  this._appKey,
@@ -689,7 +689,7 @@ class N {
689
689
  this._connection.stop();
690
690
  }
691
691
  async publish(r, s, o) {
692
- const l = X({ topic: r, args: s, kwargs: o });
692
+ const l = Z({ topic: r, args: s, kwargs: o });
693
693
  if (!l.success)
694
694
  throw new Error(`Invalid publish parameters: ${l.errors.map((t) => t.path + ": " + t.expected).join(", ")}`);
695
695
  const u = { ...{
@@ -702,7 +702,7 @@ class N {
702
702
  });
703
703
  }
704
704
  async publishToTable(r, s, o) {
705
- const l = z({ tablename: r, args: s, kwargs: o });
705
+ const l = N({ tablename: r, args: s, kwargs: o });
706
706
  if (!l.success)
707
707
  throw new Error(`Invalid table parameters: ${l.errors.map((u) => u.path + ": " + u.expected).join(", ")}`);
708
708
  if (!this._swarmKey) throw new Error("SWARM_KEY not set in environment variables!");
@@ -710,6 +710,15 @@ class N {
710
710
  const i = `${this._swarmKey}.${this._appKey}.${r}`;
711
711
  return this.publish(i, s, o);
712
712
  }
713
+ async appendToTable(r, s, o) {
714
+ const l = N({ tablename: r, args: s, kwargs: o });
715
+ if (!l.success)
716
+ throw new Error(`Invalid table parameters: ${l.errors.map((u) => u.path + ": " + u.expected).join(", ")}`);
717
+ if (!this._swarmKey) throw new Error("SWARM_KEY not set in environment variables!");
718
+ if (!this._appKey) throw new Error("APP_KEY not set in environment variables!");
719
+ const i = `append.${this._swarmKey}.${this._appKey}.${r}`;
720
+ return this._connection.call(i, s, o);
721
+ }
713
722
  async subscribe(r, s, o) {
714
723
  return this._connection.subscribe(r, s);
715
724
  }
@@ -720,7 +729,7 @@ class N {
720
729
  return this.subscribe(l, s, o);
721
730
  }
722
731
  async call(r, s, o, l, i) {
723
- const u = Z({ deviceKey: r, topic: s, args: o, kwargs: l });
732
+ const u = z({ deviceKey: r, topic: s, args: o, kwargs: l });
724
733
  if (!u.success)
725
734
  throw new Error(`Invalid call parameters: ${u.errors.map((a) => a.path + ": " + a.expected).join(", ")}`);
726
735
  const t = `${r}.${s}`;
@@ -735,7 +744,7 @@ class N {
735
744
  }
736
745
  async getHistory(r, s = { limit: 10 }) {
737
746
  if (!r) throw new Error("Tablename must not be empty!");
738
- const o = H(s);
747
+ const o = G(s);
739
748
  if (!o.success)
740
749
  throw new Error(`Invalid query parameters: ${o.errors.map((i) => i.path + ": " + i.expected).join(", ")}`);
741
750
  const l = `history.transformed.app.${this._appKey}.${r}`;
@@ -747,7 +756,7 @@ class N {
747
756
  }
748
757
  }
749
758
  async setDeviceLocation(r, s) {
750
- const o = G({ longitude: r, latitude: s });
759
+ const o = X({ longitude: r, latitude: s });
751
760
  if (!o.success)
752
761
  throw new Error(`Invalid location parameters: ${o.errors.map((u) => u.path + ": " + u.expected).join(", ")}`);
753
762
  const l = { long: r, lat: s }, i = {
@@ -783,17 +792,17 @@ class N {
783
792
  if (!s.ok)
784
793
  throw new Error(`Failed to fetch IronFlock config from ${r}: ${s.status} ${s.statusText}`);
785
794
  const o = await s.json();
786
- return new N(o);
795
+ return new O(o);
787
796
  }
788
797
  }
789
798
  export {
790
- K as CrossbarConnection,
791
- N as IronFlock,
792
- x as Stage,
793
- Z as validateCallParams,
794
- G as validateLocationParams,
795
- X as validatePublishParams,
796
- z as validateTableParams,
797
- H as validateTableQueryParams
799
+ x as CrossbarConnection,
800
+ O as IronFlock,
801
+ M as Stage,
802
+ z as validateCallParams,
803
+ X as validateLocationParams,
804
+ Z as validatePublishParams,
805
+ N as validateTableParams,
806
+ G as validateTableQueryParams
798
807
  };
799
808
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","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\n constructor() {\n super();\n }\n\n static getWebSocketURI(reswarmUrl?: string): string {\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.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\n this.resubscribeAll();\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 // return false to let autobahn handle auto-reconnect\n return 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.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 async register(\n topic: string,\n endpoint: autobahn.RegisterEndpoint\n ): Promise<autobahn.IRegistration | undefined> {\n await this.sessionWait();\n const registration = await this.session?.register(topic, endpoint);\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 { CrossbarConnection } from \"./crossbar\";\nimport {\n Stage,\n validatePublishParams,\n validateCallParams,\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 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?.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 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 deviceKey: string,\n topic: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>,\n options?: object\n ) {\n const validation = validateCallParams({ deviceKey, topic, args, kwargs });\n if (!validation.success) {\n throw new Error(`Invalid call parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n const callTopic = `${deviceKey}.${topic}`;\n return this._connection.call(callTopic, args as any[], kwargs, options);\n }\n\n async registerFunction(\n topic: string,\n endpoint: (...args: any[]) => any,\n options?: object\n ) {\n const fullTopic = `${this._swarmKey}.${this._deviceKey}.${this._appKey}.${this._env}.${topic}`;\n\n const reg = await this._connection.register(fullTopic, endpoint);\n console.log(`Function registered for IronFlock topic '${topic}'. (Full WAMP topic: '${fullTopic}')`);\n return reg;\n }\n\n async register(\n topic: string,\n endpoint: (...args: any[]) => any,\n options?: object\n ) {\n return this.registerFunction(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 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","swarmKey","appKey","stage","serialNumber","cburl","resolve","reject","autobahn","_session","_method","extra","session","reason","details","startTime","_a","topic","handler","sub","idx","matching","previous","endpoint","registration","procedure","kwargs","options","_isTypeUint32","value","MINIMUM","MAXIMUM","_isFormatDateTime","str","PATTERN","_validateReport","array","reportable","path","last","exceptable","error","_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","callTopic","fullTopic","reg","queryParams","errorStr","long","lat","payload","port","url","response"],"mappings":"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","x_google_ignoreList":[0,2,3,4,5]}
1
+ {"version":3,"file":"index.mjs","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\n constructor() {\n super();\n }\n\n static getWebSocketURI(reswarmUrl?: string): string {\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.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\n this.resubscribeAll();\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 // return false to let autobahn handle auto-reconnect\n return 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.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 async register(\n topic: string,\n endpoint: autobahn.RegisterEndpoint\n ): Promise<autobahn.IRegistration | undefined> {\n await this.sessionWait();\n const registration = await this.session?.register(topic, endpoint);\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 { CrossbarConnection } from \"./crossbar\";\nimport {\n Stage,\n validatePublishParams,\n validateCallParams,\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 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?.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 return this._connection.call(topic, args as any[], kwargs);\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 deviceKey: string,\n topic: string,\n args?: unknown[],\n kwargs?: Record<string, unknown>,\n options?: object\n ) {\n const validation = validateCallParams({ deviceKey, topic, args, kwargs });\n if (!validation.success) {\n throw new Error(`Invalid call parameters: ${validation.errors.map(e => e.path + \": \" + e.expected).join(\", \")}`);\n }\n\n const callTopic = `${deviceKey}.${topic}`;\n return this._connection.call(callTopic, args as any[], kwargs, options);\n }\n\n async registerFunction(\n topic: string,\n endpoint: (...args: any[]) => any,\n options?: object\n ) {\n const fullTopic = `${this._swarmKey}.${this._deviceKey}.${this._appKey}.${this._env}.${topic}`;\n\n const reg = await this._connection.register(fullTopic, endpoint);\n console.log(`Function registered for IronFlock topic '${topic}'. (Full WAMP topic: '${fullTopic}')`);\n return reg;\n }\n\n async register(\n topic: string,\n endpoint: (...args: any[]) => any,\n options?: object\n ) {\n return this.registerFunction(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 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","swarmKey","appKey","stage","serialNumber","cburl","resolve","reject","autobahn","_session","_method","extra","session","reason","details","startTime","_a","topic","handler","sub","idx","matching","previous","endpoint","registration","procedure","kwargs","options","_isTypeUint32","value","MINIMUM","MAXIMUM","_isFormatDateTime","str","PATTERN","_validateReport","array","reportable","path","last","exceptable","error","_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","callTopic","fullTopic","reg","queryParams","errorStr","long","lat","payload","port","url","response"],"mappings":"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","x_google_ignoreList":[0,2,3,4,5]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ironflock",
3
- "version": "1.2.1",
3
+ "version": "1.2.2",
4
4
  "description": "Collect data in the IronFlock Storage architecture",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -27,13 +27,14 @@
27
27
  "node": ">=18"
28
28
  },
29
29
  "dependencies": {
30
- "autobahn": "22.11.1",
30
+ "autobahn": "26.3.1",
31
31
  "eventemitter3": "^5.0.4"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@kennethwkz/unplugin-typia": "^2.6.7",
35
35
  "@types/autobahn": "^20.9.4",
36
36
  "@types/node": "^20.11.0",
37
+ "@vitest/coverage-v8": "^3.2.4",
37
38
  "happy-dom": "^20.8.4",
38
39
  "patch-package": "^8.0.0",
39
40
  "typescript": "^5.7.0",
@@ -49,7 +50,7 @@
49
50
  "test:browser": "vitest run --config vitest.browser.config.ts",
50
51
  "test:all": "vitest run && vitest run --config vitest.browser.config.ts",
51
52
  "test:watch": "vitest",
52
- "test:coverage": "vitest run --coverage",
53
+ "test:coverage": "vitest run --coverage && node scripts/update-coverage-badge.mjs",
53
54
  "typecheck": "tsc --noEmit",
54
55
  "release": "npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag",
55
56
  "postinstall": "patch-package && node scripts/patch-typia-exports.mjs"