@kemu-io/edge-runtime 0.2.0 → 0.2.1

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kemu-io/edge-runtime",
3
3
  "type": "module",
4
- "version": "0.2.0",
4
+ "version": "0.2.1",
5
5
  "description": "Kemu Edge runtime for running Kemu recipes",
6
6
  "author": "Kemu Pty Ltd",
7
7
  "main": "runner.js",
package/runner.d.ts CHANGED
@@ -191,6 +191,10 @@ declare const _default: {
191
191
  * ```
192
192
  */
193
193
  sendToInputWidget: SendToInputWidgetFn;
194
+ /**
195
+ * Returns the decrypted API key generated when exporting a recipe to Kemu Edge.
196
+ */
197
+ getApiKey: () => string;
194
198
  }>;
195
199
  terminate: () => Promise<void>;
196
200
  /**
package/runner.js CHANGED
@@ -1,3 +1,3 @@
1
1
  import{config as e}from"dotenv";import{readFile as t,access as n}from"node:fs/promises";import{nanoid as r}from"nanoid";import i from"jsonp";import s from"crypto-js";import o from"util";import a from"emittery";import"axios";import c from"jszip";import l,{scryptSync as d,createDecipheriv as u,createHash as p}from"crypto";import{satisfies as h}from"compare-versions";import f from"debug";import g,{join as m,dirname as v,resolve as y}from"path";import"node-ipc";import{mkdir as b,readFile as w,access as S,constants as I,readdir as _,rm as $}from"fs/promises";import C from"minimist";import k from"tty";import E,{homedir as x}from"os";import A from"net";import N from"tls";import P,{promises as O}from"fs";import L from"dgram";import T from"stream";import B from"zlib";import D from"buffer";import j from"events";import R from"https";import U from"http";import F,{fileURLToPath as M}from"url";import W from"node:os";import{spawn as G}from"child_process";import{join as V,resolve as H,dirname as z}from"node:path";import{ImageData as q,loadImage as K,createCanvas as J}from"@napi-rs/canvas";var Y;!function(e){e.STARTING="STARTING",e.PENDING="PENDING",e.RUNNING="RUNNING",e.PAUSED="PAUSED",e.DRAINING="DRAINING",e.STOPPED="STOPPED",e.ERROR="ERROR"}(Y=Y||(Y={}));const X="undefined"!=typeof window&&void 0!==window.document&&void 0!==typeof window.document.createElement,Z="object"==typeof self&&self.constructor&&"DedicatedWorkerGlobalScope"===self.constructor.name,Q="undefined"!=typeof process&&null!=process.versions&&null!=process.versions.node,ee={};let te=0,ne="";const re=e=>ee[e]?ee[e]:null,ie=(e,t)=>{const n=re(e);if(!n)return n;return n.blocks[t]||null},se=(e,t,n)=>{const r=ie(e,t);if(!r)return r;return r.gates[n]},oe=(e,t)=>{let n=r(4);for(;ee[n];)n=r(4);const i=(s=e,JSON.parse(JSON.stringify(s)));var s;return i.logs="",i.addLog=e=>{i.logs+=`${(()=>{const e=Date.now();if(e!==te){const t=new Date;te=e,ne=t.toJSON()}return ne})()}:: ${e}\n`},i.dbInfo={...t},ee[n]=i,n},ae="interrupt_port",ce="main.js",le="state.json",de="{#}",ue="$var_",pe="default";var he,fe,ge,me,ve,ye,be,we;let Se;!function(e){e.Browser="browser",e.Cloud="cloud",e.Desktop="desktop"}(he||(he={})),function(e){e[e.Number=0]="Number",e[e.String=1]="String",e[e.ArrayBuffer=2]="ArrayBuffer",e[e.Array=3]="Array",e[e.Boolean=4]="Boolean",e[e.JsonObj=5]="JsonObj",e[e.Anything=6]="Anything",e[e.ImageData=7]="ImageData",e[e.AudioBuffer=8]="AudioBuffer",e[e.Rect=9]="Rect",e[e.Point=10]="Point",e[e.ImageBitmap=11]="ImageBitmap",e[e.BinaryFile=12]="BinaryFile"}(fe||(fe={})),function(e){e.Number="Number",e.String="String",e.ArrayBuffer="ArrayBuffer",e.Array="Array",e.Boolean="Boolean",e.JsonObj="JsonObj",e.Anything="Anything",e.ImageData="ImageData",e.AudioBuffer="AudioBuffer",e.Rect="Rect",e.Point="Point",e.ImageBitmap="ImageBitmap",e.BinaryFile="BinaryFile"}(ge||(ge={})),function(e){e.Javascript="js",e.Python="py",e.Executable="exe"}(me||(me={})),function(e){e.IpcAcknowledge="iack:",e.SocketAcknowledge="sack:",e.AcknowledgeResponse="ackr:",e.ServicesListChanged="update-services",e.SendManifest="send-manifest",e.BroadcastStart="broadcast-start",e.BroadcastEnd="broadcast-end",e.AssumeSession="assume:"}(ve||(ve={})),function(e){e.GetServices="getServices",e.SubscribeToService="subscribeToService",e.UnsubscribeFromService="unsubscribeFromService",e.GetServiceContents="getServiceContents",e.SocketAckResponse="socketAckResponse",e.ShowSecretsConfigScreen="showSecretsConfigScreen",e.GetMappedSecrets="getMappedSecrets",e.GetSecretContexts="getSecretContexts",e.OnParentEvent="onParentEvent",e.GetDefaultState="getDefaultState",e.BroadcastEvent="broadcastEvent",e.HubBroadcastEvent="hubBroadcastEvent",e.ServiceManifest="serviceManifest",e.GetState="getState",e.SetState="setState",e.SetOutputs="setOutputs",e.UIEvent="uiEvent",e.GetSystemInfo="getSystemInfo",e.InitializeInstance="initializeInstance",e.TerminateInstance="terminateInstance",e.UninstallService="uninstallService",e.ChooseDirectoryDialog="chooseDirectoryDialog",e.ChooseFileDialog="chooseFileDialog",e.GetUniqueId="getUniqueId",e.RebootToInstallUpdate="rebootToInstallUpdate",e.GetFileContentFromCacheId="getFileContentFromCacheId"}(ye||(ye={})),function(e){e.SetDependencyPath="setDependencyPath",e.GetDependencyPath="getDependencyPath"}(be||(be={})),function(e){e.IPC="ipc",e.WS="ws"}(we||(we={}));const Ie=()=>{if(!Se)throw new Error("CanvasManager not set");return Se},_e=e=>{Se=e},$e=(e,t)=>Ie().createCanvas(e,t),Ce=e=>X?e.getContext("2d",{willReadFrequently:!0}):e.getContext("2d"),ke=e=>Ie().loadImage(e),Ee="-",xe=`inner${Ee}`,Ae=`outer${Ee}`,Ne=`${Ae}input${Ee}`,Pe=`${Ae}output${Ee}`,Oe=`${xe}input${Ee}`,Le=`${xe}output${Ee}`,Te=e=>(new TextEncoder).encode(e),Be=e=>e===ae,De=e=>e&&void 0!==e.width&&void 0!==e.height&&void 0!==e.data&&e.data.constructor&&"Uint8ClampedArray"===e.data.constructor.name,je=e=>e&&void 0!==e.width&&void 0!==e.height&&void 0!==e.top&&void 0!==e.left&&"number"==typeof e.width&&"number"==typeof e.height&&"number"==typeof e.top&&"number"==typeof e.left,Re=e=>e&&"number"==typeof e.x&&"number"==typeof e.y,Ue=e=>"number"==typeof e?fe.Number:"string"==typeof e?fe.String:"boolean"==typeof e?fe.Boolean:Array.isArray(e)?fe.Array:De(e)?fe.ImageData:e&&void 0!==e.duration&&void 0!==e.length&&void 0!==e.numberOfChannels&&void 0!==e.sampleRate&&"function"==typeof e.getChannelData&&"AudioBuffer"===e.constructor.name?fe.AudioBuffer:e&&void 0!==e.byteLength?fe.ArrayBuffer:je(e)?fe.Rect:e&&void 0!==e.x&&void 0!==e.y&&"number"==typeof e.x&&"number"==typeof e.y?fe.Point:(e=>e&&"string"==typeof e.format&&e.data&&e.data instanceof ArrayBuffer)(e)?fe.BinaryFile:fe.JsonObj,Fe=e=>{const t={};let n;n=Array.isArray(e)?e[0]:e;for(const e in n){const r=Ue(n[e]);t[e]=r}return t},Me=(e,t,n)=>"inner"===e?"input"===t?`${Oe}${n}`:`${Le}${n}`:"input"===t?`${Ne}${n}`:`${Pe}${n}`,We=e=>{const t=(e||"")?.split("_");if(t.length<3)throw new Error(`Unknown child identifier format [${e}]`);const n=t[0];return{portType:t[1],widgetId:n,portName:t[2]}},Ge=async e=>{try{return new ImageData(e.data,e.width,e.height,{colorSpace:e.colorSpace})}catch(t){console.warn("Failed to create ImageData from info, assuming raw image data",t);return await ke(e.data)}};var Ve,He;!function(e){e.Action="action",e.CustomInput="customInput"}(Ve=Ve||(Ve={})),function(e){e.input="input",e.counter="counter",e.play="play",e.elapsed="elapsed",e.ifGate="ifGate",e.skipEvent="skipEvent",e.between="between",e.map="map",e.parser="parser",e.slider="slider",e.suspend="suspend",e.display="display",e.json="json",e.arrayItem="arrayItem",e.extractImage="extractImage",e.imageConvolution="imageConvolution",e.firstEvent="firstEvent",e.pixelDraw="pixelDraw",e.randomBetween="randomBetween",e.arrayCombine="arrayCombine",e.clock="clock",e.multiplication="multiplication",e.object="object",e.widgetGroup="widgetGroup",e.script="script",e.base64ToImageData="base64ToImageData",e.jsonParse="jsonParse",e.text="text",e.imageCrop="imageCrop",e.imageResize="imageResize",e.value="value",e.imageWarp="imageWarp",e.widgetBundle="widgetBundle",e.sequence="sequence",e.variable="variable",e.hubService="hubService",e.imageFilter="imageFilter",e.recipeLoad="recipeLoad",e.note="note"}(He=He||(He={}));const ze={};let qe;const Ke=async e=>{const t=ze[e],n={name:ae,type:fe.Boolean};if(t){const r={name:t.portName},i=t.data||{type:fe.Boolean,value:!0};qe?(await qe(!0,t.targetWidgetId,t.thingId,t.recipePoolId,n.name,r,{...i,timestamp:Date.now()},[n]),"timeout"===t.type&&Je(e)):console.warn("Interrupt service has not been initialized")}},Je=e=>{const t=ze[e];return!!t&&(t.timerRef&&("interval"===t.type?clearInterval(t.timerRef):"timeout"===t.type&&clearTimeout(t.timerRef)),delete ze[e],!0)};var Ye={interruptHandler:Ke,createInterrupt:(e,t,n,i,s,o,a,c)=>{if(c&&ze[c])throw new Error("The given interrupt id already exists");const l=c||r().replace(/_/g,"-");if("interval"===e&&!o.interval)throw new Error(`Invalid interval. Expected a number greater than 0, but got '${o.interval}'`);if("timeout"===e&&!o.timeout)throw new Error(`Invalid timeout. Expected a number greater than 0, but got '${o.timeout}'`);if(ze[l]={data:a,portName:s,recipePoolId:t,targetWidgetId:i,thingId:n,type:e},"interval"===e)ze[l].timerRef=setInterval((async()=>await Ke(l)),o.interval);else{if("timeout"!==e)throw new Error(`Invalid interrupt type '${e}'`);ze[l].timerRef=setTimeout((async()=>await Ke(l)),o.timeout)}return l},destroyInterrupt:Je,destroyAllInterrupts:()=>{Object.keys(ze).forEach(Je)},setInvokeChildGateCb:e=>{qe=e}};const Xe=(e,t,n,r,i)=>{const s=se(e,n,r);if(!s)return console.warn(`Gate ${r} not found in block ${n} for recipe ${e}`),null;const o=(t,i,s,o)=>Ye.createInterrupt(t,e,n,r,i,s,o),a=()=>Object.freeze({...s.state,...s.type===He.input&&{customInputs:[]}}),c=e=>{if("object"!=typeof e)return void console.warn(`Invalid state type [${typeof e}]. Expected an 'object'`);const t={...e,...s.type===He.input&&!e.customInputs&&{customInputs:[]}};s.state=t};if(i){return{getState:a,setState:c,registerInterrupt:o,getStorageData:async t=>{const r=((e,t,n)=>{const r=re(e);if(!r)throw new Error(`Recipe [${e} does not exist]`);if(!r.storage)return null;const i=ie(e,t);if(!i)throw new Error(`The Thing "${t}" does not exist in recipe ${e}`);if(!(i.storageUnits||[]).includes(n))throw new Error(`The Thing "${t}" has no access to storage unit "${n}"`);return r.storage[n]||null})(e,n,t);return r},recipePoolId:e,recipeType:t,thingRecipeId:n,widgetThingId:r}}return{getState:a,setState:c,recipePoolId:e,widgetId:r}},Ze=[10001,"Invalid `sourcePort` parameter"],Qe=[10002,"The gate [%s] does not exist. Have you called `loadWidgets` yet?"],et=[10110,"No storage medium has been loaded, call `loadMedium()` first"],tt=(e,...t)=>JSON.stringify({code:e[0],message:t[0]?o.format(e[1],...t):e[1].replace(/ \[%s\]/g,"")}),nt=()=>({inputName:"",dataType:fe.Anything}),rt="output",it={processEvent:async(e,t)=>{const n=t.getState(),r={...nt(),...n};if(e.type===r.dataType||r.dataType===fe.Anything)return t.nextWidget(rt,{type:e.type,value:e.value});console.error(`Invalid data type: ${e.type} for input: ${r.inputName}. Expected: ${r.dataType}`)},getOutputNames:e=>{const t={...nt(),...e};return[{name:rt,type:t.dataType}]},getInputNames:()=>[]},st=Object.freeze({in:"in",reset:"reset",increment:"increment"}),ot="output";var at={onParentEvent:async(e,t,n,r)=>{if(!e)throw new Error(tt(Ze));const i={currentValue:0,increment:1,...r.getState()};let s=i.increment,o=i.currentValue;const a=await r.getParentAtPort(st.increment);if(t.name===st.increment)return void(n.data.type===fe.Number&&r.setState({...i,increment:Number(n.data.value)}));if(a){const e=a.getValue();null!==e&&(s=e)}if(t.name===st.reset)return r.setState({...i,currentValue:0});o+=s,r.setState({currentValue:o,increment:s});const c={type:fe.Number,value:o};return r.nextGate(ot,c)},getInputNames:()=>[{name:st.in,type:fe.Anything},{name:st.reset,type:fe.Anything},{name:st.increment,type:fe.Number}],getOutputNames:()=>[{name:ot,type:fe.Number}]};const ct=Object.freeze({in:"in",reset:"reset"}),lt="output";var dt={onParentEvent:async(e,t,n,r)=>{const i={updatedAt:0,elapsed:0,...r.getState()},s=Date.now(),o=s-(i.updatedAt||s);return t.name===ct.reset?r.setState({...i,updatedAt:s,elapsed:0}):(r.setState({updatedAt:s,elapsed:o}),r.nextGate(lt,{type:fe.Number,value:o}))},getInputNames:()=>[{name:ct.in,type:fe.Anything},{name:ct.reset,type:fe.Anything}],getOutputNames:()=>[{name:lt,type:fe.Number}]};const ut=Object.freeze({data:"data",evaluation:"evaluation"}),pt="then",ht="else";var ft={onParentEvent:async(e,t,n,r)=>{const i={value:5,condition:"Equal",useDataPort:!1,...r.getState()},s=n.data.value,o=!isNaN(Number(s)),a="string"==typeof s;if(!i.useDataPort&&(n.data.type===fe.Number||n.data.type===fe.String||n.data.type===fe.Boolean||n.data.type===fe.Anything&&o||n.data.type===fe.Anything&&a)){let e=!1;return("Equal"===i.condition&&(n.data.value==i.value||n.data.type===fe.Boolean&&n.data.value.toString()===i.value.toString())||"Not Equal"===i.condition&&(n.data.value!==i.value||n.data.type===fe.Boolean&&n.data.value!==i.value.toString())||"Greater"===i.condition&&n.data.type===fe.Number&&n.data.value>Number(i.value)||"Less"===i.condition&&n.data.type===fe.Number&&n.data.value<Number(i.value)||"Starts With"===i.condition&&String(n.data.value).startsWith(String(i.value))||"Ends With"===i.condition&&String(n.data.value).endsWith(String(i.value))||"Includes"===i.condition&&String(n.data.value).includes(String(i.value))||"Matches"===i.condition&&String(n.data.value).match(String(i.value)))&&(e=!0),e?r.nextGate(pt,n.data):r.nextGate(ht,n.data)}if((t.name===ut.evaluation&&n.data.type===fe.Number||n.data.type===fe.String||n.data.type===fe.Boolean||n.data.type===fe.Anything&&(o||a))&&(i.$lastValue=n.data.value,r.setState({...i})),t.name===ut.data){let e=!1;return("Equal"===i.condition&&(i.$lastValue==i.value||n.data.type===fe.Boolean&&i.$lastValue?.toString()===i.value.toString())||"Not Equal"===i.condition&&(i.$lastValue!==i.value||n.data.type===fe.Boolean&&i.$lastValue!==i.value.toString())||"Greater"===i.condition&&n.data.type===fe.Number&&Number(i.$lastValue)>Number(i.value)||"Less"===i.condition&&n.data.type===fe.Number&&Number(i.$lastValue)<Number(i.value)||"Starts With"===i.condition&&String(i.$lastValue).startsWith(String(i.value))||"Ends With"===i.condition&&String(i.$lastValue).endsWith(String(i.value))||"Includes"===i.condition&&String(i.$lastValue).includes(String(i.value))||"Matches"===i.condition&&String(i.$lastValue).match(String(i.value)))&&(e=!0),r.setState({...i,$lastValue:void 0,$lastDataType:n.data.type}),e?r.nextGate(pt,n.data):r.nextGate(ht,n.data)}},getInputNames:e=>e.useDataPort?[{name:ut.data,type:fe.Anything},{name:ut.evaluation,type:[fe.Number,fe.String]}]:[{name:"in",type:[fe.Number,fe.String]}],getOutputNames:e=>e.$lastDataType?[{name:pt,type:e.$lastDataType},{name:ht,type:e.$lastDataType}]:[{name:pt,type:[fe.Number,fe.String]},{name:ht,type:[fe.Number,fe.String]}]};const gt=Object.freeze({in:"in",reset:"reset"}),mt="out";var vt={onParentEvent:async(e,t,n,r)=>{const i={totalCalls:0,callsLimit:1,...r.getState()};return t.name===gt.reset?r.setState({...i,totalCalls:0}):(i.totalCalls=i.totalCalls+1,i.totalCalls>i.callsLimit?(i.totalCalls=0,r.setState(i),r.nextGate(mt,n.data)):void r.setState(i))},getInputNames:()=>[{name:gt.in,type:fe.Anything},{name:gt.reset,type:fe.Anything}],getOutputNames:()=>[{name:mt,type:fe.Anything}]};const yt=Object.freeze({in:"in"}),bt="then",wt="else";var St={onParentEvent:async(e,t,n,r)=>{const i={min:1,max:10,...r.getState()};if(n.data.type===fe.Number)return n.data.value>=i.min&&n.data.value<=i.max?r.nextGate(bt,n.data):r.nextGate(wt,n.data)},getInputNames:()=>[{name:yt.in,type:fe.Number}],getOutputNames:()=>[{name:bt,type:fe.Number},{name:wt,type:fe.Number}]};const It=Object.freeze({in:"in"}),_t="out";var $t={onParentEvent:async(e,t,n,r)=>{const i={clamp:!0,...r.getState()},s=Number(n.data.value);if(void 0!==i.fromMax&&void 0!==i.fromMin&&void 0!==i.toMax&&void 0!==i.toMin&&""!==i.fromMax&&""!==i.fromMin&&""!==i.toMax&&""!==i.toMin&&(n.data.type===fe.Number||n.data.type===fe.Anything&&!isNaN(Number(s)))){let e=((e,t,n,r,i)=>(e-t)*(i-r)/(n-t)+r)(s,Number(i.fromMin),Number(i.fromMax),Number(i.toMin),Number(i.toMax));if(isNaN(e))return;return i.clamp&&(e<Number(i.toMin)&&(e=Number(i.toMin)),e>Number(i.toMax)&&(e=Number(i.toMax))),r.nextGate(_t,{type:fe.Number,value:Number(e)})}},getInputNames:()=>[{name:It.in,type:fe.Number}],getOutputNames:()=>[{name:_t,type:fe.Number}]};const Ct=Object.freeze({in:"in"}),kt="out";var Et={onParentEvent:async(e,t,n,r)=>{const i={convertTo:"Integer",floatPlaces:2,...r.getState()};let s=n.data.value;if(n.data.type===fe.Number||n.data.type===fe.Anything||n.data.type===fe.String){if((!isNaN(Number(s))||"string"==typeof s)&&!Array.isArray(s))return"Integer"===i.convertTo?s=parseInt(s):"Decimal"===i.convertTo?s=parseFloat(Number(s).toFixed(i.floatPlaces)):"String"===i.convertTo?s=String(s):"Abs"===i.convertTo?s=Math.abs(Number(s)):"Round"===i.convertTo&&(s=Math.round(Number(s))),r.nextGate(kt,{type:"String"===i.convertTo?fe.String:fe.Number,value:s})}},getInputNames:()=>[{name:Ct.in,type:fe.Number}],getOutputNames:e=>{const t="String"===e?.convertTo?fe.String:fe.Number;return[{name:kt,type:t}]}};const xt=Object.freeze({in:"in"}),At="out";var Nt={onParentEvent:async(e,t,n,r)=>{const i={currentValue:50,min:0,max:100,...r.getState()};let s=!1;return i.currentValue<i.min&&(i.currentValue=i.min,s=!0),i.currentValue>i.max&&(i.currentValue=i.max,s=!0),s&&r.setState(i),r.nextGate(At,{type:fe.Number,value:i.currentValue})},getInputNames:()=>[{name:xt.in,type:fe.Anything}],getOutputNames:()=>[{name:At,type:fe.Number}]};const Pt=Object.freeze({in:"in",reset:"reset"}),Ot="out";var Lt={onParentEvent:async(e,t,n,r)=>{const i={lastCalledAt:0,delayMs:500},s={lastCalledAt:0,delayMs:500,...r.getState()};if(t.name===Pt.reset)return r.setState({...s,lastCalledAt:0});const o=Date.now(),a=o-s.lastCalledAt;return s.lastCalledAt===i.lastCalledAt||a>=s.delayMs&&s.delayMs>0?(s.lastCalledAt=o,r.setState(s),r.nextGate(Ot,n.data)):void 0},getInputNames:()=>[{name:Pt.in,type:fe.Anything},{name:Pt.reset,type:fe.Anything}],getOutputNames:()=>[{name:Ot,type:fe.Anything}]};const Tt="in";var Bt={onParentEvent:async()=>{},getInputNames:()=>[{name:Tt,type:[fe.ImageData,fe.Number]}],getOutputNames:()=>[]};const Dt=()=>({properties:[{label:"property1",name:"property1"}],detectedProperties:{}}),jt=(e,t)=>t.split(".").reduce(((e,t)=>null!=e?e[t]:e),e);var Rt={onParentEvent:async(e,t,n,r)=>{const i={properties:[{label:"property1",name:"property1"}],detectedProperties:{},...r.getState()},s=n?.data?.value,o=Array.isArray(s);if(n.data.type===fe.JsonObj||n.data.type===fe.Rect||n.data.type===fe.Point||n.data.type===fe.BinaryFile||n.data.type===fe.Anything||o){let e=!1;for(const t in s){const n=Ue(s[t]),r=!!i.detectedProperties[t],o=i.detectedProperties[t]?.type!==n;if(!r||o){const r=n===fe.JsonObj||n===fe.Rect||n===fe.Point||n===fe.Array;i.detectedProperties[t]={type:n,...r?{shape:Fe(s[t])}:void 0},e=!0}}if(o&&void 0===i.detectedProperties.length&&(i.detectedProperties.length={type:fe.Number}),e&&r.setState(i),s){const e=[];for(const t of i.properties||[]){const n=jt(s,t.label),o=t.label.includes(".");if(void 0!==n){const s=o?Ue(n):void 0!==i.detectedProperties[t.label]?.type?i.detectedProperties[t.label].type:fe.Anything;e.push(r.nextGate(t.name,{type:s,value:n}))}}await Promise.allSettled(e)}}},getInputNames:()=>[{name:"in",type:fe.JsonObj}],getOutputNames:e=>{const t={properties:[{label:"property1",name:"property1"}],detectedProperties:{},...e};return t.properties.map((e=>{const n=void 0!==t.detectedProperties[e.label]?t.detectedProperties[e.label]?.type:fe.Anything,r=t.detectedProperties[e.label]?.shape||void 0,i="string"==typeof e;return{name:i?e:e.name,label:i?e:e.label,type:n,jsonShape:r}}))},getDefaultState:Dt};const Ut="output",Ft="noItem";var Mt={onParentEvent:async(e,t,n,r)=>{const i={index:0,...r.getState()};let s=i.index;const o=n.data.value,a="string"==typeof n.data.value,c=Array.isArray(n.data.value);if(n.data.type===fe.Anything&&(c||a)||n.data.type===fe.String&&a||n.data.type===fe.Array&&c){s<0&&(s=o.length+s);const e=a?fe.String:Ue(o[s]);return e!==i.$$lastDetectedType&&r.setState({...i,$$lastDetectedType:e}),void 0!==o[s]?r.nextGate(Ut,{value:o[s],type:e}):r.nextGate(Ft,{value:!0,type:fe.Boolean})}},getInputNames:()=>[{name:"in",type:[fe.Array,fe.String]}],getOutputNames:e=>[{name:Ut,type:e.$$lastDetectedType??fe.Anything},{name:Ft,type:fe.Boolean}]};const Wt=Object.freeze({image:"image",rect:"rect"}),Gt="image";var Vt={onParentEvent:async(e,t,n,r)=>{const i={offset:{height:0,left:0,top:0,width:0},...r.getState()},s=await r.getParentAtPort(Wt.rect),o=[fe.Anything,fe.Rect,fe.JsonObj];if(t.name!==Wt.rect){if(s){const e=s.getValue();null!==e&&(i.rect={...e},r.setState(i))}if(!X)return n.data.type===fe.ImageData?r.nextGate(Gt,n.data):void 0;if(i.$$canvasFrom&&i.$$canvasFrom.getContext||(i.$$canvasFrom=$e(320,240)),i.$$canvasTo&&i.$$canvasTo.getContext||(i.$$canvasTo=$e(320,240)),(n.data.type===fe.ImageData||n.data.type===fe.Anything&&De(n.data.value))&&!i.$$processing&&i.$$canvasFrom&&i.rect){const e=((e,t,n,r,i)=>{if(r&&r.getContext){const s=r.getContext("2d"),o=n.getContext("2d");if(s&&o){n.width=e.width,n.height=e.height,o.putImageData(e,0,0);const a={...i};i&&(a.height=Number(i.height),a.width=Number(i.width),a.left=Number(i.left),a.top=Number(i.top));const c={top:0,width:0,left:0,height:0,...a};return i&&(Number.isInteger(c.width)||(c.width=t.width*c.width),Number.isInteger(c.height)||(c.height=t.height*c.height),Number.isInteger(c.left)||(c.left=t.left+t.width*c.left),Number.isInteger(c.top)||(c.top=t.top+t.height*c.top)),r.width=t.width+c.width,r.height=t.height+c.height,s.drawImage(n,t.left+c.left,t.top+c.top,t.width+c.width,t.height+c.height,0,0,r.width+c.width,r.height+c.height),s.getImageData(0,0,r.width||1,r.height||1)}}return e})(n.data.value,i.rect,i.$$canvasFrom,i.$$canvasTo,i.offset);return r.nextGate(Gt,{type:fe.ImageData,value:e})}}else je(n.data.value)&&o.includes(n.data.type)&&r.setState({...i,rect:n.data.value})},getInputNames:()=>[{name:Wt.image,type:fe.ImageData},{name:Wt.rect,type:[fe.Rect,fe.JsonObj]}],getOutputNames:()=>[{name:Gt,type:fe.ImageData}]};const Ht=(e,t)=>{const n=Math.round(Math.sqrt(t.length)),r=Math.floor(n/2),i=e.data,s=e.width,o=e.height,a=s,c=o,l=((e,t,n)=>{if(X)return new ImageData(t,n);return console.warn("Node environment detected. Aborting new ImageData creation"),e})(e,a,c),d=l.data;for(let e=0;e<c;e++)for(let c=0;c<a;c++){const l=e,u=c,p=4*(e*a+c);let h=0,f=0,g=0,m=0;for(let e=0;e<n;e++)for(let a=0;a<n;a++){const c=l+e-r,d=u+a-r;if(c>=0&&c<o&&d>=0&&d<s){const r=4*(c*s+d),o=t[e*n+a];h+=i[r]*o,f+=i[r+1]*o,g+=i[r+2]*o,m+=i[r+3]*o}}d[p]=h,d[p+1]=f,d[p+2]=g,d[p+3]=m+1*(255-m)}return l},zt=[-1,0,1,-2,0,2,1,0,1],qt=Object.freeze({image:"image"}),Kt="image";var Jt={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s={matrix:[...zt],...i};if(n.data.type===fe.ImageData||n.data.type===fe.Anything&&De(n.data.value)){const e=Ht(n.data.value,s.matrix);return r.nextGate(Kt,{type:fe.ImageData,value:e})}},getInputNames:()=>[{name:qt.image,type:fe.ImageData}],getOutputNames:()=>[{name:Kt,type:fe.ImageData}]};const Yt=Object.freeze({output:"output",aborted:"aborted"}),Xt=()=>({inputs:2,matchingOutputs:!0,lastInputIndex:-1,delayMs:500,triggeredAt:0}),Zt=e=>{const t={inputs:2,matchingOutputs:!0,lastInputIndex:-1,delayMs:500,triggeredAt:0,...e},n=Array(t.inputs).fill(0).map(((e,t)=>({name:`input${t+1}`,type:fe.Anything})));return n.push({name:"reset",type:fe.Anything}),n};var Qt={onParentEvent:async(e,t,n,r)=>{const i={inputs:2,matchingOutputs:!0,lastInputIndex:-1,delayMs:500,triggeredAt:0,...r.getState()};if("reset"===t.name)return r.setState({...i,triggeredAt:0});const s=Date.now(),o=s-i.triggeredAt;if(i.triggeredAt&&!(o>=i.delayMs&&i.delayMs>0)&&i.delayMs)return r.nextGate(Yt.aborted,n.data);{i.triggeredAt=s;const e=Zt(i,(r.recipePoolId,r.recipeType,r.thingRecipeId,r.id)).findIndex((e=>e.name===t.name));-1!==e&&(i.lastInputIndex=e),i.matchingOutputs?-1!==e&&await r.nextGate(`output${e+1}`,n.data):await r.nextGate(Yt.output,n.data),r.setState(i)}},getInputNames:Zt,getOutputNames:e=>{const t={inputs:2,matchingOutputs:!0,lastInputIndex:-1,delayMs:500,triggeredAt:0,...e};if(e.matchingOutputs){const e=Array(t.inputs).fill(0).map(((e,t)=>({name:`output${t+1}`,type:fe.Anything})));return e.push({name:Yt.aborted,type:fe.Anything}),e}return[{name:Yt.output,type:fe.Anything},{name:Yt.aborted,type:fe.Anything}]},getDefaultState:Xt};const en=(e,t,n,r,i,s)=>{if(i){const o=e.measureText(i),a=o.fontBoundingBoxAscent+o.fontBoundingBoxDescent;e.fillStyle=r,e.fillRect(t,n-s,1.1*o.width,a),e.font=`${s}px Arial`,e.fillStyle="black",e.fillText(i,t,n)}},tn=(e,t,n,r,i,s,o)=>{e.fillStyle=i,e.fillRect(t,n,r,r),en(e,t,n,i,s,o)},nn=(e,t,n,r,i,s)=>{e.beginPath(),e.strokeStyle=r,e.lineWidth=n,e.rect(t.left,t.top,t.width,t.height),e.stroke();const o=n/2;en(e,t.left-o,t.top-o,r,i,s)},rn=Object.freeze({image:"image",pixels:"pixels"}),sn="image";var on={onParentEvent:async(e,t,n,r)=>{const i={fontSize:12,color:"#00ff00",size:2,...r.getState()},s=n.data.type===fe.ImageData||n.data.type===fe.Anything&&De(n.data.value);if(t.name===rn.pixels){const e=((e,t)=>t===fe.Anything&&(De(e)||Re(e)||je(e)||Array.isArray(e))||t===fe.Array||t===fe.Rect||t===fe.Point)(n.data.value,n.data.type);if(!e)return;i.$$pixels=n.data.value}if(t.name===rn.image&&s){const e=n.data.value;i.$$memCanvas&&i.$$memCanvas.getContext||(i.$$memCanvas=$e(e.width||1,e.height||1)),i.$$lastFrame=e}if(i.$$lastFrame&&i.$$pixels&&i.$$memCanvas){const e=(e=>{const{sourceImage:t,pixels:n,memCanvas:r,size:i,color:s,labelProp:o,fontSize:a}=e;if(r){const e=Ce(r);if(e){r.width!==t.width&&(r.width=t.width),r.height!==t.height&&(r.height=t.height),e.putImageData(t,0,0);const c=Array.isArray(n)?n:[n];for(let t=0;t<c.length;t++){const n=c[t],r=o?n[o]:"";je(n)?nn(e,n,i,s,r,a):Re(n)&&tn(e,n.x,n.y,i,s,r,a)}return e.getImageData(0,0,r.width,r.height)}}return t})({sourceImage:i.$$lastFrame,pixels:i.$$pixels||[],memCanvas:i.$$memCanvas,size:i.size,color:i.color,labelProp:i.labelProp,fontSize:i.fontSize});return r.setState({...i,$$lastFrame:void 0,$$pixels:void 0}),r.nextWidget(sn,{type:fe.ImageData,value:e})}r.setState(i)},getInputNames:()=>[{name:rn.image,type:fe.ImageData},{name:rn.pixels,type:[fe.Rect,fe.Point,fe.Array]}],getOutputNames:()=>[{name:sn,type:fe.ImageData}]};const an=Object.freeze({in:"in"}),cn="output",ln=e=>{const t=String(e).split(".");return t.length<2?0:t[1].length};var dn={onParentEvent:async(e,t,n,r)=>{const i={min:1,max:100,...r.getState()},s=!Number.isInteger(i.min),o=!Number.isInteger(i.max),a=s||o;let c=(l=i.min,d=i.max,Math.random()*(d-l)+l);var l,d;if(a){let e=0;if(s&&(e=ln(i.min)),o){const t=ln(i.max);t>e&&(e=t)}c=Number(c.toFixed(e))}else c=Math.floor(c);return r.nextGate(cn,{type:fe.Number,value:c})},getInputNames:()=>[{name:an.in,type:fe.Anything}],getOutputNames:()=>[{name:cn,type:fe.Number}]};const un=Object.freeze({output:"output",totalItems:"totalItems"}),pn=Object.freeze({trigger:"trigger",clear:"clear"}),hn=()=>({totalSentItems:-1,totalSentAt:0,$$list:[],$$outputShape:{},totalInputs:1}),fn=async(e,t)=>t.nextGate(un.totalItems,{type:fe.Number,value:e});var gn={onParentEvent:async(e,t,n,r)=>{const i={totalSentItems:-1,totalSentAt:0,$$list:[],$$outputShape:{},totalInputs:1,...r.getState()};if(t.name===pn.clear)return i.$$list=[],i.properties?.autoFilled&&delete i.properties,r.setState(i),fn(i.$$list.length,r);const s=t.name===pn.trigger;if(!s)if(Array.isArray(n.data.value))n.data.type!==fe.Array&&n.data.type!==fe.Anything||(i.$$outputShape={...i.$$outputShape,...e?.jsonShape},i.$$list=i.$$list.concat(n.data.value),r.setState({...i}),await fn(i.$$list.length,r));else{const t=`$$primitive_${Object.keys(i.$$outputShape).length}`;n.data.type===fe.JsonObj?i.$$outputShape={...i.$$outputShape,...e?.jsonShape?e.jsonShape:void 0}:i.$$outputShape={...i.$$outputShape,[t]:n.data.type},i.$$list.push(n.data.value),r.setState({...i}),await fn(i.$$list.length,r)}if(s){Object.keys(i.$$outputShape).length&&(i.properties={autoFilled:!0,jsonShape:{...i.$$outputShape}});const e=i.$$list.length,t=[...i.$$list];return i.$$list=[],r.setState({...i}),await fn(e,r),r.nextGate(un.output,{type:fe.Array,value:t})}},getInputNames:e=>{const t={totalSentItems:-1,totalSentAt:0,$$list:[],$$outputShape:{},totalInputs:1,...e},n=Array(t.totalInputs||1).fill(0).map(((e,t)=>({name:`array${t+1}`,type:fe.Array})));return n.push({name:pn.clear,type:fe.Anything},{name:pn.trigger,type:fe.Anything}),n},getOutputNames:e=>[{name:un.output,type:fe.Array,...e.properties?{jsonShape:e.properties?.jsonShape}:void 0},{name:un.totalItems,label:"Total Items",type:fe.Number}],getDefaultState:hn};const mn=Object.freeze({start:"start",stop:"stop"}),vn="output",yn="clock_interrupt";var bn={onParentEvent:async(e,t,n,r)=>{const i={enabled:!1,interval:1e3,intervalMode:"ms",...r.getState()};if(Be(e?.name||"")&&t.name===yn)return r.nextGate(vn,{type:fe.Boolean,value:!0});if(t.name===mn.stop&&i.enabled&&i.$$interruptId){r.cancelInterrupt(i.$$interruptId)?(i.enabled=!1,i.$$interruptId=void 0,r.setState(i)):console.warn(`Failed to cancel interrupt [${i.$$interruptId}]`)}else t.name!==mn.start||i.enabled||i.$$interruptId||(i.$$interruptId=r.registerInterrupt("interval",yn,{interval:i.interval}),i.enabled=!0,r.setState(i))},getInputNames:()=>[{name:mn.start,type:fe.Anything},{name:mn.stop,type:fe.Anything}],getOutputNames:()=>[{name:vn,type:fe.Boolean}],initialize:async e=>{const t=e.getState();if(t.enabled&&!t.$$interruptId){const n=e.registerInterrupt("interval",yn,{interval:t.interval});e.setState({...t,$$interruptId:n})}}};const wn=Object.freeze({in:"in"}),Sn="output",In=(e,t,n)=>"number"==typeof e?Number((e*t).toFixed(n)):e;var _n={onParentEvent:async(e,t,n,r)=>{const i={userProperties:[],factor:2,decimalPoints:2,...r.getState()},s=n.data.type;let o=n.data.value,a=!1;return e?.jsonShape&&(i.detectedInputJson={...i.detectedInputJson,...e?.jsonShape},a=!0),i.detectedInputType||(i.detectedInputType=s,a=!0),n.data.type===fe.Array&&("number"==typeof n.data.value?.[0]?o=((e,t,n)=>{const r=(e||[]).map((e=>In(e,t,n)));return r})(n.data.value,i.factor,i.decimalPoints):"object"==typeof n.data.value?.[0]&&(o=((e,t,n,r)=>{const i=(e||[]).map((e=>{const i={...e};return Object.keys(i).forEach((e=>{r?.length&&!r?.includes(e)||(i[e]=In(i[e],t,n))})),i}));return i})(n.data.value,i.factor,i.decimalPoints,i.userProperties))),n.data.type===fe.Number&&(o=In(n.data.value,i.factor,i.decimalPoints)),a&&r.setState(i),r.nextGate(Sn,{type:s,value:o})},getInputNames:()=>[{name:wn.in,type:[fe.Array,fe.Number]}],getOutputNames:e=>[{name:Sn,type:e.detectedInputType||fe.Number,jsonShape:e.detectedInputJson}]};const $n=Object.freeze({output:"output"}),Cn=Object.freeze({trigger:"trigger"}),kn=()=>({useTriggerPort:!0,properties:[{name:"x",label:"x",type:fe.Number,value:10},{name:"y",label:"y",type:fe.Number,value:20}]}),En=e=>{const t={};for(let n=0;n<e.properties.length;n++)t[e.properties[n].label]=e.properties[n].type;return t},xn=e=>{const t={};for(let n=0;n<e.properties.length;n++){let r=e.properties[n].value;const i=e.properties[n].type;i===fe.Number?r=Number(r):i===fe.String&&(r=String(r)),t[e.properties[n].label]=r}return t};var An={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s=structuredClone(i),o={...kn(),...s};if(t.name===Cn.trigger){const e=xn(o);return r.nextGate($n.output,{type:fe.JsonObj,value:e})}const a=o.properties.findIndex((e=>e.name===t.name));if(-1!==a){let e=n.data.type===o.properties[a].type;if(!e&&n.data.type===fe.Anything){e=Ue(n.data.type)===o.properties[a].type}if(e?(o.properties[a].value=n.data.value,o.properties[a].$$invalidInputType=!1):o.properties[a].$$invalidInputType=!0,r.setState(o),!o.useTriggerPort){const e=xn(o);return r.nextGate($n.output,{type:fe.JsonObj,value:e})}}},getInputNames:e=>{const t={...kn(),...e},n=t.properties.map((e=>({name:e.name,label:e.label,type:e.type})));return t.useTriggerPort&&n.push({name:Cn.trigger,label:Cn.trigger,type:fe.Anything}),n},getOutputNames:e=>[{name:$n.output,label:$n.output,type:fe.JsonObj,jsonShape:En(e)}],getDefaultState:kn};const Nn=async e=>{const t=(e,t)=>e.split(t)[1];if(e.startsWith(Ne)){const n=t(e,Ne);return Me("inner","input",n)}if(e.startsWith(Le)){const n=t(e,Le);return Me("outer","output",n)}return null},Pn=()=>({canvasPosition:{x:0,y:0},canvasZoom:1,inputs:[{name:"input",type:[fe.Anything],index:0}],outputs:[{name:"output",type:[fe.Anything],index:0}],name:"Custom Widget 1",description:"",type:"custom"}),On=e=>{const t={...Pn(),...e},n=t.inputs.map(((e,t)=>({name:Me("outer","input",e.name),type:e.type,...e.jsonShape?{jsonShape:e.jsonShape}:void 0,...e.position?{position:e.position}:void 0,label:e.label,isInner:!1,index:t}))),r=t.outputs.map(((e,t)=>({name:Me("inner","output",e.name),type:e.type,...e.jsonShape?{jsonShape:e.jsonShape}:void 0,...e.position?{position:e.position}:void 0,label:e.label,isInner:!0,index:n.length+t})));return[...n,...r]};var Ln={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s={...Pn(),...i},o=On(s,(r.recipePoolId,r.recipeType,r.thingRecipeId,r.id));for(let e=0;e<o.length;e++){const i=o[e];if(t.name===i.name&&(i.type.includes(fe.Anything)||i.type.includes(n.data.type))){const e=await Nn(t.name);e&&await r.nextWidget(e,{type:n.data.type,value:n.data.value})}}},getInputNames:On,getOutputNames:e=>{const t={...Pn(),...e},n=t.outputs.map(((e,t)=>({name:Me("outer","output",e.name),type:e.type,...e.jsonShape?{jsonShape:e.jsonShape}:void 0,...e.position?{position:e.position}:void 0,label:e.label,isInner:!1,index:t})));return[...t.inputs.map(((e,t)=>({name:Me("inner","input",e.name),type:e.type,...e.jsonShape?{jsonShape:e.jsonShape}:void 0,...e.position?{position:e.position}:void 0,label:e.label,isInner:!0,index:t+n.length}))),...n]},getDefaultState:Pn};const Tn=(e,t,n,r,i)=>{const s=4*(t*n.width+e),o=n.data[s],a=n.data[s+1],c=n.data[s+2];return Math.abs(o-r.r)<=i&&Math.abs(a-r.g)<=i&&Math.abs(c-r.b)<=i};var Bn={getPixelValueAtIndex:(e,t)=>{const n=e.data,r=n[t]||0,i=n[t+1]||0,s=n[t+2]||0;return{avr:(r+i+s)/3,r:r,g:i,b:s}},getBoundingBox:(e,t,n)=>{const r=e.width,i=e.height,s=new Set,o=Number(n.threshold||0),a=isNaN(o)?10:o,c=(n,o)=>{const c=[[n,o]];let l=n,d=n,u=o,p=o;for(;c.length>0;){const n=c.shift();if(!n)continue;const[o,h]=n;o<0||h<0||o>=r||h>=i||s.has(`${o},${h}`)||!Tn(o,h,e,t,a||0)||(s.add(`${o},${h}`),l=Math.min(l,o),d=Math.max(d,o),u=Math.min(u,h),p=Math.max(p,h),c.push([o+1,h],[o-1,h],[o,h+1],[o,h-1]))}return{minX:l,maxX:d,minY:u,maxY:p}},l=[];for(let o=0;o<i;o+=4)for(let i=0;i<r;i+=4)if(!s.has(`${i},${o}`)&&Tn(i,o,e,t,a)){const{minX:e,maxX:t,minY:r,maxY:s}=c(i,o),a=t-e,d=s-r;if(a>=(n.minWidth||1)&&d>=(n.minHeight||1)&&l.push({left:e,top:r,width:a,height:d}),n.maxBoxes&&l.length>=n.maxBoxes)return l}return l},copyImageData:e=>new ImageData(new Uint8ClampedArray(e.data),e.width,e.height),setPixelValueAtIndex:(e,t,n)=>{const r=e.data,i="object"==typeof n,s=i?n.r:n,o=i?n.g:n,a=i?n.b:n;r[t]=s,r[t+1]=o,r[t+2]=a,r[t+3]=255}};const Dn=e=>Ue(e);var jn,Rn,Un,Fn,Mn,Wn,Gn,Vn,Hn,zn;!function(e){e.Browser="browser",e.Cloud="cloud",e.Desktop="desktop"}(jn||(jn={})),function(e){e.Bundle="bundle",e.Group="group"}(Rn||(Rn={})),function(e){e.Hardware="hardware",e.Virtual="virtual"}(Un||(Un={})),function(e){e.Cloud="cloud",e.Web="web"}(Fn||(Fn={})),function(e){e.Cpu_128M="kmu-cpu-128m",e.Cpu_256M="kmu-cpu-256m",e.Cpu_512M="kmu-cpu-512m",e.Cpu_1024M="kmu-cpu-1024m",e.Cpu_2048M="kmu-cpu-2048m",e.Cpu_4096M="kmu-cpu-4096m"}(Mn||(Mn={})),function(e){e.Gateway="gateway",e.Timer="timer"}(Wn||(Wn={})),(Gn||(Gn={})).InstallInProgress="installation-in-progress",function(e){e.InstallDependencies="install-dependencies",e.GetInstalledDependencies="get-installed-dep"}(Vn||(Vn={})),function(e){e.Success="success",e.Error="error",e.Pending="pending"}(Hn||(Hn={})),function(e){e.NotFound="not-found",e.BadRequest="bad-request",e.Forbidden="forbidden",e.InternalError="internal-error"}(zn||(zn={}));let qn=null;var Kn=()=>{if(!qn)throw new Error("Required function is not set");return qn};class Jn extends Error{constructor(e,t){super(e),this.name="UserCodeError",t&&(this.stack=t)}}const Yn=(e,t)=>`\n\t\tfunction _user_code_(){\n\t\t\t${t===jn.Browser?"\n\t\t\tvar global = {\n\t\t\t\t__user_code: true\n\t\t\t};\n\t\t\tvar process = {};\n\t\t\tvar console = this.console;\n\t\t\tvar globalThis = global;\n\t\t\tvar require = this.___notSupportedMethod;\n\t\t\t":"\n\t\t\tvar require = this.require;\n\t\t\tvar process = this.kemuProcess;\n\t\t\t"}\n\n\t\t\tvar eval = () => {};\n\t\t\tvar document = {};\n\t\t\tvar navigator = {};\n\t\t\tvar window = this.window;\n\t\t\tvar alert = this.notify.info;\n\t\t\tvar DataType = this.dataTypesEnum;\n\t\t\tvar setInterval = this.setInterval;\n\t\t\tvar setTimeout = this.setTimeout;\n\t\t\tvar addEventListener = this.addEventListener;\n\t\t\tvar removeEventListener = this.removeEventListener;\n\t\t\tvar requestAnimationFrame = this.___notSupportedMethod;\n\t\t\tvar __delay = (ms) => new Promise((resolve, reject) => setTimeout(resolve, ms, reject));\n\n\t\t\tvar Kemu = {\n\t\t\t\tservices: {\n\t\t\t\t\thttp: { ...this.httpWebService },\n\t\t\t\t\tdynamoDb: { ...this.dynamoService },\n\t\t\t\t\tgoogleSheets: {\n\t\t\t\t\t\t...this.googleSheetsService,\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\timage: this.imageHelpers,\n\t\t\t\tvariable: this.variablesManager,\n\n\t\t\t\thelpers: {\n\t\t\t\t\tdecodeDataType: this.decodeDataType,\n\t\t\t\t\tcryptoJS: this.CryptoJS,\n\t\t\t\t\tjsonp: this.jsonp,\n\t\t\t\t\tdelay: __delay,\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar sendToPort;\n\n\t\t\t// --- User Methods Start ---\n\t\t\t${e||""};\n\t\t\t// --- User Methods End ---\n\t\t\t\n\t\t\t// Processes the user code asynchronously.\n\t\t\tconst asyncProcessEvent = async (targetPort, sourcePort, event) => {\n\t\t\t\tconst userProcessEvent = typeof processEvent === 'undefined' ? undefined : processEvent;\n\t\t\t\tif(userProcessEvent) {\n\t\t\t\t\ttry{\n\t\t\t\t\t\treturn await userProcessEvent(targetPort, sourcePort, event, sendToPort);\n\t\t\t\t\t}catch(e){\n\t\t\t\t\t\tthis.__errorTracer(e);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/** invoked the very first time the recipe is initialized */\n\t\t\tconst asyncRecipeInit = async (context, logger) => {\n\t\t\t\ttry {\n\t\t\t\t\t${t===jn.Browser?"if(logger) { console = logger; }":""}\n\t\t\t\t\tif(typeof recipeInit === 'function') {\n\t\t\t\t\t\treturn recipeInit(context);\n\t\t\t\t\t}\n\t\t\t\t}catch(e){\n\t\t\t\t\tthis.__errorTracer(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/** invoked every time the code is about to be replaced */\n\t\t\tconst asyncOnTerminate = async (context) => {\n\t\t\t\ttry {\n\t\t\t\t\tif(typeof onTerminate === 'function') {\n\t\t\t\t\t\treturn onTerminate(context);\n\t\t\t\t\t}\n\t\t\t\t}catch(e){\n\t\t\t\t\tthis.__errorTracer(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/** updates the function that allows widget contexts to send data to the next widget */\n\t\t\tconst setSendToPort = (sendNextFun) => {\n\t\t\t\tsendToPort = sendNextFun;\n\t\t\t}\n\n\t\t\t/** invoked the every time the user code is compiled. */\n\t\t\tconst asyncMainEvent = async (sendNextFun, logger) => {\n\t\t\t\ttry{\n\t\t\t\t\tsetSendToPort(sendNextFun);\n\t\t\t\t\tif(logger) { console = logger; }\n\t\t\t\t\tif(typeof main === 'function'){\n\t\t\t\t\t\treturn main();\n\t\t\t\t\t}\n\t\t\t\t}catch(e){\n\t\t\t\t\tthis.__errorTracer(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tasyncProcessEvent: asyncProcessEvent,\n\t\t\t\tmain: asyncMainEvent,\n\t\t\t\trecipeInit: asyncRecipeInit,\n\t\t\t\tsetSendToPortFun: setSendToPort,\n\t\t\t\tonTerminate: asyncOnTerminate,\n\t\t\t\tgetLocalContext: () => global,\n\t\t\t\tgetWidgetInputs: typeof getWidgetInputs === 'undefined' ? undefined : getWidgetInputs,\n\t\t\t\tgetWidgetOutputs: typeof getWidgetOutputs === 'undefined' ? undefined : getWidgetOutputs,\n\t\t\t};\n\t\t}\n\t\t\n\t\treturn function compiler(context){\n\t\t\treturn _user_code_.call(context)\n\t\t}\n\n\t\treturn compiler;\n\t`,Xn=(e,t,n,r)=>{const o=Yn(e,n),a={...t,document:{},__errorTracer:e=>{throw new Jn(e.message,e.stack)},__jest:void 0===globalThis.__jest?void 0:globalThis.__jest,___notSupportedMethod:()=>r?.error("This method is not supported."),console:console,setInterval:()=>r?.error("'setInterval' is not supported. Please use a \"Timer\" widget instead."),setTimeout:t?.setTimeout,imageHelpers:Bn,...n===jn.Cloud?{require:Kn(),kemuProcess:process.env.KEMU_PROCESS?process.env.KEMU_PROCESS:{}}:{},jsonp:i,CryptoJS:s,decodeDataType:Dn,window:{addEventListener:t?.addEventListener,removeEventListener:t?.removeEventListener}};try{const e="browser"===(()=>{if(X)return"browser";if(Q)return"node";if(Z)return"worker";throw new Error("Unsupported environment")})()?(e=>e.replace(/[//]{2}[ ]*@kemu-cloud[ \t]*\{[\s\S]*?[//]{2}[ ]*@kemu-cloud[ \t]*\}/gim,""))(o):(e=>e.replace(/[//]{2}[ ]*@kemu-browser[ \t]*\{[\s\S]*?[//]{2}[ ]*@kemu-browser[ \t]*\}/gim,""))(o),t=new Function(e);return{compiledModule:t()(a)}}catch(e){return{error:{name:"CompileError",message:e.message,stack:e.stack}}}},Zn="main",Qn=()=>({pauseExecution:!1,autoPauseOnError:!0,$$eventListeners:{},pages:{[Zn]:{code:"\nconst getWidgetInputs = () => [\n\t{ name: 'Input 1', type: DataType.Number }\n];\n\nconst getWidgetOutputs = () => [\n\t{ name: 'Output 1', type: DataType.Number }\n]\n\nlet counter = 0;\n\nconst processEvent = async (targetPort, sourceWidget, event) => {\n\tif(targetPort.name === 'Input 1'){\n\t\treturn sendToPort('Output 1', {\n\t\t\ttype: DataType.Number,\n\t\t\tvalue: counter++,\n\t\t});\n\t}\n}\n",language:"javascript",name:"My First Script"}},consoleVisible:!1,$$consoleLines:[]}),er=(e,t)=>{const n={message:"Unknown Error"};if(e?.stack){const r=e?.stack?.split(":")[0].trim();n.type=r;const i=(e=>{const t=/,[ ]?<anonymous>:([0-9]+:[0-9]+)\)/gm;let n;for(;null!==(n=t.exec(e));){n.index===t.lastIndex&&t.lastIndex++;const e=n[1].split(":");if(2===e.length)return{line:Number(e[0])||0,column:Number(e[1])||0}}return null})(e.stack);i&&(n.line=i.line-(e=>{const t="___user_code_section___";return Yn(t,e).split(t)[0].split("\n").length+2})(t),n.column=i.column)}return e.message&&(n.message=e.message),n},tr=(e,t)=>{const n={...{...Qn(),...t.getState()},...e?{$$error:e}:void 0};e&&(n.$$consoleLines=[...n.$$consoleLines,{type:"error",text:e.message,timestamp:Date.now(),fileName:Zn}]),t.setState(n)};var nr,rr;!function(e){e.ServiceCreationLog="service-creation-log"}(nr=nr||(nr={})),function(e){e.Service="service",e.ServiceUI="serviceUI"}(rr=rr||(rr={}));const ir=new a,sr=(e,t,n)=>{const r=ie(e,t);if(!r)throw new Error(`Thing ${t} not found in recipe ${e}`);const i=r.gates[n];if(!i)throw new Error(`Widget ${n} not found in thing ${t}`);return i},or=(e,t,n)=>`${t}:${n}:${e}`,ar=e=>`${e}:new-var`,cr=e=>`value-change:${e}`,lr=async(e,t,n,r,i,s,o)=>{const a={...o},c={thingId:n,recipeId:t,variableName:e,changes:s,ownerId:r,callerWidgetId:i,varDefinition:Object.freeze(a)};if(s.includes("added")){const e=ar(n);return ir.emit(e,c)}{const t=or(e,n,r);return s.includes("value")&&(await ir.emit(cr(e),c),await ir.emit(cr("*"),c)),ir.emit(t,c)}},dr=(e,t,n,r)=>{const i=sr(e,t,r);i.variablesListener={...i.variablesListener,[n]:0},pr(e,t)},ur=(e,t,n,r)=>{const i=sr(e,t,r),s={...i.variablesListener};void 0!==i.variablesListener?.[n]&&(delete s[n],i.variablesListener=s)},pr=async(e,t)=>{const n=ie(e,t);if(!n)throw new Error(`Thing "${t}" not found in recipe "${e}"`);const r={...n.variables},i=Object.keys(r);for(const s of i){const i=r[s],o=Object.keys(i);for(const i of o){!n.gates[i]&&(delete r[s][i],await lr(s,e,t,i,void 0,["removed"],null))}0===Object.keys(r[s]).length&&delete r[s]}n.variables=r},hr=(e,t,n)=>{for(const r in t){const i=t[r];if(i.createdByWidgetId===e.id)return i;if(e.type===He.variable&&i.ownerType===He.variable)return i;if(e.type===He.script){const t=i.createdByWidgetId===e.groupId,r=n[i.createdByWidgetId];if(!r)continue;const s=r.groupId===e.groupId;if(t||r.type===He.variable&&s)return i}}return null};var fr=async(e,t,n,r,i,s)=>{const o=ie(e,t);if(!o)throw new Error(`Thing ${t} not found in recipe ${e}`);const a={...o.variables};a[r]=a[r]||{};const c=a[r],l=o.gates[n];if(!l)throw new Error(`Widget ${n} not found in thing ${t}`);const d=Object.values(c);let u=!1,p=!1;const h=async i=>lr(r,e,t,i.createdByWidgetId,n,["value"],i);if(l.type===He.variable){u=!0;for(const e of d)e.ownerType===He.variable&&e.type===i.type&&(e.value=i.value,p=!0,await h(e))}if(l.type===He.script){u=!0;for(const e of d){const t=e.createdByWidgetId===l.groupId,n=o.gates[e.createdByWidgetId],r=n?.type===He.variable,s=n?.groupId===l.groupId;(t||r&&s)&&e.type===i.type&&(e.value=i.value,p=!0,await h(e))}}if(!u){u=!0;for(const e of d){e.createdByWidgetId===n&&e.type===i.type&&(e.value=i.value,p=!0,await h(e))}}if(!s?.skipNotifications&&p){const a=Object.values(o.gates);for(const o of a){if(o.id===n&&s?.skipCallerNotification)continue;const a=o.variablesListener?.[r];void 0!==a&&await Gs({widgetId:o.id,thingId:t,recipeId:e,targetPortName:`${ue}${r}`,data:i})}}},gr=(e,t,n,r)=>{const i=ie(e,t);if(!i)throw new Error(`Thing ${t} not found in recipe ${e}`);if(!r.readerWidgetId&&!r.ownerWidgetId)throw new Error("readerWidgetId or ownerWidgetId must be provided");const s={...i.variables}[n];if(!s)return;if(r.ownerWidgetId){const e=s[r.ownerWidgetId];return e?.value}const o=i.gates[r.readerWidgetId];if(!o)throw new Error(`Widget ${r.readerWidgetId} not found in thing ${t}`);const a=hr(o,s,i.gates);return a?a.value:null},mr=dr,vr=ur,yr=(e,t)=>ir.on(cr(e),(e=>{if(e.varDefinition)return t({type:e.varDefinition.type,value:e.varDefinition.value,varName:e.variableName})}));const br="setTimeout",wr="variableChanged",Sr=e=>{const{recipePoolId:t,thingId:n,scriptWidgetId:r}=e;if(!se(t,n,r))throw new Error(`Widget "${r}" not found in recipe "${t}"`);return{get:(e,i)=>{const s=gr(t,n,e,{readerWidgetId:r});if(null===s){if(void 0===i)throw new Error(`Variable "${e}" is not defined`);return i}return s},set:async(e,i)=>{await fr(t,n,r,e,{type:Ue(i),value:i})},onValueChange:(i,s)=>{if(!e.setState)return void console.warn("Cannot subscribe to variable changes without a setState function");mr(t,n,i,r);const o={...Qn(),...e.getState()};o.$$eventListeners[i]={handler:s,abort:async()=>{vr(t,n,i,r)},name:wr},e.setState(o)}}},Ir="__command-compile__";let _r;const $r=()=>{console.log("Method not implemented")},Cr=(e,t,n)=>{const i=(e,...n)=>{const r={...Qn(),...t.getState()}.$$eventListeners[e];r&&r.handler(n)},s={};return Object.keys(fe).forEach((e=>{s[e]=fe[e]})),{dataTypesEnum:s,notify:{success:e=>{t.getState()?.$$managedUI?.notify?.success(e)},error:e=>{t.getState()?.$$managedUI?.notify?.error(e)},info:e=>{t.getState()?.$$managedUI?.notify?.info(e)}},variablesManager:e.variablesManager?Sr({recipePoolId:n.recipePoolId,scriptWidgetId:n.widgetId,thingId:n.thingId,getState:t.getState,setState:t.setState}):{get:$r,set:async()=>$r(),onValueChange:$r},setTimeout:(n,i,s)=>{if(e.withTimers&&t&&t.setState&&t.registerInterrupt){const e=r(),o={...Qn(),...t.getState()};o.$$eventListeners[e]={handler:n,rejectHandler:s,name:br},t.setState(o),t.registerInterrupt("timeout",e,{timeout:i},void 0,e)}},addEventListener:(e,n)=>{if(t.setState){const s=r(),o={...Qn(),...t.getState()};o.$$eventListeners[s]={handler:n,name:e},t.setState(o),window.addEventListener(e,i.bind(s))}else console.warn(`Cannot remove event listener '${e}' because the widget context is not available.`)},removeEventListener:(e,n)=>{if(t.setState){const r={...Qn(),...t.getState()},i=Object.keys(r.$$eventListeners).find((t=>r.$$eventListeners[t].name===e&&r.$$eventListeners[t].handler===n));t.setState(r),i&&removeEventListener(r.$$eventListeners[i].name,r.$$eventListeners[i].handler)}else console.warn(`Cannot remove event listener '${e}' because the widget context is not available.`)}}},kr=(e,t,n,r)=>{const i={...Qn(),...n.getState()},s=i.pages[Zn].$$compiledCode;if(s)return{compiledModule:s};{const s=Cr(e,n,t);return Xn(i.pages[Zn].code,s,n.recipeType,r)}},Er=e=>e.map((e=>({...e,name:e.name.replace("_","")}))),xr=async(e,t,n)=>{let r={...Qn(),...e.getState()};if(void 0!==n){r.pages[Zn]?.$$compiledCode?.onTerminate&&await(r.pages[Zn].$$compiledCode?.onTerminate());let t=await(async(e,t)=>{const n={...e};for(const r in e)if(e[r].name===br){const e=n[r]?.rejectHandler;if("function"==typeof e)try{await e("TIMER_ABORTED")}catch(e){console.log("Error in reject interrupt handler: ",e)}t.cancelInterrupt(r),delete n[r]}return n})(r.$$eventListeners,e);t=await(async e=>{const t={...e};for(const n in e)if(e[n].name===wr){const r=e[n]?.abort;if("function"==typeof r)try{await r()}catch(e){console.log("Error in abort interrupt handler: ",e)}delete t[n]}return t})(t),r.$$eventListeners=t,r.pages[Zn].$$compiledCode=void 0,r.pages[Zn].code=n,e.setState({...r})}const i=!r.pages[Zn].$$compiledCode,{compiledModule:s,error:o}=kr({variablesManager:!0,withTimers:!0},{recipePoolId:e.recipePoolId,thingId:e.thingRecipeId,widgetId:e.id},{getState:e.getState,setState:e.setState,recipeType:e.recipeType,registerInterrupt:e.registerInterrupt});if(o){console.log("Failed to compile user code");const t=er(o,e.recipeType);return tr(t,e),null}if(s){const n=(e=>{const t=(t,n)=>{if(_r)try{return _r[t](n)}catch(e){return void console.log("Error in custom logger: ",e)}const r={...Qn(),...e.getState()},i=[...r.$$consoleLines||[]];i.push({fileName:Zn,text:n,type:t,timestamp:Date.now()}),i.length>100&&i.splice(0,30),e.setState({...r,$$consoleLines:i})},n={log:e=>{t("log",e)},error:e=>{t("error",e)},warn:e=>{t("warn",e)},info:e=>{t("info",e)}};return n})(e);let o;if(r={...e.getState()},r.pages[Zn].$$compiledCode=s,e.nextGate&&s.setSendToPortFun(e.nextGate),t)try{await s.recipeInit({setState:e.setState,getState:e.getState},n)}catch(t){o=er(t,e.recipeType)}if(e.nextGate&&i)try{await s.main(e.nextGate,n)}catch(t){o=er(t,e.recipeType)}r.$$lastInputs=s.getWidgetInputs?s.getWidgetInputs():[],r.$$lastOutputs=s.getWidgetOutputs?s.getWidgetOutputs():[],e.setState(r),tr(o,e)}};var Ar={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s={...Qn(),...i};if(!s.pages[Zn])return console.warn("Missing default page");if(Be(e?.name||""))return s.$$eventListeners[t.name]?(await s.$$eventListeners[t.name].handler(),s.$$eventListeners[t.name].name===br&&delete s.$$eventListeners[t.name],void r.setState({...s})):void console.log(`Unknown interrupt id [${t.name}] `);if(t.name.startsWith(ue)){const e=t.name.replace(ue,""),r=n.data.value,i=s.$$eventListeners[e];return void(i?.handler&&await i.handler(r))}const o=t.name===Ir;await xr(r,!1,o?n.data.value:void 0);const a=s.pages[Zn].$$compiledCode;if(e&&e.name!==Ir&&a)try{await a.asyncProcessEvent(t,e,n)}catch(e){if("UserCodeError"===e.name){const t=er(e,r.recipeType);throw tr(t,r),t}}},getInputNames:(e,t)=>{const n={...Qn(),...e},{compiledModule:r}=kr({},{recipePoolId:t.recipePoolId,thingId:t.thingRecipeId,widgetId:t.widgetId},{getState:()=>n,recipeType:t.recipeType});if(r?.getWidgetInputs){const e=r.getWidgetInputs();return Er(e)}return e.$$lastInputs||[]},getOutputNames:(e,t)=>{const n={...Qn(),...e},{compiledModule:r}=kr({},{recipePoolId:t.recipePoolId,thingId:t.thingRecipeId,widgetId:t.widgetId},{getState:()=>n,recipeType:t.recipeType});if(r?.getWidgetOutputs){const e=r.getWidgetOutputs();return Er(e)}return e.$$lastOutputs||[]},getDefaultState:Qn,initialize:async e=>{const t=e.getState(),n={...Qn(),...t};n.pages[Zn].code&&await xr({getState:e.getState,id:e.widgetThingId,recipePoolId:e.recipePoolId,recipeType:e.recipeType,registerInterrupt:e.registerInterrupt,setState:e.setState,thingRecipeId:e.thingRecipeId,cancelInterrupt:()=>!0},!0,n.pages[Zn].code)}};const Nr=async(e,t,n,r)=>{e.startsWith("data:image/")||(e=`data:image/png;base64,${e}`);const i=await Pr(e);return((e,t,n,r)=>{const i=r.getContext("2d");if(!i)throw new Error("Failed to get canvas context");const s=e.width,o=e.height;return r.width=t,r.height=n,i.drawImage(e,0,0,s,o,0,0,t,n),i.getImageData(0,0,t,n)})(i,n||i.naturalWidth,r||i.naturalHeight,t)},Pr=e=>new Promise(((t,n)=>{const r=new Image;r.onload=()=>t(r),r.onerror=e=>n(e),r.src=e})),Or=Object.freeze({image:"image"}),Lr=Object.freeze({base64:"base64"}),Tr=()=>({});var Br={onParentEvent:async(e,t,n,r)=>{const i={...r.getState()};if(t.name===Lr.base64){if("string"!=typeof n.data.value)return;if(n.data.type!==fe.String&&n.data.type!==fe.Anything)return;const e=n.data.value;X&&(i.$$memCanvas&&i.$$memCanvas.getContext||(i.$$memCanvas=$e(320,240)));try{const t=await Nr(e,i.$$memCanvas,i.resize?.width,i.resize?.height);return r.setState(i),r.nextGate(Or.image,{type:fe.ImageData,value:t})}catch(e){console.log("[base64ToImageData] Error: ",e)}}},getInputNames:()=>[{name:Lr.base64,type:fe.String}],getOutputNames:()=>[{name:Or.image,type:fe.ImageData}],getDefaultState:Tr};const Dr=Object.freeze({object:"object",error:"error"}),jr=Object.freeze({string:"string"}),Rr=()=>({outputIsArray:!1});var Ur={onParentEvent:async(e,t,n,r)=>{const i={outputIsArray:!1,...r.getState()};if((n.data.type===fe.String||n.data.type===fe.Anything)&&"string"==typeof n.data.value)try{const e=JSON.parse(n.data.value),t=Array.isArray(e);return t&&!i.outputIsArray?r.setState({...i,outputIsArray:!0}):!t&&i.outputIsArray&&r.setState({...i,outputIsArray:!1}),r.nextGate("object",{type:t?fe.Array:fe.JsonObj,value:e})}catch(e){return r.nextGate("error",{type:fe.Boolean,value:!0})}},getInputNames:()=>[{name:jr.string,type:fe.String}],getOutputNames:e=>[{name:Dr.object,type:[fe.JsonObj,fe.Array],label:e.outputIsArray?"array":Dr.object},{name:Dr.error,type:fe.Boolean}],getDefaultState:Rr};const Fr=Object.freeze({string:"string",length:"length"}),Mr=Object.freeze({trigger:"trigger",setText:"setText"}),Wr=()=>({text:"",dispatchOnSet:!1});var Gr={onParentEvent:async(e,t,n,r)=>{const i={text:"",dispatchOnSet:!1,...r.getState()};if(t.name===Mr.setText){if(!((n.data.type===fe.String||n.data.type===fe.Anything)&&"string"==typeof n.data.value))return;if("string"==typeof n.data.value&&(i.text=n.data.value,r.setState(i)),!i.dispatchOnSet)return}const s=r.nextGate(Fr.length,{type:fe.Number,value:i.text.length}),o=r.nextGate(Fr.string,{type:fe.String,value:i.text});await Promise.all([s,o])},getInputNames:e=>{const t=[{name:Mr.setText,type:fe.String}];return e.dispatchOnSet||t.push({name:Mr.trigger,type:fe.Anything}),t},getOutputNames:()=>[{name:Fr.string,type:fe.String},{name:Fr.length,type:fe.Number}],getDefaultState:Wr};const Vr=Object.freeze({image:"image"}),Hr=Object.freeze({image:"image",x:"x",y:"y",width:"width",height:"height"}),zr=()=>({showInputPorts:!1});var qr={onParentEvent:async(e,t,n,r)=>{const i={showInputPorts:!1,...r.getState()};if("number"==typeof n.data.value)return t.name===Hr.x&&(i.cropX=n.data.value),t.name===Hr.y&&(i.cropY=n.data.value),t.name===Hr.width&&(i.cropWidth=n.data.value),t.name===Hr.height&&(i.cropHeight=n.data.value),void r.setState(i);if(t.name===Hr.image){if(n.data.type!==fe.ImageData&&n.data.type!==fe.Anything)return;if(!De(n.data.value))return;const e=n.data.value;if(i.$$memCanvas&&i.$$memCanvas.getContext||(i.$$memCanvas=$e(320,240),i.$$memCanvasContext=Ce(i.$$memCanvas),r.setState(i)),!i.$$memCanvas||!i.$$memCanvasContext)return void console.error("Failed to get canvas or context");let t=e;return i.$$memCanvas.width=e.width,i.$$memCanvas.height=e.height,(i.cropX||i.cropY||i.cropWidth||i.cropHeight)&&(t=((e,t,n,r)=>{if(!n)return e;const i=Math.max(r.x||0,0),s=Math.max(r.y||0,0),o=e.width,a=e.height,c=Math.min(Math.ceil(r.width||o),o),l=Math.min(Math.ceil(r.height||a),a);return t.width=e.width,t.height=e.height,n.putImageData(e,0,0),n.drawImage(t,i,s,c,l,0,0,c,l),n.getImageData(0,0,c,l)})(e,i.$$memCanvas,i.$$memCanvasContext,{x:i.cropX,y:i.cropY,width:i.cropWidth,height:i.cropHeight})),r.nextGate(Vr.image,{type:fe.ImageData,value:t})}},getInputNames:e=>{const t=[{name:Hr.image,type:[fe.ImageData]}];return e.showInputPorts&&(t.push({name:Hr.x,type:fe.Number}),t.push({name:Hr.y,type:fe.Number}),t.push({name:Hr.width,type:fe.Number}),t.push({name:Hr.height,type:fe.Number})),t},getOutputNames:()=>[{name:Vr.image,type:fe.ImageData}],getDefaultState:zr};const Kr=Object.freeze({image:"image"}),Jr=Object.freeze({image:"image",width:"width",height:"height"}),Yr=()=>({showInputPorts:!1});var Xr={onParentEvent:async(e,t,n,r)=>{const i={showInputPorts:!1,...r.getState()};if("number"==typeof n.data.value)return t.name===Jr.width&&(i.width=n.data.value),t.name===Jr.height&&(i.height=n.data.value),void r.setState(i);if(t.name===Jr.image){if(n.data.type!==fe.ImageData&&n.data.type!==fe.Anything)return;if(!De(n.data.value))return;const e=n.data.value;if(i.$$memCanvas&&i.$$memCanvas.getContext||(i.$$memCanvas=$e(320,240),i.$$tempCanvas=$e(320,240),r.setState(i)),!i.$$memCanvas||!i.$$tempCanvas)return;let t=e;return(i.width||i.height)&&(t=((e,t,n,r,i)=>{if(!r&&!i)return e;r&&!i?i=r*(e.height/e.width):!r&&i&&(r=i*(e.width/e.height));const s=Math.max(1,r||e.width),o=Math.max(1,i||e.height);n.width===e.width&&n.height===e.height||(n.width=e.width,n.height=e.height),t.width=s,t.height=o;const a=Ce(t),c=Ce(n);if(!a||!c)throw new Error("Failed to get canvas context");return c.putImageData(e,0,0),a.drawImage(n,0,0,e.width,e.height,0,0,s,o),a.getImageData(0,0,s,o)})(e,i.$$memCanvas,i.$$tempCanvas,i.width,i.height)),r.nextGate(Kr.image,{type:fe.ImageData,value:t})}},getInputNames:e=>{const t=[{name:Jr.image,type:fe.ImageData}];return e.showInputPorts&&(t.push({name:Jr.width,type:fe.Number}),t.push({name:Jr.height,type:fe.Number})),t},getOutputNames:()=>[{name:Kr.image,type:fe.ImageData}],getDefaultState:Yr};const Zr=Object.freeze({value:"value"}),Qr=Object.freeze({trigger:"trigger",setValue:"setValue"}),ei=()=>({value:0,dispatchOnSet:!1});var ti={onParentEvent:async(e,t,n,r)=>{const i={value:0,dispatchOnSet:!1,...r.getState()};if(t.name===Qr.setValue){const e=n.data.type===fe.Number||n.data.type===fe.Anything||n.data.type===fe.String,t=!isNaN(Number(n.data.value))&&!Array.isArray(n.data.value);if(!e||!t)return;if(i.value=Number(n.data.value),r.setState(i),!i.dispatchOnSet)return}return r.nextGate(Zr.value,{type:fe.Number,value:i.value})},getInputNames:e=>{const t=[{name:Qr.setValue,type:fe.Number}];return e.dispatchOnSet||t.push({name:Qr.trigger,type:fe.Anything}),t},getOutputNames:()=>[{name:Zr.value,type:fe.Number}],getDefaultState:ei};const ni=Object.freeze({image:"image"}),ri=Object.freeze({image:"image"}),ii=()=>({anchors:[],vertices:[],matrix:[]}),si={onParentEvent:async(e,t,n,r)=>{const i={anchors:[],vertices:[],matrix:[],...r.getState()},s=window,o=n.data.type===fe.ImageData;if(s.Speedy&&o){const e=s.Speedy,t=n.data.value;let o,d,u,p=i.$$private?.canvas,h=i.$$private?.context,f={...i};const g=4===i.anchors.length;if(i.$$private?.pipeline)o=i.$$private?.pipeline,d=i.$$private?.source;else{o=e.Pipeline(),d=e.Image.Source();const n=e.Image.Sink();u=e.Transform.PerspectiveWarp(),p?p.width===t.width&&p.height===t.height||(p.width=t.width,p.height=t.height,h=p.getContext("2d")):(c=t.width,l=t.height,p=$e(c,l),h=p.getContext("2d")),d.output().connectTo(u.input()),u.output().connectTo(n.input()),o.init(d,n,u);let r=e.Matrix(3,3,[1,0,0,0,1,0,0,0,1]);if(4===i.anchors.length){const t=e.Matrix(2,4,[(a=i.anchors)[0].x,a[0].y,a[1].x,a[1].y,a[2].x,a[2].y,a[3].x,a[3].y]),n=e.Matrix(2,4,i.vertices.reduce(((e,t)=>e.concat([t.x,t.y])),[])),s=e.Matrix.Zeros(3,3);await e.Matrix.perspective(s,t,n);const o=s.read();r=e.Matrix(3,3,o)}u.transform=r,f={...f,$$private:{...f.$$private,canvas:p,context:h,perspective:u,pipeline:o,source:d}}}let m=t;if(g){const e=await(async(e,t)=>{const n=window,r=e.$$private?.source,i=e.$$private?.pipeline;if(n.Speedy&&r&&i){const e=n.Speedy,s=await createImageBitmap(t),o=await e.load(s);return r.media=o,(await i.run()).image.source}return null})(f,m);e&&(p&&h&&(m=((e,t,n)=>(t.width=e.width,t.height=e.height,n.drawImage(e,0,0),n.getImageData(0,0,e.width,e.height)))(e,p,h)),f.$$private&&r.setState({...f,$$private:{...f.$$private,lastInputImage:t}}))}else f.$$private&&r.setState({...f,$$private:{...f.$$private,lastInputImage:t}});return r.nextGate(ni.image,{type:fe.ImageData,value:m})}var a,c,l;console.log("Environment not supported")},getInputNames:()=>[{name:ri.image,type:fe.ImageData}],getOutputNames:()=>[{name:ni.image,type:fe.ImageData}],getDefaultState:ii,terminate:async e=>{const t=e.getState();t.$$private?.pipeline.release()}},oi=()=>({name:"Default widget bundle",description:"",inputs:[{dataType:[fe.Anything],name:"input"}],outputs:[{dataType:[fe.Anything],name:"output"}]});let ai;const ci=()=>{if(!ai)throw new Error(tt(et));return ai};const li=async e=>{const t=new c,n=await t.loadAsync(e),r={};for(const e in n.files)if(!n.files[e].dir){const t=await n.file(e);t&&(r[e]=await t.async("uint8array"))}return r},di={};var ui=e=>di[e]||null;const pi=async(e,t,n)=>{try{const r=ci(),i=n?r.loadBlobAsString:r.loadBlob;return await i(e,t)}catch(e){return null}},hi=async e=>{const t=ce;try{const n=await pi(e,t,!0);if(!n)return null;return Function(n)()}catch(e){return null}},fi=async e=>{const t=le;try{const n=await pi(e,t,!0);if(!n)return null;return JSON.parse(n)}catch(n){return console.log(`Failed to parse the bundle's state [${e}/${t}] %j`,n),null}},gi=(e,t)=>`${e.replace(de,"")}_${t}`,mi=(e,t)=>`widget/${e.replace(de,"")}/v/${t}`,vi=async(e,t)=>{const n=ci(),[r]=await Promise.all([li(e),n.createLocation(t)]);for(const e in r)e.startsWith("__MACOSX")||await n.saveBlob(t,e,r[e])},yi=(e,t)=>{const n=gi(e,t),r=ui(n);return r?{...r}:null},bi=(e,t,n)=>{const r=`${`widget/${e.replace(de,"")}/tmp`}/${t}`;if(n){return ci().getCacheLocation(r)}return r};var wi=yi,Si=async(e,t,n)=>{const r=bi(t,n);await vi(e,r);const i=hi(r),s=fi(r),o=ci(),a=o.getCacheLocation(r),[c,l]=await Promise.all([i,s]);if(!c)return null;let d=l;if(!l){const e=oi(),t=JSON.stringify(e);await o.saveBlob(r,le,Te(t)),d=e}return{cachePath:a,processor:c,storedState:Object.freeze(d)}},Ii=(e,t,n)=>{if(n.isTempStorage)return bi(e,t,n.fullStorageRoot);const r=ci(),i=mi(e,t);return n.fullStorageRoot?r.getCacheLocation(i):i};const _i=()=>oi();var $i={onParentEvent:async(e,t,n,r)=>{const i=r.getState();return i.$$processor?.onParentEvent({sourcePort:e?.name||"",targetPort:t?.name||"",data:n.data},{getState:r.getState,recipeId:r.recipePoolId,recipeType:r.recipeType,setState:r.setState,nextWidget:r.nextGate})},getInputNames:(e,t)=>{const n={..._i(),...e};return n.$$processor?.getInputNames?n.$$processor.getInputNames(e,t):n.inputs.map((e=>({name:e.name,type:e.dataType})))},getOutputNames:(e,t)=>{const n={..._i(),...e};return n.$$processor?.getOutputNames?n.$$processor.getOutputNames(e,t):n.outputs.map((e=>({name:e.name,type:e.dataType})))},getDefaultState:_i,initialize:async(e,t)=>{console.log("Widget bundle initialize",e);let n={...e.getState()},r=n.$$cacheInfo?.widgetThingId||n.collectionInfo?.widgetId||e.widgetThingId;const i=n.$$cacheInfo?.version.toString()||n.collectionInfo?.version.toString()||1;if(n.$$cacheInfo={...n.$$cacheInfo,version:Number(i),widgetThingId:r},!r||!i)throw new Error("Widget bundle state is missing cache id or version");console.log("Loading state from cache");const s=wi(r,i);let o=!s;if(!n.$$processor)if(n.storageUnitId&&!s){const t=await e.getStorageData(n.storageUnitId);if(t){r=e.widgetThingId;const s=await Si(t,r,i);o=!0,s&&(n={...n,$$processor:s.processor,$$cacheInfo:{...n.$$cacheInfo,widgetThingId:r,version:Number(i)}},e.setState(n))}}else if(s){o=!1;const r=n.collectionInfo?{...n.collectionInfo}:void 0;n={...n,...!t.keepCurrentState&&s.storedState?{...s.storedState,...r?{collectionInfo:r}:{}}:{},$$processor:s.processor},e.setState(n)}const a=Ii(r,i,{fullStorageRoot:!0,isTempStorage:o});console.log("Invoking bundle initialize with cache: ",a);try{await(n.$$processor?.initialize({cacheLocation:a,getState:e.getState,setState:e.setState}));const t=e.getState();e.setState({...t,$$initializationError:void 0})}catch(t){const n=e.getState();throw e.setState({...n,$$initializationError:t.message||"An error occurred initializing the widget"}),t}},terminate:async e=>{const t={...e.getState()};console.log(`Terminating widget bundle ${t.name} [${t.$$cacheInfo?.widgetThingId||""}]`);const n=t.$$processor;n&&"function"==typeof n.terminate&&await n.terminate({getState:e.getState,setState:e.setState,recipePoolId:e.recipePoolId,widgetId:e.widgetId})}};const Ci=Object.freeze({event:"event"}),ki="1",Ei="2",xi="3";var Ai={onParentEvent:async(e,t,n,r)=>{const i={...r.getState()};r.setState({...i,$$lastEventType:n.data.type}),await r.nextGate(ki,n.data),await r.nextGate(Ei,n.data),await r.nextGate(xi,n.data)},getInputNames:()=>[{name:Ci.event,type:fe.Anything}],getOutputNames:e=>{const t={type:{...e}.$$lastEventType??fe.Anything};return[{name:ki,...t},{name:Ei,...t},{name:xi,...t}]}};const Ni=Object.freeze({set:"set",trigger:"trigger"}),Pi="value";var Oi={onParentEvent:async(e,t,n,r)=>{const i=r.getState(),s={name:"myVar",type:fe.String,reactive:!0,defaultValue:"",...i};if(t.name.startsWith(ue)){if(!s.reactive)return;if(n.data.type!==s.type)return;return r.nextWidget(Pi,n.data)}if(t.name!==Ni.set){if(t.name===Ni.trigger){const e=gr(r.recipePoolId,r.thingRecipeId,s.name,{ownerWidgetId:r.id}),t=e||s.defaultValue;await r.nextWidget(Pi,{type:s.type,value:t})}}else await fr(r.recipePoolId,r.thingRecipeId,r.id,s.name,n.data,{skipCallerNotification:!s.reactive})},getInputNames:e=>{const t={...e};return[{name:Ni.set,type:t.type||fe.Anything},{name:Ni.trigger,type:fe.Anything}]},getOutputNames:e=>{const t={...e};return[{name:Pi,type:t.type||fe.Anything}]}};let Li;var Ti=e=>{Li=e},Bi=()=>{if(!Li)throw new Error("Hub Connector not set");return Li};const Di=async(e,t=!1)=>{const n=Bi();let r=e.$$$serviceId;if(!e.service)return console.log("Aborting service initialization, missing property `service` in state."),null;if(!r||t){const t=await n.getCompatibleService(e.service.name,e.service.version,"^");if(!t)return null;r=t.sessionId}return r};var ji={onParentEvent:async(e,t,n,r)=>{const i={dynamicInputs:{},dynamicOutputs:{},customState:{},...r.getState()};if(!e)return;const s=Bi();let o=i.$$$serviceId;if(!o){const e=s.getCachedServices().available.find((e=>e.name===i.service?.name&&e.version===i.service?.version));if(!e)return;o=e.sessionId,i.$$$serviceId=o,r.setState(i)}const a=i.service?.variants?.find((e=>e.id===i.variantId)),c=a?i.dynamicInputs[a.id]||a?.inputs||[]:i.service?.inputs||[];if(!c?.length)return;if(!a&&i.service?.ignoreParentEvents)return;const l=i.service?.processingTimeoutSec,d=i.service?.name&&r.eventContext?.[i.service?.name];return s.onParentEvent({recipeId:r.recipePoolId,data:n.data,targetServiceSessionId:o,currentState:i.customState,targetVariantId:i.variantId,target:{portName:t.name,widgetId:r.id,widgetType:r.type},source:e,config:{timeout:l?1e3*l:0,async:i.service?.asyncParentEvents},eventContext:d})},getInputNames:async e=>{const t=e.variantId;if(t&&e.dynamicInputs?.[t])return[...e.dynamicInputs[t]||[]];if(!t)return e.service?.inputs||[];{const n=e.service?.variants?.find((e=>e.id===t));if(n)return n.inputs||[]}return[]},getOutputNames:async e=>{const t=e.variantId;if(t&&e.dynamicOutputs?.[t])return[...e.dynamicOutputs[t]||[]];if(!t)return e.service?.outputs||[];{const n=e.service?.variants?.find((e=>e.id===t));if(n)return n.outputs||[]}return[]},initialize:async e=>{const t={dynamicInputs:{},dynamicOutputs:{},customState:{},...e.getState()},n=Bi(),r=await Di(t);if(r)try{return await n.initializeServiceInstance({recipeId:e.recipePoolId,sessionId:r,widgetId:e.widgetThingId,recipeType:e.recipeType,variantId:t.variantId})}catch(t){if("FNC_NOT_FOUND"!==t?.errCode){if(!!("string"!=typeof t||!t.match('^Function ".*" not found.$')))throw t;console.warn(`Widget [${e.widgetThingId}] does not have an init function.`)}}else console.log(`Aborting service initialization, "${t.service?.name}" was not found in the current Hub.`)},terminate:async e=>{const t={dynamicInputs:{},dynamicOutputs:{},customState:{},...e.getState()},n=Bi(),r=await Di(t,!0);if(r)return n.terminateServiceInstance(r,e.widgetId,e.recipePoolId,t.variantId)}};const Ri=Object.freeze({Image:"image"}),Ui=Object.freeze({Image:"image"}),Fi=()=>({filters:[{name:"grayscale",value:.5,id:"d-1"}]});const Mi="loaded";const Wi={input:it,counter:at,elapsed:dt,ifGate:ft,skipEvent:vt,between:St,map:$t,parser:Et,slider:Nt,suspend:Lt,display:Bt,json:Rt,arrayItem:Mt,extractImage:Vt,imageConvolution:Jt,firstEvent:Qt,pixelDraw:on,randomBetween:dn,arrayCombine:gn,clock:bn,multiplication:_n,object:An,widgetGroup:Ln,script:Ar,base64ToImageData:Br,jsonParse:Ur,text:Gr,imageCrop:qr,imageResize:Xr,value:ti,imageWarp:si,widgetBundle:$i,sequence:Ai,variable:Oi,hubService:ji,imageFilter:{onParentEvent:async(e,t,n,r)=>{const i={filters:[{name:"grayscale",value:.5,id:"d-1"}],...r.getState()};if(t.name===Ri.Image&&n.data.type===fe.ImageData){if(!De(n.data.value))return void console.log("ImageFilter: Invalid image data type, aborting process");const e=n.data.value;i.$$memCanvas||(i.$$memCanvas=$e(e.width,e.height)),i.$$context||(i.$$context=i.$$memCanvas.getContext("2d")),i.$$memCanvas.width!==e.width&&(i.$$memCanvas.width=e.width),i.$$memCanvas.height!==e.height&&(i.$$memCanvas.height=e.height),r.setState(i),i.$$context.putImageData(e,0,0),i.filters.length?i.$$context.filter=i.filters.map((e=>`${e.name}(${e.value}${"blur"===e.name?"px":""})`)).join(" "):i.$$context.filter="none",i.$$context.drawImage(i.$$memCanvas,0,0);const t=i.$$context.getImageData(0,0,e.width,e.height);return r.nextWidget(Ui.Image,{type:fe.ImageData,value:t})}},getInputNames:()=>[{name:Ri.Image,type:fe.ImageData}],getOutputNames:()=>[{name:Ui.Image,type:fe.ImageData}],getDefaultState:Fi},recipeLoad:{onParentEvent:async(e,t,n,r)=>r.nextWidget(Mi,{value:!0,type:fe.Boolean}),getInputNames:()=>[],getOutputNames:()=>[{name:Mi,type:fe.Boolean,description:"Triggered when the recipe is fully loaded"}]},note:{onParentEvent:async()=>{},getInputNames:()=>[],getOutputNames:()=>[],getDefaultState:()=>({text:"",color:"#eac43e",size:{width:300,height:200}})},play:{getInputNames:()=>[],onParentEvent:()=>Promise.resolve(),getOutputNames:()=>[{name:"out",type:fe.Boolean}]}},Gi={},Vi=async()=>{if(!Object.keys(Gi).length)for(const e in Wi){const t=Wi[e];Gi[e]=Object.freeze({...t})}};var Hi=e=>{if(Gi[e])return Gi[e];throw new Error(tt(Qe,e))},zi=Vi;const qi=new a,Ki="invoked";let Ji={},Yi={},Xi={},Zi={};const Qi=(e,t,n)=>`${e}-${t}${n?`-${n}`:""}`;var es=(e,t,n,r,i)=>{const s=Qi(e,t,n),o=Qi(e,t),a=Qi(e,t,"produced"),c=Xi[o],l=Date.now();Zi[o]=l,Ji[s]={data:r,sourcePortName:n,...i?{target:{widgetId:i.widgetId,portName:i.portName}}:{}},qi.emit(a,{currentTime:l,prevTime:c,...i?{targetPort:i?.portName}:{}})},ts=(e,t,n,r,i)=>{const s=Qi(e,t,n),o=Qi(e,t),a=Qi(e,t,Ki),c=Xi[o],l=Date.now();Xi[o]=l,Yi[s]={data:r,sourcePortName:n,...i?{source:{widgetId:i.widgetId,portName:i.portName}}:{}},qi.emit(a,{prevTime:c,currentTime:l,targetPort:n,sourceInfo:i})},ns=()=>{Ji={},Yi={},Xi={},Zi={},qi.clearListeners()};const rs={};let is={};const ss=new a;let os=!1,as=!1,cs=!1,ls=null,ds=null;const us="processing-state-change",ps="error-event",hs={abortRequested:!1,isPaused:!1,pausePromise:null,pausePromiseResolve:null,lastPausedWidgetId:null},fs=e=>(ds=e,ss.emit(us,e)),gs=(e,t)=>`${e}-${t}`,ms=(e,t)=>`state-change:${gs(e,t)}`,vs=e=>{const{thingId:t,widgetId:n}=e,r=gs(t,n);return rs[r]||{isProcessing:!1}},ys=()=>{hs.abortRequested=!1,hs.isPaused=!1},bs=e=>(hs.pausePromise||(hs.isPaused=!0,hs.pausePromise=new Promise((e=>{hs.pausePromiseResolve=e})),e&&(hs.lastPausedWidgetId=e),fs({isProcessing:!0,isPaused:!0,...e?{pauseTrapWidgetId:e}:{}})),hs.pausePromise);var ws=async e=>{const{thingId:t,widgetId:n}=e,r=gs(t,n),i=ms(t,n),s=vs({thingId:t,widgetId:n});if(s.isProcessing)return;const o={isProcessing:!0,isPaused:!1,startTime:Date.now()};rs[r]=o,os||(os=!0,ls=null,await fs({isProcessing:!0,isPaused:!1})),await ss.emit(i,{thingId:t,widgetId:n,prevState:s,newState:o})},Ss=async e=>{const{thingId:t,widgetId:n,error:r}=e,i=gs(t,n),s=ms(t,n),o=vs({thingId:t,widgetId:n}),a={isProcessing:!1,isPaused:!1,startTime:o.startTime,endTime:Date.now(),error:r};rs[i]=a,await ss.emit(s,{thingId:t,widgetId:n,prevState:o,newState:a}),r&&(ls=r,await ss.emit(ps,r)),os&&0===Object.values(rs).filter((e=>e.isProcessing)).length&&(os=!1,as=!1,ys(),await fs({isProcessing:!1,isPaused:!1}))},Is=()=>{os=!1;for(const e in rs)delete rs[e];hs.abortRequested=!1,hs.isPaused=!1,hs.pausePromise=null,hs.pausePromiseResolve=null,hs.lastPausedWidgetId=null,ss.clearListeners()},_s=()=>hs.abortRequested,$s=e=>{hs.lastPausedWidgetId=e,hs.isPaused=!0,fs({isProcessing:!0,isPaused:!0,pauseTrapWidgetId:e})},Cs=()=>as||cs?null:hs.pausePromise,ks=e=>cs?null:is[e]??null,Es=()=>as,xs=e=>bs(e);let As={},Ns={},Ps=null;const Os=(e,t)=>{const n=(()=>{if(null===Ps)throw new Error("Recipe execution type not set, please set the execution type using `setRecipeExecutionType`");return Ps===jn.Desktop})();let r=n?Ns[e]:void 0;return r||(r=(e=>{const{widgets:t,targetId:n,allowedTypes:r}=e;if(!t[n])return[];const i=new Set;Object.values(t).forEach((e=>{e.children?.forEach((e=>i.add(e.childId)))}));const s=Object.keys(t).filter((e=>!i.has(e))),o=s.length>0?s:Object.keys(t),a=[],c=(e,i,s)=>{if(s.has(e))return;s.add(e);const o=t[e],l=!r||r.includes(o.type),d=[...i];l&&d.push(e),e===n?a.push(d.join("/")):o.children?.forEach((e=>c(e.childId,d,s))),s.delete(e)};return o.forEach((e=>c(e,[],new Set))),[...new Set(a)]})({widgets:t,targetId:e,allowedTypes:[He.hubService]}),n&&(Ns[e]=r)),r},Ls=(e,t,n)=>{Os(t,n).forEach((n=>{As[n]={eventContext:e,widgetId:t}}))},Ts=(e,t)=>{const n=t[e].state,r=n.service?.name;if(!r)return[];const i=Os(e,t),s=new Map;for(const e of i){const n=e.split("/");let i="";for(let e=0;e<n.length-1;e++){i=0===e?n[e]:`${i}/${n[e]}`;const o=As[i];if(o&&!s.has(o.widgetId)){const e=t[o.widgetId].state;e.service?.name===r&&s.set(o.widgetId,{path:i,data:o,pathSegments:i.split("/").length})}}}return Array.from(s.values())},Bs=()=>{As={}},Ds=e=>{Ps=e},js=()=>{As={},Ns={}};let Rs,Us,Fs,Ms=!1,Ws=0;const Gs=async e=>{const{widgetId:t,thingId:n,recipeId:r,targetPortName:i,data:s}=e,o=ie(r,n);if(!o)return;const a=o.gates[t];if(!a||a.disabled)return;const c={...s,timestamp:Date.now()},l=Hi(a.type),d=qs({gateId:t,originalEvent:c,blockRecipeId:o.recipeId,blockDbId:o.id,blockVersion:o.version,recipeId:r});if(d&&l.onParentEvent){const e={name:i};return Rs&&await Rs({recipeId:r,blockId:o.recipeId,gateId:t,targetPort:e.name,data:s}),l.onParentEvent(null,e,{originalEvent:c,data:{...c}},d)}},Vs=async e=>{const{interruptDriven:t,childGateId:n,recipeId:r,sourcePortName:i,targetPort:s,data:o,sourceOutputNames:a,sourceGateId:c}=e;let{originalEvent:l,block:d}=e;if(!t&&!c)throw new Error("Missing parameter ['sourceGateId']");if(!t&&!l)throw new Error("Missing parameter ['originalEvent']");t&&(l={timestamp:Date.now(),type:fe.Boolean,value:!0});const u=l;if("string"==typeof d){const e=ie(r,d);if(!e)return;d=e}const p=d.gates[n];if(!p||p.disabled)return;const h=a.findIndex((e=>e.name===i)),f=Hi(p.type),g=qs({gateId:n,originalEvent:u,blockRecipeId:d.recipeId,blockDbId:d.id,blockVersion:d.version,recipeId:r});if(g&&f.onParentEvent&&-1!==h){Rs&&await Rs({recipeId:r,blockId:d.recipeId,gateId:n,targetPort:s.name,data:o,sourceGate:t?"interrupt_widget":c,sourcePort:t?ae:i});const e={name:a[h].name,type:a[h].type,...a[h].jsonShape?{jsonShape:a[h].jsonShape}:void 0};return ts(d.recipeId,n,s.name,o,c?{widgetId:c,portName:i}:void 0),f.onParentEvent(e,s,{originalEvent:u,data:o},g)}},Hs=async e=>{const{portName:t,originalEvent:n,data:r,currentGateId:i,blockRecipeId:s,thingDbId:o,thingVersion:a,recipeId:c,eventContext:l}=e,d=re(c);if(!d)throw new Error(`Failed to find recipe "${c}" in cache`);const u=d.dbInfo.recipeType,p=se(c,s,i);if(!p)return;const h={...r,timestamp:n.timestamp},f=Hi(p.type);let g;g=p.type===He.input?f.getOutputNames(p.state,{thingRecipeId:s,thingDbId:o,thingVersion:a,id:i,recipeId:c,recipeType:u,recipePoolId:c}):await f.getOutputNames(p.state,{recipePoolId:c,recipeType:u,thingRecipeId:s,widgetId:i});const m=g.findIndex((e=>e.name===t));if(-1!==m){const e=ie(c,s);if(!e)return;es(s,i,t,h);let r=null;const o=p.children.length;if(p.type===He.hubService&&l){const t=p.state,n=t.service?.name;n&&Ls(l,p.id,e.gates)}try{for(let a=0;a<o;a++){const o=e.gates[p.children[a].childId];if(o?.disabled)continue;const l=We(p.children[a]?.sourcePort),d=We(p.children[a]?.targetPort);if(l.portName===t&&o&&!o.disabled){if(Ms&&Cs()&&($s(o.id),await Cs()),ks(o.id)&&!Es()&&"innerInput"!==d?.portType){const e=xs(o.id);await e}if(Ms&&_s())break;const a=Hi(o.type);let l;const f={recipePoolId:c,recipeType:u,thingRecipeId:s,widgetId:i};l=o.type===He.hubService?await a.getInputNames(o.state,f):a.getInputNames(o.state,f);const m=l.find((e=>e.name===d.portName));if(m){Ms&&await ws({thingId:s,widgetId:o.id}),Ws++;if(!await Vs({interruptDriven:!1,childGateId:o.id,block:e,recipeId:c,sourcePortName:t,targetPort:{name:m.name},data:p.returnOriginalEvent?n:h,sourceOutputNames:g,sourceGateId:p.id,originalEvent:n}).then((()=>!0)).catch((e=>{const n="string"==typeof e?e:e.message||JSON.stringify(e);return r={targetWidgetId:o.id,targetPortName:m.name,sourcePortName:t,error:n},!1})).finally((()=>{if(Ws--,Ms)return Ss({thingId:s,widgetId:o.id,error:r})})))break}}}}catch(e){console.error(`Error processing next widget [${i}]: ${e}`)}finally{Ws<0&&(console.warn("Active execution counter is negative, this should never happen"),Ws=0),0===Ws&&Bs()}}},zs=async(e,t,n,r)=>{const i=re(r);if(!i)return null;const s=ie(r,n);if(!s)return s;const o=s.gates,a=s.gates[t],c=Hi(a.type),l=await c.getInputNames(a.state,{recipePoolId:r,recipeType:i.dbInfo.recipeType,thingRecipeId:n,widgetId:t}),d=l.findIndex((t=>t.name===e));if(-1!==d){const e=((e,t,n)=>{for(const r in n){const i=n[r],s=i.children.length;for(let n=0;n<s;n++){const r=i.children[n],s=We(r.targetPort);if(r.childId===e&&s.portName===t)return i}}return null})(t,l[d].name,o);if(e){const t=Hi(e.type);return{getValue:()=>"function"==typeof t.getValue?t.getValue():null}}}return null},qs=e=>{const{gateId:t,originalEvent:n,blockRecipeId:r,blockDbId:i,blockVersion:s,recipeId:o}=e,a=re(o);if(!a)throw new Error(`Failed to find recipe "${o}" in cache`);const c=se(o,r,t);if(!c)return console.warn(`Gate ${t} not found in block ${r} for recipe ${o}`),null;const l=async(e,a)=>Hs({portName:e,originalEvent:n,data:a,currentGateId:t,blockRecipeId:r,thingDbId:i,thingVersion:s,recipeId:o}),d=c.type===He.hubService,u=d?Ts(t,a.blocks[r].gates):[],p=u.reduce(((e,t)=>e.pathSegments>t.pathSegments?e:t),u[0]),h={id:t,type:c.type,recipePoolId:o,thingRecipeId:r,recipeType:a.dbInfo.recipeType,returnOriginalEvent:!!c.returnOriginalEvent,registerInterrupt:(e,n,i,s,a)=>Ye.createInterrupt(e,o,r,t,n,i,s,a),cancelInterrupt:e=>Ye.destroyInterrupt(e),nextWidget:l,nextGate:l,getParentAtPort:e=>zs(e,t,r,o),getState:()=>Object.freeze({...c.state,...c.type===He.input&&{customInputs:[]}}),setState:e=>{if("object"!=typeof e)return void console.warn(`Invalid state type [${typeof e}]. Expected an 'object'`);const n={...e,...c.type===He.input&&!e.customInputs&&{customInputs:[]}},i={...c.state};c.state=n,Us&&Us({blockId:r,gateId:t,prevState:i,newState:{...n},recipeId:o})},...d&&p&&{eventContext:p.data.eventContext}};return h};Ye.setInvokeChildGateCb((async(e,t,n,r,i,s,o,a,c,l)=>Vs({interruptDriven:e,childGateId:t,block:n,recipeId:r,sourcePortName:i,targetPort:s,data:o,sourceOutputNames:a,sourceGateId:c,originalEvent:l})));const Ks=new a,Js="invoked",Ys="state",Xs=()=>{Ye.destroyAllInterrupts()},Zs=async(e,t,n)=>{const r=re(e),i=se(e,t,n);if(i&&r){const s=Hi(i.type);if(s&&"function"==typeof s.terminate){const i=((e,t,n,r)=>Xe(e,t,n,r))(e,r.dbInfo.recipeType,t,n);if(i)try{await s.terminate(i)}catch(e){console.warn(`Error terminating widget "${n}" in thing "${t}". Failing silently: `,e)}}}},Qs=async(e,t,n,r)=>{const i=re(e),s=se(e,t,n);if(s&&i){const o=Hi(s.type);if(o&&"function"==typeof o.initialize){const s=((e,t,n,r)=>Xe(e,t,n,r,!0))(e,i.dbInfo.recipeType,t,n);if(s){const e=o.initialize;try{await e(s,r||{})}catch(e){throw console.warn(`Error initializing widget "${n}" in thing "${t}": `,e),e}}}}},eo=(e,t)=>{const n=re(t);if(n)for(const t in n.blocks){const r=n.blocks[t];for(const t in r.gates)if(t===e)return{widget:r.gates[t],thing:r}}return null},to=(e,t="",n="")=>`block:${t}:gate:${n||""}:${e}`,no=e=>{Ks.emit(to(Ys),e),Ks.emit(to(Ys,e.blockId,e.gateId),e)};Rs=async e=>{await Ks.emit(to(Js),e),await Ks.emit(to(Js,e.blockId,e.gateId),e)},(e=>{Us=e})(no);var ro,io,so,oo,ao,co,lo,uo,po,ho,fo,go,mo,vo=async(e,t,n,r,i)=>{const s=oe(e,{id:t,authorId:r,version:n,recipeType:i});ns(),js(),Ds(i);const o=re(s);return o&&(o.startedAt=Date.now(),o.retryAttempts=0,o.execCounter=0,o.status=Y.STARTING,o.addLog("recipe registered")),s},yo=async e=>{const t=re(e);var n;if(!t)return null;t.addLog("terminating recipe"),Xs(),Is();for(const n in t.blocks){const r=t.blocks[n];for(const t in r.gates)await Zs(e,n,t)}ee[n=e]&&delete ee[n]},bo=async(e,t)=>{const n=re(e),r=[],i=[];if(n)for(const s in n.blocks){const o=n.blocks[s];if(!t||!Array.isArray(t)||t.includes(s))for(const t in o.gates)try{if(n.dbInfo?.recipeType===jn.Desktop){const e=o.gates[t];if(e.type===He.hubService){const r=e.state;if(r?.service?.webOnly){n?.addLog(`skipping initialization of web-only widget "${t}"`);continue}}e.type===He.recipeLoad&&i.push(e)}await Qs(e,s,t,{keepCurrentState:!0})}catch(e){r.push({widgetId:t,error:e.message})}}return{failed:r,sendToInputWidget:(t,n,r=pe)=>(async(e,t,n,r)=>{const i=re(n),s=ie(n,r),o=Date.now();if(s&&i)for(const i in s.gates){const a=s.gates[i];if(a.type===He.input&&!a.disabled){const c=a.state.inputName||"";if(c===e){const e=Hi(a.type),l={...t,timestamp:o},d=qs({gateId:i,originalEvent:l,blockRecipeId:r,blockDbId:s.id,blockVersion:s.version,recipeId:n});if(d&&e.processEvent){const s={...d,getState:d.getState};Rs&&await Rs({recipeId:n,blockId:r,gateId:i,targetPort:rt,data:t}),Fs?await Fs(r,n,c,t):await e.processEvent(l,s)}}}}})(t,n,e,r),invokeRecipeLoadedWidgets:async()=>{for(const t of i)await Gs({widgetId:t.id,thingId:pe,recipeId:e,targetPortName:Mi,data:{type:fe.Boolean,value:!0}})}}},wo=e=>{Ti(e)},So=(e,t,n,r=!1)=>{const i=eo(t,e);if(i){const{widget:s,thing:o}=i,a={...s.state};s.state=n,r&&no({blockId:o.recipeId,gateId:t,recipeId:e,newState:{...n},prevState:a})}},Io=(e,t)=>{const n=eo(t,e);return n?n.widget.state:null},_o=async e=>{const{recipePoolId:t,currentGateId:n,sourcePortName:r,originalEvent:i,data:s,eventContext:o}=e,a=eo(n,t);if(a)return Hs({portName:r,originalEvent:i,data:s,currentGateId:n,blockRecipeId:a.thing.recipeId,thingDbId:a.thing.id,thingVersion:a.thing.version,recipeId:t,eventContext:o})};!function(e){e.Seats="seats",e.RecipeInvocations="recipe_invocations",e.HubServices="hub_services",e.RecipeExports="recipe_exports"}(ro||(ro={})),function(e){e.UserFriendlyName="user_friendly_name",e.UserFriendlyDescription="user_friendly_description",e.InternalDescription="internal_description",e.TierLevel="tier_level",e.ProductFeatures="product_features",e.UserSubscribeCode="subscription_code"}(io||(io={})),function(e){e.Browser="browser",e.Cloud="cloud",e.Desktop="desktop"}(so||(so={})),function(e){e.Bundle="bundle",e.Group="group"}(oo||(oo={})),function(e){e.Hardware="hardware",e.Virtual="virtual"}(ao||(ao={})),function(e){e.Cloud="cloud",e.Web="web"}(co||(co={})),function(e){e.Cpu_128M="kmu-cpu-128m",e.Cpu_256M="kmu-cpu-256m",e.Cpu_512M="kmu-cpu-512m",e.Cpu_1024M="kmu-cpu-1024m",e.Cpu_2048M="kmu-cpu-2048m",e.Cpu_4096M="kmu-cpu-4096m"}(lo||(lo={})),function(e){e.Gateway="gateway",e.Timer="timer"}(uo||(uo={})),function(e){e.InstallInProgress="installation-in-progress"}(po||(po={})),function(e){e.InstallDependencies="install-dependencies",e.GetInstalledDependencies="get-installed-dep"}(ho||(ho={})),function(e){e.Success="success",e.Error="error",e.Pending="pending"}(fo||(fo={})),function(e){e.NotFound="not-found",e.BadRequest="bad-request",e.Forbidden="forbidden",e.InternalError="internal-error"}(go||(go={})),function(e){e.KeyCreated="key_created",e.ValidateKey="validate_key",e.ExecuteRecipe="execute_recipe",e.InstallHubService="install_hub_service",e.UninstallHubService="uninstall_hub_service",e.ExportRecipe="export_recipe"}(mo||(mo={}));const $o=(e,t)=>((e,t,n)=>{const r=Buffer.from(n,"base64"),i=r.subarray(0,16),s=r.subarray(16).toString("base64"),o=d(e,t,32),a=u("aes-256-cbc",o,i);let c=a.update(s,"base64","utf8");return c+=a.final("utf8"),c})(e.id||"recipe.kemu","kemu",t),Co=e=>{try{return JSON.parse(e)}catch(e){return null}},ko="undefined"!=typeof window,Eo={protocolPrefix:4,protocolVersion:1,jsonLength:4,binaryLength:4,fromServiceId:4,toServiceId:4,sentAt:8},xo={protocolPrefix:4,txtLength:4},Ao=Object.values(Eo).reduce(((e,t)=>e+t),0),No=Object.values(xo).reduce(((e,t)=>e+t),0),Po=["width","height","colorSpace"],Oo=(e,t)=>{const n={},r=[];let i=0,s=Array.isArray(e)?[]:{};const o=(e,s)=>{const a=(e=>{const t="undefined"!=typeof Buffer&&e instanceof Buffer,n=e instanceof ArrayBuffer,r=e instanceof Uint8ClampedArray,i=e instanceof Uint8Array,s=e instanceof Int8Array;return t?"Buffer":n?"ArrayBuffer":r?"Uint8ClampedArray":i?"Uint8Array":s?"Int8Array":null})(e);if(!a){if(Array.isArray(e)){const t=[];for(let n=0;n<e.length;n++)t[n]=o(e[n],`${s}[${n}]`);return t}if("object"==typeof e){const t={},n=(e=>{const t=e instanceof Int16Array,n=e instanceof Uint16Array,r=e instanceof Int32Array,i=e instanceof Uint32Array,s=e instanceof Float32Array,o=e instanceof Float64Array,a=e instanceof BigInt64Array,c=e instanceof BigUint64Array;return t?"Int16Array":n?"Uint16Array":r?"Int32Array":i?"Uint32Array":s?"Float32Array":o?"Float64Array":a?"BigInt64Array":c?"BigUint64Array":null})(e);if(n)throw new Error(`Unsupported binary type [${n}] at path "${s}"`);for(const n in e)e.hasOwnProperty(n)||Po.includes(n)||console.warn(`Allowing inherited property: ${n} from path: ${s}`),t[n]=o(e[n],`${s.length?`${s}.`:""}${n}`);return t}return e}n[s]={index:i,length:e.byteLength,binaryType:a},"Buffer"===t?r.push(Buffer.from(e)):"ArrayBuffer"===a?r.push(e):r.push(e.buffer),i+=e.byteLength};s=o(e,"");let a=null;if(r.length>1)if("ArrayBuffer"===t){const e=r.reduce(((e,t)=>e+t.byteLength),0),t=new Uint8Array(e);let n=0;for(let e=0;e<r.length;e++)t.set(new Uint8Array(r[e]),n),n+=r[e].byteLength;a=t.buffer}else{a=Buffer.concat(r)}else 1===r.length&&(a=r[0]);return a?{map:n,combinedData:a,sourceCopy:s}:null},Lo=(e,t,n)=>{const r=t.match(/(\[\d+\])|([^[\].]+)/g)||[];let i=e;for(let e=0;e<r.length;e++){let t=r[e];const s=t.startsWith("[")&&t.endsWith("]"),o=e===r.length-1;if(s){t=t.slice(1,-1);const s=parseInt(t,10);if(!Array.isArray(i))throw new Error(`Expected an array at key "${r.slice(0,e).join(".")}" but found an object.`);o?i[s]=n:(i[s]||(i[s]=r[e+1].startsWith("[")?[]:{}),i=i[s])}else o?i[t]=n:(i[t]||(i[t]=r[e+1].startsWith("[")?[]:{}),i=i[t])}return e},To=(e,t,n)=>{const r="undefined"!=typeof Buffer,i=t instanceof Uint8Array;for(const s in n)if(n.hasOwnProperty(s)){const{index:o,length:a,binaryType:c}=n[s];let l=null;if(r&&t instanceof Buffer)switch(c){case"Buffer":l=t.subarray(o,o+a);break;case"ArrayBuffer":l=t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength).slice(o,o+a);break;case"Uint8Array":l=new Uint8Array(t.subarray(o,o+a));break;case"Uint8ClampedArray":l=new Uint8ClampedArray(t.subarray(o,o+a));break;case"Int8Array":l=new Int8Array(t.subarray(o,o+a))}else if(t instanceof ArrayBuffer||t instanceof Uint8Array)switch(c){case"Buffer":if(r){l=Buffer.from(t.slice(o,o+a));break}case"ArrayBuffer":l=i?t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength).slice(o,o+a):t.slice(o,o+a);break;case"Uint8Array":l=i?t.slice(o,o+a):new Uint8Array(t.slice(o,o+a));break;case"Uint8ClampedArray":l=new Uint8ClampedArray(t.slice(o,o+a));break;case"Int8Array":l=new Int8Array(t.slice(o,o+a))}l&&Lo(e,s,l)}return e},Bo=e=>f(e),Do="KMSG",jo="KCMD",Ro=Bo("klProtocol");var Uo={encode:(e,t,n)=>{const r={json:e.json},i=Oo(r.json,"Buffer"),s=i?.combinedData;i&&(r.jsonBinaryMap=i.map,r.json=i.sourceCopy);const o=s?s.byteLength:0,a=JSON.stringify(r),c=Buffer.from(a),l=c.byteLength,d=Eo.protocolPrefix+Eo.protocolVersion+Eo.jsonLength+Eo.binaryLength+Eo.fromServiceId+Eo.toServiceId+Eo.sentAt+l+o,u=Buffer.alloc(d),p=Date.now();let h=0;return u.write(Do,h),h+=Eo.protocolPrefix,u.writeUInt8(1,h),h+=Eo.protocolVersion,u.writeUInt32LE(l,h),h+=Eo.jsonLength,u.writeUInt32LE(o,h),h+=Eo.binaryLength,u.writeUInt32LE(t,h),h+=Eo.fromServiceId,u.writeUInt32LE(n,h),h+=Eo.toServiceId,u.writeBigInt64LE(BigInt(p),h),h+=Eo.sentAt,c.copy(u,h),h+=l,s&&o&&s.copy(u,h),u},decodeHeader:e=>{let t=0;const n=e.toString("utf-8",t,Eo.protocolPrefix);if(t+=Eo.protocolPrefix,n!==Do)return null;if(e.byteLength<Ao)return Ro(`Received a Partial Header with ${e.byteLength} bytes. Waiting for more data.`),{partialHeader:!0,remaining:null};const r=e.readUInt8(t);t+=Eo.protocolVersion;const i=e.readUInt32LE(t);t+=Eo.jsonLength;const s=e.readUInt32LE(t);t+=Eo.binaryLength;const o=e.readUInt32LE(t);t+=Eo.fromServiceId;const a=e.readUInt32LE(t);t+=Eo.toServiceId;const c=e.readBigInt64LE(t);t+=Eo.sentAt;const l=i+s,d=e.subarray(t,t+l),u=e.subarray(0,Ao);let p=null;return e.byteLength-Ao-i-s>0&&(p=e.subarray(Ao+i+s)),{header:{protocolVersion:r,jsonLength:i,binaryLength:s,fromServiceId:o,toServiceId:a,sentAt:new Date(Number(c)),packages:[d],headerPackage:u},remaining:p}},decodeFullKlMessage:e=>{const t=Buffer.concat(e.packages),n=t.subarray(0,e.jsonLength).toString(),r=t.subarray(e.jsonLength,e.jsonLength+e.binaryLength),i=Co(n);if(!i?.json)return Ro("Invalid JSON in KL message"),null;i.jsonBinaryMap&&r.byteLength&&To(i.json,r,i.jsonBinaryMap);const s=Buffer.concat([e.headerPackage,t]);let o=s,a=null;const c=Ao+e.jsonLength+e.binaryLength;return s.byteLength>c&&(a=s.subarray(c),o=s.subarray(0,c)),{message:{json:i.json,rawMessage:o},remaining:a}},patchEncodedHeader:(e,t)=>{if(null==t.fromServiceId&&void 0===t.toServiceId)return e;if(e.byteLength<Ao)return Ro("Invalid Header Size"),e;let n=0;return n+=Eo.protocolPrefix,n+=Eo.protocolVersion,n+=Eo.jsonLength,n+=Eo.binaryLength,void 0!==t.fromServiceId&&e.writeUInt32LE(t.fromServiceId,n),n+=Eo.fromServiceId,void 0!==t.toServiceId&&e.writeUInt32LE(t.toServiceId,n),e},encodeCommand:e=>{let t=0;const n=Buffer.from(e),r=n.byteLength,i=No+r,s=Buffer.alloc(i);return s.write(jo,t),t+=xo.protocolPrefix,s.writeUint32LE(r,t),t+=xo.txtLength,n.copy(s,t),s},decodeCommand:e=>{let t=0;if(e.byteLength<No)return{command:null};const n=e.toString("utf-8",t,xo.protocolPrefix);if(t+=xo.protocolPrefix,n!==jo)return{command:null};const r=e.readUInt32LE(t);t+=xo.txtLength;const i=e.toString("utf-8",t,t+r),s=e.byteLength-No-r;let o=null;s>0&&(o=e.subarray(No+r));let a=0;return s<0&&(a=Math.abs(s)),{command:i,remainingData:o,missing:a}}};const Fo="KMSG",Mo="KCMD",Wo=Bo("klProtocol"),Go=new TextEncoder;var Vo={encode:(e,t,n)=>{const r={json:e.json},i=Oo(e.json,"ArrayBuffer"),s=i?.combinedData;i&&(r.jsonBinaryMap=i.map,r.json=i.sourceCopy);const o=s?s.byteLength:0,a=JSON.stringify(r),c=Go.encode(a),l=c.byteLength,d=new ArrayBuffer(Eo.protocolPrefix+Eo.protocolVersion+Eo.jsonLength+Eo.binaryLength+Eo.fromServiceId+Eo.toServiceId+Eo.sentAt+l+o),u=new DataView(d),p=new Uint8Array(d),h=Date.now();let f=0;for(let e=0;e<4;++e)p[f++]=Fo.charCodeAt(e);return u.setUint8(f,1),f+=Eo.protocolVersion,u.setUint32(f,l,!0),f+=Eo.jsonLength,u.setUint32(f,o,!0),f+=Eo.binaryLength,u.setUint32(f,t,!0),f+=Eo.fromServiceId,u.setUint32(f,n,!0),f+=Eo.toServiceId,u.setBigInt64(f,BigInt(h),!0),f+=Eo.sentAt,p.set(c,f),f+=l,s&&o&&p.set(new Uint8Array(s),f),d},decodeHeader:e=>{const t=new DataView(e);let n=0,r="";for(let e=0;e<Eo.protocolPrefix;++e)r+=String.fromCharCode(t.getUint8(n++));if(r!==Fo)return null;if(e.byteLength<Ao)return Wo.log(`Received a Partial Header with ${e.byteLength} bytes. Waiting for more data.`),{partialHeader:!0,remaining:null};const i=t.getUint8(n);n+=Eo.protocolVersion;const s=t.getUint32(n,!0);n+=Eo.jsonLength;const o=t.getUint32(n,!0);n+=Eo.binaryLength;const a=t.getUint32(n,!0);n+=Eo.fromServiceId;const c=t.getUint32(n,!0);n+=Eo.toServiceId;const l=t.getBigInt64(n,!0);n+=Eo.sentAt;const d=s+o,u=e.slice(n,n+d),p=new Uint8Array(e,0,Ao);let h=null;if(e.byteLength-Ao-s-o>0){h=new Uint8Array(e,Ao+s+o).slice().buffer}return{header:{protocolVersion:i,jsonLength:s,binaryLength:o,fromServiceId:a,toServiceId:c,sentAt:new Date(Number(l)),packages:[u],headerPackage:p.slice().buffer},remaining:h}},decodeFullKlMessage:e=>{const t=e.packages.reduce(((e,t)=>e+t.byteLength),0),n=new Uint8Array(t);let r,i=0;for(const t of e.packages)r=new Uint8Array(t),n.set(r,i),i+=r.byteLength;const s=(new TextDecoder).decode(n.subarray(0,e.jsonLength)),o=n.subarray(e.jsonLength,e.jsonLength+e.binaryLength),a=Co(s);if(!a?.json)return Wo.log("Invalid JSON in KL message"),null;a.jsonBinaryMap&&o.byteLength&&To(a.json,o,a.jsonBinaryMap);const c=new Uint8Array(e.headerPackage.byteLength+n.byteLength);c.set(new Uint8Array(e.headerPackage),0),c.set(n,e.headerPackage.byteLength);let l=c,d=null;const u=Ao+e.jsonLength+e.binaryLength;return c.byteLength>u&&(d=c.subarray(u),l=c.subarray(0,u)),{message:{json:a.json,...o.length?{binaryData:o.buffer}:{},rawMessage:l.buffer},remaining:d?.buffer??null}},patchEncodedHeader:(e,t)=>{if(null==t.fromServiceId&&void 0===t.toServiceId)return e;if(e.byteLength<Ao)return Wo("Invalid Header Size"),e;let n=0;n+=Eo.protocolPrefix,n+=Eo.protocolVersion,n+=Eo.jsonLength,n+=Eo.binaryLength;const r=new DataView(e);return void 0!==t.fromServiceId&&r.setUint32(n,t.fromServiceId,!0),n+=Eo.fromServiceId,void 0!==t.toServiceId&&r.setUint32(n,t.toServiceId,!0),e},encodeCommand:e=>{let t=0;const n=Go.encode(e),r=n.byteLength,i=new ArrayBuffer(No+r),s=new DataView(i),o=new Uint8Array(i);for(let e=0;e<4;++e)o[t++]=Mo.charCodeAt(e);return s.setUint32(t,r,!0),t+=xo.txtLength,o.set(n,t),i},decodeCommand:e=>{const t=new DataView(e);let n=0;if(e.byteLength<No)return{command:null};let r="";for(let e=0;e<xo.protocolPrefix;++e)r+=String.fromCharCode(t.getUint8(n++));if(r!==Mo)return{command:null};const i=t.getUint32(n,!0);n+=xo.txtLength;const s=e.byteLength-No-i,o=new Uint8Array(e,n,Math.min(i,e.byteLength-No)),a=(new TextDecoder).decode(o);let c=null;s>0&&(c=e.slice(No+i));let l=0;return s<0&&(l=Math.abs(s)),{command:a,remainingData:c,missing:l}}};let Ho=Uo;ko&&(Ho=Vo);var zo,qo=Ho;!function(e){e.FunctionNotFound="FNC_NOT_FOUND",e.ParentEventCallbackError="PARENT_EVENT_CALLBACK_ERROR"}(zo||(zo={}));let Ko=Math.ceil(Date.now()/1e3);let Jo,Yo,Xo,Zo,Qo,ea=!1;var ta=()=>{ea=!0},na=(e,t)=>{if(!Jo)throw new Error("Memory connection not set.");Jo.sendBuf(e,t)},ra=e=>Yo=e,ia=e=>Qo=e,sa=e=>Xo=e,oa=e=>Zo=e;const aa=async(e,t=2)=>{const n=async(e,r)=>{if(Array.isArray(e))for(let i=0;i<e.length;i++){const s=e[i];if(s&&"object"==typeof s)if(Array.isArray(s))await n(s,r+1);else{const o=s._kemuType;void 0!==o?o===fe.ImageData&&(e[i]=await Ge(s)):r<t&&await n(s,r+1)}}else if("object"==typeof e&&null!==e){const i=Object.keys(e);for(const s of i){const i=e[s];if(i&&"object"==typeof i){const o=i._kemuType;void 0!==o?o===fe.ImageData&&(e[s]=await Ge(i)):r<t&&await n(i,r+1)}}}};return await n(e,1),e};Bo("klTransmissionManager"),Bo("ipcClient");Bo("kemuWidgetService"),C(process.argv.slice(2));const ca=e=>f(`runner:${e}`),la=ca("connectionManager"),da=ca("remoteInvoke"),ua=new function(e){const t={};let n=console.log;const r={};let i=e||String(Date.now());const s={},o=e=>!s[e],a=(e,t,n,r,i,s)=>{let a=ko?new ArrayBuffer(0):Buffer.alloc(0);const c={json:{functionName:e,args:s.success?s.success:[s],messageId:t,type:s.success?"response":"error"}};return o(r)&&(a=qo.encode(c,n,r)),i(a,{msg:c,sourceServiceId:n,targetServiceId:r})};return{setLogger:e=>{n=e},processMessage:(e,i,s,o)=>{if(!o)return!1;const c=o;if(t[c.messageId]){const e=t[c.messageId];return e&&(clearTimeout(e.timer),e.fulfilled||(e.fulfilled=!0,"response"===c.type?e.resolve(c.args):"error"===c.type&&e.reject(c.args[0])),delete t[c.messageId]),!0}if("execute"!==c.type&&n&&n(`No pending execution found for message id "${c.messageId}"`),"execute"===c.type){const t=r[c.functionName];if(t){const n=e=>{a(c.functionName,c.messageId,s.targetServiceId,s.sourceServiceId,i,e)};t({transport:e,args:c.args,reply:n,messageId:c.messageId,sourceServiceId:s.sourceServiceId,send:i})}else{const e=`Function "${c.functionName}" not found.`;n&&n(e),a(c.functionName,c.messageId,s.targetServiceId,s.sourceServiceId,i,{error:e,errCode:"FNC_NOT_FOUND"})}return!0}return!1},execute:async(e,r,s,a,c,l)=>{if(!s){const e="No send buffer function provided.";throw n&&n(e),e}Ko+=1;const d=`${i}-${Ko}-exec-${e.substring(0,10)}`,u={messageId:d,functionName:e,send:s,sourceServiceId:a,targetServiceId:c,args:r||[],fulfilled:!1,resolve:()=>{},reject:()=>{}};u.promise=new Promise(((e,t)=>{u.resolve=e,u.reject=t}));let p=ko?new ArrayBuffer(0):Buffer.alloc(0);const h={json:{functionName:e,args:r,messageId:d,type:"execute"}};o(c)&&(p=qo.encode(h,a,c)),t[d]=u,n&&n(`Calling remote function "${e}" with message id "${d}"`);const f="true"===process.env.NO_INVOKE_TIMEOUT;return l?.async?(u.fulfilled=!0,u.resolve([void 0]),delete t[d]):0===l?.timeout||f||(u.timer=setTimeout((()=>{n&&n(`Remote function ${d} timed out`);const r=t[d];r&&!r.fulfilled&&(r.fulfilled=!0,u.reject(`Function ${e} Timed out`)),delete t[d]}),l?.timeout||3e4)),s(p,{sourceServiceId:a,targetServiceId:c,msg:h}),u.promise},sendResponse:a,registerFunction:(e,t)=>{r[e]=t},getTransportSendFunction:e=>{const n=t[e];return n?n.send:null},setServiceName:e=>{i=e},getPendingExecutions:()=>t,rejectAllPending:e=>{Object.keys(t).forEach((n=>{const r=t[n];r&&!r.fulfilled&&(clearTimeout(r.timer),r.fulfilled=!0,r.reject(e),delete t[n])}))},broadcast:(e,t,r,s)=>{Ko+=1;const a=`${i}-${Ko}-multicast-${e.substring(0,10)}`;let c=ko?new ArrayBuffer(0):Buffer.alloc(0);const l={json:{functionName:e,args:t,messageId:a,type:"execute"}};let d=o(r[0].serviceId);d&&(c=qo.encode(l,s,r[0].serviceId));for(let t=0;t<r.length;t++)try{const i=r[t];n&&n(`Broadcasting function "${e}" with message id "${a}" to client [${i.serviceId}]`),0!==t&&(d=o(i.serviceId),d&&(c=qo.patchEncodedHeader(c,{toServiceId:i.serviceId}))),i.sendFn(c,{msg:l,sourceServiceId:s,targetServiceId:i.serviceId})}catch(e){n&&n(`Error broadcasting to client at index ${t}`)}},disableServiceEncoding:(e,t)=>{s[e]=t}}}("kweb");ua.setLogger(da);const pa=new a,ha=new a;let fa,ga=null,ma=null,va=null,ya=null;const ba={},wa=()=>{if(!va)throw new Error("API key is required to interact with the hub");return va},Sa=(e,t,n)=>{const r=`${e}_${t}`,i={contents:n,lastRequestedAt:Date.now(),contentsChecksum:""};return ba[r]=i,i},Ia=(e,t)=>ba[`${e}_${t}`]||null,_a=async(e,t)=>{if(!ga)return la("Hub Link has not been acknowledged. Cannot get services."),null;const n=[{serviceName:e,version:t}];return(await ua.execute(ye.GetServiceContents,n,Ca,ga,0))[0]},$a=async(e,t,n=!1)=>{if(!e||!t)return null;const r=Ia(e,t);if(!r||n){const n=r||Sa(e,t);try{const r=await _a(e,t);return r&&(n.contents=r.uiContent,n.contentsChecksum=r.uiContentsChecksum||""),n.contents||null}catch(n){la(`Failed to fetch service contents for ${e} v${t}`,n)}}return r?.contents||null},Ca=na,ka=()=>{la("Disconnected from the server"),ga=null,ya=null,ua.rejectAllPending("Disconnected from the server"),pa.emit("disconnected")},Ea=()=>{la("Connected to the server"),pa.emit("connected")},xa=()=>ma,Aa=(e,t,n,r)=>`${e}_${t}_${n}_${r}`,Na=async()=>{const e=xa();if(e){const t=re(e)?.blocks;if(t){const n={};for(const r in t){const i=t[r];for(const t in i.gates){const r=i.gates[t];if(r.type===He.hubService){const t=r.state;if(t.service?.eventEmitter){const r=`${t.service.name}_${t.service.version}`;if(!n[r])try{la(`Re-issuing subscription for service ${t.service.name} (${t.service.version})`),n[r]=!0,await Ha({listener:{recipeId:e},targetService:{serviceName:t.service.name,version:t.service.version}})}catch(e){la(`Failed to re-issue subscription for service ${t.service.name} (${t.service.version})`,e)}}}}}}}},Pa=async e=>{if(!e)return void la("Hub sent ACK request without service id");const t={apiKey:wa(),ackSessionId:e};await ua.execute(ye.SocketAckResponse,[t],Ca,e,0),la("Hub Link acknowledged"),ga=e,pa.emit("acknowledged"),Na()},Oa=async e=>{const t=e.args[0],n=Aa("broadcast",`hub_${t.type}`,(0).toString(),"");await ha.emit(n,t)},La=async e=>{const t=e.args[0];for(const e of t.outputs||[])e.type===fe.ImageData&&De(e.value)&&(e.value=await Ge(e.value));const n=xa();if(n){const r=re(n);if(r){const i=async e=>{const n=Aa("broadcast",t.source.serviceName,t.source.serviceVersion,e);try{await ha.emit(n,t)}catch(t){la(`Failed to emit broadcast event for target ${e}`,t)}};await i("app");for(const s in r.blocks){const o=r.blocks[s];for(const r in o.gates){const s=o.gates[r];if(s.disabled)continue;const a=s.state;if(s.type===He.hubService&&a.service?.name===t.source.serviceName&&a.service?.version===t.source.serviceVersion&&a.variantId===t.variantId){await i(r);const s=a?.service?.name&&t.eventContext?{[a.service.name]:t.eventContext}:void 0;for(const i of t.outputs||[])if(null!==i.value&&void 0!==i.value){const t={type:i.type,value:i.value,timestamp:Date.now()};la(`Sending data to output ${i.name} requested by messageId ${e.messageId}`),await _o({recipePoolId:n,currentGateId:r,sourcePortName:i.name,originalEvent:t,data:t,eventContext:s})}}}}}}},Ta=async e=>{const t=e.args[0],{finalState:n,recipeId:r,widgetId:i}=t,s=Io(r,i);let o=s;if(n&&o&&s&&(o={...s,customState:n},So(r,i,o,!0)),o?.service)try{const e=Aa("setOutputs",o.service.name,o.service.version,i);await ha.emit(e,t.outputs)}catch(e){la(`Failed to emit setOutputs event for widget ${i}`,e)}for(const n of t.outputs)if(null!==n.value&&void 0!==n.value){if(n.type===fe.ImageData){if(!De(n.value)){la(`Invalid ImageData value received for output ${n.name}. Expected an ImageData-like object`);continue}n.value=await Ge(n.value)}else n.type!==fe.JsonObj&&n.type!==fe.Array||await aa(n.value);const s={type:n.type,value:n.value,timestamp:Date.now()};la(`Sending data to output ${n.name} requested by messageId ${e.messageId}`);const a=o?.service?.name&&t.eventContext?{[o.service.name]:t.eventContext}:void 0;await _o({recipePoolId:r,currentGateId:i,sourcePortName:n.name,originalEvent:s,data:s,eventContext:a})}e.reply({success:[]})},Ba=async e=>{const t=e.args[0],{newState:n,recipeId:r,widgetId:i}=t,s=Io(r,i);if(s){const t={...s,customState:{...s.customState,...n}};return So(r,i,t,!0),e.reply({success:[]})}},Da=async({args:e,reply:t})=>{const n=e[0],{recipeId:r,widgetId:i,path:s,key:o}=n;la(`Received request to set a dependency path for "${o}" on widget "${i}" in recipe "${r}"`);const a=Io(r,i);if(a){const e={...a};e.dependencies=e.dependencies||{},e.dependencies[o]={path:s},So(r,i,e,!0)}return t({success:[]})},ja=async({args:e,reply:t})=>{const n=e[0],{recipeId:r,widgetId:i,key:s}=n;la(`Received request to get a dependency path for "${s}" on widget "${i}" in recipe "${r}"`);const o=Io(r,i);if(o){const e=o.dependencies?.[s]?.path;return la(`Returning dependency path for "${s}" on widget "${i}": "${e}"`),t({success:[e||null]})}return t({error:"Widget not found",errCode:"WIDGET_NOT_FOUND"})},Ra=async()=>{if(la(`Requesting services on ${(new Date).toISOString()}`),!ga)return la("Hub Link has not been acknowledged. Cannot get services."),{available:[],installed:[],failed:[]};const[e]=await ua.execute(ye.GetServices,[],Ca,ga,0);fa=e;for(const t of e.available){if(t.internal)continue;const e=Ia(t.name,t.version);if(!e||e?.contentsChecksum!==t.uiContentChecksum)try{const n=e||Sa(t.name,t.version);la(`Service ${t.name} v${t.version} contents have changed, fetching new contents`);const r=await _a(t.name,t.version);r&&(n.contents=r.uiContent,n.contentsChecksum=t.uiContentChecksum||"")}catch(e){la(`Failed to update service contents for ${t.name} v${t.version}`,e)}}return e},Ua=()=>fa||{available:[],installed:[],failed:[]},Fa=()=>!!fa,Ma=async e=>{const{targetServiceSessionId:t}=e;if(!ga)return void la("No target service session id provided");la(`Forwarding "onParentEvent" to service ${t}`);return await ua.execute(ye.OnParentEvent,[e],Ca,ga,t,e.config).catch((e=>{throw la(`Error invoking onParentEvent callback: ${e}`),e.errCode===zo.ParentEventCallbackError?e.error:e}))},Wa=async e=>{if(!ga)return la("Hub Link has not been acknowledged. Cannot get services."),{};const[t]=await ua.execute(ye.GetDefaultState,[],Ca,ga,e);return t},Ga=async(e,t,n,r)=>{if(!ga)return la("Hub Link has not been acknowledged. Cannot get services."),null;const[i]=await ua.execute(ye.UIEvent,[t,n],Ca,ga,e,r);return i},Va=(e,t)=>{const n=()=>{t()};return pa.on(e,n),()=>pa.off(e,n)},Ha=async e=>{if(ga)return ua.execute(ye.SubscribeToService,[e],Ca,ga,0);la("Hub Link has not been acknowledged. Cannot subscribe to services.")},za=async e=>{if(ga)return ua.execute(ye.UnsubscribeFromService,[e],Ca,ga,0);la("Hub Link has not been acknowledged. Cannot subscribe to services.")},qa=(e,t,n,r)=>{const i=Aa("broadcast",t,n,e);return ha.on(i,r)},Ka=(e,t,n,r)=>{const i=Aa("setOutputs",t,n,e);return ha.on(i,r)},Ja=async(e,t,n)=>ga?ua.execute(e,t,Ca,ga,0,n):(la("Hub Link has not been acknowledged. Cannot execute function."),null),Ya=async e=>{if(!ga)return void la("Hub Link has not been acknowledged. Cannot execute function.");const t=Io(e.recipeId,e.widgetId);if(!t)throw new Error("Widget or recipe pool not found. Cannot initialize service instance.");const n=Object.keys(t.dependencies||{}).reduce(((e,n)=>(e[n]=t.dependencies?.[n]?.path||null,e)),{}),r=[{currentState:t.customState,recipeId:e.recipeId,widgetId:e.widgetId,variantId:e.variantId,recipeType:e.recipeType,currentDependencies:n}],[i]=await ua.execute(ye.InitializeInstance,r,Ca,ga,e.sessionId);if(i){const t=Io(e.recipeId,e.widgetId);if(t){const n={...t,customState:i};So(e.recipeId,e.widgetId,n,!0)}}},Xa=async(e,t,n,r)=>{if(!ga)return void la("Hub Link has not been acknowledged. Cannot execute function.");const i=Io(n,t);if(!i)throw new Error("Widget or recipe pool not found. Cannot initialize service instance.");const s=[{currentState:i.customState,recipeId:n,widgetId:t,variantId:r}];await ua.execute(ye.TerminateInstance,s,Ca,ga,e)},Za=async(e,t,n="^",r)=>{const i=["^","~",">=",">","<=","<","="];if(!i.includes(n))throw new Error(`Invalid compare mode "${n}". Must be one of ${i.join(", ")}`);const s=Fa(),o=r||!s?await Ra():Ua();for(const r of o.available)if(r.name===e){if(r.version===t)return r;if(h(r.version,`${n}${t}`))return r}return null},Qa=async()=>{if(!ga)return la("Hub Link has not been acknowledged. Cannot get services."),null;if(ya)return ya;const[e]=await ua.execute(ye.GetSystemInfo,[],Ca,ga,0).catch((e=>(la("Failed to get system info",e),[null])));return ya=e,e};var ec,tc,nc,rc,ic,sc,oc,ac,cc=async e=>{sa(Ea),oa(ka),va=e,ia((({json:e,transmission:t})=>{ua.processMessage("websocket",Ca,t,e)})),ua.registerFunction(ye.SetState,Ba),ua.registerFunction(ye.SetOutputs,Ta),ua.registerFunction(ye.BroadcastEvent,La),ua.registerFunction(ye.HubBroadcastEvent,Oa),ua.registerFunction(be.SetDependencyPath,Da),ua.registerFunction(be.GetDependencyPath,ja),ra((e=>{((e,t)=>{const n=ve.SocketAcknowledge,r=ve.IpcAcknowledge,i=e.startsWith(n);if(e===r)return t&&t(),0;if(i){const s=e.split(i?n:r),o=parseInt(s[1]);return t&&t(o),o}})(e,Pa),((e,t)=>{e===ve.ServicesListChanged&&(t&&t())})(e,(()=>{la("Services list changed"),pa.emit("services-changed")}))})),await ta()},lc=(e,t)=>{pa.on(e,t)},dc=()=>({getServices:Ra,getServiceContents:$a,onParentEvent:Ma,onCommand:Va,getDefaultState:Wa,getCachedServices:Ua,areServicesCached:Fa,subscribeToServiceEvents:Ha,unsubscribeFromServiceEvents:za,callProcessorHandler:Ga,onBroadcastEvent:qa,onSetOutputsEvent:Ka,executeHubFunction:Ja,initializeServiceInstance:Ya,terminateServiceInstance:Xa,getCompatibleService:Za,getHubSystemInfo:Qa}),uc=e=>{ma=e},pc=()=>ua;!function(e){e.Browser="browser",e.Cloud="cloud",e.Desktop="desktop"}(ec||(ec={})),function(e){e[e.Number=0]="Number",e[e.String=1]="String",e[e.ArrayBuffer=2]="ArrayBuffer",e[e.Array=3]="Array",e[e.Boolean=4]="Boolean",e[e.JsonObj=5]="JsonObj",e[e.Anything=6]="Anything",e[e.ImageData=7]="ImageData",e[e.AudioBuffer=8]="AudioBuffer",e[e.Rect=9]="Rect",e[e.Point=10]="Point",e[e.ImageBitmap=11]="ImageBitmap",e[e.BinaryFile=12]="BinaryFile"}(tc||(tc={})),function(e){e.Number="Number",e.String="String",e.ArrayBuffer="ArrayBuffer",e.Array="Array",e.Boolean="Boolean",e.JsonObj="JsonObj",e.Anything="Anything",e.ImageData="ImageData",e.AudioBuffer="AudioBuffer",e.Rect="Rect",e.Point="Point",e.ImageBitmap="ImageBitmap",e.BinaryFile="BinaryFile"}(nc||(nc={})),function(e){e.Javascript="js",e.Python="py",e.Executable="exe"}(rc||(rc={})),function(e){e.IpcAcknowledge="iack:",e.SocketAcknowledge="sack:",e.AcknowledgeResponse="ackr:",e.ServicesListChanged="update-services",e.SendManifest="send-manifest",e.BroadcastStart="broadcast-start",e.BroadcastEnd="broadcast-end",e.AssumeSession="assume:"}(ic||(ic={})),function(e){e.GetServices="getServices",e.SubscribeToService="subscribeToService",e.UnsubscribeFromService="unsubscribeFromService",e.GetServiceContents="getServiceContents",e.SocketAckResponse="socketAckResponse",e.ShowSecretsConfigScreen="showSecretsConfigScreen",e.GetMappedSecrets="getMappedSecrets",e.GetSecretContexts="getSecretContexts",e.OnParentEvent="onParentEvent",e.GetDefaultState="getDefaultState",e.BroadcastEvent="broadcastEvent",e.HubBroadcastEvent="hubBroadcastEvent",e.ServiceManifest="serviceManifest",e.GetState="getState",e.SetState="setState",e.SetOutputs="setOutputs",e.UIEvent="uiEvent",e.GetSystemInfo="getSystemInfo",e.InitializeInstance="initializeInstance",e.TerminateInstance="terminateInstance",e.UninstallService="uninstallService",e.ChooseDirectoryDialog="chooseDirectoryDialog",e.ChooseFileDialog="chooseFileDialog",e.GetUniqueId="getUniqueId",e.RebootToInstallUpdate="rebootToInstallUpdate",e.GetFileContentFromCacheId="getFileContentFromCacheId"}(sc||(sc={})),function(e){e.SetDependencyPath="setDependencyPath",e.GetDependencyPath="getDependencyPath"}(oc||(oc={})),function(e){e.IPC="ipc",e.WS="ws"}(ac||(ac={}));const hc=e=>{try{return JSON.parse(e)}catch(e){return null}},fc=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,gc=e=>{if("string"!=typeof e)throw new TypeError("Invalid argument expected string");const t=e.match(fc);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},mc=e=>"*"===e||"x"===e||"X"===e,vc=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},yc=(e,t)=>{if(mc(e)||mc(t))return 0;const[n,r]=((e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t])(vc(e),vc(t));return n>r?1:n<r?-1:0},bc=(e,t)=>{for(let n=0;n<Math.max(e.length,t.length);n++){const r=yc(e[n]||"0",t[n]||"0");if(0!==r)return r}return 0},wc=(e,t,n)=>{_c(n);const r=((e,t)=>{const n=gc(e),r=gc(t),i=n.pop(),s=r.pop(),o=bc(n,r);return 0!==o?o:i&&s?bc(i.split("."),s.split(".")):i||s?i?-1:1:0})(e,t);return Sc[n].includes(r)},Sc={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1],"!=":[-1,1]},Ic=Object.keys(Sc),_c=e=>{if(-1===Ic.indexOf(e))throw new Error(`Invalid operator, expected one of ${Ic.join("|")}`)};var $c="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Cc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var kc,Ec,xc,Ac,Nc,Pc={exports:{}},Oc={exports:{}};function Lc(){if(Ec)return kc;Ec=1;var e=1e3,t=60*e,n=60*t,r=24*n,i=7*r,s=365.25*r;function o(e,t,n,r){var i=t>=1.5*n;return Math.round(e/n)+" "+r+(i?"s":"")}return kc=function(a,c){c=c||{};var l=typeof a;if("string"===l&&a.length>0)return function(o){if((o=String(o)).length>100)return;var a=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(o);if(!a)return;var c=parseFloat(a[1]);switch((a[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*s;case"weeks":case"week":case"w":return c*i;case"days":case"day":case"d":return c*r;case"hours":case"hour":case"hrs":case"hr":case"h":return c*n;case"minutes":case"minute":case"mins":case"min":case"m":return c*t;case"seconds":case"second":case"secs":case"sec":case"s":return c*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(a);if("number"===l&&isFinite(a))return c.long?function(i){var s=Math.abs(i);if(s>=r)return o(i,s,r,"day");if(s>=n)return o(i,s,n,"hour");if(s>=t)return o(i,s,t,"minute");if(s>=e)return o(i,s,e,"second");return i+" ms"}(a):function(i){var s=Math.abs(i);if(s>=r)return Math.round(i/r)+"d";if(s>=n)return Math.round(i/n)+"h";if(s>=t)return Math.round(i/t)+"m";if(s>=e)return Math.round(i/e)+"s";return i+"ms"}(a);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(a))}}function Tc(){if(Ac)return xc;return Ac=1,xc=function(e){function t(e){let r,i,s,o=null;function a(...e){if(!a.enabled)return;const n=a,i=Number(new Date),s=i-(r||i);n.diff=s,n.prev=r,n.curr=i,r=i,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let o=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,((r,i)=>{if("%%"===r)return"%";o++;const s=t.formatters[i];if("function"==typeof s){const t=e[o];r=s.call(n,t),e.splice(o,1),o--}return r})),t.formatArgs.call(n,e);(n.log||t.log).apply(n,e)}return a.namespace=e,a.useColors=t.useColors(),a.color=t.selectColor(e),a.extend=n,a.destroy=t.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==o?o:(i!==t.namespaces&&(i=t.namespaces,s=t.enabled(e)),s),set:e=>{o=e}}),"function"==typeof t.init&&t.init(a),a}function n(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function r(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){if(e instanceof Error)return e.stack||e.message;return e},t.disable=function(){const e=[...t.names.map(r),...t.skips.map(r).map((e=>"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),i=r.length;for(n=0;n<i;n++)r[n]&&("-"===(e=r[n].replace(/\*/g,".*?"))[0]?t.skips.push(new RegExp("^"+e.slice(1)+"$")):t.names.push(new RegExp("^"+e+"$")))},t.enabled=function(e){if("*"===e[e.length-1])return!0;let n,r;for(n=0,r=t.skips.length;n<r;n++)if(t.skips[n].test(e))return!1;for(n=0,r=t.names.length;n<r;n++)if(t.names[n].test(e))return!0;return!1},t.humanize=Lc(),t.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(e).forEach((n=>{t[n]=e[n]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t<e.length;t++)n=(n<<5)-n+e.charCodeAt(t),n|=0;return t.colors[Math.abs(n)%t.colors.length]},t.enable(t.load()),t},xc}var Bc,Dc,jc,Rc,Uc,Fc={exports:{}};function Mc(){return Dc||(Dc=1,Bc=(e,t=process.argv)=>{const n=e.startsWith("-")?"":1===e.length?"-":"--",r=t.indexOf(n+e),i=t.indexOf("--");return-1!==r&&(-1===i||r<i)}),Bc}"undefined"==typeof process||"renderer"===process.type||!0===process.browser||process.__nwjs?Pc.exports=(Nc||(Nc=1,function(e,t){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let r=0,i=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(i=r))})),t.splice(i,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}return!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG),e},t.useColors=function(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type&&!window.process.__nwjs)||("undefined"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=Tc()(t);const{formatters:n}=e.exports;n.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(Oc,Oc.exports)),Oc.exports):Pc.exports=(Uc||(Uc=1,function(e,t){const n=k,r=o;t.init=function(e){e.inspectOpts={};const n=Object.keys(t.inspectOpts);for(let r=0;r<n.length;r++)e.inspectOpts[n[r]]=t.inspectOpts[n[r]]},t.log=function(...e){return process.stderr.write(r.formatWithOptions(t.inspectOpts,...e)+"\n")},t.formatArgs=function(n){const{namespace:r,useColors:i}=this;if(i){const t=this.color,i="[3"+(t<8?t:"8;5;"+t),s=` ${i};1m${r} `;n[0]=s+n[0].split("\n").join("\n"+s),n.push(i+"m+"+e.exports.humanize(this.diff)+"")}else n[0]=(t.inspectOpts.hideDate?"":(new Date).toISOString()+" ")+r+" "+n[0]},t.save=function(e){e?process.env.DEBUG=e:delete process.env.DEBUG},t.load=function(){return process.env.DEBUG},t.useColors=function(){return"colors"in t.inspectOpts?Boolean(t.inspectOpts.colors):n.isatty(process.stderr.fd)},t.destroy=r.deprecate((()=>{}),"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."),t.colors=[6,2,3,4,5,1];try{const e=function(){if(Rc)return jc;Rc=1;const e=E,t=k,n=Mc(),{env:r}=process;let i;function s(e){return 0!==e&&{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function o(t,s){if(0===i)return 0;if(n("color=16m")||n("color=full")||n("color=truecolor"))return 3;if(n("color=256"))return 2;if(t&&!s&&void 0===i)return 0;const o=i||0;if("dumb"===r.TERM)return o;if("win32"===process.platform){const t=e.release().split(".");return Number(t[0])>=10&&Number(t[2])>=10586?Number(t[2])>=14931?3:2:1}if("CI"in r)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI","GITHUB_ACTIONS","BUILDKITE"].some((e=>e in r))||"codeship"===r.CI_NAME?1:o;if("TEAMCITY_VERSION"in r)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(r.TEAMCITY_VERSION)?1:0;if("truecolor"===r.COLORTERM)return 3;if("TERM_PROGRAM"in r){const e=parseInt((r.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(r.TERM_PROGRAM){case"iTerm.app":return e>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(r.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(r.TERM)||"COLORTERM"in r?1:o}return n("no-color")||n("no-colors")||n("color=false")||n("color=never")?i=0:(n("color")||n("colors")||n("color=true")||n("color=always"))&&(i=1),"FORCE_COLOR"in r&&(i="true"===r.FORCE_COLOR?1:"false"===r.FORCE_COLOR?0:0===r.FORCE_COLOR.length?1:Math.min(parseInt(r.FORCE_COLOR,10),3)),jc={supportsColor:function(e){return s(o(e,e&&e.isTTY))},stdout:s(o(!0,t.isatty(1))),stderr:s(o(!0,t.isatty(2)))}}();e&&(e.stderr||e).level>=2&&(t.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch(e){}t.inspectOpts=Object.keys(process.env).filter((e=>/^debug_/i.test(e))).reduce(((e,t)=>{const n=t.substring(6).toLowerCase().replace(/_([a-z])/g,((e,t)=>t.toUpperCase()));let r=process.env[t];return r=!!/^(yes|on|true|enabled)$/i.test(r)||!/^(no|off|false|disabled)$/i.test(r)&&("null"===r?null:Number(r)),e[n]=r,e}),{}),e.exports=Tc()(t);const{formatters:i}=e.exports;i.o=function(e){return this.inspectOpts.colors=this.useColors,r.inspect(e,this.inspectOpts).split("\n").map((e=>e.trim())).join(" ")},i.O=function(e){return this.inspectOpts.colors=this.useColors,r.inspect(e,this.inspectOpts)}}(Fc,Fc.exports)),Fc.exports);var Wc=Cc(Pc.exports);const Gc=e=>Wc(e),Vc=Date.now();let Hc=Math.ceil(Vc/1e3);var zc=()=>Hc+=1;const qc=m(x(),"kemu-user-services"),Kc=m(x(),"kemu-test-services"),Jc="KMU-CB-v1",Yc=process.env.HUB_PKG_VERSION||'"1.2.4"';var Xc;!function(e){e.input="input",e.counter="counter",e.play="play",e.elapsed="elapsed",e.ifGate="ifGate",e.skipEvent="skipEvent",e.between="between",e.map="map",e.parser="parser",e.slider="slider",e.suspend="suspend",e.display="display",e.pixelfy="pixelfy",e.json="json",e.arrayItem="arrayItem",e.extractImage="extractImage",e.imageConvolution="imageConvolution",e.firstEvent="firstEvent",e.pixelDraw="pixelDraw",e.randomBetween="randomBetween",e.arrayCombine="arrayCombine",e.clock="clock",e.multiplication="multiplication",e.object="object",e.widgetGroup="widgetGroup",e.script="script",e.base64ToImageData="base64ToImageData",e.jsonParse="jsonParse",e.text="text",e.imageCrop="imageCrop",e.imageResize="imageResize",e.value="value",e.imageWarp="imageWarp",e.widgetBundle="widgetBundle",e.sequence="sequence",e.variable="variable",e.hubService="hubService"}(Xc||(Xc={}));const Zc=e=>({...e,type:Array.isArray(e.type)?e.type.map((e=>tc[e])):tc[e.type]}),Qc=async e=>{try{return await w(e,"utf-8")}catch(e){return null}},el=e=>{if(e&&e.startsWith(Jc)){const t=e.slice(9),n=decodeURI(t);return hc(n)}return null},tl=async(e,t,n)=>{let r=[];e.variants?.length&&(r=e.variants.map((e=>({...e,...e.inputs?{inputs:e.inputs.map(Zc)}:{},...e.outputs?{outputs:e.outputs.map(Zc)}:{}}))));const i={...e,path:t,customWidgets:[],...e.inputs?{inputs:e.inputs.map(Zc)}:{inputs:[]},...e.outputs?{outputs:e.outputs.map(Zc)}:{outputs:[]},variants:r,...e.widgetUI&&n?.widgetUIContents?{widgetUIContents:n.widgetUIContents}:{}},s=await(async(e,t,n=console.log)=>{const r=[];if(t.customWidgets?.length)for(const i of t.customWidgets){const t=await Qc(m(e,i));if(!t){n(`Error loading custom widget file ${i}`);continue}const s=t.startsWith(Jc)?t:`${Jc}${t}`,o=el(s);if(!o){n(`Custom widget file "${i}" is not a valid Kemu Clipboard item`);continue}const a=Object.values(o).filter((e=>e.type===Xc.widgetGroup&&!e.groupId));if(a.length>1){n(`Custom widget file "${i}" contains more than one top level widgetGroup`);continue}const c=a[0];if(!c){n(`Custom widget file "${i}" does not contain a top level widgetGroup`);continue}const l=c.state,d={name:l.name,color:l.color,description:l.description,contents:s,rootGroupId:c.id,icon:l.icon,protocolVersion:l.protocolVersion||"2"};r.push(d)}return r})(t,e,n?.log);if(s.length?i.customWidgets=s:delete i.customWidgets,i.variants?.length)for(const e of i.variants)if(e.svgIcon)try{const n=await w(m(t,e.svgIcon),"utf-8");e.svgIcon=n}catch(t){n?.log&&n?.log(`Error loading svgIcon for variant ${e.id}: ${t}`)}return i},nl=async e=>{try{return await S(e,I.F_OK),!0}catch{return!1}};let rl=null,il=null;const sl=()=>rl||qc,ol=Gc("servicesManager"),al={};let cl=null,ll=null,dl=null;class ul extends Error{code;originalError;constructor(e,t,n){super(e),this.code=t,this.originalError=n,this.name="ServiceError"}}const pl=async e=>{try{return await S(e),!0}catch{return!1}},hl=async e=>{if(!cl)throw new Error('IPC config not set, call "setHubIpcConfig" first.');try{if(e.processor===rc.Javascript){ol(`Spawning service ${e.name} with sessionId ${e.sessionId}`);const t=g.join(e.path,"processor.js"),n=g.join(e.path,"processor.mjs"),r=await pl(t)?t:n,i=[`--sessionId=${e.sessionId.toString()}`,`--ipcSpace=${cl.appSpace}`,`--ipcId=${cl?.id}`,`--recipePath=${cl.recipePath||""}`];if(e.internal&&i.push("--internal=true"),!dl)throw new Error('Get secrets function not set, call "setGetSecretsFunction" first.');const s=await dl({name:e.name,version:e.version,requiredSecrets:e.requiredSecrets||{}}),o=Object.entries(e.requiredSecrets||{}).filter((([e,t])=>{const n=s[e];return null==n&&!t.optional})).map((([e])=>e));if(o?.length)throw new ul(`Missing required environment variables: ${o.join(", ")}`,"MISSING_REQUIRED_SECRETS");return new Promise(((t,n)=>{if(!ll)throw new Error('Spawn function not set, call "setSpawnNodeFunction" first.');const o=ll({args:[r,...i],serviceInfo:{name:e.name,version:e.version},options:{env:s}});o.stdout.on("data",(t=>{ol(`[${e.name}] - stdout: ${t}`)})),o.stderr.on("data",(t=>{ol(`[${e.name}] - stderr: ${t}`)})),o.on("exit",(t=>{ol(`[${e.name}] exited with code ${t}`)})),o.on("spawn",(()=>{ol(`[${e.name}] spawned with PID ${o.pid}`),t(o)})),o.on("error",(t=>{ol(`[${e.name}] error: ${t}`),n(new ul(`Error spawning service ${e.name}: ${t}`,"SPAWN_ERROR"))}))}))}throw`Unsupported processor type ${e.processor}`}catch(t){if(t instanceof ul)throw t;throw`Error spawning service ${e.name}: ${t}`}},fl=e=>{if(!e?.name)return"Missing name";if(!e?.version)return"Missing version";if(!e?.description)return"Missing description";if(!e?.processor)return"Missing processor";return[rc.Javascript,rc.Executable,rc.Python].includes(e?.processor)?null:"Invalid processor"},gl=async(e,t)=>{const n=g.join(e,"manifest.json");if(!await pl(n)){const t=`Missing manifest for service ${e}. Aborting.`;return ol(t),{error:t}}const r=await w(n,"utf-8"),i=hc(r),s=fl(i);if(!i||s){const t=`Invalid service manifest [${e}]: ${s}. Aborting.`;return ol(t),{error:t}}let o;if(delete i.internal,t?.singleServiceName&&i.name!==t.singleServiceName){return{error:`Skipping service ${i.name} as it does not match the singleServiceName option`}}await Promise.all([(async()=>{if(i.widgetUI)try{o=await w(g.join(e,"widgetUI.js"))}catch(e){const t=`Error loading widgetUI file ${i.name}: ${e}`;return ol(t),{error:t}}})(),(async()=>{if(i.svgIcon){const t=await Qc(g.join(e,i.svgIcon));if(!t){return{error:`Error loading icon for service ${i.name}`}}i.svgIcon=t}})(),(async()=>{if(i.subServices?.length)for(const t of i.subServices){const n=g.join(e,t),{error:r,service:s}=await gl(n);r?ol(`Error loading sub-service ${t}: ${r}`):s&&(s.info.parentService={name:i.name,version:i.version})}delete i.subServices})(),(async()=>{if(i.variants?.length)for(const t of i.variants)if(t.svgIcon)try{const n=await w(g.join(e,t.svgIcon),"utf-8");t.svgIcon=n}catch(e){ol(`Error loading svgIcon for variant ${t.id}: ${e}`)}})()]);const a=zc(),c=t?.fixedSession||a;ol(`Loaded service ${i.name} with sessionId ${c}`);const l=await tl(i,e,{widgetUIContents:o});return ml(l),al[c]={info:{...l,path:e,sessionId:c},status:"loaded",childProcess:null},{service:al[c]}},ml=e=>{e.widgetUIContents?e.uiContentChecksum=(e=>{const t=p("sha256");return t.update(e),t.digest("hex")})(e.widgetUIContents):e.uiContentChecksum=void 0},vl=async e=>{try{return e.childProcess=await hl(e.info),e.status="started",e.errorMsg=void 0,e.errorCode=void 0,!0}catch(t){return ol(`Service [${e.info.name}] error: ${t}`),e.status="error",t instanceof ul?(e.errorMsg=t.message,e.errorCode=t.code):(e.errorMsg="string"==typeof t?t:JSON.stringify(t),e.errorCode="UNKNOWN_ERROR"),!1}},yl=e=>{const{path:t,...n}=e.info;return{...n}},bl=()=>Object.values(al).filter((e=>"running"===e.status)).map(yl),wl=e=>{const{serviceName:t,version:n,force:r}=e,i=Object.values(al).find((t=>t.info.name===e.serviceName&&t.info.version===e.version));if(!i)return null;if(i.info.internal&&!r)throw`Cannot stop internal service ${t}`;if(i.childProcess){ol(`Stopping service "${t} (v${n})"`);i.childProcess.kill("SIGINT")||ol(`Failed to stop service ${t}`)}return i.status="stopped",ol(`Service ${t} stopped`),i},Sl=e=>e.info.internal?e.info.path:g.join(e.info.path,".."),Il=e=>!!e.internal;var _l={isOfficialKemuService:e=>e.name.startsWith("kemu.io"),loadServices:async(e,t)=>{if(!await nl(e))return void ol(`Failed to load services from "${e}". Directory does not exist.`);const n=(await _(e,{withFileTypes:!0})).filter((e=>e.isDirectory())).map((e=>e.name));ol(`Found ${n.length} services in "${e}"`);for(let r=0;r<n.length;r++){const i=n[r],s=g.join(e,i),{error:o,service:a}=await gl(`${s}${t?.internalServices?"":"/dist"}`,t);o&&ol(`Failed to load service ${s}. Please check logs`),a&&t?.internalServices&&(a.info.internal=!0)}},launchServices:async e=>{if(ol("Initializing services"),!cl)throw new Error('IPC config not set, call "setHubIpcConfig" first.');for(const t in al){const n=al[t];e.noSpawningList&&e.noSpawningList.includes(n.info.name)?ol(`Service ${n.info.name} is in the noSpawningList. Skipping.`):vl(n)}ol("Services initialized")},setServiceStatus:(e,t)=>{const n=al[e];return n?(n.status=t,!0):(ol(`Service with serviceId ${e} not found`),!1)},getActiveServices:bl,getMatchingService:(e,t)=>{const n=Object.values(al).filter((e=>"running"===e.status));for(const r of n)if(r.info.name===e){if(r.info.version===t)return r;if(wc(r.info.version,t,">="))return r}return null},getServiceBySessionId:e=>al[e]||null,killAllServices:()=>{for(const e in al){const t=al[e];if(t.childProcess)try{ol(`Killing service ${t.info.name} with PID ${t.childProcess.pid}`),t.childProcess.kill()}catch(e){ol(`Error killing service ${t.info.name}: ${e}`)}}},addDevService:async(e,t,n)=>{const r={info:{...await tl(t,t.path),sessionId:e},status:n,startedAt:new Date,devMode:!0,childProcess:null};al[e]=r,ml(al[e].info)},setServiceManifest:(e,t,n)=>{const r=al[e];if(!r)return ol(`Service with sessionId ${e} not found`),!1;const i=fl(t);if(i)return ol(`Invalid manifest for service ${r.info.name}: ${i}`),!1;ml(t),r.info={...r.info,...t},n&&(r.status=n)},getMatchingDevService:(e,t,n)=>{const r=Object.values(al).filter((e=>e.devMode));for(const i of r)if(i.info.name===e&&i.status===n&&i.info.version===t)return i;return null},getInternalServices:()=>bl().filter((e=>e.internal)),getAllServices:()=>Object.values(al),stopService:wl,uninstallService:async(e,t)=>{ol(`Uninstalling service ${e} v${t}`);const n=wl({serviceName:e,version:t});if(!n)return!1;ol(`Service ${e} stopped. Removing from disk...`);const r=Sl(n),i=sl();return r.startsWith(i)?(await $(r,{recursive:!0,force:!0}),ol(`Service ${e} successfully removed from disk`),(e=>{const t=al[e];delete al[e]})(n.info.sessionId),!0):(ol(`Service ${e} is not installed in the user services directory. Aborting.`),!1)},getAllServiceVersions:e=>Object.values(al).filter((t=>t.info.name===e)),setHubIpcConfig:e=>{cl={...e}},loadAndLaunch:async(e,t,n)=>{const r=y(e,t),{error:i,service:s}=await gl(r);if(i||!s)return{errorMsg:i};try{s.info.internal=!!n,s.childProcess=await hl(s.info),s.status="started"}catch(e){s.status="error",e instanceof ul?(ol(`Service spawning error: ${e.message} (${e.code})`),s.errorMsg=e.message,s.errorCode=e.code):(ol(`Error launching service ${s.info.name}: ${e}`),s.errorMsg="string"==typeof e?e:JSON.stringify(e))}return{service:s,errorCode:s.errorCode,errorMsg:s.errorMsg}},getServiceRootDirectory:Sl,setSpawnNodeFunction:e=>{ll=e},setGetSecretsFunction:e=>{dl=e},restartService:async(e,t)=>{ol(`Restarting service ${e} v${t}`);const n=wl({serviceName:e,version:t,force:!0});return!!n&&vl(n)},getFailedServices:()=>Object.values(al).filter((e=>"error"===e.status)).map((e=>({...yl(e),errorMsg:e.errorMsg||"",errorCode:e.errorCode,status:e.status}))),isInternalKemuService:Il,isNotInternalKemuService:e=>!Il(e),isNotDevService:e=>!e.devMode};class $l{constructor(){}appspace="app.";socketRoot="/tmp/";id=E.hostname();encoding="utf8";rawBuffer=!1;sync=!1;unlink=!0;delimiter="\f";silent=!1;logDepth=5;logInColor=!0;logger=console.log.bind(console);maxConnections=100;retry=500;maxRetries=1/0;stopRetrying=!1;IPType=function(){const e=E.networkInterfaces();let t="";e&&Array.isArray(e)&&e.length>0&&(t=e[Object.keys(e)[0]][0].family);return t}();tls=!1;networkHost="IPv6"==this.IPType?"::1":"127.0.0.1";networkPort=8e3;readableAll=!1;writableAll=!1;interface={localAddress:!1,localPort:!1,family:!1,hints:!1,lookup:!1}}class Cl{constructor(e){e||(e=new $l),this.delimiter=e.delimiter}format(e){return e.data||!1===e.data||0===e.data||(e.data={}),e.data._maxListeners&&(e.data={}),e=e.JSON+this.delimiter}parse(e){let t=e.split(this.delimiter);return t.pop(),t}}var kl=function(){Object.defineProperties(this,{data:{enumerable:!0,get:function(){return t},set:function(e){t=e}},type:{enumerable:!0,get:function(){return e},set:function(t){e=t}},load:{enumerable:!0,writable:!1,value:function(n){try{n=JSON.parse(n);e=n.type,t=n.data}catch(r){e="error",t={message:"Invalid JSON response format",err:r,response:n}}}},JSON:{enumerable:!0,get:function(){return JSON.stringify({type:e,data:t})}}});var e="",t={}},El=Cc(kl);var xl=Cc((function(){Object.defineProperties(this,{add:{enumerable:!0,writable:!1,value:function(){for(var n in arguments)e.push(arguments[n]);t||this.stop||!this.autoRun||this.next()}},next:{enumerable:!0,writable:!1,value:function(){if(t=!0,e.length<1||this.stop)return void(t=!1);e.shift().bind(this)()}},clear:{enumerable:!0,writable:!1,value:function(){return e=[]}},contents:{enumerable:!1,get:function(){return e},set:function(t){return e=t}},autoRun:{enumerable:!0,writable:!0,value:!0},stop:{enumerable:!0,writable:!0,value:!1}});var e=[],t=!1}));class Al{}class Nl{}const Pl=new class{constructor(e=!0){this.strict=e}throw(e,t){let n=new TypeError;if(n.message=`expected type of ${e} to be ${t}`,!this.strict)return!1;throw n}typeCheck(e,t){return typeof e===t||this.throw(typeof e,t)}instanceCheck(e=new Al,t=Nl){return e instanceof t||this.throw(typeof e,t.name)}symbolStringCheck(e,t){return Object.prototype.toString.call(e)==`[object ${t}]`||this.throw(Object.prototype.toString.call(e),`[object ${t}]`)}compare(e,t,n){return e==t||this.throw(typeof e,n)}finite(e){return!!isFinite(e)||this.throw(typeof e,"finite")}NaN(e){return this.number(e)?!!isNaN(e)||this.throw(typeof e,"NaN"):this.number(e)}null(e){return this.compare(e,null,"null")}array(e){return this.instanceCheck(e,Array)}boolean(e){return this.typeCheck(e,"boolean")}bigint(e){return this.typeCheck(e,"bigint")}date(e){return this.instanceCheck(e,Date)}generator(e){return this.symbolStringCheck(e,"Generator")}asyncGenerator(e){return this.symbolStringCheck(e,"AsyncGenerator")}globalThis(e){return this.compare(e,globalThis,"explicitly globalThis, not window, global nor self")}infinity(e){return this.compare(e,1/0,"Infinity")}map(e){return this.instanceCheck(e,Map)}weakMap(e){return this.instanceCheck(e,WeakMap)}number(e){return this.typeCheck(e,"number")}object(e){return this.typeCheck(e,"object")}promise(e){return this.instanceCheck(e,Promise)}regExp(e){return this.instanceCheck(e,RegExp)}undefined(e){return this.typeCheck(e,"undefined")}set(e){return this.instanceCheck(e,Set)}weakSet(e){return this.instanceCheck(e,WeakSet)}string(e){return this.typeCheck(e,"string")}symbol(e){return this.typeCheck(e,"symbol")}function(e){return this.typeCheck(e,"function")}asyncFunction(e){return this.symbolStringCheck(e,"AsyncFunction")}generatorFunction(e){return this.symbolStringCheck(e,"GeneratorFunction")}asyncGeneratorFunction(e){return this.symbolStringCheck(e,"AsyncGeneratorFunction")}error(e){return this.instanceCheck(e,Error)}evalError(e){return this.instanceCheck(e,EvalError)}rangeError(e){return this.instanceCheck(e,RangeError)}referenceError(e){return this.instanceCheck(e,ReferenceError)}syntaxError(e){return this.instanceCheck(e,SyntaxError)}typeError(e){return this.instanceCheck(e,TypeError)}URIError(e){return this.instanceCheck(e,URIError)}bigInt64Array(e){return this.instanceCheck(e,BigInt64Array)}bigUint64Array(e){return this.instanceCheck(e,BigUint64Array)}float32Array(e){return this.instanceCheck(e,Float32Array)}float64Array(e){return this.instanceCheck(e,Float64Array)}int8Array(e){return this.instanceCheck(e,Int8Array)}int16Array(e){return this.instanceCheck(e,Int16Array)}int32Array(e){return this.instanceCheck(e,Int32Array)}uint8Array(e){return this.instanceCheck(e,Uint8Array)}uint8ClampedArray(e){return this.instanceCheck(e,Uint8ClampedArray)}uint16Array(e){return this.instanceCheck(e,Uint16Array)}uint32Array(e){return this.instanceCheck(e,Uint32Array)}arrayBuffer(e){return this.instanceCheck(e,ArrayBuffer)}dataView(e){return this.instanceCheck(e,DataView)}sharedArrayBuffer(e){return this.instanceCheck(e,function(){try{return SharedArrayBuffer}catch{return Al}}())}intlDateTimeFormat(e){return this.instanceCheck(e,Intl.DateTimeFormat)}intlCollator(e){return this.instanceCheck(e,Intl.Collator)}intlDisplayNames(e){return this.instanceCheck(e,Intl.DisplayNames)}intlListFormat(e){return this.instanceCheck(e,Intl.ListFormat)}intlLocale(e){return this.instanceCheck(e,Intl.Locale)}intlNumberFormat(e){return this.instanceCheck(e,Intl.NumberFormat)}intlPluralRules(e){return this.instanceCheck(e,Intl.PluralRules)}intlRelativeTimeFormat(e){return this.instanceCheck(e,Intl.RelativeTimeFormat)}intlRelativeTimeFormat(e){return this.instanceCheck(e,Intl.RelativeTimeFormat)}finalizationRegistry(e){return this.instanceCheck(e,FinalizationRegistry)}weakRef(e){return this.instanceCheck(e,WeakRef)}};class Ol{constructor(){}on(e,t,n=!1){return Pl.string(e),Pl.function(t),Pl.boolean(n),"*"==e&&(e=this.#e),this.#t[e]||(this.#t[e]=[]),t[this.#n]=n,this.#t[e].push(t),this}once(e,t){return this.on(e,t,!0)}off(e="*",t="*"){if(Pl.string(e),e!=this.#e.toString()&&"*"!=e||(e=this.#e),!this.#t[e])return this;if("*"==t)return delete this.#t[e],this;Pl.function(t);const n=this.#t[e];for(;n.includes(t);)n.splice(n.indexOf(t),1);return n.length<1&&delete this.#t[e],this}emit(e,...t){Pl.string(e);const n=this.#t[this.#e]||[];if(this.#r(this.#e.toString(),n,e,...t),!this.#t[e])return this;const r=this.#t[e];return this.#r(e,r,...t),this}reset(){this.off(this.#e.toString());for(let e in this.#t)this.off(e);return this}get list(){return Object.assign({},this.#t)}#r=(e,t,...n)=>{Pl.string(e),Pl.array(t);const r=[];for(let e of t)e(...n),e[this.#n]&&r.push(e);for(let t of r)this.off(e,t)};#e=Symbol.for("event-pubsub-all");#n=Symbol.for("event-pubsub-once");#t={}}let Ll=new Cl;class Tl extends Ol{constructor(e,t){super(),this.config=e,this.log=t,this.publish=super.emit,e.maxRetries&&(this.retriesRemaining=e.maxRetries),Ll=new Cl(this.config)}Client=Tl;queue=new xl;socket=!1;connect=jl;emit=Bl;retriesRemaining=0;explicitlyDisconnected=!1}function Bl(e,t){this.log("dispatching event to ",this.id,this.path," : ",e,",",t);let n=new El;n.type=e,n.data=t,n=this.config.rawBuffer?Buffer.from(e,this.config.encoding):Ll.format(n),this.config.sync?this.queue.add(Dl.bind(this,n)):this.socket.write(n)}function Dl(e){this.log("dispatching event to ",this.id,this.path," : ",e),this.socket.write(e)}function jl(){let e=this;if(e.log("requested connection to ",e.id,e.path),!this.path)return void e.log("\n\n######\nerror: ",e.id," client has not specified socket path it wishes to connect to.");const t={};if(e.port)if(t.host=e.path,t.port=e.port,e.config.interface.localAddress&&(t.localAddress=e.config.interface.localAddress),e.config.interface.localPort&&(t.localPort=e.config.interface.localPort),e.config.interface.family&&(t.family=e.config.interface.family),e.config.interface.hints&&(t.hints=e.config.interface.hints),e.config.interface.lookup&&(t.lookup=e.config.interface.lookup),e.config.tls){if(e.log("Connecting client via TLS to",e.path,e.port,e.config.tls),e.config.tls.private&&(e.config.tls.key=P.readFileSync(e.config.tls.private)),e.config.tls.public&&(e.config.tls.cert=P.readFileSync(e.config.tls.public)),e.config.tls.trustedConnections){"string"==typeof e.config.tls.trustedConnections&&(e.config.tls.trustedConnections=[e.config.tls.trustedConnections]),e.config.tls.ca=[];for(let t=0;t<e.config.tls.trustedConnections.length;t++)e.config.tls.ca.push(P.readFileSync(e.config.tls.trustedConnections[t]))}Object.assign(e.config.tls,t),e.socket=N.connect(e.config.tls)}else e.log("Connecting client via TCP to",t),e.socket=A.connect(t);else e.log("Connecting client on Unix Socket :",e.path),t.path=e.path,"win32"!==process.platform||e.path.startsWith("\\\\.\\pipe\\")||(t.path=t.path.replace(/^\//,""),t.path=t.path.replace(/\//g,"-"),t.path=`\\\\.\\pipe\\${t.path}`),e.socket=A.connect(t);e.socket.setEncoding(this.config.encoding),e.socket.on("error",(function(t){e.log("\n\n######\nerror: ",t),e.publish("error",t)})),e.socket.on("connect",(function(){e.publish("connect"),e.retriesRemaining=e.config.maxRetries,e.log("retrying reset")})),e.socket.on("close",(function(){if(e.log("connection closed",e.id,e.path,e.retriesRemaining,"tries remaining of",e.config.maxRetries),e.config.stopRetrying||e.retriesRemaining<1||e.explicitlyDisconnected)return e.publish("disconnect"),e.log(e.config.id,"exceeded connection rety amount of"," or stopRetrying flag set."),e.socket.destroy(),e.publish("destroy"),void(e=void 0);setTimeout(function(){e.explicitlyDisconnected||(e.retriesRemaining--,e.connect())}.bind(null,e),e.config.retry),e.publish("disconnect")})),e.socket.on("data",(function(t){if(e.log("## received events ##"),e.config.rawBuffer){if(e.publish("data",Buffer.from(t,e.config.encoding)),!e.config.sync)return;return void e.queue.next()}if(this.ipcBuffer||(this.ipcBuffer=""),(t=this.ipcBuffer+=t).slice(-1)!=Ll.delimiter||-1==t.indexOf(Ll.delimiter))return void e.log("Messages are large, You may want to consider smaller messages.");this.ipcBuffer="";const n=Ll.parse(t),r=n.length;for(let t=0;t<r;t++){let r=new El;r.load(n[t]),e.log("detected event",r.type,r.data),e.publish(r.type,r.data)}e.config.sync&&e.queue.next()}))}let Rl=new Cl;class Ul extends Ol{constructor(e,t,n,r){super(),this.config=t,this.path=e,this.port=r,this.log=n,this.publish=super.emit,Rl=new Cl(this.config),this.on("close",Wl.bind(this))}udp4=!1;udp6=!1;server=!1;sockets=[];emit=Fl;broadcast=Ml;onStart(e){this.publish("start",e)}stop(){this.server.close()}start(){this.path?this.config.unlink?P.unlink(this.path,zl.bind(this)):zl.bind(this)():this.log("Socket Server Path not specified, refusing to start")}}function Fl(e,t,n){this.log("dispatching event to socket"," : ",t,n);let r=new El;if(r.type=t,r.data=n,this.config.rawBuffer?(this.log(this.config.encoding),r=Buffer.from(t,this.config.encoding)):r=Rl.format(r),this.udp4||this.udp6)return e.address&&e.port?void this.server.write(r,e):(this.log("Attempting to emit to a single UDP socket without supplying socket address or port. Redispatching event as broadcast to all connected sockets"),void this.broadcast(t,n));e.write(r)}function Ml(e,t){this.log("broadcasting event to all known sockets listening to ",this.path," : ",this.port?this.port:"",e,t);let n=new El;if(n.type=e,n.data=t,n=this.config.rawBuffer?Buffer.from(e,this.config.encoding):Rl.format(n),this.udp4||this.udp6)for(let e=1,t=this.sockets.length;e<t;e++)this.server.write(n,this.sockets[e]);else for(let e=0,t=this.sockets.length;e<t;e++)this.sockets[e].write(n)}function Wl(){for(let e=0,t=this.sockets.length;e<t;e++){let t=this.sockets[e],n=!1;if(!t||!t.readable)return t.id&&(n=t.id),this.log("socket disconnected",n.toString()),t&&t.destroy&&t.destroy(),this.sockets.splice(e,1),void this.publish("socket.disconnected",t,n)}}function Gl(e,t,n){let r=this.udp4||this.udp6?n:e;if(this.config.rawBuffer)return t=Buffer.from(t,this.config.encoding),void this.publish("data",t,r);if(r.ipcBuffer||(r.ipcBuffer=""),(t=r.ipcBuffer+=t).slice(-1)==Rl.delimiter&&-1!=t.indexOf(Rl.delimiter))for(r.ipcBuffer="",t=Rl.parse(t);t.length>0;){let e=new El;e.load(t.shift()),e.data&&e.data.id&&(r.id=e.data.id),this.log("received event of : ",e.type,e.data),this.publish(e.type,e.data,r)}else this.log("Messages are large, You may want to consider smaller messages.")}function Vl(e){this.publish("close",e)}function Hl(e){this.sockets.push(e),e.setEncoding&&e.setEncoding(this.config.encoding),this.log("## socket connection to server detected ##"),e.on("close",Vl.bind(this)),e.on("error",function(e){this.log("server socket error",e),this.publish("error",e)}.bind(this)),e.on("data",Gl.bind(this,e)),e.on("message",function(t,n){if(!n)return;let r;this.log("Received UDP message from ",n.address,n.port),r=this.config.rawSocket?Buffer.from(t,this.config.encoding):t.toString(),e.emit("data",r,n)}.bind(this)),this.publish("connect",e),this.config.rawBuffer}function zl(){return this.log("starting server on ",this.path,this.port?`:${this.port}`:""),this.udp4||this.udp6?(this.server=L.createSocket(this.udp4?"udp4":"udp6"),this.server.write=Kl.bind(this),this.server.on("listening",function(){Hl.bind(this)(this.server)}.bind(this))):(this.log("starting TLS server",this.config.tls),this.config.tls?ql.bind(this)():this.server=A.createServer(Hl.bind(this))),this.server.on("error",function(e){this.log("server error",e),this.publish("error",e)}.bind(this)),this.server.maxConnections=this.config.maxConnections,this.port?this.udp4||this.udp6?(this.log("starting server as",this.udp4?"udp4":"udp6"),this.server.bind(this.port,this.path),void this.onStart({address:this.path,port:this.port})):(this.log("starting server as",this.config.tls?"TLS":"TCP"),void this.server.listen(this.port,this.path,this.onStart.bind(this))):(this.log("starting server as","Unix || Windows Socket"),"win32"===process.platform&&(this.path=this.path.replace(/^\//,""),this.path=this.path.replace(/\//g,"-"),this.path=`\\\\.\\pipe\\${this.path}`),void this.server.listen({path:this.path,readableAll:this.config.readableAll,writableAll:this.config.writableAll},this.onStart.bind(this)))}function ql(){if(this.log("starting TLS server",this.config.tls),this.config.tls.private?this.config.tls.key=P.readFileSync(this.config.tls.private):this.config.tls.key=P.readFileSync(`${__dirname}/../local-node-ipc-certs/private/server.key`),this.config.tls.public?this.config.tls.cert=P.readFileSync(this.config.tls.public):this.config.tls.cert=P.readFileSync(`${__dirname}/../local-node-ipc-certs/server.pub`),this.config.tls.dhparam&&(this.config.tls.dhparam=P.readFileSync(this.config.tls.dhparam)),this.config.tls.trustedConnections){"string"==typeof this.config.tls.trustedConnections&&(this.config.tls.trustedConnections=[this.config.tls.trustedConnections]),this.config.tls.ca=[];for(let e=0;e<this.config.tls.trustedConnections.length;e++)this.config.tls.ca.push(P.readFileSync(this.config.tls.trustedConnections[e]))}this.server=N.createServer(this.config.tls,Hl.bind(this))}function Kl(e,t){let n=Buffer.from(e,this.config.encoding);this.server.send(n,0,n.length,t.port,t.address,(function(e){e&&(this.log("error writing data to socket",e),this.publish("error",(function(e){this.publish("error",e)})))}))}class Jl{constructor(){}config=new $l;of={};server=!1;get connectTo(){return td}get connectToNet(){return nd}get disconnect(){return Xl}get serve(){return Zl}get serveNet(){return ed}get log(){return Yl}set connectTo(e){return td}set connectToNet(e){return nd}set disconnect(e){return Xl}set serve(e){return Zl}set serveNet(e){return ed}set log(e){return Yl}}function Yl(...e){if(!this.config.silent){for(let t=0,n=e.length;t<n;t++)"object"==typeof e[t]&&(e[t]=o.inspect(e[t],{depth:this.config.logDepth,colors:this.config.logInColor}));this.config.logger(e.join(" "))}}function Xl(e){this.of[e]&&(this.of[e].explicitlyDisconnected=!0,this.of[e].off("*","*"),this.of[e].socket&&this.of[e].socket.destroy&&this.of[e].socket.destroy(),delete this.of[e])}function Zl(e,t){"function"==typeof e&&(t=e,e=!1),e||(this.log("Server path not specified, so defaulting to","ipc.config.socketRoot + ipc.config.appspace + ipc.config.id",this.config.socketRoot+this.config.appspace+this.config.id),e=this.config.socketRoot+this.config.appspace+this.config.id),t||(t=Ql),this.server=new Ul(e,this.config,Yl),this.server.on("start",t)}function Ql(){}function ed(e,t,n,r){"number"==typeof e&&(r=n,n=t,t=e,e=!1),"function"==typeof e&&(r=e,n=!1,e=!1,t=!1),e||(this.log("Server host not specified, so defaulting to","ipc.config.networkHost",this.config.networkHost),e=this.config.networkHost),"udp4"!=e.toLowerCase()&&"udp6"!=e.toLowerCase()||(r=t,n=e.toLowerCase(),t=!1,e=this.config.networkHost),"string"==typeof t&&(r=n,n=t,t=!1),"function"==typeof t&&(r=t,n=!1,t=!1),t||(this.log("Server port not specified, so defaulting to","ipc.config.networkPort",this.config.networkPort),t=this.config.networkPort),"function"==typeof n&&(r=n,n=!1),r||(r=Ql),this.server=new Ul(e,this.config,Yl,t),n&&(this.server[n]=!0,"udp4"===n&&"::1"===e&&(this.server.path="127.0.0.1")),this.server.on("start",r)}function td(e,t,n){if("function"==typeof t&&(n=t,t=!1),n||(n=Ql),e){if(t||(this.log("Service path not specified, so defaulting to","ipc.config.socketRoot + ipc.config.appspace + id",(this.config.socketRoot+this.config.appspace+e).data),t=this.config.socketRoot+this.config.appspace+e),this.of[e]){if(!this.of[e].socket.destroyed)return this.log("Already Connected to",e,"- So executing success without connection"),void n();this.of[e].socket.destroy()}this.of[e]=new Tl(this.config,this.log),this.of[e].id=e,this.of[e].socket&&(this.of[e].socket.id=e),this.of[e].path=t,this.of[e].connect(),n(this)}else this.log("Service id required","Requested service connection without specifying service id. Aborting connection attempt")}function nd(e,t,n,r){if(e){if("number"==typeof t&&(r=n,n=t,t=!1),"function"==typeof t&&(r=t,t=!1,n=!1),t||(this.log("Server host not specified, so defaulting to","ipc.config.networkHost",this.config.networkHost),t=this.config.networkHost),"function"==typeof n&&(r=n,n=!1),n||(this.log("Server port not specified, so defaulting to","ipc.config.networkPort",this.config.networkPort),n=this.config.networkPort),"string"==typeof r&&(UDPType=r,r=!1),r||(r=Ql),this.of[e]){if(!this.of[e].socket.destroyed)return this.log("Already Connected to",e,"- So executing success without connection"),void r();this.of[e].socket.destroy()}this.of[e]=new Tl(this.config,this.log),this.of[e].id=e,this.of[e].socket&&(this.of[e].socket.id=e),this.of[e].path=t,this.of[e].port=n,this.of[e].connect(),r(this)}else this.log("Service id required","Requested service connection without specifying service id. Aborting connection attempt")}const rd=new class extends Jl{constructor(){super()}IPC=Jl};var id={id:"widgets",retry:1500,silent:!0,rawBuffer:!0,appspace:"kemu.",encoding:"hex"};const sd=Object.values({protocolPrefix:4,protocolVersion:1,jsonLength:4,binaryLength:4,fromServiceId:4,toServiceId:4,sentAt:8}).reduce(((e,t)=>e+t),0),od=e=>{try{return JSON.parse(e)}catch(e){return null}},ad="undefined"!=typeof window,cd={protocolPrefix:4,protocolVersion:1,jsonLength:4,binaryLength:4,fromServiceId:4,toServiceId:4,sentAt:8},ld={protocolPrefix:4,txtLength:4},dd=Object.values(cd).reduce(((e,t)=>e+t),0),ud=Object.values(ld).reduce(((e,t)=>e+t),0),pd=["width","height","colorSpace"],hd=(e,t)=>{const n={},r=[];let i=0,s=Array.isArray(e)?[]:{};const o=(e,s)=>{const a=(e=>{const t="undefined"!=typeof Buffer&&e instanceof Buffer,n=e instanceof ArrayBuffer,r=e instanceof Uint8ClampedArray,i=e instanceof Uint8Array,s=e instanceof Int8Array;return t?"Buffer":n?"ArrayBuffer":r?"Uint8ClampedArray":i?"Uint8Array":s?"Int8Array":null})(e);if(!a){if(Array.isArray(e)){const t=[];for(let n=0;n<e.length;n++)t[n]=o(e[n],`${s}[${n}]`);return t}if("object"==typeof e){const t={},n=(e=>{const t=e instanceof Int16Array,n=e instanceof Uint16Array,r=e instanceof Int32Array,i=e instanceof Uint32Array,s=e instanceof Float32Array,o=e instanceof Float64Array,a=e instanceof BigInt64Array,c=e instanceof BigUint64Array;return t?"Int16Array":n?"Uint16Array":r?"Int32Array":i?"Uint32Array":s?"Float32Array":o?"Float64Array":a?"BigInt64Array":c?"BigUint64Array":null})(e);if(n)throw new Error(`Unsupported binary type [${n}] at path "${s}"`);for(const n in e)e.hasOwnProperty(n)||pd.includes(n)||console.warn(`Allowing inherited property: ${n} from path: ${s}`),t[n]=o(e[n],`${s.length?`${s}.`:""}${n}`);return t}return e}n[s]={index:i,length:e.byteLength,binaryType:a},"Buffer"===t?r.push(Buffer.from(e)):"ArrayBuffer"===a?r.push(e):r.push(e.buffer),i+=e.byteLength};s=o(e,"");let a=null;if(r.length>1)if("ArrayBuffer"===t){const e=r.reduce(((e,t)=>e+t.byteLength),0),t=new Uint8Array(e);let n=0;for(let e=0;e<r.length;e++)t.set(new Uint8Array(r[e]),n),n+=r[e].byteLength;a=t.buffer}else{a=Buffer.concat(r)}else 1===r.length&&(a=r[0]);return a?{map:n,combinedData:a,sourceCopy:s}:null},fd=(e,t,n)=>{const r=t.match(/(\[\d+\])|([^[\].]+)/g)||[];let i=e;for(let e=0;e<r.length;e++){let t=r[e];const s=t.startsWith("[")&&t.endsWith("]"),o=e===r.length-1;if(s){t=t.slice(1,-1);const s=parseInt(t,10);if(!Array.isArray(i))throw new Error(`Expected an array at key "${r.slice(0,e).join(".")}" but found an object.`);o?i[s]=n:(i[s]||(i[s]=r[e+1].startsWith("[")?[]:{}),i=i[s])}else o?i[t]=n:(i[t]||(i[t]=r[e+1].startsWith("[")?[]:{}),i=i[t])}return e},gd=(e,t,n)=>{const r="undefined"!=typeof Buffer,i=t instanceof Uint8Array;for(const s in n)if(n.hasOwnProperty(s)){const{index:o,length:a,binaryType:c}=n[s];let l=null;if(r&&t instanceof Buffer)switch(c){case"Buffer":l=t.subarray(o,o+a);break;case"ArrayBuffer":l=t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength).slice(o,o+a);break;case"Uint8Array":l=new Uint8Array(t.subarray(o,o+a));break;case"Uint8ClampedArray":l=new Uint8ClampedArray(t.subarray(o,o+a));break;case"Int8Array":l=new Int8Array(t.subarray(o,o+a))}else if(t instanceof ArrayBuffer||t instanceof Uint8Array)switch(c){case"Buffer":if(r){l=Buffer.from(t.slice(o,o+a));break}case"ArrayBuffer":l=i?t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength).slice(o,o+a):t.slice(o,o+a);break;case"Uint8Array":l=i?t.slice(o,o+a):new Uint8Array(t.slice(o,o+a));break;case"Uint8ClampedArray":l=new Uint8ClampedArray(t.slice(o,o+a));break;case"Int8Array":l=new Int8Array(t.slice(o,o+a))}l&&fd(e,s,l)}return e},md=e=>Wc(e),vd="KMSG",yd="KCMD",bd=md("klProtocol");var wd={encode:(e,t,n)=>{const r={json:e.json},i=hd(r.json,"Buffer"),s=i?.combinedData;i&&(r.jsonBinaryMap=i.map,r.json=i.sourceCopy);const o=s?s.byteLength:0,a=JSON.stringify(r),c=Buffer.from(a),l=c.byteLength,d=cd.protocolPrefix+cd.protocolVersion+cd.jsonLength+cd.binaryLength+cd.fromServiceId+cd.toServiceId+cd.sentAt+l+o,u=Buffer.alloc(d),p=Date.now();let h=0;return u.write(vd,h),h+=cd.protocolPrefix,u.writeUInt8(1,h),h+=cd.protocolVersion,u.writeUInt32LE(l,h),h+=cd.jsonLength,u.writeUInt32LE(o,h),h+=cd.binaryLength,u.writeUInt32LE(t,h),h+=cd.fromServiceId,u.writeUInt32LE(n,h),h+=cd.toServiceId,u.writeBigInt64LE(BigInt(p),h),h+=cd.sentAt,c.copy(u,h),h+=l,s&&o&&s.copy(u,h),u},decodeHeader:e=>{let t=0;const n=e.toString("utf-8",t,cd.protocolPrefix);if(t+=cd.protocolPrefix,n!==vd)return null;if(e.byteLength<dd)return bd(`Received a Partial Header with ${e.byteLength} bytes. Waiting for more data.`),{partialHeader:!0,remaining:null};const r=e.readUInt8(t);t+=cd.protocolVersion;const i=e.readUInt32LE(t);t+=cd.jsonLength;const s=e.readUInt32LE(t);t+=cd.binaryLength;const o=e.readUInt32LE(t);t+=cd.fromServiceId;const a=e.readUInt32LE(t);t+=cd.toServiceId;const c=e.readBigInt64LE(t);t+=cd.sentAt;const l=i+s,d=e.subarray(t,t+l),u=e.subarray(0,dd);let p=null;return e.byteLength-dd-i-s>0&&(p=e.subarray(dd+i+s)),{header:{protocolVersion:r,jsonLength:i,binaryLength:s,fromServiceId:o,toServiceId:a,sentAt:new Date(Number(c)),packages:[d],headerPackage:u},remaining:p}},decodeFullKlMessage:e=>{const t=Buffer.concat(e.packages),n=t.subarray(0,e.jsonLength).toString(),r=t.subarray(e.jsonLength,e.jsonLength+e.binaryLength),i=od(n);if(!i?.json)return bd("Invalid JSON in KL message"),null;i.jsonBinaryMap&&r.byteLength&&gd(i.json,r,i.jsonBinaryMap);const s=Buffer.concat([e.headerPackage,t]);let o=s,a=null;const c=dd+e.jsonLength+e.binaryLength;return s.byteLength>c&&(a=s.subarray(c),o=s.subarray(0,c)),{message:{json:i.json,rawMessage:o},remaining:a}},patchEncodedHeader:(e,t)=>{if(null==t.fromServiceId&&void 0===t.toServiceId)return e;if(e.byteLength<dd)return bd("Invalid Header Size"),e;let n=0;return n+=cd.protocolPrefix,n+=cd.protocolVersion,n+=cd.jsonLength,n+=cd.binaryLength,void 0!==t.fromServiceId&&e.writeUInt32LE(t.fromServiceId,n),n+=cd.fromServiceId,void 0!==t.toServiceId&&e.writeUInt32LE(t.toServiceId,n),e},encodeCommand:e=>{let t=0;const n=Buffer.from(e),r=n.byteLength,i=ud+r,s=Buffer.alloc(i);return s.write(yd,t),t+=ld.protocolPrefix,s.writeUint32LE(r,t),t+=ld.txtLength,n.copy(s,t),s},decodeCommand:e=>{let t=0;if(e.byteLength<ud)return{command:null};const n=e.toString("utf-8",t,ld.protocolPrefix);if(t+=ld.protocolPrefix,n!==yd)return{command:null};const r=e.readUInt32LE(t);t+=ld.txtLength;const i=e.toString("utf-8",t,t+r),s=e.byteLength-ud-r;let o=null;s>0&&(o=e.subarray(ud+r));let a=0;return s<0&&(a=Math.abs(s)),{command:i,remainingData:o,missing:a}}};const Sd="KMSG",Id="KCMD",_d=md("klProtocol"),$d=new TextEncoder;var Cd={encode:(e,t,n)=>{const r={json:e.json},i=hd(e.json,"ArrayBuffer"),s=i?.combinedData;i&&(r.jsonBinaryMap=i.map,r.json=i.sourceCopy);const o=s?s.byteLength:0,a=JSON.stringify(r),c=$d.encode(a),l=c.byteLength,d=new ArrayBuffer(cd.protocolPrefix+cd.protocolVersion+cd.jsonLength+cd.binaryLength+cd.fromServiceId+cd.toServiceId+cd.sentAt+l+o),u=new DataView(d),p=new Uint8Array(d),h=Date.now();let f=0;for(let e=0;e<4;++e)p[f++]=Sd.charCodeAt(e);return u.setUint8(f,1),f+=cd.protocolVersion,u.setUint32(f,l,!0),f+=cd.jsonLength,u.setUint32(f,o,!0),f+=cd.binaryLength,u.setUint32(f,t,!0),f+=cd.fromServiceId,u.setUint32(f,n,!0),f+=cd.toServiceId,u.setBigInt64(f,BigInt(h),!0),f+=cd.sentAt,p.set(c,f),f+=l,s&&o&&p.set(new Uint8Array(s),f),d},decodeHeader:e=>{const t=new DataView(e);let n=0,r="";for(let e=0;e<cd.protocolPrefix;++e)r+=String.fromCharCode(t.getUint8(n++));if(r!==Sd)return null;if(e.byteLength<dd)return _d.log(`Received a Partial Header with ${e.byteLength} bytes. Waiting for more data.`),{partialHeader:!0,remaining:null};const i=t.getUint8(n);n+=cd.protocolVersion;const s=t.getUint32(n,!0);n+=cd.jsonLength;const o=t.getUint32(n,!0);n+=cd.binaryLength;const a=t.getUint32(n,!0);n+=cd.fromServiceId;const c=t.getUint32(n,!0);n+=cd.toServiceId;const l=t.getBigInt64(n,!0);n+=cd.sentAt;const d=s+o,u=e.slice(n,n+d),p=new Uint8Array(e,0,dd);let h=null;if(e.byteLength-dd-s-o>0){h=new Uint8Array(e,dd+s+o).slice().buffer}return{header:{protocolVersion:i,jsonLength:s,binaryLength:o,fromServiceId:a,toServiceId:c,sentAt:new Date(Number(l)),packages:[u],headerPackage:p.slice().buffer},remaining:h}},decodeFullKlMessage:e=>{const t=e.packages.reduce(((e,t)=>e+t.byteLength),0),n=new Uint8Array(t);let r,i=0;for(const t of e.packages)r=new Uint8Array(t),n.set(r,i),i+=r.byteLength;const s=(new TextDecoder).decode(n.subarray(0,e.jsonLength)),o=n.subarray(e.jsonLength,e.jsonLength+e.binaryLength),a=od(s);if(!a?.json)return _d.log("Invalid JSON in KL message"),null;a.jsonBinaryMap&&o.byteLength&&gd(a.json,o,a.jsonBinaryMap);const c=new Uint8Array(e.headerPackage.byteLength+n.byteLength);c.set(new Uint8Array(e.headerPackage),0),c.set(n,e.headerPackage.byteLength);let l=c,d=null;const u=dd+e.jsonLength+e.binaryLength;return c.byteLength>u&&(d=c.subarray(u),l=c.subarray(0,u)),{message:{json:a.json,...o.length?{binaryData:o.buffer}:{},rawMessage:l.buffer},remaining:d?.buffer??null}},patchEncodedHeader:(e,t)=>{if(null==t.fromServiceId&&void 0===t.toServiceId)return e;if(e.byteLength<dd)return _d("Invalid Header Size"),e;let n=0;n+=cd.protocolPrefix,n+=cd.protocolVersion,n+=cd.jsonLength,n+=cd.binaryLength;const r=new DataView(e);return void 0!==t.fromServiceId&&r.setUint32(n,t.fromServiceId,!0),n+=cd.fromServiceId,void 0!==t.toServiceId&&r.setUint32(n,t.toServiceId,!0),e},encodeCommand:e=>{let t=0;const n=$d.encode(e),r=n.byteLength,i=new ArrayBuffer(ud+r),s=new DataView(i),o=new Uint8Array(i);for(let e=0;e<4;++e)o[t++]=Id.charCodeAt(e);return s.setUint32(t,r,!0),t+=ld.txtLength,o.set(n,t),i},decodeCommand:e=>{const t=new DataView(e);let n=0;if(e.byteLength<ud)return{command:null};let r="";for(let e=0;e<ld.protocolPrefix;++e)r+=String.fromCharCode(t.getUint8(n++));if(r!==Id)return{command:null};const i=t.getUint32(n,!0);n+=ld.txtLength;const s=e.byteLength-ud-i,o=new Uint8Array(e,n,Math.min(i,e.byteLength-ud)),a=(new TextDecoder).decode(o);let c=null;s>0&&(c=e.slice(ud+i));let l=0;return s<0&&(l=Math.abs(s)),{command:a,remainingData:c,missing:l}}};const kd=md("klTransmissionManager"),Ed=()=>{const e=(t,n,r,i)=>{let s=n,o=null;const a=t instanceof ArrayBuffer;if(kd(`RAW: ${t.toString()}`),!s||s.partialHeaderData){let c;if(a?(c=s?.partialHeaderData?new Uint8Array([...new Uint8Array(s.partialHeaderData),...new Uint8Array(t)]).buffer:t,o=Cd.decodeHeader(c)):(c=s?.partialHeaderData?Buffer.concat([s.partialHeaderData,t]):t,o=wd.decodeHeader(c)),!o){const{command:t,missing:s,remainingData:o}=a?Cd.decodeCommand(c):wd.decodeCommand(c);return t?i({command:t,complete:!0,rawMessage:c}):kd(s?`ERROR: Missing ${s} bytes to complete the command. This partial command will be aborted.`:`ERROR: Invalid state, message was decoded without a header or partial header data. Discarding ${c.byteLength} bytes`),o?(kd(`${o.byteLength} bytes remain after processing command. Re-analyzing...`),e(o,n,r,i)):void 0}if(o.partialHeader)return s={firstPackageAt:Date.now(),partialHeaderData:c},r(s);if(!o.header)return kd(`ERROR: Invalid state, message was decoded without a header or partial header data. Discarding ${c.byteLength} bytes`);const l=o.header;s={firstPackageAt:Date.now(),header:{...l,totalBytesReceived:l.packages[0].byteLength,totalBytesExpected:l.binaryLength+l.jsonLength,remaining:o.remaining}},r(s)}else s.header&&s.header.totalBytesReceived<s.header.totalBytesExpected&&(s.header.packages.push(t),s.header.totalBytesReceived+=t.byteLength,r(s));if(s.header&&s.header.totalBytesReceived>=s.header.totalBytesExpected){const t=Date.now()-s.header.sentAt.getTime(),n=Date.now()-s.firstPackageAt;kd(`Received ${s.header.totalBytesReceived} of ${s.header.totalBytesExpected} expected in ${t} ms, elapsed since first package: ${n}ms`);const o=a?Cd.decodeFullKlMessage(s.header):wd.decodeFullKlMessage(s.header),c=s.header.totalBytesReceived,l=s.header.remaining;r(null),o&&i({klMessage:o.message,complete:!0,sourceServiceId:s.header.fromServiceId,targetServiceId:s.header.toServiceId,rawMessage:o.message.rawMessage});let d=l;if(o?.remaining&&(d=a?l?((e,t)=>{const n=e.byteLength+t.byteLength,r=new ArrayBuffer(n),i=new Uint8Array(e),s=new Uint8Array(t),o=new Uint8Array(r);return o.set(i),o.set(s,i.length),r})(l,o.remaining):o.remaining:l?Buffer.concat([l,o.remaining]):o.remaining),d)return kd(`${d.byteLength} bytes remaining after processing message with ${c} bytes of data. Re-analyzing...`),e(d,null,r,i)}};return e};rd.config={...rd.config,...id};const xd={info:Gc("ipcServer:info"),data:Gc("ipcServer:data")};let Ad,Nd,Pd,Od,Ld={};const Td=Ed(),Bd=e=>{Ld[e]&&(xd.info(`Client disconnected [${e}]`),delete Ld[e],Nd&&Nd(e))};var Dd=e=>(e?.ipcId&&(rd.config.id=e.ipcId),e?.ipcAppSpace&&(rd.config.appspace=e.ipcAppSpace),new Promise((e=>{rd.serve((()=>{xd.info("IPC Server Initiated"),rd.server.on("data",((e,t)=>{const n=Ld[t.id];n?(xd.data(`IPC Socket [${t.id}] data ${e.byteLength} bytes`),Td(e,n.activeMessage,(e=>n.activeMessage=e),(e=>{if(!e.complete)return;const n=e=>{t.write(e)};if(e.command)return xd.data(`Received command from client [${t.id}]: ${e.command}`),void(Pd&&Pd(t.id,e.command,n));e.klMessage&&Od&&Od({send:n,transmission:{sourceServiceId:e.sourceServiceId??-1,targetServiceId:e.targetServiceId??-1,rawMessage:e.rawMessage},json:e.klMessage.json})}))):xd.data(`Received data from unknown client [${t.id}]. Ignoring.`)})),rd.server.on("connect",(e=>{const t=zc();xd.info(`New client connected. Registered as "${t}"`),e.id=t,Ld[t]={socket:e,activeMessage:null,disconnectHandler:()=>Bd(t)},e.on("close",Ld[t].disconnectHandler),Ad&&Ad(t)})),rd.server.on("disconnect",(e=>{Bd(e.id)})),rd.server.on("error",(e=>{console.log(`IPC Server Error: ${e}`)})),e()})),rd.server.start()}))),jd=e=>{Ad=e},Rd=e=>{Nd=e},Ud=e=>Od=e,Fd=(e,t)=>{const n=Ld[e];if(!n)return xd.info(`Cannot send message to unknown client [${e}]`),!1;if(t.length>=sd)return xd.info("Message is too long to be a command. Use sendMessage instead."),!1;const r=wd.encodeCommand(t);return n.socket.write(r),!0},Md=(e,t)=>{const n=Ld[e];return!!n&&(xd.info(`Renaming socket id [${e}] to [${t}]`),delete Ld[e],n.socket.id=t,Ld[t]=n,n.socket.removeListener("close",n.disconnectHandler),n.disconnectHandler=()=>Bd(t),n.socket.on("close",n.disconnectHandler),!0)},Wd=e=>{Pd=e};let Gd=wd;ad&&(Gd=Cd);var Vd,Hd=Gd;!function(e){e.FunctionNotFound="FNC_NOT_FOUND",e.ParentEventCallbackError="PARENT_EVENT_CALLBACK_ERROR"}(Vd||(Vd={}));let zd=Math.ceil(Date.now()/1e3);var qd={exports:{}};const Kd=["nodebuffer","arraybuffer","fragments"],Jd="undefined"!=typeof Blob;Jd&&Kd.push("blob");var Yd={BINARY_TYPES:Kd,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob:Jd,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),NOOP:()=>{}};const{EMPTY_BUFFER:Xd}=Yd,Zd=Buffer[Symbol.species];function Qd(e,t,n,r,i){for(let s=0;s<i;s++)n[r+s]=e[s]^t[3&s]}function eu(e,t){for(let n=0;n<e.length;n++)e[n]^=t[3&n]}if(qd.exports={concat:function(e,t){if(0===e.length)return Xd;if(1===e.length)return e[0];const n=Buffer.allocUnsafe(t);let r=0;for(let t=0;t<e.length;t++){const i=e[t];n.set(i,r),r+=i.length}return r<t?new Zd(n.buffer,n.byteOffset,r):n},mask:Qd,toArrayBuffer:function(e){return e.length===e.buffer.byteLength?e.buffer:e.buffer.slice(e.byteOffset,e.byteOffset+e.length)},toBuffer:function e(t){if(e.readOnly=!0,Buffer.isBuffer(t))return t;let n;return t instanceof ArrayBuffer?n=new Zd(t):ArrayBuffer.isView(t)?n=new Zd(t.buffer,t.byteOffset,t.byteLength):(n=Buffer.from(t),e.readOnly=!1),n},unmask:eu},!process.env.WS_NO_BUFFER_UTIL)try{const e=require("bufferutil");qd.exports.mask=function(t,n,r,i,s){s<48?Qd(t,n,r,i,s):e.mask(t,n,r,i,s)},qd.exports.unmask=function(t,n){t.length<32?eu(t,n):e.unmask(t,n)}}catch(e){}var tu=qd.exports;const nu=Symbol("kDone"),ru=Symbol("kRun");const iu=B,su=tu,ou=class{constructor(e){this[nu]=()=>{this.pending--,this[ru]()},this.concurrency=e||1/0,this.jobs=[],this.pending=0}add(e){this.jobs.push(e),this[ru]()}[ru](){if(this.pending!==this.concurrency&&this.jobs.length){const e=this.jobs.shift();this.pending++,e(this[nu])}}},{kStatusCode:au}=Yd,cu=Buffer[Symbol.species],lu=Buffer.from([0,0,255,255]),du=Symbol("permessage-deflate"),uu=Symbol("total-length"),pu=Symbol("callback"),hu=Symbol("buffers"),fu=Symbol("error");let gu;var mu=class{constructor(e,t,n){if(this._maxPayload=0|n,this._options=e||{},this._threshold=void 0!==this._options.threshold?this._options.threshold:1024,this._isServer=!!t,this._deflate=null,this._inflate=null,this.params=null,!gu){const e=void 0!==this._options.concurrencyLimit?this._options.concurrencyLimit:10;gu=new ou(e)}}static get extensionName(){return"permessage-deflate"}offer(){const e={};return this._options.serverNoContextTakeover&&(e.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(e.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(e.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?e.client_max_window_bits=this._options.clientMaxWindowBits:null==this._options.clientMaxWindowBits&&(e.client_max_window_bits=!0),e}accept(e){return e=this.normalizeParams(e),this.params=this._isServer?this.acceptAsServer(e):this.acceptAsClient(e),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){const e=this._deflate[pu];this._deflate.close(),this._deflate=null,e&&e(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(e){const t=this._options,n=e.find((e=>!(!1===t.serverNoContextTakeover&&e.server_no_context_takeover||e.server_max_window_bits&&(!1===t.serverMaxWindowBits||"number"==typeof t.serverMaxWindowBits&&t.serverMaxWindowBits>e.server_max_window_bits)||"number"==typeof t.clientMaxWindowBits&&!e.client_max_window_bits)));if(!n)throw new Error("None of the extension offers can be accepted");return t.serverNoContextTakeover&&(n.server_no_context_takeover=!0),t.clientNoContextTakeover&&(n.client_no_context_takeover=!0),"number"==typeof t.serverMaxWindowBits&&(n.server_max_window_bits=t.serverMaxWindowBits),"number"==typeof t.clientMaxWindowBits?n.client_max_window_bits=t.clientMaxWindowBits:!0!==n.client_max_window_bits&&!1!==t.clientMaxWindowBits||delete n.client_max_window_bits,n}acceptAsClient(e){const t=e[0];if(!1===this._options.clientNoContextTakeover&&t.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(t.client_max_window_bits){if(!1===this._options.clientMaxWindowBits||"number"==typeof this._options.clientMaxWindowBits&&t.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"')}else"number"==typeof this._options.clientMaxWindowBits&&(t.client_max_window_bits=this._options.clientMaxWindowBits);return t}normalizeParams(e){return e.forEach((e=>{Object.keys(e).forEach((t=>{let n=e[t];if(n.length>1)throw new Error(`Parameter "${t}" must have only a single value`);if(n=n[0],"client_max_window_bits"===t){if(!0!==n){const e=+n;if(!Number.isInteger(e)||e<8||e>15)throw new TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${t}": ${n}`)}else if("server_max_window_bits"===t){const e=+n;if(!Number.isInteger(e)||e<8||e>15)throw new TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else{if("client_no_context_takeover"!==t&&"server_no_context_takeover"!==t)throw new Error(`Unknown parameter "${t}"`);if(!0!==n)throw new TypeError(`Invalid value for parameter "${t}": ${n}`)}e[t]=n}))})),e}decompress(e,t,n){gu.add((r=>{this._decompress(e,t,((e,t)=>{r(),n(e,t)}))}))}compress(e,t,n){gu.add((r=>{this._compress(e,t,((e,t)=>{r(),n(e,t)}))}))}_decompress(e,t,n){const r=this._isServer?"client":"server";if(!this._inflate){const e=`${r}_max_window_bits`,t="number"!=typeof this.params[e]?iu.Z_DEFAULT_WINDOWBITS:this.params[e];this._inflate=iu.createInflateRaw({...this._options.zlibInflateOptions,windowBits:t}),this._inflate[du]=this,this._inflate[uu]=0,this._inflate[hu]=[],this._inflate.on("error",bu),this._inflate.on("data",yu)}this._inflate[pu]=n,this._inflate.write(e),t&&this._inflate.write(lu),this._inflate.flush((()=>{const e=this._inflate[fu];if(e)return this._inflate.close(),this._inflate=null,void n(e);const i=su.concat(this._inflate[hu],this._inflate[uu]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[uu]=0,this._inflate[hu]=[],t&&this.params[`${r}_no_context_takeover`]&&this._inflate.reset()),n(null,i)}))}_compress(e,t,n){const r=this._isServer?"server":"client";if(!this._deflate){const e=`${r}_max_window_bits`,t="number"!=typeof this.params[e]?iu.Z_DEFAULT_WINDOWBITS:this.params[e];this._deflate=iu.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:t}),this._deflate[uu]=0,this._deflate[hu]=[],this._deflate.on("data",vu)}this._deflate[pu]=n,this._deflate.write(e),this._deflate.flush(iu.Z_SYNC_FLUSH,(()=>{if(!this._deflate)return;let e=su.concat(this._deflate[hu],this._deflate[uu]);t&&(e=new cu(e.buffer,e.byteOffset,e.length-4)),this._deflate[pu]=null,this._deflate[uu]=0,this._deflate[hu]=[],t&&this.params[`${r}_no_context_takeover`]&&this._deflate.reset(),n(null,e)}))}};function vu(e){this[hu].push(e),this[uu]+=e.length}function yu(e){this[uu]+=e.length,this[du]._maxPayload<1||this[uu]<=this[du]._maxPayload?this[hu].push(e):(this[fu]=new RangeError("Max payload size exceeded"),this[fu].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH",this[fu][au]=1009,this.removeListener("data",yu),this.reset())}function bu(e){this[du]._inflate=null,e[au]=1007,this[pu](e)}var wu={exports:{}};const{isUtf8:Su}=D,{hasBlob:Iu}=Yd;function _u(e){const t=e.length;let n=0;for(;n<t;)if(128&e[n])if(192==(224&e[n])){if(n+1===t||128!=(192&e[n+1])||192==(254&e[n]))return!1;n+=2}else if(224==(240&e[n])){if(n+2>=t||128!=(192&e[n+1])||128!=(192&e[n+2])||224===e[n]&&128==(224&e[n+1])||237===e[n]&&160==(224&e[n+1]))return!1;n+=3}else{if(240!=(248&e[n]))return!1;if(n+3>=t||128!=(192&e[n+1])||128!=(192&e[n+2])||128!=(192&e[n+3])||240===e[n]&&128==(240&e[n+1])||244===e[n]&&e[n+1]>143||e[n]>244)return!1;n+=4}else n++;return!0}if(wu.exports={isBlob:function(e){return Iu&&"object"==typeof e&&"function"==typeof e.arrayBuffer&&"string"==typeof e.type&&"function"==typeof e.stream&&("Blob"===e[Symbol.toStringTag]||"File"===e[Symbol.toStringTag])},isValidStatusCode:function(e){return e>=1e3&&e<=1014&&1004!==e&&1005!==e&&1006!==e||e>=3e3&&e<=4999},isValidUTF8:_u,tokenChars:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0]},Su)wu.exports.isValidUTF8=function(e){return e.length<24?_u(e):Su(e)};else if(!process.env.WS_NO_UTF_8_VALIDATE)try{const e=require("utf-8-validate");wu.exports.isValidUTF8=function(t){return t.length<32?_u(t):e(t)}}catch(e){}var $u=wu.exports;const{Writable:Cu}=T,ku=mu,{BINARY_TYPES:Eu,EMPTY_BUFFER:xu,kStatusCode:Au,kWebSocket:Nu}=Yd,{concat:Pu,toArrayBuffer:Ou,unmask:Lu}=tu,{isValidStatusCode:Tu,isValidUTF8:Bu}=$u,Du=Buffer[Symbol.species];var ju=class extends Cu{constructor(e={}){super(),this._allowSynchronousEvents=void 0===e.allowSynchronousEvents||e.allowSynchronousEvents,this._binaryType=e.binaryType||Eu[0],this._extensions=e.extensions||{},this._isServer=!!e.isServer,this._maxPayload=0|e.maxPayload,this._skipUTF8Validation=!!e.skipUTF8Validation,this[Nu]=void 0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._errored=!1,this._loop=!1,this._state=0}_write(e,t,n){if(8===this._opcode&&0==this._state)return n();this._bufferedBytes+=e.length,this._buffers.push(e),this.startLoop(n)}consume(e){if(this._bufferedBytes-=e,e===this._buffers[0].length)return this._buffers.shift();if(e<this._buffers[0].length){const t=this._buffers[0];return this._buffers[0]=new Du(t.buffer,t.byteOffset+e,t.length-e),new Du(t.buffer,t.byteOffset,e)}const t=Buffer.allocUnsafe(e);do{const n=this._buffers[0],r=t.length-e;e>=n.length?t.set(this._buffers.shift(),r):(t.set(new Uint8Array(n.buffer,n.byteOffset,e),r),this._buffers[0]=new Du(n.buffer,n.byteOffset+e,n.length-e)),e-=n.length}while(e>0);return t}startLoop(e){this._loop=!0;do{switch(this._state){case 0:this.getInfo(e);break;case 1:this.getPayloadLength16(e);break;case 2:this.getPayloadLength64(e);break;case 3:this.getMask();break;case 4:this.getData(e);break;case 5:case 6:return void(this._loop=!1)}}while(this._loop);this._errored||e()}getInfo(e){if(this._bufferedBytes<2)return void(this._loop=!1);const t=this.consume(2);if(48&t[0]){return void e(this.createError(RangeError,"RSV2 and RSV3 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_2_3"))}const n=!(64&~t[0]);if(!n||this._extensions[ku.extensionName]){if(this._fin=!(128&~t[0]),this._opcode=15&t[0],this._payloadLength=127&t[1],0===this._opcode){if(n){return void e(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"))}if(!this._fragmented){return void e(this.createError(RangeError,"invalid opcode 0",!0,1002,"WS_ERR_INVALID_OPCODE"))}this._opcode=this._fragmented}else if(1===this._opcode||2===this._opcode){if(this._fragmented){return void e(this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE"))}this._compressed=n}else{if(!(this._opcode>7&&this._opcode<11)){return void e(this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE"))}if(!this._fin){return void e(this.createError(RangeError,"FIN must be set",!0,1002,"WS_ERR_EXPECTED_FIN"))}if(n){return void e(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"))}if(this._payloadLength>125||8===this._opcode&&1===this._payloadLength){return void e(this.createError(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH"))}}if(this._fin||this._fragmented||(this._fragmented=this._opcode),this._masked=!(128&~t[1]),this._isServer){if(!this._masked){return void e(this.createError(RangeError,"MASK must be set",!0,1002,"WS_ERR_EXPECTED_MASK"))}}else if(this._masked){return void e(this.createError(RangeError,"MASK must be clear",!0,1002,"WS_ERR_UNEXPECTED_MASK"))}126===this._payloadLength?this._state=1:127===this._payloadLength?this._state=2:this.haveLength(e)}else{e(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"))}}getPayloadLength16(e){this._bufferedBytes<2?this._loop=!1:(this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength(e))}getPayloadLength64(e){if(this._bufferedBytes<8)return void(this._loop=!1);const t=this.consume(8),n=t.readUInt32BE(0);if(n>Math.pow(2,21)-1){e(this.createError(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH"))}else this._payloadLength=n*Math.pow(2,32)+t.readUInt32BE(4),this.haveLength(e)}haveLength(e){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0)){e(this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH"))}else this._masked?this._state=3:this._state=4}getMask(){this._bufferedBytes<4?this._loop=!1:(this._mask=this.consume(4),this._state=4)}getData(e){let t=xu;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength)return void(this._loop=!1);t=this.consume(this._payloadLength),this._masked&&this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3]&&Lu(t,this._mask)}if(this._opcode>7)this.controlMessage(t,e);else{if(this._compressed)return this._state=5,void this.decompress(t,e);t.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(t)),this.dataMessage(e)}}decompress(e,t){this._extensions[ku.extensionName].decompress(e,this._fin,((e,n)=>{if(e)return t(e);if(n.length){if(this._messageLength+=n.length,this._messageLength>this._maxPayload&&this._maxPayload>0){const e=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");return void t(e)}this._fragments.push(n)}this.dataMessage(t),0===this._state&&this.startLoop(t)}))}dataMessage(e){if(!this._fin)return void(this._state=0);const t=this._messageLength,n=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],2===this._opcode){let r;r="nodebuffer"===this._binaryType?Pu(n,t):"arraybuffer"===this._binaryType?Ou(Pu(n,t)):"blob"===this._binaryType?new Blob(n):n,this._allowSynchronousEvents?(this.emit("message",r,!0),this._state=0):(this._state=6,setImmediate((()=>{this.emit("message",r,!0),this._state=0,this.startLoop(e)})))}else{const r=Pu(n,t);if(!this._skipUTF8Validation&&!Bu(r)){const t=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");return void e(t)}5===this._state||this._allowSynchronousEvents?(this.emit("message",r,!1),this._state=0):(this._state=6,setImmediate((()=>{this.emit("message",r,!1),this._state=0,this.startLoop(e)})))}}controlMessage(e,t){if(8!==this._opcode)this._allowSynchronousEvents?(this.emit(9===this._opcode?"ping":"pong",e),this._state=0):(this._state=6,setImmediate((()=>{this.emit(9===this._opcode?"ping":"pong",e),this._state=0,this.startLoop(t)})));else{if(0===e.length)this._loop=!1,this.emit("conclude",1005,xu),this.end();else{const n=e.readUInt16BE(0);if(!Tu(n)){const e=this.createError(RangeError,`invalid status code ${n}`,!0,1002,"WS_ERR_INVALID_CLOSE_CODE");return void t(e)}const r=new Du(e.buffer,e.byteOffset+2,e.length-2);if(!this._skipUTF8Validation&&!Bu(r)){const e=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");return void t(e)}this._loop=!1,this.emit("conclude",n,r),this.end()}this._state=0}}createError(e,t,n,r,i){this._loop=!1,this._errored=!0;const s=new e(n?`Invalid WebSocket frame: ${t}`:t);return Error.captureStackTrace(s,this.createError),s.code=i,s[Au]=r,s}};const{randomFillSync:Ru}=l,Uu=mu,{EMPTY_BUFFER:Fu,kWebSocket:Mu,NOOP:Wu}=Yd,{isBlob:Gu,isValidStatusCode:Vu}=$u,{mask:Hu,toBuffer:zu}=tu,qu=Symbol("kByteLength"),Ku=Buffer.alloc(4),Ju=8192;let Yu,Xu=Ju;var Zu=class e{constructor(e,t,n){this._extensions=t||{},n&&(this._generateMask=n,this._maskBuffer=Buffer.alloc(4)),this._socket=e,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._queue=[],this._state=0,this.onerror=Wu,this[Mu]=void 0}static frame(e,t){let n,r,i=!1,s=2,o=!1;t.mask&&(n=t.maskBuffer||Ku,t.generateMask?t.generateMask(n):(Xu===Ju&&(void 0===Yu&&(Yu=Buffer.alloc(Ju)),Ru(Yu,0,Ju),Xu=0),n[0]=Yu[Xu++],n[1]=Yu[Xu++],n[2]=Yu[Xu++],n[3]=Yu[Xu++]),o=!(n[0]|n[1]|n[2]|n[3]),s=6),"string"==typeof e?r=t.mask&&!o||void 0===t[qu]?(e=Buffer.from(e)).length:t[qu]:(r=e.length,i=t.mask&&t.readOnly&&!o);let a=r;r>=65536?(s+=8,a=127):r>125&&(s+=2,a=126);const c=Buffer.allocUnsafe(i?r+s:s);return c[0]=t.fin?128|t.opcode:t.opcode,t.rsv1&&(c[0]|=64),c[1]=a,126===a?c.writeUInt16BE(r,2):127===a&&(c[2]=c[3]=0,c.writeUIntBE(r,4,6)),t.mask?(c[1]|=128,c[s-4]=n[0],c[s-3]=n[1],c[s-2]=n[2],c[s-1]=n[3],o?[c,e]:i?(Hu(e,n,c,s,r),[c]):(Hu(e,n,e,0,r),[c,e])):[c,e]}close(t,n,r,i){let s;if(void 0===t)s=Fu;else{if("number"!=typeof t||!Vu(t))throw new TypeError("First argument must be a valid error code number");if(void 0!==n&&n.length){const e=Buffer.byteLength(n);if(e>123)throw new RangeError("The message must not be greater than 123 bytes");s=Buffer.allocUnsafe(2+e),s.writeUInt16BE(t,0),"string"==typeof n?s.write(n,2):s.set(n,2)}else s=Buffer.allocUnsafe(2),s.writeUInt16BE(t,0)}const o={[qu]:s.length,fin:!0,generateMask:this._generateMask,mask:r,maskBuffer:this._maskBuffer,opcode:8,readOnly:!1,rsv1:!1};0!==this._state?this.enqueue([this.dispatch,s,!1,o,i]):this.sendFrame(e.frame(s,o),i)}ping(t,n,r){let i,s;if("string"==typeof t?(i=Buffer.byteLength(t),s=!1):Gu(t)?(i=t.size,s=!1):(i=(t=zu(t)).length,s=zu.readOnly),i>125)throw new RangeError("The data size must not be greater than 125 bytes");const o={[qu]:i,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:9,readOnly:s,rsv1:!1};Gu(t)?0!==this._state?this.enqueue([this.getBlobData,t,!1,o,r]):this.getBlobData(t,!1,o,r):0!==this._state?this.enqueue([this.dispatch,t,!1,o,r]):this.sendFrame(e.frame(t,o),r)}pong(t,n,r){let i,s;if("string"==typeof t?(i=Buffer.byteLength(t),s=!1):Gu(t)?(i=t.size,s=!1):(i=(t=zu(t)).length,s=zu.readOnly),i>125)throw new RangeError("The data size must not be greater than 125 bytes");const o={[qu]:i,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:10,readOnly:s,rsv1:!1};Gu(t)?0!==this._state?this.enqueue([this.getBlobData,t,!1,o,r]):this.getBlobData(t,!1,o,r):0!==this._state?this.enqueue([this.dispatch,t,!1,o,r]):this.sendFrame(e.frame(t,o),r)}send(e,t,n){const r=this._extensions[Uu.extensionName];let i,s,o=t.binary?2:1,a=t.compress;"string"==typeof e?(i=Buffer.byteLength(e),s=!1):Gu(e)?(i=e.size,s=!1):(i=(e=zu(e)).length,s=zu.readOnly),this._firstFragment?(this._firstFragment=!1,a&&r&&r.params[r._isServer?"server_no_context_takeover":"client_no_context_takeover"]&&(a=i>=r._threshold),this._compress=a):(a=!1,o=0),t.fin&&(this._firstFragment=!0);const c={[qu]:i,fin:t.fin,generateMask:this._generateMask,mask:t.mask,maskBuffer:this._maskBuffer,opcode:o,readOnly:s,rsv1:a};Gu(e)?0!==this._state?this.enqueue([this.getBlobData,e,this._compress,c,n]):this.getBlobData(e,this._compress,c,n):0!==this._state?this.enqueue([this.dispatch,e,this._compress,c,n]):this.dispatch(e,this._compress,c,n)}getBlobData(t,n,r,i){this._bufferedBytes+=r[qu],this._state=2,t.arrayBuffer().then((t=>{if(this._socket.destroyed){const e=new Error("The socket was closed while the blob was being read");return void process.nextTick(Qu,this,e,i)}this._bufferedBytes-=r[qu];const s=zu(t);n?this.dispatch(s,n,r,i):(this._state=0,this.sendFrame(e.frame(s,r),i),this.dequeue())})).catch((e=>{process.nextTick(ep,this,e,i)}))}dispatch(t,n,r,i){if(!n)return void this.sendFrame(e.frame(t,r),i);const s=this._extensions[Uu.extensionName];this._bufferedBytes+=r[qu],this._state=1,s.compress(t,r.fin,((t,n)=>{if(this._socket.destroyed){Qu(this,new Error("The socket was closed while data was being compressed"),i)}else this._bufferedBytes-=r[qu],this._state=0,r.readOnly=!1,this.sendFrame(e.frame(n,r),i),this.dequeue()}))}dequeue(){for(;0===this._state&&this._queue.length;){const e=this._queue.shift();this._bufferedBytes-=e[3][qu],Reflect.apply(e[0],this,e.slice(1))}}enqueue(e){this._bufferedBytes+=e[3][qu],this._queue.push(e)}sendFrame(e,t){2===e.length?(this._socket.cork(),this._socket.write(e[0]),this._socket.write(e[1],t),this._socket.uncork()):this._socket.write(e[0],t)}};function Qu(e,t,n){"function"==typeof n&&n(t);for(let n=0;n<e._queue.length;n++){const r=e._queue[n],i=r[r.length-1];"function"==typeof i&&i(t)}}function ep(e,t,n){Qu(e,t,n),e.onerror(t)}const{kForOnEventAttribute:tp,kListener:np}=Yd,rp=Symbol("kCode"),ip=Symbol("kData"),sp=Symbol("kError"),op=Symbol("kMessage"),ap=Symbol("kReason"),cp=Symbol("kTarget"),lp=Symbol("kType"),dp=Symbol("kWasClean");class up{constructor(e){this[cp]=null,this[lp]=e}get target(){return this[cp]}get type(){return this[lp]}}Object.defineProperty(up.prototype,"target",{enumerable:!0}),Object.defineProperty(up.prototype,"type",{enumerable:!0});class pp extends up{constructor(e,t={}){super(e),this[rp]=void 0===t.code?0:t.code,this[ap]=void 0===t.reason?"":t.reason,this[dp]=void 0!==t.wasClean&&t.wasClean}get code(){return this[rp]}get reason(){return this[ap]}get wasClean(){return this[dp]}}Object.defineProperty(pp.prototype,"code",{enumerable:!0}),Object.defineProperty(pp.prototype,"reason",{enumerable:!0}),Object.defineProperty(pp.prototype,"wasClean",{enumerable:!0});class hp extends up{constructor(e,t={}){super(e),this[sp]=void 0===t.error?null:t.error,this[op]=void 0===t.message?"":t.message}get error(){return this[sp]}get message(){return this[op]}}Object.defineProperty(hp.prototype,"error",{enumerable:!0}),Object.defineProperty(hp.prototype,"message",{enumerable:!0});class fp extends up{constructor(e,t={}){super(e),this[ip]=void 0===t.data?null:t.data}get data(){return this[ip]}}Object.defineProperty(fp.prototype,"data",{enumerable:!0});const gp={addEventListener(e,t,n={}){for(const r of this.listeners(e))if(!n[tp]&&r[np]===t&&!r[tp])return;let r;if("message"===e)r=function(e,n){const r=new fp("message",{data:n?e:e.toString()});r[cp]=this,vp(t,this,r)};else if("close"===e)r=function(e,n){const r=new pp("close",{code:e,reason:n.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});r[cp]=this,vp(t,this,r)};else if("error"===e)r=function(e){const n=new hp("error",{error:e,message:e.message});n[cp]=this,vp(t,this,n)};else{if("open"!==e)return;r=function(){const e=new up("open");e[cp]=this,vp(t,this,e)}}r[tp]=!!n[tp],r[np]=t,n.once?this.once(e,r):this.on(e,r)},removeEventListener(e,t){for(const n of this.listeners(e))if(n[np]===t&&!n[tp]){this.removeListener(e,n);break}}};var mp={CloseEvent:pp,ErrorEvent:hp,Event:up,EventTarget:gp,MessageEvent:fp};function vp(e,t,n){"object"==typeof e&&e.handleEvent?e.handleEvent.call(e,n):e.call(t,n)}const{tokenChars:yp}=$u;function bp(e,t,n){void 0===e[t]?e[t]=[n]:e[t].push(n)}var wp={format:function(e){return Object.keys(e).map((t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map((e=>[t].concat(Object.keys(e).map((t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map((e=>!0===e?t:`${t}=${e}`)).join("; ")}))).join("; "))).join(", ")})).join(", ")},parse:function(e){const t=Object.create(null);let n,r,i=Object.create(null),s=!1,o=!1,a=!1,c=-1,l=-1,d=-1,u=0;for(;u<e.length;u++)if(l=e.charCodeAt(u),void 0===n)if(-1===d&&1===yp[l])-1===c&&(c=u);else if(0===u||32!==l&&9!==l){if(59!==l&&44!==l)throw new SyntaxError(`Unexpected character at index ${u}`);{if(-1===c)throw new SyntaxError(`Unexpected character at index ${u}`);-1===d&&(d=u);const r=e.slice(c,d);44===l?(bp(t,r,i),i=Object.create(null)):n=r,c=d=-1}}else-1===d&&-1!==c&&(d=u);else if(void 0===r)if(-1===d&&1===yp[l])-1===c&&(c=u);else if(32===l||9===l)-1===d&&-1!==c&&(d=u);else if(59===l||44===l){if(-1===c)throw new SyntaxError(`Unexpected character at index ${u}`);-1===d&&(d=u),bp(i,e.slice(c,d),!0),44===l&&(bp(t,n,i),i=Object.create(null),n=void 0),c=d=-1}else{if(61!==l||-1===c||-1!==d)throw new SyntaxError(`Unexpected character at index ${u}`);r=e.slice(c,u),c=d=-1}else if(o){if(1!==yp[l])throw new SyntaxError(`Unexpected character at index ${u}`);-1===c?c=u:s||(s=!0),o=!1}else if(a)if(1===yp[l])-1===c&&(c=u);else if(34===l&&-1!==c)a=!1,d=u;else{if(92!==l)throw new SyntaxError(`Unexpected character at index ${u}`);o=!0}else if(34===l&&61===e.charCodeAt(u-1))a=!0;else if(-1===d&&1===yp[l])-1===c&&(c=u);else if(-1===c||32!==l&&9!==l){if(59!==l&&44!==l)throw new SyntaxError(`Unexpected character at index ${u}`);{if(-1===c)throw new SyntaxError(`Unexpected character at index ${u}`);-1===d&&(d=u);let o=e.slice(c,d);s&&(o=o.replace(/\\/g,""),s=!1),bp(i,r,o),44===l&&(bp(t,n,i),i=Object.create(null),n=void 0),r=void 0,c=d=-1}}else-1===d&&(d=u);if(-1===c||a||32===l||9===l)throw new SyntaxError("Unexpected end of input");-1===d&&(d=u);const p=e.slice(c,d);return void 0===n?bp(t,p,i):(void 0===r?bp(i,p,!0):bp(i,r,s?p.replace(/\\/g,""):p),bp(t,n,i)),t}};const Sp=j,Ip=R,_p=U,$p=A,Cp=N,{randomBytes:kp,createHash:Ep}=l,{URL:xp}=F,Ap=mu,Np=ju,Pp=Zu,{isBlob:Op}=$u,{BINARY_TYPES:Lp,EMPTY_BUFFER:Tp,GUID:Bp,kForOnEventAttribute:Dp,kListener:jp,kStatusCode:Rp,kWebSocket:Up,NOOP:Fp}=Yd,{EventTarget:{addEventListener:Mp,removeEventListener:Wp}}=mp,{format:Gp,parse:Vp}=wp,{toBuffer:Hp}=tu,zp=3e4,qp=Symbol("kAborted"),Kp=[8,13],Jp=["CONNECTING","OPEN","CLOSING","CLOSED"],Yp=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;let Xp=class e extends Sp{constructor(t,n,r){super(),this._binaryType=Lp[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=Tp,this._closeTimer=null,this._errorEmitted=!1,this._extensions={},this._paused=!1,this._protocol="",this._readyState=e.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,null!==t?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,void 0===n?n=[]:Array.isArray(n)||("object"==typeof n&&null!==n?(r=n,n=[]):n=[n]),Qp(this,t,n,r)):(this._autoPong=r.autoPong,this._isServer=!0)}get binaryType(){return this._binaryType}set binaryType(e){Lp.includes(e)&&(this._binaryType=e,this._receiver&&(this._receiver._binaryType=e))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get isPaused(){return this._paused}get onclose(){return null}get onerror(){return null}get onopen(){return null}get onmessage(){return null}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(t,n,r){const i=new Np({allowSynchronousEvents:r.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxPayload:r.maxPayload,skipUTF8Validation:r.skipUTF8Validation}),s=new Pp(t,this._extensions,r.generateMask);this._receiver=i,this._sender=s,this._socket=t,i[Up]=this,s[Up]=this,t[Up]=this,i.on("conclude",sh),i.on("drain",oh),i.on("error",ah),i.on("message",lh),i.on("ping",dh),i.on("pong",uh),s.onerror=hh,t.setTimeout&&t.setTimeout(0),t.setNoDelay&&t.setNoDelay(),n.length>0&&t.unshift(n),t.on("close",gh),t.on("data",mh),t.on("end",vh),t.on("error",yh),this._readyState=e.OPEN,this.emit("open")}emitClose(){if(!this._socket)return this._readyState=e.CLOSED,void this.emit("close",this._closeCode,this._closeMessage);this._extensions[Ap.extensionName]&&this._extensions[Ap.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=e.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(t,n){if(this.readyState!==e.CLOSED)if(this.readyState!==e.CONNECTING)this.readyState!==e.CLOSING?(this._readyState=e.CLOSING,this._sender.close(t,n,!this._isServer,(e=>{e||(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())})),fh(this)):this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end();else{const e="WebSocket was closed before the connection was established";rh(this,this._req,e)}}pause(){this.readyState!==e.CONNECTING&&this.readyState!==e.CLOSED&&(this._paused=!0,this._socket.pause())}ping(t,n,r){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");"function"==typeof t?(r=t,t=n=void 0):"function"==typeof n&&(r=n,n=void 0),"number"==typeof t&&(t=t.toString()),this.readyState===e.OPEN?(void 0===n&&(n=!this._isServer),this._sender.ping(t||Tp,n,r)):ih(this,t,r)}pong(t,n,r){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");"function"==typeof t?(r=t,t=n=void 0):"function"==typeof n&&(r=n,n=void 0),"number"==typeof t&&(t=t.toString()),this.readyState===e.OPEN?(void 0===n&&(n=!this._isServer),this._sender.pong(t||Tp,n,r)):ih(this,t,r)}resume(){this.readyState!==e.CONNECTING&&this.readyState!==e.CLOSED&&(this._paused=!1,this._receiver._writableState.needDrain||this._socket.resume())}send(t,n,r){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if("function"==typeof n&&(r=n,n={}),"number"==typeof t&&(t=t.toString()),this.readyState!==e.OPEN)return void ih(this,t,r);const i={binary:"string"!=typeof t,mask:!this._isServer,compress:!0,fin:!0,...n};this._extensions[Ap.extensionName]||(i.compress=!1),this._sender.send(t||Tp,i,r)}terminate(){if(this.readyState!==e.CLOSED)if(this.readyState!==e.CONNECTING)this._socket&&(this._readyState=e.CLOSING,this._socket.destroy());else{const e="WebSocket was closed before the connection was established";rh(this,this._req,e)}}};Object.defineProperty(Xp,"CONNECTING",{enumerable:!0,value:Jp.indexOf("CONNECTING")}),Object.defineProperty(Xp.prototype,"CONNECTING",{enumerable:!0,value:Jp.indexOf("CONNECTING")}),Object.defineProperty(Xp,"OPEN",{enumerable:!0,value:Jp.indexOf("OPEN")}),Object.defineProperty(Xp.prototype,"OPEN",{enumerable:!0,value:Jp.indexOf("OPEN")}),Object.defineProperty(Xp,"CLOSING",{enumerable:!0,value:Jp.indexOf("CLOSING")}),Object.defineProperty(Xp.prototype,"CLOSING",{enumerable:!0,value:Jp.indexOf("CLOSING")}),Object.defineProperty(Xp,"CLOSED",{enumerable:!0,value:Jp.indexOf("CLOSED")}),Object.defineProperty(Xp.prototype,"CLOSED",{enumerable:!0,value:Jp.indexOf("CLOSED")}),["binaryType","bufferedAmount","extensions","isPaused","protocol","readyState","url"].forEach((e=>{Object.defineProperty(Xp.prototype,e,{enumerable:!0})})),["open","error","close","message"].forEach((e=>{Object.defineProperty(Xp.prototype,`on${e}`,{enumerable:!0,get(){for(const t of this.listeners(e))if(t[Dp])return t[jp];return null},set(t){for(const t of this.listeners(e))if(t[Dp]){this.removeListener(e,t);break}"function"==typeof t&&this.addEventListener(e,t,{[Dp]:!0})}})})),Xp.prototype.addEventListener=Mp,Xp.prototype.removeEventListener=Wp;var Zp=Xp;function Qp(e,t,n,r){const i={allowSynchronousEvents:!0,autoPong:!0,protocolVersion:Kp[1],maxPayload:104857600,skipUTF8Validation:!1,perMessageDeflate:!0,followRedirects:!1,maxRedirects:10,...r,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:"GET",host:void 0,path:void 0,port:void 0};if(e._autoPong=i.autoPong,!Kp.includes(i.protocolVersion))throw new RangeError(`Unsupported protocol version: ${i.protocolVersion} (supported versions: ${Kp.join(", ")})`);let s;if(t instanceof xp)s=t;else try{s=new xp(t)}catch(e){throw new SyntaxError(`Invalid URL: ${t}`)}"http:"===s.protocol?s.protocol="ws:":"https:"===s.protocol&&(s.protocol="wss:"),e._url=s.href;const o="wss:"===s.protocol,a="ws+unix:"===s.protocol;let c;if("ws:"===s.protocol||o||a?a&&!s.pathname?c="The URL's pathname is empty":s.hash&&(c="The URL contains a fragment identifier"):c='The URL\'s protocol must be one of "ws:", "wss:", "http:", "https", or "ws+unix:"',c){const t=new SyntaxError(c);if(0===e._redirects)throw t;return void eh(e,t)}const l=o?443:80,d=kp(16).toString("base64"),u=o?Ip.request:_p.request,p=new Set;let h,f;if(i.createConnection=i.createConnection||(o?nh:th),i.defaultPort=i.defaultPort||l,i.port=s.port||l,i.host=s.hostname.startsWith("[")?s.hostname.slice(1,-1):s.hostname,i.headers={...i.headers,"Sec-WebSocket-Version":i.protocolVersion,"Sec-WebSocket-Key":d,Connection:"Upgrade",Upgrade:"websocket"},i.path=s.pathname+s.search,i.timeout=i.handshakeTimeout,i.perMessageDeflate&&(h=new Ap(!0!==i.perMessageDeflate?i.perMessageDeflate:{},!1,i.maxPayload),i.headers["Sec-WebSocket-Extensions"]=Gp({[Ap.extensionName]:h.offer()})),n.length){for(const e of n){if("string"!=typeof e||!Yp.test(e)||p.has(e))throw new SyntaxError("An invalid or duplicated subprotocol was specified");p.add(e)}i.headers["Sec-WebSocket-Protocol"]=n.join(",")}if(i.origin&&(i.protocolVersion<13?i.headers["Sec-WebSocket-Origin"]=i.origin:i.headers.Origin=i.origin),(s.username||s.password)&&(i.auth=`${s.username}:${s.password}`),a){const e=i.path.split(":");i.socketPath=e[0],i.path=e[1]}if(i.followRedirects){if(0===e._redirects){e._originalIpc=a,e._originalSecure=o,e._originalHostOrSocketPath=a?i.socketPath:s.host;const t=r&&r.headers;if(r={...r,headers:{}},t)for(const[e,n]of Object.entries(t))r.headers[e.toLowerCase()]=n}else if(0===e.listenerCount("redirect")){const t=a?!!e._originalIpc&&i.socketPath===e._originalHostOrSocketPath:!e._originalIpc&&s.host===e._originalHostOrSocketPath;(!t||e._originalSecure&&!o)&&(delete i.headers.authorization,delete i.headers.cookie,t||delete i.headers.host,i.auth=void 0)}i.auth&&!r.headers.authorization&&(r.headers.authorization="Basic "+Buffer.from(i.auth).toString("base64")),f=e._req=u(i),e._redirects&&e.emit("redirect",e.url,f)}else f=e._req=u(i);i.timeout&&f.on("timeout",(()=>{rh(e,f,"Opening handshake has timed out")})),f.on("error",(t=>{null===f||f[qp]||(f=e._req=null,eh(e,t))})),f.on("response",(s=>{const o=s.headers.location,a=s.statusCode;if(o&&i.followRedirects&&a>=300&&a<400){if(++e._redirects>i.maxRedirects)return void rh(e,f,"Maximum redirects exceeded");let s;f.abort();try{s=new xp(o,t)}catch(t){const n=new SyntaxError(`Invalid URL: ${o}`);return void eh(e,n)}Qp(e,s,n,r)}else e.emit("unexpected-response",f,s)||rh(e,f,`Unexpected server response: ${s.statusCode}`)})),f.on("upgrade",((t,n,r)=>{if(e.emit("upgrade",t),e.readyState!==Xp.CONNECTING)return;f=e._req=null;const s=t.headers.upgrade;if(void 0===s||"websocket"!==s.toLowerCase())return void rh(e,n,"Invalid Upgrade header");const o=Ep("sha1").update(d+Bp).digest("base64");if(t.headers["sec-websocket-accept"]!==o)return void rh(e,n,"Invalid Sec-WebSocket-Accept header");const a=t.headers["sec-websocket-protocol"];let c;if(void 0!==a?p.size?p.has(a)||(c="Server sent an invalid subprotocol"):c="Server sent a subprotocol but none was requested":p.size&&(c="Server sent no subprotocol"),c)return void rh(e,n,c);a&&(e._protocol=a);const l=t.headers["sec-websocket-extensions"];if(void 0!==l){if(!h){return void rh(e,n,"Server sent a Sec-WebSocket-Extensions header but no extension was requested")}let t;try{t=Vp(l)}catch(t){return void rh(e,n,"Invalid Sec-WebSocket-Extensions header")}const r=Object.keys(t);if(1!==r.length||r[0]!==Ap.extensionName){return void rh(e,n,"Server indicated an extension that was not requested")}try{h.accept(t[Ap.extensionName])}catch(t){return void rh(e,n,"Invalid Sec-WebSocket-Extensions header")}e._extensions[Ap.extensionName]=h}e.setSocket(n,r,{allowSynchronousEvents:i.allowSynchronousEvents,generateMask:i.generateMask,maxPayload:i.maxPayload,skipUTF8Validation:i.skipUTF8Validation})})),i.finishRequest?i.finishRequest(f,e):f.end()}function eh(e,t){e._readyState=Xp.CLOSING,e._errorEmitted=!0,e.emit("error",t),e.emitClose()}function th(e){return e.path=e.socketPath,$p.connect(e)}function nh(e){return e.path=void 0,e.servername||""===e.servername||(e.servername=$p.isIP(e.host)?"":e.host),Cp.connect(e)}function rh(e,t,n){e._readyState=Xp.CLOSING;const r=new Error(n);Error.captureStackTrace(r,rh),t.setHeader?(t[qp]=!0,t.abort(),t.socket&&!t.socket.destroyed&&t.socket.destroy(),process.nextTick(eh,e,r)):(t.destroy(r),t.once("error",e.emit.bind(e,"error")),t.once("close",e.emitClose.bind(e)))}function ih(e,t,n){if(t){const n=Op(t)?t.size:Hp(t).length;e._socket?e._sender._bufferedBytes+=n:e._bufferedAmount+=n}if(n){const t=new Error(`WebSocket is not open: readyState ${e.readyState} (${Jp[e.readyState]})`);process.nextTick(n,t)}}function sh(e,t){const n=this[Up];n._closeFrameReceived=!0,n._closeMessage=t,n._closeCode=e,void 0!==n._socket[Up]&&(n._socket.removeListener("data",mh),process.nextTick(ph,n._socket),1005===e?n.close():n.close(e,t))}function oh(){const e=this[Up];e.isPaused||e._socket.resume()}function ah(e){const t=this[Up];void 0!==t._socket[Up]&&(t._socket.removeListener("data",mh),process.nextTick(ph,t._socket),t.close(e[Rp])),t._errorEmitted||(t._errorEmitted=!0,t.emit("error",e))}function ch(){this[Up].emitClose()}function lh(e,t){this[Up].emit("message",e,t)}function dh(e){const t=this[Up];t._autoPong&&t.pong(e,!this._isServer,Fp),t.emit("ping",e)}function uh(e){this[Up].emit("pong",e)}function ph(e){e.resume()}function hh(e){const t=this[Up];t.readyState!==Xp.CLOSED&&(t.readyState===Xp.OPEN&&(t._readyState=Xp.CLOSING,fh(t)),this._socket.end(),t._errorEmitted||(t._errorEmitted=!0,t.emit("error",e)))}function fh(e){e._closeTimer=setTimeout(e._socket.destroy.bind(e._socket),zp)}function gh(){const e=this[Up];let t;this.removeListener("close",gh),this.removeListener("data",mh),this.removeListener("end",vh),e._readyState=Xp.CLOSING,this._readableState.endEmitted||e._closeFrameReceived||e._receiver._writableState.errorEmitted||null===(t=e._socket.read())||e._receiver.write(t),e._receiver.end(),this[Up]=void 0,clearTimeout(e._closeTimer),e._receiver._writableState.finished||e._receiver._writableState.errorEmitted?e.emitClose():(e._receiver.on("error",ch),e._receiver.on("finish",ch))}function mh(e){this[Up]._receiver.write(e)||this.pause()}function vh(){const e=this[Up];e._readyState=Xp.CLOSING,e._receiver.end(),this.end()}function yh(){const e=this[Up];this.removeListener("error",yh),this.on("error",Fp),e&&(e._readyState=Xp.CLOSING,this.destroy())}const{tokenChars:bh}=$u;var wh={parse:function(e){const t=new Set;let n=-1,r=-1,i=0;for(;i<e.length;i++){const s=e.charCodeAt(i);if(-1===r&&1===bh[s])-1===n&&(n=i);else if(0===i||32!==s&&9!==s){if(44!==s)throw new SyntaxError(`Unexpected character at index ${i}`);{if(-1===n)throw new SyntaxError(`Unexpected character at index ${i}`);-1===r&&(r=i);const s=e.slice(n,r);if(t.has(s))throw new SyntaxError(`The "${s}" subprotocol is duplicated`);t.add(s),n=r=-1}}else-1===r&&-1!==n&&(r=i)}if(-1===n||-1!==r)throw new SyntaxError("Unexpected end of input");const s=e.slice(n,i);if(t.has(s))throw new SyntaxError(`The "${s}" subprotocol is duplicated`);return t.add(s),t}};const Sh=j,Ih=U,{createHash:_h}=l,$h=wp,Ch=mu,kh=wh,Eh=Zp,{GUID:xh,kWebSocket:Ah}=Yd,Nh=/^[+/0-9A-Za-z]{22}==$/;var Ph=class extends Sh{constructor(e,t){if(super(),null==(e={allowSynchronousEvents:!0,autoPong:!0,maxPayload:104857600,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:Eh,...e}).port&&!e.server&&!e.noServer||null!=e.port&&(e.server||e.noServer)||e.server&&e.noServer)throw new TypeError('One and only one of the "port", "server", or "noServer" options must be specified');if(null!=e.port?(this._server=Ih.createServer(((e,t)=>{const n=Ih.STATUS_CODES[426];t.writeHead(426,{"Content-Length":n.length,"Content-Type":"text/plain"}),t.end(n)})),this._server.listen(e.port,e.host,e.backlog,t)):e.server&&(this._server=e.server),this._server){const e=this.emit.bind(this,"connection");this._removeListeners=function(e,t){for(const n of Object.keys(t))e.on(n,t[n]);return function(){for(const n of Object.keys(t))e.removeListener(n,t[n])}}(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(t,n,r)=>{this.handleUpgrade(t,n,r,e)}})}!0===e.perMessageDeflate&&(e.perMessageDeflate={}),e.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=e,this._state=0}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(e){if(2===this._state)return e&&this.once("close",(()=>{e(new Error("The server is not running"))})),void process.nextTick(Oh,this);if(e&&this.once("close",e),1!==this._state)if(this._state=1,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients&&this.clients.size?this._shouldEmitClose=!0:process.nextTick(Oh,this);else{const e=this._server;this._removeListeners(),this._removeListeners=this._server=null,e.close((()=>{Oh(this)}))}}shouldHandle(e){if(this.options.path){const t=e.url.indexOf("?");if((-1!==t?e.url.slice(0,t):e.url)!==this.options.path)return!1}return!0}handleUpgrade(e,t,n,r){t.on("error",Lh);const i=e.headers["sec-websocket-key"],s=e.headers.upgrade,o=+e.headers["sec-websocket-version"];if("GET"!==e.method){return void Bh(this,e,t,405,"Invalid HTTP method")}if(void 0===s||"websocket"!==s.toLowerCase()){return void Bh(this,e,t,400,"Invalid Upgrade header")}if(void 0===i||!Nh.test(i)){return void Bh(this,e,t,400,"Missing or invalid Sec-WebSocket-Key header")}if(8!==o&&13!==o){return void Bh(this,e,t,400,"Missing or invalid Sec-WebSocket-Version header")}if(!this.shouldHandle(e))return void Th(t,400);const a=e.headers["sec-websocket-protocol"];let c=new Set;if(void 0!==a)try{c=kh.parse(a)}catch(n){return void Bh(this,e,t,400,"Invalid Sec-WebSocket-Protocol header")}const l=e.headers["sec-websocket-extensions"],d={};if(this.options.perMessageDeflate&&void 0!==l){const n=new Ch(this.options.perMessageDeflate,!0,this.options.maxPayload);try{const e=$h.parse(l);e[Ch.extensionName]&&(n.accept(e[Ch.extensionName]),d[Ch.extensionName]=n)}catch(n){return void Bh(this,e,t,400,"Invalid or unacceptable Sec-WebSocket-Extensions header")}}if(this.options.verifyClient){const s={origin:e.headers[""+(8===o?"sec-websocket-origin":"origin")],secure:!(!e.socket.authorized&&!e.socket.encrypted),req:e};if(2===this.options.verifyClient.length)return void this.options.verifyClient(s,((s,o,a,l)=>{if(!s)return Th(t,o||401,a,l);this.completeUpgrade(d,i,c,e,t,n,r)}));if(!this.options.verifyClient(s))return Th(t,401)}this.completeUpgrade(d,i,c,e,t,n,r)}completeUpgrade(e,t,n,r,i,s,o){if(!i.readable||!i.writable)return i.destroy();if(i[Ah])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>0)return Th(i,503);const a=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${_h("sha1").update(t+xh).digest("base64")}`],c=new this.options.WebSocket(null,void 0,this.options);if(n.size){const e=this.options.handleProtocols?this.options.handleProtocols(n,r):n.values().next().value;e&&(a.push(`Sec-WebSocket-Protocol: ${e}`),c._protocol=e)}if(e[Ch.extensionName]){const t=e[Ch.extensionName].params,n=$h.format({[Ch.extensionName]:[t]});a.push(`Sec-WebSocket-Extensions: ${n}`),c._extensions=e}this.emit("headers",a,r),i.write(a.concat("\r\n").join("\r\n")),i.removeListener("error",Lh),c.setSocket(i,s,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(c),c.on("close",(()=>{this.clients.delete(c),this._shouldEmitClose&&!this.clients.size&&process.nextTick(Oh,this)}))),o(c,r)}};function Oh(e){e._state=2,e.emit("close")}function Lh(){this.destroy()}function Th(e,t,n,r){n=n||Ih.STATUS_CODES[t],r={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(n),...r},e.once("finish",e.destroy),e.end(`HTTP/1.1 ${t} ${Ih.STATUS_CODES[t]}\r\n`+Object.keys(r).map((e=>`${e}: ${r[e]}`)).join("\r\n")+"\r\n\r\n"+n)}function Bh(e,t,n,r,i){if(e.listenerCount("wsClientError")){const r=new Error(i);Error.captureStackTrace(r,Bh),e.emit("wsClientError",r,n,t)}else Th(n,r,i)}var Dh=Cc(Ph);const jh=Gc("websocketServer"),Rh={},Uh=Ed();let Fh,Mh,Wh,Gh,Vh;const Hh=e=>{const t=Rh[e];t&&t.socket.close()};var zh={startServer:e=>{Vh=new Dh({port:e,maxPayload:1048576e3}),Vh.on("connection",(e=>{const t=zc();jh(`New client connected. Registered as "${t}"`),e.id=t,Rh[t]={socket:e,activeMessage:null},Fh&&Fh(t),e.on("message",(t=>{if(t instanceof Buffer){const n=Rh[e.id];Uh(t,n.activeMessage,(e=>n.activeMessage=e),(t=>{if(!t.complete)return;const r=t=>{e.send(t),jh(`Writing ${t.byteLength} bytes to socket [${n.socket.id}]: ${t.toString()}`)},i=()=>{Hh(n.socket.id)};if(t.command)return jh(`Received command from client [${n.socket.id}]: ${t.command}`),void(Wh&&Wh(n.socket.id,t.command,r,i));t.klMessage&&Gh&&Gh({send:r,terminateWebsocket:i,websocketId:n.socket.id,transmission:{sourceServiceId:t.sourceServiceId??-1,targetServiceId:t.targetServiceId??-1,rawMessage:t.rawMessage},json:t.klMessage.json})}))}})),e.on("close",(()=>{jh(`Client disconnected: ${e.id}`),Mh&&Mh(e.id),delete Rh[e.id]})),e.on("error",(()=>{jh(`Error on client connection: ${e.id}`)}))})),console.log(`WebSocket server is running on port ${e}`)},stopServer:()=>{Vh.close((()=>{console.log("WebSocket server stopped")}))},onClientConnected:e=>{Fh=e},onClientDisconnected:e=>{Mh=e},onClientCommand:e=>{Wh=e},sendCommand:(e,t)=>{const n=Rh[e];if(!n)return jh(`Cannot send message to unknown client [${e}]`),!1;if(t.length>=sd)return jh("Message is too long to be a command. Use sendMessage instead."),!1;const r=wd.encodeCommand(t);return n.socket.send(r),!0},onMessageReceived:e=>Gh=e,terminateConnection:Hh};const qh=Gc("stopService"),Kh=async e=>{const t=e.args[0];if(!t)return e.reply({error:"No service name provided"});const n=_l.getAllServiceVersions(t);qh(`Stopping ${n.length} services with name: ${t}`);for(const e of n)await _l.stopService({serviceName:e.info.name,version:e.info.version});const r=n.map((e=>`${e.info.name}@${e.info.version}`));e.reply({success:[r]})},Jh=Gc("removeService"),Yh=async e=>{const t=e.args[0],n=e.args[1];if(!t)return e.reply({error:"No service name provided"});let r=_l.getAllServiceVersions(t);n&&(r=r.filter((e=>e.info.version===n))),Jh(`Removing ${r.length} service(s) with name: ${t}`);for(const e of r)await _l.uninstallService(e.info.name,e.info.version);const i=r.map((e=>`${e.info.name}@${e.info.version}`));e.reply({success:[i]})},Xh=Gc("launchService"),Zh=async e=>{const t=e.args[0],n=e.args[1];if(!t)return e.reply({error:"No service name provided"});if(!n)return e.reply({error:"No service version provided"});const r=`${t}@${n}/dist`;try{const i=sl();Xh(`Loading service ${t}@${n} from ${i}`);const{errorMsg:s,service:o,errorCode:a}=await _l.loadAndLaunch(i,r,!1);if(s||"started"!==o?.status)return e.reply({error:`Failed to launch service ${t}@${n}: ${s||"error-not-provided"}`,errCode:a});const c=Date.now(),l=3e4,d=async()=>{const r=o.status;return"running"===r?(Xh(`Service ${t}@${n} loaded and started`),e.reply({success:[]})):(Xh(`Service ${t}@${n} not yet started, status: ${r}`),"stopped"===r||"error"===r?e.reply({error:`Error launching service: "${o.errorMsg||"failed to initiate"}"`}):Date.now()-c>l?e.reply({error:"Timeout waiting for service to start"}):(Xh("Retrying in 1 second..."),void setTimeout(d,1e3)))};d()}catch(r){return Xh(`Error loading service ${t}@${n}: ${r?.message||r}`),e.reply({error:r?.message||"There was an error loading the service"})}},Qh=Gc("getMatchingServices"),ef=async e=>{const t=e.args[0],n=[],r=[];Qh(`Checking for matching services: ${t.map((e=>e.name)).join(", ")}`);for(const{name:e,version:i}of t){const t=_l.getMatchingService(e,i);t?n.push({name:e,version:i,installationPath:_l.getServiceRootDirectory(t)}):r.push({name:e,version:i})}Qh(`Found ${n.length} available services and ${r.length} missing services.`),e.reply({success:[{available:n,missing:r}]})},tf=Gc("getSecretsValues");let nf;var rf=async e=>{const t=e.args[0].services;if(!nf)throw new Error("getSecretValuesFn is not set. Please call setGetSecretValuesFunction before using this function.");tf(`Checking for secrets values for services: ${t.map((e=>`${e.name}@${e.version}`)).join(", ")}`);const n=[];for(const e of t){const t=e.secrets,r=await nf({name:e.name,version:e.version,requiredSecrets:t.reduce(((e,t)=>(e[t]={optional:!1,description:""},e)),{})});n.push({name:e.name,version:e.version,secrets:t.map((e=>({name:e,value:r[e]})))})}const r=[{services:n}];e.reply({success:r})},sf=e=>{nf=e};const of=Gc("getMappedSecrets");let af;var cf=async e=>{const t=e.args[0].services;of(`Getting mapped secrets for services: ${t.map((e=>`${e.name}@${e.version}`)).join(", ")}`);const n=await af(t),r=[{services:t.map((e=>({name:e.name,version:e.version,secrets:n[e.name]||[]})))}];e.reply({success:r})},lf=e=>{af=e};const df=Gc("getServiceContents"),uf=({reply:e,args:t})=>{const[n]=t;df(`Received GetServiceContents request for service ${n.serviceName} v${n.version}`);const r=_l.getMatchingService(n.serviceName,n.version);if(r){return e({success:[{serviceName:r.info.name,serviceVersion:r.info.version,uiContent:r.info.widgetUIContents,uiContentsChecksum:r.info.uiContentChecksum}]})}df(`Service ${n.serviceName} v${n.version} not found`),e({error:`Service ${n.serviceName} v${n.version} not found`})};let pf=null;const hf=()=>{if(!pf)throw new Error("Unknown server URL. Please call `setServerUrl` before using the APIs.");return pf},ff=async(e,t)=>{try{const n=await fetch(e,{method:"POST",body:JSON.stringify(t)});return n.ok?{data:await n.json(),statusCode:n.status,success:!0}:{statusCode:n.status,error:await n.text(),success:!1}}catch(e){return{statusCode:500,error:e instanceof Error?e.message:"Internal server error",success:!1}}},gf={},mf=async e=>{const t=(e=>{const t=gf[e],n=Date.now()-(t?.lastCheckedAt.getTime()??0);return t&&n<3e5?t.features:null})(e);if(t)return{valid:!0,features:t,error:null};const{valid:n,features:r,error:i}=await(async e=>{const{data:t,error:n}=await ff(`${hf()}/v1/validate/validate_key`,{apiKey:e});return n?(console.warn(`Error validating Kemu API key: ${n}`),{valid:!1,features:{},error:n}):t?.features?{valid:!0,features:t.features,error:null}:{valid:!1,features:{},error:"No features returned from the server"}})(e);return n&&(gf[e]={features:r,lastCheckedAt:new Date}),{valid:n,features:r,error:i}},vf=Gc("activeClients");let yf={},bf={};const wf=(e,t)=>`${e}_${t}`,Sf=e=>yf[e]||null,If=(e,t)=>{const n=wf(e,t);return bf[n]||[]},_f=()=>{for(const e in yf){const t=yf[e];if(t?.transport===ac.WS){const e=wd.encodeCommand(ic.ServicesListChanged);t.send(e)}}},$f=async e=>{const t=[],{serviceSessionId:n,transport:r,send:i,terminateFn:s,extraInfo:o,isDevClient:a}=e,c=e=>{console.warn(e),s&&s()};if(r===ac.WS){if(!o.wsApiKey)return void c(`Attempted to register a WebSocket client without an API key. SessionId: ${n}`);const{valid:e,error:t}=await mf(o.wsApiKey);if(!e&&!t)return void c(`Attempted to register a WebSocket client with an invalid API key. SessionId: ${n}`);t&&vf(`Unable to validate API Key, usage will be limited. SessionId: ${n}`)}yf[n]={serviceSessionId:n,transport:r,isDevClient:!!a,broadcastSubscriptions:t,send:i,extraInfo:o,terminate:()=>{s&&s()},addSubscription:e=>{if(!t.some((t=>t.targetService.serviceName===e.serviceName&&t.targetService.version===e.version))){t.push({targetService:e});const r=wf(e.serviceName,e.version);bf[r]=bf[r]||[];return bf[r].some((e=>e.serviceId===n))||bf[r].push({sendFn:i,serviceId:n}),!0}return!1},removeSubscription:e=>{const r=t.findIndex((t=>t.targetService.serviceName===e.serviceName));if(-1!==r){t.splice(r,1);const i=wf(e.serviceName,e.version),s=bf[i]?.findIndex((e=>e.serviceId===n));if(-1!==s&&(bf[i].splice(s,1),!bf[i].length)){const t=_l.getMatchingService(e.serviceName,e.version);if(t?.info.eventEmitter&&"running"===t.status){const e=Sf(t.info.sessionId);e?.extraInfo.ipcSocketId&&Fd(e?.extraInfo.ipcSocketId,ic.BroadcastEnd)}}}},removeAllSubscriptions:()=>{for(const e of t){const t=wf(e.targetService.serviceName,e.targetService.version),r=bf[t].findIndex((e=>e.serviceId===n));-1!==r&&bf[t].splice(r,1)}t.length=0}},r===ac.IPC&&(_f(),kf(n))},Cf=()=>{const e=Object.values(yf);for(const t of e)if(t.transport===ac.IPC){const e=t.extraInfo.ipcSocketId,n=_l.getServiceBySessionId(t.serviceSessionId);if(n?.info.eventEmitter){If(n.info.name,n.info.version).length||e&&Fd(e,ic.BroadcastEnd)}}},kf=e=>{const t=_l.getServiceBySessionId(e);if(t?.info.eventEmitter){if(If(t.info.name,t.info.version).length){const t=Sf(e);t?.extraInfo.ipcSocketId&&Fd(t?.extraInfo.ipcSocketId,ic.BroadcastStart)}}},Ef=e=>{const t=yf[e];delete yf[e],t?.transport===ac.IPC?_f():(t?.removeAllSubscriptions(),Cf())},xf=Gc("ipc:handleIpcClientCommand"),Af=(e,t,n)=>{const r=((e,t)=>{if(e.startsWith(ic.AcknowledgeResponse)){const n=e.split(":"),r=parseInt(n[1]),i=parseInt(n[2]);return t&&t(r,isNaN(i)?void 0:i),!0}return!1})(t,((e,t)=>{if(!e)return void xf(`Ignoring ACK response from IPC service ${e} with no service id`);xf(`Received ACK from IPC service ${e}. Marking as running.`);let r=e;t&&e&&e!==t&&(Md(e,t),r=t);let i=!1;t&&(i=_l.setServiceStatus(t,"running")),i?$f({serviceSessionId:t||e,transport:ac.IPC,send:n,extraInfo:{ipcSocketId:t}}):Fd(r,ic.SendManifest)}));!r&&xf(`Received unknown command [${t}] from service ${e}`)};let Nf={};W.platform();const Pf=async e=>{const t=e.args[0];if(Nf.chooseDirectory)try{const n=await Nf.chooseDirectory(t);return e.reply({success:[String(n).trim()]})}catch(t){return console.error(t),e.reply({error:t instanceof Error?t.message:"Unknown error"})}return e.reply({error:"This hub does not support showing file dialogs",errCode:"GUI_NOT_SUPPORTED"})},Of=async e=>{const t=e.args[0];if(Nf.chooseFile)try{const n=await Nf.chooseFile(t);return e.reply({success:[String(n).trim()]})}catch(t){return console.error(t),e.reply({error:t instanceof Error?t.message:"Unknown error"})}return e.reply({error:"This hub does not support showing file dialogs",errCode:"GUI_NOT_SUPPORTED"})},Lf=e=>{Nf=e};var Tf={},Bf={},Df={};function jf(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`positive integer expected, not ${e}`)}function Rf(e){if("boolean"!=typeof e)throw new Error(`boolean expected, not ${e}`)}function Uf(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}function Ff(e,...t){if(!Uf(e))throw new Error("Uint8Array expected");if(t.length>0&&!t.includes(e.length))throw new Error(`Uint8Array expected of length ${t}, not of length=${e.length}`)}function Mf(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");jf(e.outputLen),jf(e.blockLen)}function Wf(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function Gf(e,t){Ff(e);const n=t.outputLen;if(e.length<n)throw new Error(`digestInto() expects output buffer of length at least ${n}`)}Object.defineProperty(Df,"__esModule",{value:!0}),Df.output=Df.exists=Df.hash=Df.bytes=Df.bool=Df.number=Df.isBytes=void 0,Df.number=jf,Df.bool=Rf,Df.isBytes=Uf,Df.bytes=Ff,Df.hash=Mf,Df.exists=Wf,Df.output=Gf;const Vf={number:jf,bool:Rf,bytes:Ff,hash:Mf,exists:Wf,output:Gf};Df.default=Vf;var Hf={};Object.defineProperty(Hf,"__esModule",{value:!0}),Hf.add5L=Hf.add5H=Hf.add4H=Hf.add4L=Hf.add3H=Hf.add3L=Hf.add=Hf.rotlBL=Hf.rotlBH=Hf.rotlSL=Hf.rotlSH=Hf.rotr32L=Hf.rotr32H=Hf.rotrBL=Hf.rotrBH=Hf.rotrSL=Hf.rotrSH=Hf.shrSL=Hf.shrSH=Hf.toBig=Hf.split=Hf.fromBig=void 0;const zf=BigInt(2**32-1),qf=BigInt(32);function Kf(e,t=!1){return t?{h:Number(e&zf),l:Number(e>>qf&zf)}:{h:0|Number(e>>qf&zf),l:0|Number(e&zf)}}function Jf(e,t=!1){let n=new Uint32Array(e.length),r=new Uint32Array(e.length);for(let i=0;i<e.length;i++){const{h:s,l:o}=Kf(e[i],t);[n[i],r[i]]=[s,o]}return[n,r]}Hf.fromBig=Kf,Hf.split=Jf;const Yf=(e,t)=>BigInt(e>>>0)<<qf|BigInt(t>>>0);Hf.toBig=Yf;const Xf=(e,t,n)=>e>>>n;Hf.shrSH=Xf;const Zf=(e,t,n)=>e<<32-n|t>>>n;Hf.shrSL=Zf;const Qf=(e,t,n)=>e>>>n|t<<32-n;Hf.rotrSH=Qf;const eg=(e,t,n)=>e<<32-n|t>>>n;Hf.rotrSL=eg;const tg=(e,t,n)=>e<<64-n|t>>>n-32;Hf.rotrBH=tg;const ng=(e,t,n)=>e>>>n-32|t<<64-n;Hf.rotrBL=ng;const rg=(e,t)=>t;Hf.rotr32H=rg;const ig=e=>e;Hf.rotr32L=ig;const sg=(e,t,n)=>e<<n|t>>>32-n;Hf.rotlSH=sg;const og=(e,t,n)=>t<<n|e>>>32-n;Hf.rotlSL=og;const ag=(e,t,n)=>t<<n-32|e>>>64-n;Hf.rotlBH=ag;const cg=(e,t,n)=>e<<n-32|t>>>64-n;function lg(e,t,n,r){const i=(t>>>0)+(r>>>0);return{h:e+n+(i/2**32|0)|0,l:0|i}}Hf.rotlBL=cg,Hf.add=lg;const dg=(e,t,n)=>(e>>>0)+(t>>>0)+(n>>>0);Hf.add3L=dg;const ug=(e,t,n,r)=>t+n+r+(e/2**32|0)|0;Hf.add3H=ug;const pg=(e,t,n,r)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0);Hf.add4L=pg;const hg=(e,t,n,r,i)=>t+n+r+i+(e/2**32|0)|0;Hf.add4H=hg;const fg=(e,t,n,r,i)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0)+(i>>>0);Hf.add5L=fg;const gg=(e,t,n,r,i,s)=>t+n+r+i+s+(e/2**32|0)|0;Hf.add5H=gg;const mg={fromBig:Kf,split:Jf,toBig:Yf,shrSH:Xf,shrSL:Zf,rotrSH:Qf,rotrSL:eg,rotrBH:tg,rotrBL:ng,rotr32H:rg,rotr32L:ig,rotlSH:sg,rotlSL:og,rotlBH:ag,rotlBL:cg,add:lg,add3L:dg,add3H:ug,add4L:pg,add4H:hg,add5H:gg,add5L:fg};Hf.default=mg;var vg={},yg={};Object.defineProperty(yg,"__esModule",{value:!0}),yg.crypto=void 0,yg.crypto="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,function(e){
2
2
  /*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
3
- Object.defineProperty(e,"__esModule",{value:!0}),e.randomBytes=e.wrapXOFConstructorWithOpts=e.wrapConstructorWithOpts=e.wrapConstructor=e.checkOpts=e.Hash=e.concatBytes=e.toBytes=e.utf8ToBytes=e.asyncLoop=e.nextTick=e.hexToBytes=e.bytesToHex=e.byteSwap32=e.byteSwapIfBE=e.byteSwap=e.isLE=e.rotl=e.rotr=e.createView=e.u32=e.u8=e.isBytes=void 0;const t=yg,n=Df;e.isBytes=function(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name};e.u8=e=>new Uint8Array(e.buffer,e.byteOffset,e.byteLength);e.u32=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4));e.createView=e=>new DataView(e.buffer,e.byteOffset,e.byteLength);e.rotr=(e,t)=>e<<32-t|e>>>t;e.rotl=(e,t)=>e<<t|e>>>32-t>>>0,e.isLE=68===new Uint8Array(new Uint32Array([287454020]).buffer)[0];e.byteSwap=e=>e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255,e.byteSwapIfBE=e.isLE?e=>e:t=>(0,e.byteSwap)(t),e.byteSwap32=function(t){for(let n=0;n<t.length;n++)t[n]=(0,e.byteSwap)(t[n])};const r=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));e.bytesToHex=function(e){(0,n.bytes)(e);let t="";for(let n=0;n<e.length;n++)t+=r[e[n]];return t};const i={_0:48,_9:57,_A:65,_F:70,_a:97,_f:102};function s(e){return e>=i._0&&e<=i._9?e-i._0:e>=i._A&&e<=i._F?e-(i._A-10):e>=i._a&&e<=i._f?e-(i._a-10):void 0}e.hexToBytes=function(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);const t=e.length,n=t/2;if(t%2)throw new Error("padded hex string expected, got unpadded hex of length "+t);const r=new Uint8Array(n);for(let t=0,i=0;t<n;t++,i+=2){const n=s(e.charCodeAt(i)),o=s(e.charCodeAt(i+1));if(void 0===n||void 0===o){const t=e[i]+e[i+1];throw new Error('hex string expected, got non-hex character "'+t+'" at index '+i)}r[t]=16*n+o}return r};function o(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function a(e){return"string"==typeof e&&(e=o(e)),(0,n.bytes)(e),e}e.nextTick=async()=>{},e.asyncLoop=async function(t,n,r){let i=Date.now();for(let s=0;s<t;s++){r(s);const t=Date.now()-i;t>=0&&t<n||(await(0,e.nextTick)(),i+=t)}},e.utf8ToBytes=o,e.toBytes=a,e.concatBytes=function(...e){let t=0;for(let r=0;r<e.length;r++){const i=e[r];(0,n.bytes)(i),t+=i.length}const r=new Uint8Array(t);for(let t=0,n=0;t<e.length;t++){const i=e[t];r.set(i,n),n+=i.length}return r};e.Hash=class{clone(){return this._cloneInto()}};const c={}.toString;e.checkOpts=function(e,t){if(void 0!==t&&"[object Object]"!==c.call(t))throw new Error("Options should be object or undefined");return Object.assign(e,t)},e.wrapConstructor=function(e){const t=t=>e().update(a(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t},e.wrapConstructorWithOpts=function(e){const t=(t,n)=>e(n).update(a(t)).digest(),n=e({});return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t},e.wrapXOFConstructorWithOpts=function(e){const t=(t,n)=>e(n).update(a(t)).digest(),n=e({});return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t},e.randomBytes=function(e=32){if(t.crypto&&"function"==typeof t.crypto.getRandomValues)return t.crypto.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}}(vg),Object.defineProperty(Bf,"__esModule",{value:!0}),Bf.shake256=Bf.shake128=Bf.keccak_512=Bf.keccak_384=Bf.keccak_256=Bf.keccak_224=Bf.sha3_512=Bf.sha3_384=Bf.sha3_256=Bf.sha3_224=Bf.Keccak=Bf.keccakP=void 0;const bg=Df,wg=Hf,Sg=vg,Ig=[],_g=[],$g=[],Cg=BigInt(0),kg=BigInt(1),Eg=BigInt(2),xg=BigInt(7),Ag=BigInt(256),Ng=BigInt(113);for(let e=0,t=kg,n=1,r=0;e<24;e++){[n,r]=[r,(2*n+3*r)%5],Ig.push(2*(5*r+n)),_g.push((e+1)*(e+2)/2%64);let i=Cg;for(let e=0;e<7;e++)t=(t<<kg^(t>>xg)*Ng)%Ag,t&Eg&&(i^=kg<<(kg<<BigInt(e))-kg);$g.push(i)}const[Pg,Og]=(0,wg.split)($g,!0),Lg=(e,t,n)=>n>32?(0,wg.rotlBH)(e,t,n):(0,wg.rotlSH)(e,t,n),Tg=(e,t,n)=>n>32?(0,wg.rotlBL)(e,t,n):(0,wg.rotlSL)(e,t,n);function Bg(e,t=24){const n=new Uint32Array(10);for(let r=24-t;r<24;r++){for(let t=0;t<10;t++)n[t]=e[t]^e[t+10]^e[t+20]^e[t+30]^e[t+40];for(let t=0;t<10;t+=2){const r=(t+8)%10,i=(t+2)%10,s=n[i],o=n[i+1],a=Lg(s,o,1)^n[r],c=Tg(s,o,1)^n[r+1];for(let n=0;n<50;n+=10)e[t+n]^=a,e[t+n+1]^=c}let t=e[2],i=e[3];for(let n=0;n<24;n++){const r=_g[n],s=Lg(t,i,r),o=Tg(t,i,r),a=Ig[n];t=e[a],i=e[a+1],e[a]=s,e[a+1]=o}for(let t=0;t<50;t+=10){for(let r=0;r<10;r++)n[r]=e[t+r];for(let r=0;r<10;r++)e[t+r]^=~n[(r+2)%10]&n[(r+4)%10]}e[0]^=Pg[r],e[1]^=Og[r]}n.fill(0)}Bf.keccakP=Bg;class Dg extends Sg.Hash{constructor(e,t,n,r=!1,i=24){if(super(),this.blockLen=e,this.suffix=t,this.outputLen=n,this.enableXOF=r,this.rounds=i,this.pos=0,this.posOut=0,this.finished=!1,this.destroyed=!1,(0,bg.number)(n),0>=this.blockLen||this.blockLen>=200)throw new Error("Sha3 supports only keccak-f1600 function");this.state=new Uint8Array(200),this.state32=(0,Sg.u32)(this.state)}keccak(){Sg.isLE||(0,Sg.byteSwap32)(this.state32),Bg(this.state32,this.rounds),Sg.isLE||(0,Sg.byteSwap32)(this.state32),this.posOut=0,this.pos=0}update(e){(0,bg.exists)(this);const{blockLen:t,state:n}=this,r=(e=(0,Sg.toBytes)(e)).length;for(let i=0;i<r;){const s=Math.min(t-this.pos,r-i);for(let t=0;t<s;t++)n[this.pos++]^=e[i++];this.pos===t&&this.keccak()}return this}finish(){if(this.finished)return;this.finished=!0;const{state:e,suffix:t,pos:n,blockLen:r}=this;e[n]^=t,128&t&&n===r-1&&this.keccak(),e[r-1]^=128,this.keccak()}writeInto(e){(0,bg.exists)(this,!1),(0,bg.bytes)(e),this.finish();const t=this.state,{blockLen:n}=this;for(let r=0,i=e.length;r<i;){this.posOut>=n&&this.keccak();const s=Math.min(n-this.posOut,i-r);e.set(t.subarray(this.posOut,this.posOut+s),r),this.posOut+=s,r+=s}return e}xofInto(e){if(!this.enableXOF)throw new Error("XOF is not possible for this instance");return this.writeInto(e)}xof(e){return(0,bg.number)(e),this.xofInto(new Uint8Array(e))}digestInto(e){if((0,bg.output)(e,this),this.finished)throw new Error("digest() was already called");return this.writeInto(e),this.destroy(),e}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,this.state.fill(0)}_cloneInto(e){const{blockLen:t,suffix:n,outputLen:r,rounds:i,enableXOF:s}=this;return e||(e=new Dg(t,n,r,s,i)),e.state32.set(this.state32),e.pos=this.pos,e.posOut=this.posOut,e.finished=this.finished,e.rounds=i,e.suffix=n,e.outputLen=r,e.enableXOF=s,e.destroyed=this.destroyed,e}}Bf.Keccak=Dg;const jg=(e,t,n)=>(0,Sg.wrapConstructor)((()=>new Dg(t,e,n)));Bf.sha3_224=jg(6,144,28),Bf.sha3_256=jg(6,136,32),Bf.sha3_384=jg(6,104,48),Bf.sha3_512=jg(6,72,64),Bf.keccak_224=jg(1,144,28),Bf.keccak_256=jg(1,136,32),Bf.keccak_384=jg(1,104,48),Bf.keccak_512=jg(1,72,64);const Rg=(e,t,n)=>(0,Sg.wrapXOFConstructorWithOpts)(((r={})=>new Dg(t,e,void 0===r.dkLen?n:r.dkLen,!0)));Bf.shake128=Rg(31,168,16),Bf.shake256=Rg(31,136,32);const{sha3_512:Ug}=Bf,Fg=(e=4,t=Math.random)=>{let n="";for(;n.length<e;)n+=Math.floor(36*t()).toString(36);return n};function Mg(e){let t=0n;for(const n of e.values()){t=(t<<8n)+BigInt(n)}return t}const Wg=(e="")=>Mg(Ug(e)).toString(36).slice(1),Gg=Array.from({length:26},((e,t)=>String.fromCharCode(t+97))),Vg=({globalObj:e=(void 0!==$c?$c:"undefined"!=typeof window?window:{}),random:t=Math.random}={})=>{const n=Object.keys(e).toString(),r=n.length?n+Fg(32,t):Fg(32,t);return Wg(r).substring(0,32)},Hg=e=>()=>e++,zg=({random:e=Math.random,counter:t=Hg(Math.floor(476782367*e())),length:n=24,fingerprint:r=Vg({random:e})}={})=>function(){const i=(e=>Gg[Math.floor(e()*Gg.length)])(e),s=Date.now().toString(36),o=t().toString(36),a=Fg(n,e);return`${i+Wg(`${s+a+o+r}`).substring(1,n)}`},qg=zg();Tf.getConstants=()=>({defaultLength:24,bigLength:32}),Tf.init=zg,Tf.createId=qg,Tf.bufToBigInt=Mg,Tf.createCounter=Hg,Tf.createFingerprint=Vg,Tf.isCuid=(e,{minLength:t=2,maxLength:n=32}={})=>{const r=e.length,i=/^[0-9a-z]+$/;try{if("string"==typeof e&&r>=t&&r<=n&&i.test(e))return!0}finally{}return!1};const{createId:Kg,init:Jg,getConstants:Yg,isCuid:Xg}=Tf;var Zg=Kg;const Qg=Gc("getUniqueId"),em=({reply:e,sourceServiceId:t})=>{Qg(`Generating unique id for service "${t}"`);return e({success:[Zg()]})},tm=Gc("getActiveServices"),nm=async({transport:e,sourceServiceId:t,reply:n})=>{if(tm(`Received GetServices request from ${e} [${t}]`),e===ac.WS){let e=_l.getActiveServices();const r=Sf(t);if(!r)return n({error:"Client not found",errCode:"CLIENT_NOT_FOUND"});let i=[];if(r.transport===ac.WS){if(!r?.extraInfo.wsApiKey)return n({error:"Client does not have an API key",errCode:"CLIENT_NO_API_KEY"});const t=e.filter(_l.isInternalKemuService),s=e.filter((e=>e.devMode&&_l.isNotInternalKemuService(e))),o=e.filter((e=>_l.isOfficialKemuService(e)&&_l.isNotInternalKemuService(e)&&_l.isNotDevService(e))).sort(((e,t)=>e.name.localeCompare(t.name))),a=await(async e=>{const{features:t}=await mf(e);return t})(r.extraInfo.wsApiKey),c=a?.hub_services??0,l=o.slice(0,-1!==c?c:o.length);i=o.slice(c).map((e=>({name:e.name,version:e.version,svgIcon:e.svgIcon,color:e.color,description:e.description,title:e.title,shortTitle:e.shortTitle}))),e=[...t,...s,...l]}const s=_l.getFailedServices().map((e=>({name:e.name,version:e.version,description:e.description,title:e.title,status:e.status,errorMsg:e.errorMsg,errorCode:e.errorCode,internal:_l.isInternalKemuService(e),svgIcon:e.svgIcon,color:e.color,shortTitle:e.shortTitle})));n({success:[{available:e.map((e=>{const{widgetUIContents:t,...n}=e;return{...n}})),failed:s,installed:i}]})}};let rm="runtime",im=null;const sm=()=>rm,om=Gc("getSystemInfo"),am=async({reply:e})=>{om("Received GetSystemInfo request");e({success:[await(async()=>({platformArch:`${"win32"===process.platform?"win":"darwin"===process.platform?"osx":""}-${(()=>{switch(process.arch){case"x64":return"x64";case"ia32":return"x86";case"arm":return"arm";case"arm64":return"arm64";default:return""}})()}`,isDesktopHub:"desktop"===sm(),isRuntimeHub:"runtime"===sm(),hubVersion:Yc,...im?{updateAvailable:im}:{}}))()]})},cm=Gc("removeService"),lm=async({args:e,sourceServiceId:t,reply:n})=>{const r=e[0],i=r.serviceName,s=r.version;if(!i)return n({error:"No service name provided"});if(!s)return n({error:"No service version provided"});const o=_l.getAllServiceVersions(i),a=o.find((e=>e.info.version===s));if(!a)return n({error:"Service not found"});cm(`Removing ${o.length} service(s) with name: ${i}`);const c=a.info.publicationId;let l;if(await _l.uninstallService(a.info.name,a.info.version),c){const e=Sf(t);if(!e)return n({error:"Client not found",errCode:"CLIENT_NOT_FOUND"});const r=e.extraInfo.wsApiKey;if(!r)return n({error:"Client does not have an API key",errCode:"CLIENT_NO_API_KEY"});cm(`Updating license details for "${c}"`);const i=await(async e=>{const{data:t,error:n}=await ff(`${hf()}/v1/validate/uninstall_hub_service`,e);if(n)throw new Error(n);return t})({apiKey:r,hubService:{id:c}}).catch((e=>(cm(`Error updating license details for "${c}": ${e}`),{error:e.message,remaining:void 0})));l=i?.remaining}n({success:[{remaining:l,service:{name:i,version:s}}]})},dm=v(M(import.meta.url)),um=Gc("hub"),pm=new function(e){const t={};let n=console.log;const r={};let i=e||String(Date.now());const s={},o=e=>!s[e],a=(e,t,n,r,i,s)=>{let a=ad?new ArrayBuffer(0):Buffer.alloc(0);const c={json:{functionName:e,args:s.success?s.success:[s],messageId:t,type:s.success?"response":"error"}};return o(r)&&(a=Hd.encode(c,n,r)),i(a,{msg:c,sourceServiceId:n,targetServiceId:r})};return{setLogger:e=>{n=e},processMessage:(e,i,s,o)=>{if(!o)return!1;const c=o;if(t[c.messageId]){const e=t[c.messageId];return e&&(clearTimeout(e.timer),e.fulfilled||(e.fulfilled=!0,"response"===c.type?e.resolve(c.args):"error"===c.type&&e.reject(c.args[0])),delete t[c.messageId]),!0}if("execute"!==c.type&&n&&n(`No pending execution found for message id "${c.messageId}"`),"execute"===c.type){const t=r[c.functionName];if(t){const n=e=>{a(c.functionName,c.messageId,s.targetServiceId,s.sourceServiceId,i,e)};t({transport:e,args:c.args,reply:n,messageId:c.messageId,sourceServiceId:s.sourceServiceId,send:i})}else{const e=`Function "${c.functionName}" not found.`;n&&n(e),a(c.functionName,c.messageId,s.targetServiceId,s.sourceServiceId,i,{error:e,errCode:"FNC_NOT_FOUND"})}return!0}return!1},execute:async(e,r,s,a,c,l)=>{if(!s){const e="No send buffer function provided.";throw n&&n(e),e}zd+=1;const d=`${i}-${zd}-exec-${e.substring(0,10)}`,u={messageId:d,functionName:e,send:s,sourceServiceId:a,targetServiceId:c,args:r||[],fulfilled:!1,resolve:()=>{},reject:()=>{}};u.promise=new Promise(((e,t)=>{u.resolve=e,u.reject=t}));let p=ad?new ArrayBuffer(0):Buffer.alloc(0);const h={json:{functionName:e,args:r,messageId:d,type:"execute"}};o(c)&&(p=Hd.encode(h,a,c)),t[d]=u,n&&n(`Calling remote function "${e}" with message id "${d}"`);const f="true"===process.env.NO_INVOKE_TIMEOUT;return l?.async?(u.fulfilled=!0,u.resolve([void 0]),delete t[d]):0===l?.timeout||f||(u.timer=setTimeout((()=>{n&&n(`Remote function ${d} timed out`);const r=t[d];r&&!r.fulfilled&&(r.fulfilled=!0,u.reject(`Function ${e} Timed out`)),delete t[d]}),l?.timeout||3e4)),s(p,{sourceServiceId:a,targetServiceId:c,msg:h}),u.promise},sendResponse:a,registerFunction:(e,t)=>{r[e]=t},getTransportSendFunction:e=>{const n=t[e];return n?n.send:null},setServiceName:e=>{i=e},getPendingExecutions:()=>t,rejectAllPending:e=>{Object.keys(t).forEach((n=>{const r=t[n];r&&!r.fulfilled&&(clearTimeout(r.timer),r.fulfilled=!0,r.reject(e),delete t[n])}))},broadcast:(e,t,r,s)=>{zd+=1;const a=`${i}-${zd}-multicast-${e.substring(0,10)}`;let c=ad?new ArrayBuffer(0):Buffer.alloc(0);const l={json:{functionName:e,args:t,messageId:a,type:"execute"}};let d=o(r[0].serviceId);d&&(c=Hd.encode(l,s,r[0].serviceId));for(let t=0;t<r.length;t++)try{const i=r[t];n&&n(`Broadcasting function "${e}" with message id "${a}" to client [${i.serviceId}]`),0!==t&&(d=o(i.serviceId),d&&(c=Hd.patchEncodedHeader(c,{toServiceId:i.serviceId}))),i.sendFn(c,{msg:l,sourceServiceId:s,targetServiceId:i.serviceId})}catch(e){n&&n(`Error broadcasting to client at index ${t}`)}},disableServiceEncoding:(e,t)=>{s[e]=t}}}("hub");pm.setLogger(um);const hm={[sc.RebootToInstallUpdate]:null,[sc.GetFileContentFromCacheId]:null},fm=(e,t)=>{const{transmission:n}=t;if(0!==n.targetServiceId){const r=Sf(n.targetServiceId);if(!r)return um(`Service [${e}] ${n.sourceServiceId} is sending data to an unknown service ["${n.targetServiceId}"]`),!0;r.transport,ac.IPC;const i=t.json?.messageId;return um(`Forwarding message from ${n.sourceServiceId} to ${n.targetServiceId}, msgId: ${i}`),r.send(n.rawMessage,{sourceServiceId:n.sourceServiceId,targetServiceId:n.targetServiceId,msg:{json:t.json}}),!0}return!1},gm=({sourceServiceId:e,args:t})=>{const n=_l.getServiceBySessionId(e);if(n){const r=If(n.info.name,n.info.version),i=If(n.info.name,"*");if(!r.length&&!i.length)return;const s=[...r,...i],o={...t[0],source:{serviceName:n.info.name,serviceVersion:n.info.version,sessionId:e}};pm.broadcast(sc.BroadcastEvent,[o],s,0)}},mm=e=>{const{send:t,transmission:n,json:r}=e;um(`Raw message Id received from WS: ${r?.messageId}`);fm(ac.WS,e)||pm.processMessage(ac.WS,t,n,r)},vm=e=>{const t=(n=e,`${ic.SocketAcknowledge}${n}`);var n;zh.sendCommand(e,t)},ym=(e,t)=>{um(`Received unknown command [${t}] from service ${e}`)},bm=async e=>{const{args:t,sourceServiceId:n,send:r,reply:i}=e,{apiKey:s}=t[0],o=n;await $f({serviceSessionId:n,transport:ac.WS,send:r,terminateFn:()=>{zh.terminateConnection(n)},extraInfo:{websocketId:o,wsApiKey:s}}),i({success:[]})},wm=e=>{um(`WS Client ${e} disconnected`),Ef(e)},Sm=async({sourceServiceId:e,args:t,transport:n,send:r})=>{if(n!==ac.IPC){var i;um(`Received manifest from non IPC service ${e}.`)}else{const n=t[0];if(n.devMode){const t=_l.getMatchingDevService(n.name,n.version,"stopped");if(t){um(`Found matching previous service ${t.info.name} (${t.info.version}). Reactivating previous client with session id ${t.info.sessionId}`);const s=Sf(t.info.sessionId);if(!s)return void um(`Could not find previous client instance for ${t.info.name} (${t.info.version}). Aborting manifest injection`);s.send=r,yf[i=e]?delete yf[i]:vf(`Could not find source client with session id ${i}`),Md(e,t.info.sessionId);const o=await tl(n,n.path);t.info={...t.info,...o},um(`Updating manifest for dev service ${t.info.sessionId}`),_l.setServiceManifest(t.info.sessionId,o,"running"),um(`Asking service ${e} to assume previous session id ${t.info.sessionId}`),Fd(t.info.sessionId,(e=>`${ic.AssumeSession}${e}`)(t.info.sessionId)),(e=>{const t=yf[e];t?t.isDevClient?(t.disconnected=!1,t.transport===ac.IPC&&(_f(),kf(e))):vf(`Client with session id ${e} is not a dev client`):vf(`Could not find source client with session id ${e}`)})(t.info.sessionId)}else{_l.addDevService(e,n,"running");const t=Sf(e);t?t.isDevClient=!0:$f({serviceSessionId:e,transport:ac.IPC,send:r,extraInfo:{ipcSocketId:e},isDevClient:!0})}return}um(`Received manifest from non dev service ${e} [${n.name}@(${n.version})]. Ignoring...`)}};var Im=async e=>{var t;um("Starting Kemu Hub..."),t=e.desktopMode?"desktop":"runtime",rm=t;const n=e?.ipc?.appSpace||"kemu.",r=e?.ipc?.id||"widgets";if(!e.serviceUrl)throw new Error("Missing service url, please set the `apiUrl` option.");const i=e.serviceUrl;pf=i,pm.registerFunction(sc.GetServiceContents,uf),pm.registerFunction(sc.GetServices,nm),pm.registerFunction(sc.GetSystemInfo,am),pm.registerFunction(sc.ShowSecretsConfigScreen,(async({args:t,reply:n})=>{const[{name:r,version:i}]=t;e?.onShowSecretsScreen?(await e.onShowSecretsScreen(r,i),n({success:[]})):n({error:"This hub does not support showing secrets configuration screens",errCode:"GUI_NOT_SUPPORTED"})})),pm.registerFunction(sc.UnsubscribeFromService,(({transport:e,reply:t,args:n,sourceServiceId:r})=>{if(e===ac.WS){const[e]=n,i=Sf(r);if(!i)return t({error:`Session id "${r}" not found`});um(`Service ${r} unsubscribing from "${e.targetService.serviceName} (${e.targetService.version})"`),t({success:[]}),i?.removeSubscription({serviceName:e.targetService.serviceName,version:e.targetService.version})}})),pm.registerFunction(sc.SubscribeToService,(({transport:e,reply:t,args:n,sourceServiceId:r})=>{if(e===ac.WS){const[e]=n,i=Sf(r),s=e.targetService;if(!i)return t({error:`Session id "${r}" not found`});if(um(`Service ${r} subscribing to "${s.serviceName} (${s.version})"`),"hub"===s.serviceName)return i.addSubscription(s),void t({success:[]});if(!i.addSubscription(s))return um(`Service ${r} already subscribed to "${s.serviceName} (${s.version})", ignoring request.`),t({success:[]});const o=_l.getMatchingService(s.serviceName,s.version);if(!o)return um(`Service ${s.serviceName} ${s.version} not active yet`),t({success:[]});if(!o.info.eventEmitter)return um(`Service ${s.serviceName} ${s.version} does not have an event emitter, removing subscription`),i.removeSubscription(s),t({error:`Service "${s.serviceName} (${s.version})" does not produce events`});const a=Sf(o.info.sessionId);return a?.extraInfo.ipcSocketId&&(um(`Sending Broadcast START command to service ${o.info.sessionId}`),Fd(a?.extraInfo.ipcSocketId,ic.BroadcastStart)),t({success:[]})}})),pm.registerFunction("stopService",Kh),pm.registerFunction("removeService",Yh),pm.registerFunction("launchService",Zh),pm.registerFunction("getMatchingServices",ef),pm.registerFunction("getSecretsValues",rf),pm.registerFunction(sc.GetMappedSecrets,cf),pm.registerFunction(sc.BroadcastEvent,gm),pm.registerFunction(sc.ServiceManifest,Sm),pm.registerFunction(sc.ChooseDirectoryDialog,Pf),pm.registerFunction(sc.ChooseFileDialog,Of),pm.registerFunction(sc.GetUniqueId,em),pm.registerFunction(sc.SocketAckResponse,bm),pm.registerFunction(sc.UninstallService,lm),Object.entries(hm).forEach((([e,t])=>{t?pm.registerFunction(e,t):(um(`Skipping registration of "${e}" because it's not implemented`),pm.registerFunction(e,(({reply:t})=>{t({error:`This hub does not support "${e}"`,errCode:"FUNCTION_NOT_SUPPORTED"})})))})),Ud((e=>{const{send:t,transmission:n,json:r}=e;um(`Raw message Id received from IPC: ${r?.messageId}`);fm(ac.IPC,e)||pm.processMessage(ac.IPC,t,n,r)})),zh.onMessageReceived(mm),zh.onClientConnected(vm),zh.onClientCommand(ym),zh.onClientDisconnected(wm),Wd(Af),jd((e=>{const t=(e=>`${ic.IpcAcknowledge}${e}`)(e);Fd(e,t)})),Rd((e=>{um(`IPC socket [${e}] disconnected`);const t=Sf(e);if(t){um(`Found matching service for disconnected socket. SessionId: ${t.serviceSessionId}`);const e=_l.getServiceBySessionId(t.serviceSessionId);_l.setServiceStatus(t.serviceSessionId,"stopped"),e?.devMode?(t.disconnected=!0,_f()):Ef(t.serviceSessionId)}})),await Dd({ipcAppSpace:n,ipcId:r}),e?.ws?.disabled||await zh.startServer(e?.ws?.port||5368);const s=e?.defaultServicesPath||g.resolve(dm,"defaultServices"),o=process.env.DEV_SESSION_ID;_l.setHubIpcConfig({recipePath:e?.recipeRootPath,appSpace:n,id:r}),e?.servicesInstallPath&&(e=>{rl=e})(e.servicesInstallPath),e?.testServicesInstallPath&&(e=>{il=e})(e.testServicesInstallPath);const a=sl(),c=il||Kc,l=async({requiredSecrets:e})=>{const t=Object.keys(e).reduce(((e,t)=>({...e,[t]:process.env[t]})),{});return t.__KEMU_USER_SERVICES_PATH=a,t.__KEMU_USER_TEST_SERVICES_PATH=c,t.__KEMU_SERVICE_URL=i,t},d=async e=>e.reduce(((e,t)=>({...e,[t.name]:[]})),{});e?.getServiceSecretsFn?(_l.setGetSecretsFunction(e.getServiceSecretsFn),sf(e.getServiceSecretsFn)):(_l.setGetSecretsFunction(l),sf(l)),lf(e?.getMappedSecretsFn?e.getMappedSecretsFn:d),_l.setSpawnNodeFunction(e?.spawnFn?e.spawnFn:({args:e,options:t})=>{const n={...process.env};return G("node",e||[],{...t,env:{...n,...t?.env}})}),e?.noDefaultServices||await _l.loadServices(s,{fixedSession:o?parseInt(o):void 0,singleServiceName:process.env.DEV_SINGLE_SERVICE_NAME,internalServices:!0}),null!==e?.servicesInstallPath&&(await nl(a)||await b(a,{recursive:!0}),await _l.loadServices(a,{internalServices:!1,singleServiceName:process.env.DEV_SINGLE_SERVICE_NAME}));const u=process.env.DEV_NO_SPAWN_LIST?.split(",");await _l.launchServices({noSpawningList:u||[]}),um("Kemu Hub started"),(e?.onChooseDirectory||e?.onChooseFile)&&Lf({chooseDirectory:e.onChooseDirectory,chooseFile:e.onChooseFile})},_m=e=>{if(e===ac.WS)return{handleWebsocketConnectionEvent:vm,handleWebsocketClientDisconnectionEvent:wm,handleWebsocketMessage:mm,handleWebsocketClientCommand:ym,getRemoteInvoke:()=>pm}},$m=(e=[])=>{let t;const n=new Promise((n=>{const r=()=>{if(_l.getAllServices().every((e=>"running"===e.status))){if(e.every((e=>"running"===_l.getMatchingService(e.name,e.version)?.status)))return n()}t=setTimeout(r,100)};r()}));return n.abort=()=>{t&&clearTimeout(t)},n};let Cm;const km=ca("run"),Em=dc(),xm=1e3,Am=C(process.argv.slice(2));global.ImageData=q,_e({createCanvas:(e,t)=>J(e,t),loadImage:async e=>{const t=await K(e),n=J(t.width,t.height).getContext("2d");n.drawImage(t,0,0,t.width,t.height);return n.getImageData(0,0,t.width,t.height)}});const Nm={createImageDataLike:(e,t,n,r="srgb")=>{let i;return i=e instanceof Uint8ClampedArray?e:new Uint8ClampedArray(e),{data:i,width:t,height:n,colorSpace:r,_kemuType:fe.ImageData}},loadImageFile:async e=>{const t=await K(e),n=J(t.width,t.height).getContext("2d");n.drawImage(t,0,0,t.width,t.height);return n.getImageData(0,0,t.width,t.height)},encodeImageData:async(e,t="jpeg",n)=>{const r=J(e.width,e.height);let i;return r.getContext("2d").putImageData(e,0,0),i="png"===t?await r.encode(t):await r.encode(t,n),i}};var Pm={start:async r=>{r=r||{};const i=r?.recipePath||Am.recipePath||process.env.KEMU_EDGE_RECIPE_PATH||process.cwd();if(!i)throw new Error("`recipePath` not provided. Please specify it in the config object, via a command line argument [--recipePath] or as an environment variable [KEMU_EDGE_RECIPE_PATH].");e({path:V(H(i),".env")});const s=r.apiKey||process.env.KEMU_API_KEY;if(!s)throw new Error("Missing API key. Please provide it via config.apiKey or KEMU_API_KEY environment variable.");const o=i.endsWith(".json")||i.endsWith(".kemu"),a=o?z(i):i,c=o?i:V(a,"recipe.kemu"),l=(e=>{try{return JSON.parse(e||"")}catch(e){return null}})(await t(H(c),"utf-8"));if(!l)throw new Error("Failed to parse recipe file");const{serviceUrl:d,apiKey:u}=((e,t)=>{const n=$o(e,t),r=Buffer.from(n,"base64").toString("utf8"),[i,s]=r.split("<@>");if(!s||!i)throw new Error("Invalid API key.");return{serviceUrl:s,apiKey:i}})(l,s);await zi();const p={id:l.id||String(Date.now()),version:1,author:""};(e=>{_r=e})(console);const h=_m(we.WS),f=(e,t)=>{if(t)h?.handleWebsocketMessage({send:m,transmission:{rawMessage:e,sourceServiceId:t.sourceServiceId,targetServiceId:t.targetServiceId},json:t.msg?.json});else{const t=e instanceof Buffer?e.toString():e;h?.handleWebsocketClientCommand(xm,t)}},g=(Jo={instanceServiceId:xm,sendBuf:f,sendCmd:f,triggerOnCommand:(...e)=>Yo(...e),triggerOnConnected:()=>Xo(),triggerOnDisconnected:()=>Zo(),triggerOnMessageReceived:(...e)=>Qo(...e)},Jo);const m=(e,t)=>{if(t)g.triggerOnMessageReceived({send:f,transmission:{rawMessage:e,sourceServiceId:t.sourceServiceId,targetServiceId:t.targetServiceId},json:t.msg.json});else{const t=e instanceof Buffer?e.toString():e;g.triggerOnCommand(t)}},v=pc(),y=h.getRemoteInvoke();v.disableServiceEncoding(0,!0),y.disableServiceEncoding(xm,!0);const b=Object.values(l.blocks[pe].gates).filter((e=>e.type===He.hubService&&e.state.service&&!0!==e.state.service?.webOnly)),w=b.map((e=>{const t=e.state.service;return{name:t.name,version:t.version}})),S=V(a,"services"),I=await n(S).then((()=>!0)).catch((()=>!1));await Im({recipeRootPath:a,servicesInstallPath:I?V(a,"services"):null,noDefaultServices:!0,ws:{disabled:!0},serviceUrl:d,ipc:{appSpace:"kemu-runner.",id:p.id}}),km("Waiting for services to run"),await $m(w),km("All services are running"),wo(Em);const _=await vo(l,"runner",p.version,p.author,so.Desktop);return Cm=_,uc(_),await cc(u),new Promise(((e,t)=>{var n;lc("acknowledged",(async()=>{await Em.getServices();const{failed:n,sendToInputWidget:r,invokeRecipeLoadedWidgets:i}=await bo(_);if(n.length>0){const e=`Some widgets failed to initialize: ${n.join(", ")}`;return t(e)}await i().catch((e=>{console.error("Error invoking recipe loaded widgets: ",e)})),km("Recipe started"),e({sendToInputWidget:(e,t)=>"number"==typeof t?r(e,{type:fe.Number,value:t}):"string"==typeof t?r(e,{type:fe.String,value:t}):"boolean"==typeof t?r(e,{type:fe.Boolean,value:t}):Array.isArray(t)?r(e,{type:fe.Array,value:t}):r(e,t)})})),g.triggerOnConnected(),g.triggerOnCommand((n=xm,`${ve.SocketAcknowledge}${n}`))}))},terminate:async()=>{Cm&&await yo(Cm)},onVariableChange:(e,t)=>yr(e,t)};void 0===typeof process.env.BLOCKS_INSTALL_DIR&&console.warn("Missing `BLOCKS_INSTALL_DIR` env var");process.env.BLOCKS_INSTALL_DIR;export{fe as DataType,Pm as default,Nm as utils};
3
+ Object.defineProperty(e,"__esModule",{value:!0}),e.randomBytes=e.wrapXOFConstructorWithOpts=e.wrapConstructorWithOpts=e.wrapConstructor=e.checkOpts=e.Hash=e.concatBytes=e.toBytes=e.utf8ToBytes=e.asyncLoop=e.nextTick=e.hexToBytes=e.bytesToHex=e.byteSwap32=e.byteSwapIfBE=e.byteSwap=e.isLE=e.rotl=e.rotr=e.createView=e.u32=e.u8=e.isBytes=void 0;const t=yg,n=Df;e.isBytes=function(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name};e.u8=e=>new Uint8Array(e.buffer,e.byteOffset,e.byteLength);e.u32=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4));e.createView=e=>new DataView(e.buffer,e.byteOffset,e.byteLength);e.rotr=(e,t)=>e<<32-t|e>>>t;e.rotl=(e,t)=>e<<t|e>>>32-t>>>0,e.isLE=68===new Uint8Array(new Uint32Array([287454020]).buffer)[0];e.byteSwap=e=>e<<24&4278190080|e<<8&16711680|e>>>8&65280|e>>>24&255,e.byteSwapIfBE=e.isLE?e=>e:t=>(0,e.byteSwap)(t),e.byteSwap32=function(t){for(let n=0;n<t.length;n++)t[n]=(0,e.byteSwap)(t[n])};const r=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));e.bytesToHex=function(e){(0,n.bytes)(e);let t="";for(let n=0;n<e.length;n++)t+=r[e[n]];return t};const i={_0:48,_9:57,_A:65,_F:70,_a:97,_f:102};function s(e){return e>=i._0&&e<=i._9?e-i._0:e>=i._A&&e<=i._F?e-(i._A-10):e>=i._a&&e<=i._f?e-(i._a-10):void 0}e.hexToBytes=function(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);const t=e.length,n=t/2;if(t%2)throw new Error("padded hex string expected, got unpadded hex of length "+t);const r=new Uint8Array(n);for(let t=0,i=0;t<n;t++,i+=2){const n=s(e.charCodeAt(i)),o=s(e.charCodeAt(i+1));if(void 0===n||void 0===o){const t=e[i]+e[i+1];throw new Error('hex string expected, got non-hex character "'+t+'" at index '+i)}r[t]=16*n+o}return r};function o(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function a(e){return"string"==typeof e&&(e=o(e)),(0,n.bytes)(e),e}e.nextTick=async()=>{},e.asyncLoop=async function(t,n,r){let i=Date.now();for(let s=0;s<t;s++){r(s);const t=Date.now()-i;t>=0&&t<n||(await(0,e.nextTick)(),i+=t)}},e.utf8ToBytes=o,e.toBytes=a,e.concatBytes=function(...e){let t=0;for(let r=0;r<e.length;r++){const i=e[r];(0,n.bytes)(i),t+=i.length}const r=new Uint8Array(t);for(let t=0,n=0;t<e.length;t++){const i=e[t];r.set(i,n),n+=i.length}return r};e.Hash=class{clone(){return this._cloneInto()}};const c={}.toString;e.checkOpts=function(e,t){if(void 0!==t&&"[object Object]"!==c.call(t))throw new Error("Options should be object or undefined");return Object.assign(e,t)},e.wrapConstructor=function(e){const t=t=>e().update(a(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t},e.wrapConstructorWithOpts=function(e){const t=(t,n)=>e(n).update(a(t)).digest(),n=e({});return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t},e.wrapXOFConstructorWithOpts=function(e){const t=(t,n)=>e(n).update(a(t)).digest(),n=e({});return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t},e.randomBytes=function(e=32){if(t.crypto&&"function"==typeof t.crypto.getRandomValues)return t.crypto.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}}(vg),Object.defineProperty(Bf,"__esModule",{value:!0}),Bf.shake256=Bf.shake128=Bf.keccak_512=Bf.keccak_384=Bf.keccak_256=Bf.keccak_224=Bf.sha3_512=Bf.sha3_384=Bf.sha3_256=Bf.sha3_224=Bf.Keccak=Bf.keccakP=void 0;const bg=Df,wg=Hf,Sg=vg,Ig=[],_g=[],$g=[],Cg=BigInt(0),kg=BigInt(1),Eg=BigInt(2),xg=BigInt(7),Ag=BigInt(256),Ng=BigInt(113);for(let e=0,t=kg,n=1,r=0;e<24;e++){[n,r]=[r,(2*n+3*r)%5],Ig.push(2*(5*r+n)),_g.push((e+1)*(e+2)/2%64);let i=Cg;for(let e=0;e<7;e++)t=(t<<kg^(t>>xg)*Ng)%Ag,t&Eg&&(i^=kg<<(kg<<BigInt(e))-kg);$g.push(i)}const[Pg,Og]=(0,wg.split)($g,!0),Lg=(e,t,n)=>n>32?(0,wg.rotlBH)(e,t,n):(0,wg.rotlSH)(e,t,n),Tg=(e,t,n)=>n>32?(0,wg.rotlBL)(e,t,n):(0,wg.rotlSL)(e,t,n);function Bg(e,t=24){const n=new Uint32Array(10);for(let r=24-t;r<24;r++){for(let t=0;t<10;t++)n[t]=e[t]^e[t+10]^e[t+20]^e[t+30]^e[t+40];for(let t=0;t<10;t+=2){const r=(t+8)%10,i=(t+2)%10,s=n[i],o=n[i+1],a=Lg(s,o,1)^n[r],c=Tg(s,o,1)^n[r+1];for(let n=0;n<50;n+=10)e[t+n]^=a,e[t+n+1]^=c}let t=e[2],i=e[3];for(let n=0;n<24;n++){const r=_g[n],s=Lg(t,i,r),o=Tg(t,i,r),a=Ig[n];t=e[a],i=e[a+1],e[a]=s,e[a+1]=o}for(let t=0;t<50;t+=10){for(let r=0;r<10;r++)n[r]=e[t+r];for(let r=0;r<10;r++)e[t+r]^=~n[(r+2)%10]&n[(r+4)%10]}e[0]^=Pg[r],e[1]^=Og[r]}n.fill(0)}Bf.keccakP=Bg;class Dg extends Sg.Hash{constructor(e,t,n,r=!1,i=24){if(super(),this.blockLen=e,this.suffix=t,this.outputLen=n,this.enableXOF=r,this.rounds=i,this.pos=0,this.posOut=0,this.finished=!1,this.destroyed=!1,(0,bg.number)(n),0>=this.blockLen||this.blockLen>=200)throw new Error("Sha3 supports only keccak-f1600 function");this.state=new Uint8Array(200),this.state32=(0,Sg.u32)(this.state)}keccak(){Sg.isLE||(0,Sg.byteSwap32)(this.state32),Bg(this.state32,this.rounds),Sg.isLE||(0,Sg.byteSwap32)(this.state32),this.posOut=0,this.pos=0}update(e){(0,bg.exists)(this);const{blockLen:t,state:n}=this,r=(e=(0,Sg.toBytes)(e)).length;for(let i=0;i<r;){const s=Math.min(t-this.pos,r-i);for(let t=0;t<s;t++)n[this.pos++]^=e[i++];this.pos===t&&this.keccak()}return this}finish(){if(this.finished)return;this.finished=!0;const{state:e,suffix:t,pos:n,blockLen:r}=this;e[n]^=t,128&t&&n===r-1&&this.keccak(),e[r-1]^=128,this.keccak()}writeInto(e){(0,bg.exists)(this,!1),(0,bg.bytes)(e),this.finish();const t=this.state,{blockLen:n}=this;for(let r=0,i=e.length;r<i;){this.posOut>=n&&this.keccak();const s=Math.min(n-this.posOut,i-r);e.set(t.subarray(this.posOut,this.posOut+s),r),this.posOut+=s,r+=s}return e}xofInto(e){if(!this.enableXOF)throw new Error("XOF is not possible for this instance");return this.writeInto(e)}xof(e){return(0,bg.number)(e),this.xofInto(new Uint8Array(e))}digestInto(e){if((0,bg.output)(e,this),this.finished)throw new Error("digest() was already called");return this.writeInto(e),this.destroy(),e}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,this.state.fill(0)}_cloneInto(e){const{blockLen:t,suffix:n,outputLen:r,rounds:i,enableXOF:s}=this;return e||(e=new Dg(t,n,r,s,i)),e.state32.set(this.state32),e.pos=this.pos,e.posOut=this.posOut,e.finished=this.finished,e.rounds=i,e.suffix=n,e.outputLen=r,e.enableXOF=s,e.destroyed=this.destroyed,e}}Bf.Keccak=Dg;const jg=(e,t,n)=>(0,Sg.wrapConstructor)((()=>new Dg(t,e,n)));Bf.sha3_224=jg(6,144,28),Bf.sha3_256=jg(6,136,32),Bf.sha3_384=jg(6,104,48),Bf.sha3_512=jg(6,72,64),Bf.keccak_224=jg(1,144,28),Bf.keccak_256=jg(1,136,32),Bf.keccak_384=jg(1,104,48),Bf.keccak_512=jg(1,72,64);const Rg=(e,t,n)=>(0,Sg.wrapXOFConstructorWithOpts)(((r={})=>new Dg(t,e,void 0===r.dkLen?n:r.dkLen,!0)));Bf.shake128=Rg(31,168,16),Bf.shake256=Rg(31,136,32);const{sha3_512:Ug}=Bf,Fg=(e=4,t=Math.random)=>{let n="";for(;n.length<e;)n+=Math.floor(36*t()).toString(36);return n};function Mg(e){let t=0n;for(const n of e.values()){t=(t<<8n)+BigInt(n)}return t}const Wg=(e="")=>Mg(Ug(e)).toString(36).slice(1),Gg=Array.from({length:26},((e,t)=>String.fromCharCode(t+97))),Vg=({globalObj:e=(void 0!==$c?$c:"undefined"!=typeof window?window:{}),random:t=Math.random}={})=>{const n=Object.keys(e).toString(),r=n.length?n+Fg(32,t):Fg(32,t);return Wg(r).substring(0,32)},Hg=e=>()=>e++,zg=({random:e=Math.random,counter:t=Hg(Math.floor(476782367*e())),length:n=24,fingerprint:r=Vg({random:e})}={})=>function(){const i=(e=>Gg[Math.floor(e()*Gg.length)])(e),s=Date.now().toString(36),o=t().toString(36),a=Fg(n,e);return`${i+Wg(`${s+a+o+r}`).substring(1,n)}`},qg=zg();Tf.getConstants=()=>({defaultLength:24,bigLength:32}),Tf.init=zg,Tf.createId=qg,Tf.bufToBigInt=Mg,Tf.createCounter=Hg,Tf.createFingerprint=Vg,Tf.isCuid=(e,{minLength:t=2,maxLength:n=32}={})=>{const r=e.length,i=/^[0-9a-z]+$/;try{if("string"==typeof e&&r>=t&&r<=n&&i.test(e))return!0}finally{}return!1};const{createId:Kg,init:Jg,getConstants:Yg,isCuid:Xg}=Tf;var Zg=Kg;const Qg=Gc("getUniqueId"),em=({reply:e,sourceServiceId:t})=>{Qg(`Generating unique id for service "${t}"`);return e({success:[Zg()]})},tm=Gc("getActiveServices"),nm=async({transport:e,sourceServiceId:t,reply:n})=>{if(tm(`Received GetServices request from ${e} [${t}]`),e===ac.WS){let e=_l.getActiveServices();const r=Sf(t);if(!r)return n({error:"Client not found",errCode:"CLIENT_NOT_FOUND"});let i=[];if(r.transport===ac.WS){if(!r?.extraInfo.wsApiKey)return n({error:"Client does not have an API key",errCode:"CLIENT_NO_API_KEY"});const t=e.filter(_l.isInternalKemuService),s=e.filter((e=>e.devMode&&_l.isNotInternalKemuService(e))),o=e.filter((e=>_l.isOfficialKemuService(e)&&_l.isNotInternalKemuService(e)&&_l.isNotDevService(e))).sort(((e,t)=>e.name.localeCompare(t.name))),a=await(async e=>{const{features:t}=await mf(e);return t})(r.extraInfo.wsApiKey),c=a?.hub_services??0,l=o.slice(0,-1!==c?c:o.length);i=o.slice(c).map((e=>({name:e.name,version:e.version,svgIcon:e.svgIcon,color:e.color,description:e.description,title:e.title,shortTitle:e.shortTitle}))),e=[...t,...s,...l]}const s=_l.getFailedServices().map((e=>({name:e.name,version:e.version,description:e.description,title:e.title,status:e.status,errorMsg:e.errorMsg,errorCode:e.errorCode,internal:_l.isInternalKemuService(e),svgIcon:e.svgIcon,color:e.color,shortTitle:e.shortTitle})));n({success:[{available:e.map((e=>{const{widgetUIContents:t,...n}=e;return{...n}})),failed:s,installed:i}]})}};let rm="runtime",im=null;const sm=()=>rm,om=Gc("getSystemInfo"),am=async({reply:e})=>{om("Received GetSystemInfo request");e({success:[await(async()=>({platformArch:`${"win32"===process.platform?"win":"darwin"===process.platform?"osx":""}-${(()=>{switch(process.arch){case"x64":return"x64";case"ia32":return"x86";case"arm":return"arm";case"arm64":return"arm64";default:return""}})()}`,isDesktopHub:"desktop"===sm(),isRuntimeHub:"runtime"===sm(),hubVersion:Yc,...im?{updateAvailable:im}:{}}))()]})},cm=Gc("removeService"),lm=async({args:e,sourceServiceId:t,reply:n})=>{const r=e[0],i=r.serviceName,s=r.version;if(!i)return n({error:"No service name provided"});if(!s)return n({error:"No service version provided"});const o=_l.getAllServiceVersions(i),a=o.find((e=>e.info.version===s));if(!a)return n({error:"Service not found"});cm(`Removing ${o.length} service(s) with name: ${i}`);const c=a.info.publicationId;let l;if(await _l.uninstallService(a.info.name,a.info.version),c){const e=Sf(t);if(!e)return n({error:"Client not found",errCode:"CLIENT_NOT_FOUND"});const r=e.extraInfo.wsApiKey;if(!r)return n({error:"Client does not have an API key",errCode:"CLIENT_NO_API_KEY"});cm(`Updating license details for "${c}"`);const i=await(async e=>{const{data:t,error:n}=await ff(`${hf()}/v1/validate/uninstall_hub_service`,e);if(n)throw new Error(n);return t})({apiKey:r,hubService:{id:c}}).catch((e=>(cm(`Error updating license details for "${c}": ${e}`),{error:e.message,remaining:void 0})));l=i?.remaining}n({success:[{remaining:l,service:{name:i,version:s}}]})},dm=v(M(import.meta.url)),um=Gc("hub"),pm=new function(e){const t={};let n=console.log;const r={};let i=e||String(Date.now());const s={},o=e=>!s[e],a=(e,t,n,r,i,s)=>{let a=ad?new ArrayBuffer(0):Buffer.alloc(0);const c={json:{functionName:e,args:s.success?s.success:[s],messageId:t,type:s.success?"response":"error"}};return o(r)&&(a=Hd.encode(c,n,r)),i(a,{msg:c,sourceServiceId:n,targetServiceId:r})};return{setLogger:e=>{n=e},processMessage:(e,i,s,o)=>{if(!o)return!1;const c=o;if(t[c.messageId]){const e=t[c.messageId];return e&&(clearTimeout(e.timer),e.fulfilled||(e.fulfilled=!0,"response"===c.type?e.resolve(c.args):"error"===c.type&&e.reject(c.args[0])),delete t[c.messageId]),!0}if("execute"!==c.type&&n&&n(`No pending execution found for message id "${c.messageId}"`),"execute"===c.type){const t=r[c.functionName];if(t){const n=e=>{a(c.functionName,c.messageId,s.targetServiceId,s.sourceServiceId,i,e)};t({transport:e,args:c.args,reply:n,messageId:c.messageId,sourceServiceId:s.sourceServiceId,send:i})}else{const e=`Function "${c.functionName}" not found.`;n&&n(e),a(c.functionName,c.messageId,s.targetServiceId,s.sourceServiceId,i,{error:e,errCode:"FNC_NOT_FOUND"})}return!0}return!1},execute:async(e,r,s,a,c,l)=>{if(!s){const e="No send buffer function provided.";throw n&&n(e),e}zd+=1;const d=`${i}-${zd}-exec-${e.substring(0,10)}`,u={messageId:d,functionName:e,send:s,sourceServiceId:a,targetServiceId:c,args:r||[],fulfilled:!1,resolve:()=>{},reject:()=>{}};u.promise=new Promise(((e,t)=>{u.resolve=e,u.reject=t}));let p=ad?new ArrayBuffer(0):Buffer.alloc(0);const h={json:{functionName:e,args:r,messageId:d,type:"execute"}};o(c)&&(p=Hd.encode(h,a,c)),t[d]=u,n&&n(`Calling remote function "${e}" with message id "${d}"`);const f="true"===process.env.NO_INVOKE_TIMEOUT;return l?.async?(u.fulfilled=!0,u.resolve([void 0]),delete t[d]):0===l?.timeout||f||(u.timer=setTimeout((()=>{n&&n(`Remote function ${d} timed out`);const r=t[d];r&&!r.fulfilled&&(r.fulfilled=!0,u.reject(`Function ${e} Timed out`)),delete t[d]}),l?.timeout||3e4)),s(p,{sourceServiceId:a,targetServiceId:c,msg:h}),u.promise},sendResponse:a,registerFunction:(e,t)=>{r[e]=t},getTransportSendFunction:e=>{const n=t[e];return n?n.send:null},setServiceName:e=>{i=e},getPendingExecutions:()=>t,rejectAllPending:e=>{Object.keys(t).forEach((n=>{const r=t[n];r&&!r.fulfilled&&(clearTimeout(r.timer),r.fulfilled=!0,r.reject(e),delete t[n])}))},broadcast:(e,t,r,s)=>{zd+=1;const a=`${i}-${zd}-multicast-${e.substring(0,10)}`;let c=ad?new ArrayBuffer(0):Buffer.alloc(0);const l={json:{functionName:e,args:t,messageId:a,type:"execute"}};let d=o(r[0].serviceId);d&&(c=Hd.encode(l,s,r[0].serviceId));for(let t=0;t<r.length;t++)try{const i=r[t];n&&n(`Broadcasting function "${e}" with message id "${a}" to client [${i.serviceId}]`),0!==t&&(d=o(i.serviceId),d&&(c=Hd.patchEncodedHeader(c,{toServiceId:i.serviceId}))),i.sendFn(c,{msg:l,sourceServiceId:s,targetServiceId:i.serviceId})}catch(e){n&&n(`Error broadcasting to client at index ${t}`)}},disableServiceEncoding:(e,t)=>{s[e]=t}}}("hub");pm.setLogger(um);const hm={[sc.RebootToInstallUpdate]:null,[sc.GetFileContentFromCacheId]:null},fm=(e,t)=>{const{transmission:n}=t;if(0!==n.targetServiceId){const r=Sf(n.targetServiceId);if(!r)return um(`Service [${e}] ${n.sourceServiceId} is sending data to an unknown service ["${n.targetServiceId}"]`),!0;r.transport,ac.IPC;const i=t.json?.messageId;return um(`Forwarding message from ${n.sourceServiceId} to ${n.targetServiceId}, msgId: ${i}`),r.send(n.rawMessage,{sourceServiceId:n.sourceServiceId,targetServiceId:n.targetServiceId,msg:{json:t.json}}),!0}return!1},gm=({sourceServiceId:e,args:t})=>{const n=_l.getServiceBySessionId(e);if(n){const r=If(n.info.name,n.info.version),i=If(n.info.name,"*");if(!r.length&&!i.length)return;const s=[...r,...i],o={...t[0],source:{serviceName:n.info.name,serviceVersion:n.info.version,sessionId:e}};pm.broadcast(sc.BroadcastEvent,[o],s,0)}},mm=e=>{const{send:t,transmission:n,json:r}=e;um(`Raw message Id received from WS: ${r?.messageId}`);fm(ac.WS,e)||pm.processMessage(ac.WS,t,n,r)},vm=e=>{const t=(n=e,`${ic.SocketAcknowledge}${n}`);var n;zh.sendCommand(e,t)},ym=(e,t)=>{um(`Received unknown command [${t}] from service ${e}`)},bm=async e=>{const{args:t,sourceServiceId:n,send:r,reply:i}=e,{apiKey:s}=t[0],o=n;await $f({serviceSessionId:n,transport:ac.WS,send:r,terminateFn:()=>{zh.terminateConnection(n)},extraInfo:{websocketId:o,wsApiKey:s}}),i({success:[]})},wm=e=>{um(`WS Client ${e} disconnected`),Ef(e)},Sm=async({sourceServiceId:e,args:t,transport:n,send:r})=>{if(n!==ac.IPC){var i;um(`Received manifest from non IPC service ${e}.`)}else{const n=t[0];if(n.devMode){const t=_l.getMatchingDevService(n.name,n.version,"stopped");if(t){um(`Found matching previous service ${t.info.name} (${t.info.version}). Reactivating previous client with session id ${t.info.sessionId}`);const s=Sf(t.info.sessionId);if(!s)return void um(`Could not find previous client instance for ${t.info.name} (${t.info.version}). Aborting manifest injection`);s.send=r,yf[i=e]?delete yf[i]:vf(`Could not find source client with session id ${i}`),Md(e,t.info.sessionId);const o=await tl(n,n.path);t.info={...t.info,...o},um(`Updating manifest for dev service ${t.info.sessionId}`),_l.setServiceManifest(t.info.sessionId,o,"running"),um(`Asking service ${e} to assume previous session id ${t.info.sessionId}`),Fd(t.info.sessionId,(e=>`${ic.AssumeSession}${e}`)(t.info.sessionId)),(e=>{const t=yf[e];t?t.isDevClient?(t.disconnected=!1,t.transport===ac.IPC&&(_f(),kf(e))):vf(`Client with session id ${e} is not a dev client`):vf(`Could not find source client with session id ${e}`)})(t.info.sessionId)}else{_l.addDevService(e,n,"running");const t=Sf(e);t?t.isDevClient=!0:$f({serviceSessionId:e,transport:ac.IPC,send:r,extraInfo:{ipcSocketId:e},isDevClient:!0})}return}um(`Received manifest from non dev service ${e} [${n.name}@(${n.version})]. Ignoring...`)}};var Im=async e=>{var t;um("Starting Kemu Hub..."),t=e.desktopMode?"desktop":"runtime",rm=t;const n=e?.ipc?.appSpace||"kemu.",r=e?.ipc?.id||"widgets";if(!e.serviceUrl)throw new Error("Missing service url, please set the `apiUrl` option.");const i=e.serviceUrl;pf=i,pm.registerFunction(sc.GetServiceContents,uf),pm.registerFunction(sc.GetServices,nm),pm.registerFunction(sc.GetSystemInfo,am),pm.registerFunction(sc.ShowSecretsConfigScreen,(async({args:t,reply:n})=>{const[{name:r,version:i}]=t;e?.onShowSecretsScreen?(await e.onShowSecretsScreen(r,i),n({success:[]})):n({error:"This hub does not support showing secrets configuration screens",errCode:"GUI_NOT_SUPPORTED"})})),pm.registerFunction(sc.UnsubscribeFromService,(({transport:e,reply:t,args:n,sourceServiceId:r})=>{if(e===ac.WS){const[e]=n,i=Sf(r);if(!i)return t({error:`Session id "${r}" not found`});um(`Service ${r} unsubscribing from "${e.targetService.serviceName} (${e.targetService.version})"`),t({success:[]}),i?.removeSubscription({serviceName:e.targetService.serviceName,version:e.targetService.version})}})),pm.registerFunction(sc.SubscribeToService,(({transport:e,reply:t,args:n,sourceServiceId:r})=>{if(e===ac.WS){const[e]=n,i=Sf(r),s=e.targetService;if(!i)return t({error:`Session id "${r}" not found`});if(um(`Service ${r} subscribing to "${s.serviceName} (${s.version})"`),"hub"===s.serviceName)return i.addSubscription(s),void t({success:[]});if(!i.addSubscription(s))return um(`Service ${r} already subscribed to "${s.serviceName} (${s.version})", ignoring request.`),t({success:[]});const o=_l.getMatchingService(s.serviceName,s.version);if(!o)return um(`Service ${s.serviceName} ${s.version} not active yet`),t({success:[]});if(!o.info.eventEmitter)return um(`Service ${s.serviceName} ${s.version} does not have an event emitter, removing subscription`),i.removeSubscription(s),t({error:`Service "${s.serviceName} (${s.version})" does not produce events`});const a=Sf(o.info.sessionId);return a?.extraInfo.ipcSocketId&&(um(`Sending Broadcast START command to service ${o.info.sessionId}`),Fd(a?.extraInfo.ipcSocketId,ic.BroadcastStart)),t({success:[]})}})),pm.registerFunction("stopService",Kh),pm.registerFunction("removeService",Yh),pm.registerFunction("launchService",Zh),pm.registerFunction("getMatchingServices",ef),pm.registerFunction("getSecretsValues",rf),pm.registerFunction(sc.GetMappedSecrets,cf),pm.registerFunction(sc.BroadcastEvent,gm),pm.registerFunction(sc.ServiceManifest,Sm),pm.registerFunction(sc.ChooseDirectoryDialog,Pf),pm.registerFunction(sc.ChooseFileDialog,Of),pm.registerFunction(sc.GetUniqueId,em),pm.registerFunction(sc.SocketAckResponse,bm),pm.registerFunction(sc.UninstallService,lm),Object.entries(hm).forEach((([e,t])=>{t?pm.registerFunction(e,t):(um(`Skipping registration of "${e}" because it's not implemented`),pm.registerFunction(e,(({reply:t})=>{t({error:`This hub does not support "${e}"`,errCode:"FUNCTION_NOT_SUPPORTED"})})))})),Ud((e=>{const{send:t,transmission:n,json:r}=e;um(`Raw message Id received from IPC: ${r?.messageId}`);fm(ac.IPC,e)||pm.processMessage(ac.IPC,t,n,r)})),zh.onMessageReceived(mm),zh.onClientConnected(vm),zh.onClientCommand(ym),zh.onClientDisconnected(wm),Wd(Af),jd((e=>{const t=(e=>`${ic.IpcAcknowledge}${e}`)(e);Fd(e,t)})),Rd((e=>{um(`IPC socket [${e}] disconnected`);const t=Sf(e);if(t){um(`Found matching service for disconnected socket. SessionId: ${t.serviceSessionId}`);const e=_l.getServiceBySessionId(t.serviceSessionId);_l.setServiceStatus(t.serviceSessionId,"stopped"),e?.devMode?(t.disconnected=!0,_f()):Ef(t.serviceSessionId)}})),await Dd({ipcAppSpace:n,ipcId:r}),e?.ws?.disabled||await zh.startServer(e?.ws?.port||5368);const s=e?.defaultServicesPath||g.resolve(dm,"defaultServices"),o=process.env.DEV_SESSION_ID;_l.setHubIpcConfig({recipePath:e?.recipeRootPath,appSpace:n,id:r}),e?.servicesInstallPath&&(e=>{rl=e})(e.servicesInstallPath),e?.testServicesInstallPath&&(e=>{il=e})(e.testServicesInstallPath);const a=sl(),c=il||Kc,l=async({requiredSecrets:e})=>{const t=Object.keys(e).reduce(((e,t)=>({...e,[t]:process.env[t]})),{});return t.__KEMU_USER_SERVICES_PATH=a,t.__KEMU_USER_TEST_SERVICES_PATH=c,t.__KEMU_SERVICE_URL=i,t},d=async e=>e.reduce(((e,t)=>({...e,[t.name]:[]})),{});e?.getServiceSecretsFn?(_l.setGetSecretsFunction(e.getServiceSecretsFn),sf(e.getServiceSecretsFn)):(_l.setGetSecretsFunction(l),sf(l)),lf(e?.getMappedSecretsFn?e.getMappedSecretsFn:d),_l.setSpawnNodeFunction(e?.spawnFn?e.spawnFn:({args:e,options:t})=>{const n={...process.env};return G("node",e||[],{...t,env:{...n,...t?.env}})}),e?.noDefaultServices||await _l.loadServices(s,{fixedSession:o?parseInt(o):void 0,singleServiceName:process.env.DEV_SINGLE_SERVICE_NAME,internalServices:!0}),null!==e?.servicesInstallPath&&(await nl(a)||await b(a,{recursive:!0}),await _l.loadServices(a,{internalServices:!1,singleServiceName:process.env.DEV_SINGLE_SERVICE_NAME}));const u=process.env.DEV_NO_SPAWN_LIST?.split(",");await _l.launchServices({noSpawningList:u||[]}),um("Kemu Hub started"),(e?.onChooseDirectory||e?.onChooseFile)&&Lf({chooseDirectory:e.onChooseDirectory,chooseFile:e.onChooseFile})},_m=e=>{if(e===ac.WS)return{handleWebsocketConnectionEvent:vm,handleWebsocketClientDisconnectionEvent:wm,handleWebsocketMessage:mm,handleWebsocketClientCommand:ym,getRemoteInvoke:()=>pm}},$m=(e=[])=>{let t;const n=new Promise((n=>{const r=()=>{if(_l.getAllServices().every((e=>"running"===e.status))){if(e.every((e=>"running"===_l.getMatchingService(e.name,e.version)?.status)))return n()}t=setTimeout(r,100)};r()}));return n.abort=()=>{t&&clearTimeout(t)},n};let Cm;const km=ca("run"),Em=dc(),xm=1e3,Am=C(process.argv.slice(2));global.ImageData=q,_e({createCanvas:(e,t)=>J(e,t),loadImage:async e=>{const t=await K(e),n=J(t.width,t.height).getContext("2d");n.drawImage(t,0,0,t.width,t.height);return n.getImageData(0,0,t.width,t.height)}});const Nm={createImageDataLike:(e,t,n,r="srgb")=>{let i;return i=e instanceof Uint8ClampedArray?e:new Uint8ClampedArray(e),{data:i,width:t,height:n,colorSpace:r,_kemuType:fe.ImageData}},loadImageFile:async e=>{const t=await K(e),n=J(t.width,t.height).getContext("2d");n.drawImage(t,0,0,t.width,t.height);return n.getImageData(0,0,t.width,t.height)},encodeImageData:async(e,t="jpeg",n)=>{const r=J(e.width,e.height);let i;return r.getContext("2d").putImageData(e,0,0),i="png"===t?await r.encode(t):await r.encode(t,n),i}};var Pm={start:async r=>{r=r||{};const i=r?.recipePath||Am.recipePath||process.env.KEMU_EDGE_RECIPE_PATH||process.cwd();if(!i)throw new Error("`recipePath` not provided. Please specify it in the config object, via a command line argument [--recipePath] or as an environment variable [KEMU_EDGE_RECIPE_PATH].");e({path:V(H(i),".env")});const s=r.apiKey||process.env.KEMU_API_KEY;if(!s)throw new Error("Missing API key. Please provide it via config.apiKey or KEMU_API_KEY environment variable.");const o=i.endsWith(".json")||i.endsWith(".kemu"),a=o?z(i):i,c=o?i:V(a,"recipe.kemu"),l=(e=>{try{return JSON.parse(e||"")}catch(e){return null}})(await t(H(c),"utf-8"));if(!l)throw new Error("Failed to parse recipe file");const{serviceUrl:d,apiKey:u}=((e,t)=>{const n=$o(e,t),r=Buffer.from(n,"base64").toString("utf8"),[i,s]=r.split("<@>");if(!s||!i)throw new Error("Invalid API key.");return{serviceUrl:s,apiKey:i}})(l,s);await zi();const p={id:l.id||String(Date.now()),version:1,author:""};(e=>{_r=e})(console);const h=_m(we.WS),f=(e,t)=>{if(t)h?.handleWebsocketMessage({send:m,transmission:{rawMessage:e,sourceServiceId:t.sourceServiceId,targetServiceId:t.targetServiceId},json:t.msg?.json});else{const t=e instanceof Buffer?e.toString():e;h?.handleWebsocketClientCommand(xm,t)}},g=(Jo={instanceServiceId:xm,sendBuf:f,sendCmd:f,triggerOnCommand:(...e)=>Yo(...e),triggerOnConnected:()=>Xo(),triggerOnDisconnected:()=>Zo(),triggerOnMessageReceived:(...e)=>Qo(...e)},Jo);const m=(e,t)=>{if(t)g.triggerOnMessageReceived({send:f,transmission:{rawMessage:e,sourceServiceId:t.sourceServiceId,targetServiceId:t.targetServiceId},json:t.msg.json});else{const t=e instanceof Buffer?e.toString():e;g.triggerOnCommand(t)}},v=pc(),y=h.getRemoteInvoke();v.disableServiceEncoding(0,!0),y.disableServiceEncoding(xm,!0);const b=Object.values(l.blocks[pe].gates).filter((e=>e.type===He.hubService&&e.state.service&&!0!==e.state.service?.webOnly)),w=b.map((e=>{const t=e.state.service;return{name:t.name,version:t.version}})),S=V(a,"services"),I=await n(S).then((()=>!0)).catch((()=>!1));await Im({recipeRootPath:a,servicesInstallPath:I?V(a,"services"):null,noDefaultServices:!0,ws:{disabled:!0},serviceUrl:d,ipc:{appSpace:"kemu-runner.",id:p.id}}),km("Waiting for services to run"),await $m(w),km("All services are running"),wo(Em);const _=await vo(l,"runner",p.version,p.author,so.Desktop);return Cm=_,uc(_),await cc(u),new Promise(((e,t)=>{var n;lc("acknowledged",(async()=>{await Em.getServices();const{failed:n,sendToInputWidget:r,invokeRecipeLoadedWidgets:i}=await bo(_);if(n.length>0){const e=`Some widgets failed to initialize: ${n.join(", ")}`;return t(e)}await i().catch((e=>{console.error("Error invoking recipe loaded widgets: ",e)})),km("Recipe started"),e({getApiKey:()=>u,sendToInputWidget:(e,t)=>"number"==typeof t?r(e,{type:fe.Number,value:t}):"string"==typeof t?r(e,{type:fe.String,value:t}):"boolean"==typeof t?r(e,{type:fe.Boolean,value:t}):Array.isArray(t)?r(e,{type:fe.Array,value:t}):r(e,t)})})),g.triggerOnConnected(),g.triggerOnCommand((n=xm,`${ve.SocketAcknowledge}${n}`))}))},terminate:async()=>{Cm&&await yo(Cm)},onVariableChange:(e,t)=>yr(e,t)};void 0===typeof process.env.BLOCKS_INSTALL_DIR&&console.warn("Missing `BLOCKS_INSTALL_DIR` env var");process.env.BLOCKS_INSTALL_DIR;export{fe as DataType,Pm as default,Nm as utils};