@kosdev-code/kos-dispense-sdk 2.1.35 → 2.1.37

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.
@@ -1,2 +1,2 @@
1
- "use strict";var nt=Object.defineProperty;var st=(e,t,r)=>t in e?nt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var d=(e,t,r)=>(st(e,typeof t!="symbol"?t+"":t,r),r);const i=require("@kosdev-code/kos-ui-sdk");require("react");var h=(e=>(e.IngredientLoader="kos.ingredient.loader",e.IngredientMapper="kos.ingredient.mapper",e.IngredientIndex="kos.ingredient.index",e.IngredientTypeMapper="kos.ingredient.type.mapper",e.HolderTypeMapper="kos.holder.type.mapper",e.HolderMapper="kos.holder.mapper",e.HolderIndex="kos.holder.index",e.HolderIngredientMapper="kos.holder.ingredient.mapper",e.AvailabilityMapper="kos.availability.mapper",e.AvailabilityLoader="kos.availability.loader",e.SelectedPourableMapper="kos.selected.pourable.mapper",e.AssemblyMapper="kos.assembly.mapper",e.BoardMapper="kos.board.mapper",e.BoardIndex="kos.board.index",e.PumpIndex="kos.pump.index",e.AssemblyFeatureFlags="kos.assembly.feature.flags",e))(h||{}),E=(e=>(e.Nozzle="nozzle-model",e.Availability="availability-model",e.Holder="holder-model",e.HolderContainer="holder-container-model",e.IngredientContainer="ingredient-container-model",e.Ingredient="ingredient-model",e.Pump="pump-model",e.PumpContainer="pump-container-model",e))(E||{}),at=Object.getOwnPropertyDescriptor,ot=(e,t,r,n)=>{for(var s=n>1?void 0:n?at(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=o(s)||s);return s};const w="ingredient-model";let te=class{constructor(e,{name:t,type:r,data:n,ingredientId:s,...a}){d(this,"id");d(this,"ingredientId");d(this,"name");d(this,"type");d(this,"data");this.id=e,this.ingredientId=s,this.name=t,this.type=r,this.data=n,Object.assign(this,a)}updateModel({name:e,type:t,data:r,ingredientId:n,...s}){this.name=e,this.type=t,this.ingredientId=n,this.data=r,Object.assign(this,s)}};te=ot([i.kosModel(w)],te);const se={registration:{[w]:{class:te,singleton:!1}},type:w,predicate:i.isKosModel(w),factory:i.Kos.Factory.create(w)},{URL:Ce}=i.resolveServiceUrl("INGREDIENT_SERVICE"),{getOne:dt}=i.ServiceFactory.build({basePath:`${Ce}/api/ext/dispense/ingredients`}),Re=async()=>await dt({urlOverride:`${Ce}/api/ext/dispense/ingredients`});var lt=Object.defineProperty,ct=Object.getOwnPropertyDescriptor,we=(e,t,r,n)=>{for(var s=n>1?void 0:n?ct(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&lt(t,r,s),s};const S="ingredient-container-model",pt=i.KosLog.createLogger({name:"ingredient-container-model"});let G=class{constructor(e,t){d(this,"id");d(this,"ingredients");this.id=e,this.ingredients=new i.KosModelContainer({indexMap:{ingredientType:"type"},extensionId:h.IngredientIndex,parentId:e})}updateModel(){}getIngredientsByType(e){return this.ingredients.getIndexByKey("ingredientType",e)}async load(e){var s;pt.debug(`loading ingredient container ${this.id}`);const t=await Re();if((t==null?void 0:t.status)!==200)throw new Error("Failed to load ingredients");const r=await i.KosExtensionUtils.executeLoaderExtension({context:e,extension:h.IngredientLoader}),n=(t==null?void 0:t.data)??{};for(const a of Object.keys(n))for(const o of((s=t==null?void 0:t.data)==null?void 0:s[a])||[]){const p=await i.KosExtensionUtils.executeDataMapperExtension({extension:h.IngredientMapper,data:o,contextData:r}),c=await i.KosExtensionUtils.executePropertyMapperExtension({extension:h.IngredientTypeMapper,data:o,contextData:r}),g={...o,type:c||o.type,...p,data:p},y=se.factory(o.id)(g);this.ingredients.addModel(y)}}};we([i.kosChild],G.prototype,"ingredients",2);G=we([i.kosModel(S)],G);const ae={registration:{[S]:{class:G,singleton:!0}},type:S,predicate:i.isKosModel(S),factory:i.Kos.Singleton.create(S)},{URL:X}=i.resolveServiceUrl("HOLDER_SERVICE"),{getAll:gt,postModel:Se,deleteModel:ht}=i.ServiceFactory.build({basePath:`${X}/api/kos/holders`}),ut=i.KosLog.createLogger({name:"holder-service",group:"Services"}),yt=async()=>await gt({}),Ae=async(e,t)=>{if(!e||!t)throw new Error("Missing holderPath or ingredientId");return await Se({model:{holderPath:e,ingredientId:t},urlOverride:`${X}/api/ext/dispense/assignments`})},Te=async e=>{if(!e)throw new Error("Missing holderPath");return await ht({id:e,urlOverride:`${X}/api/ext/dispense/assignments/${e}`})},Ne=async e=>{if(!e)throw new Error("Missing holderPath");return ut.debug(`sending POST request to /api/ext/dispense/pumpEvents/replaceLine/${e}`),await Se({model:{},urlOverride:`${X}/api/ext/dispense/pumpEvents/replaceLine/${e}`})},{URL:k}=i.resolveServiceUrl("ASSIGNMENT_SERVICE"),{getAll:Pt,postModel:De,deleteModel:It}=i.ServiceFactory.build({destinationAddress:"",basePath:`${k}/api/ext/dispense/assignments`}),F=window.kosUseFos,mt=async()=>await Pt({fos:F}),Le=async(e,t)=>{var s,a,o,p;const r=JSON.stringify(t),n=`${k}/api/ext/dispense/assignments`;try{const c=await De({model:{holderPath:e,factoryJson:r},urlOverride:n});return(c==null?void 0:c.status)===200&&((s=c==null?void 0:c.data)!=null&&s.error)?[c.data.error||"unknownError",c.data]:[void 0,c==null?void 0:c.data]}catch(c){if(c instanceof i.FetchError)return[((o=(a=c.payload)==null?void 0:a.data)==null?void 0:o.error)||"unknownError",(p=c.payload)==null?void 0:p.data]}return["unknownError",void 0]},vt=async e=>{const t=F?`${k}/api/ingredients/assignments/${e.holderPath}`:`${k}/api/ext/dispense/assignments`;return await De({model:{...e,fuelGauge:680},fos:F,urlOverride:t})},ft=async e=>await It({id:e,fos:F});var Et=Object.defineProperty,bt=Object.getOwnPropertyDescriptor,oe=(e,t,r,n)=>{for(var s=n>1?void 0:n?bt(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&Et(t,r,s),s};const A=E.Holder,be=i.KosLog.createLogger({name:"holder-model"});i.ExtensionManager[i.EXTENSION_TROUBLE_MAPPER].register("holder",async e=>{const t=[];return t.push(...e.data.holderPaths),t});i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("pump",async e=>{if(e.data.pumpPath){const{model:t}=i.getKosModelSync(e.data.pumpPath);if(t){const r=t.ingredientId?i.getKosModelSync(t.ingredientId).model:void 0;return{ingredientId:t.ingredientId,ingredientName:(r==null?void 0:r.displayName)??((r==null?void 0:r.name)||""),childPumpName:t.name}}}return{}});i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("holder",async e=>e.data.holderNames.length>0?{holderName:e.data.holderNames[0]||""}:{});i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("container",async e=>{if(e.data.ingredients.length>0){const t=e.data.ingredients[0],{model:r}=i.getKosModelSync(t);return{ingredientName:(r==null?void 0:r.displayName)??((r==null?void 0:r.name)||""),ingredients:e.data.ingredients?e.data.ingredients:[],unknonwnIngredientId:e.data.unknonwnIngredientId??""}}return{}});class Mt extends Error{constructor(r,n){super(n);d(this,"type");this.name="AssignmentError",this.type=r}}let B=class{constructor(e,{path:t,name:r,ingredientSource:n,ingredientId:s,ingredientType:a,slice:o,group:p,data:c,enjoyByDate:g},y){d(this,"id");d(this,"path");d(this,"name");d(this,"ingredientId");d(this,"ingredientType");d(this,"ingredientSource");d(this,"group");d(this,"slice");d(this,"logger");d(this,"data");d(this,"enjoyByDate");d(this,"pumps");d(this,"ingredientContainer");this.id=e,this.path=t,this.name=r,this.ingredientType=a,this.ingredientSource=n,this.ingredientId=s,this.group=p,this.slice=o,this.enjoyByDate=g,this.data=c,this.pumps=new i.KosModelContainer({parentId:e,sortKey:"path"}),this.logger=y.logger}updateModel({path:e,name:t,ingredientSource:r,ingredientId:n,ingredientType:s,group:a,slice:o,enjoyByDate:p,data:c}){this.path=e,this.name=t,this.ingredientId=n,this.ingredientType=s,this.ingredientSource=r,this.enjoyByDate=p,this.slice=o,this.group=a,this.data=c}get hasEnjoyByDate(){return!!this.enjoyByDate&&!this.unassigned}get hasEnjoyByWarning(){var e;return((e=this.troublesByType.EnjoyByTrouble)==null?void 0:e.length)>0}get nozzlePaths(){return this.pumps.data.map(e=>e.nozzlePath)}async cancelPour(){await Promise.all(this.pumps.data.filter(e=>e.isPouring).map(e=>e.cancelPour()))}get canPour(){return!this.shouldDefer&&this.pumps.data.every(e=>e.canPour)}get isPouring(){const e=this.pumps.data.some(t=>t.isPouring);return this.logger.debug(`isPouring: ${!!e}`),e}async performIntent(e){const t=typeof e=="string"?e:e.intent,r=typeof e=="string"?void 0:e.pumpPath,n=r?this.pumps.getModel(r):this.pumps.data[0];return n==null?void 0:n.performIntent({intent:t})}get pourState(){return this.pumps.data.reduce((t,r)=>r.pouringState?r.pouringState:t,"")}get nozzlePath(){var e;return(e=this.pumps.data[0])==null?void 0:e.nozzlePath}get pumpPaths(){return this.pumps.data.map(e=>e.id)}get sortedPumps(){return this.pumps.data.sort((e,t)=>e.virtual&&!t.virtual?-1:!e.virtual&&t.virtual?1:e.name.localeCompare(t.name))}get ingredient(){var t;return this.ingredientId?(t=this.ingredientContainer)==null?void 0:t.ingredients.getModel(this.ingredientId):void 0}get ingredientName(){return this.ingredient?this.ingredient.displayName??this.ingredient.name:this.ingredientId?"unknown":""}get previousIngredient(){var t;return this.prevIngredientId?(t=this.ingredientContainer)==null?void 0:t.ingredients.getModel(this.prevIngredientId):void 0}get previousIngredientName(){return this.previousIngredient?this.previousIngredient.displayName??this.previousIngredient.name:this.prevIngredientId?"unknown":""}get prevIngredientId(){var e,t;return(t=(e=this.pumps.data)==null?void 0:e[0])==null?void 0:t.prevIngredientId}get unassigned(){return(!this.ingredientId||this.ingredientId==="0")&&(!this.prevIngredientId||this.prevIngredientId==="0")}get removed(){return(!this.ingredientId||this.ingredientId==="0")&&this.prevIngredientId!==void 0&&this.prevIngredientId!=="0"}get maxVolume(){return this.slice.maxVolMl??0}get remainingVolume(){return this.slice.currentVolMl??0}get hasMaxVolume(){return this.slice.maxVolMl!==void 0}get hasRemainingVolume(){return this.slice.currentVolMl!==void 0}get fillPercent(){return this.remainingVolume<=0?0:Math.floor((this.remainingVolume||1)/(this.maxVolume||1)*100)}get hasFuelGuage(){return this.hasMaxVolume&&this.hasRemainingVolume}updateIngredient(e){this.ingredientId!==e&&i.kosAction(()=>{this.ingredientId=e})}async resolveIntentVolume(e){const t=this.pumps.data[0];return t?t.resolveIntentVolume(e):{volume:-1}}async overrideRfidCode(e){if(!e)throw new Error("Invalid override");try{const[t,r]=await Le(this.path,e);if(t)throw new Mt(t,`Failed to perform rfid override on holder ${this.id}`);return i.kosAction(()=>{this.ingredientId=r==null?void 0:r.ingredientId}),r}catch(t){throw be.error(`Failed to perform rfid override on holder ${this.id}`,t),t}}async assignIngredient(e){try{e?await Ae(this.path,e):await Te(this.path),i.kosAction(()=>{this.ingredientId=e})}catch(t){throw be.error(`Failed to perform assign ingredient to holder ${this.id}`,t),t}}get shouldDefer(){return this.troubles.some(e=>e.shouldDefer)}async replaceLine(){await Ne(this.path)}};oe([i.kosChild],B.prototype,"pumps",2);oe([i.kosDependency({modelType:ae.type})],B.prototype,"ingredientContainer",2);B=oe([i.kosModel(A),i.kosTroubleAware()],B);const de={registration:{[A]:{class:B,singleton:!1}},type:A,predicate:i.isKosModel(A),factory:i.Kos.Factory.create(A)},_t=async(e,t)=>{var Ee;const r=i.ExtensionManager.propertyMapper.executeMapper(h.HolderIngredientMapper,t),n=i.ExtensionManager.propertyMapper.executeMapper(h.HolderTypeMapper,t)||t.ingType,s=await i.KosExtensionUtils.executeDataMapperExtension({extension:h.HolderMapper,data:t,contextData:{}}),{name:a,path:o,ingredientId:p,ingType:c,ingSource:g,slice:y,...R}=t,u={...R,...s},v=y||{pos:0},b={name:a,path:o,ingredientId:r||p,ingredientType:n||c,ingredientSource:g,enjoyByDate:(Ee=t.container)!=null&&Ee.enjoyByDate?new Date(t.container.enjoyByDate):void 0,slice:v,group:e,data:u};return de.factory(t.path)(b)},{URL:Ot}=i.resolveServiceUrl("ASSEMBLY_SERVICE"),{getOne:Ct}=i.ServiceFactory.build({basePath:`${Ot}/api/kos/device/assemblies`}),Rt=i.KosLog.createLogger({name:"assembly-service",group:"Services"}),le=async()=>(Rt.debug("sending GET for assembly"),await Ct({}));var wt=Object.defineProperty,St=Object.getOwnPropertyDescriptor,Z=(e,t,r,n)=>{for(var s=n>1?void 0:n?St(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&wt(t,r,s),s};const T="board-container-model",ce="/kos/hardware/board/linked",pe="/kos/hardware/board/unlinked";exports.BoardContainerModel=class{constructor(t,r,n){d(this,"id");d(this,"logger");d(this,"models");this.id=t,this.logger=n.logger,this.models=new i.KosModelContainer({parentId:t,extensionId:h.BoardIndex})}get boardList(){return this.models.data}updateModel(){}addModel(t){this.models.addModel(t)}removeModel(t){this.models.removeModel(t)}updateBoard(t){const r=t.path,n=this.models.getModel(r);if(!n){this.logger.warn(`board ${r} not found`);return}n.updateModel(t)}handleBoardLinkEvent(t){this.logger.debug(`handling ${ce} event ${t}`),t?this.updateBoard(t):this.logger.debug("- boardLinkEvent is undefined")}handleBoardUnlinkEvent(t){this.logger.debug(`handling ${pe} event ${t}`),t?this.updateBoard(t):this.logger.debug("- boardLinkEvent is undefined")}};Z([i.kosChild],exports.BoardContainerModel.prototype,"models",2);Z([i.kosTopicHandler({lifecycle:i.DependencyLifecycle.INIT,topic:ce,websocket:!0})],exports.BoardContainerModel.prototype,"handleBoardLinkEvent",1);Z([i.kosTopicHandler({lifecycle:i.DependencyLifecycle.INIT,topic:pe,websocket:!0})],exports.BoardContainerModel.prototype,"handleBoardUnlinkEvent",1);exports.BoardContainerModel=Z([i.kosModel(T)],exports.BoardContainerModel);const At=async e=>{const t=e.data.boardPath,{model:r}=i.getKosModelSync(t);return{boardName:(r==null?void 0:r.name)||""}};var Tt=Object.defineProperty,Nt=Object.getOwnPropertyDescriptor,$e=(e,t,r,n)=>{for(var s=n>1?void 0:n?Nt(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&Tt(t,r,s),s};const N=E.PumpContainer;var ge=(e=>(e.byBoard="byBoard",e.byType="byType",e.byNozzle="byNozzle",e))(ge||{});let j=class{constructor(e,t){d(this,"id");d(this,"pumps");this.id=e,this.pumps=new i.KosModelContainer({indexMap:{byNozzle:r=>r.nozzlePaths,byBoard:r=>r.boardPath,byType:"type"},parentId:e,extensionId:h.PumpIndex})}get pumpModels(){return this.pumps.data}get pumpPaths(){return this.pumpModels.map(e=>e.path)}addModel(e){this.pumps.addModel(e)}removeModel(e){this.pumps.removeModel(e)}getModel(e){return this.pumps.getModel(e)}get models(){return this.pumps}get data(){return this.pumps.data}updateModel(){}async load(){}};$e([i.kosChild],j.prototype,"pumps",2);j=$e([i.kosModel(N)],j);const q={registration:{[N]:{class:j,singleton:!0}},type:N,predicate:i.isKosModel(N),factory:i.Kos.Singleton.create(N)},Ue=async e=>{const t=[],{model:r}=await i.getKosModel(e);return r&&(t.push(r.boardPath),t.push(r.nozzlePath),t.push(r.holderPath)),t},Dt=async e=>{const t=[],r=e.data.pumpPath;t.push(r);const n=await Ue(r);return[...t,...n]},Lt=async e=>{const t=[],r=e.data.boardPath;t.push(e.data.boardPath);const n=await i.getKosModel(q.type);if(n!=null&&n.model){const a=n.model.models.getIndexByKey(ge.byBoard,r).map(p=>Ue(p.path));(await Promise.allSettled(a)).forEach(p=>{p.status==="fulfilled"&&p.value.forEach(c=>t.push(c))})}return Array.from(new Set(t))};var $t=Object.getOwnPropertyDescriptor,Ut=(e,t,r,n)=>{for(var s=n>1?void 0:n?$t(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=o(s)||s);return s};const D="board-model",Me=(e,t)=>{const{type:r,name:n,path:s,linked:a,instanceId:o,link:p,...c}=e;t.type=r,t.name=n,t.path=s,t.linked=a,t.link=Object.freeze(p),t.instanceId=o,Object.assign(t,c)};i.ExtensionManager[i.EXTENSION_TROUBLE_MAPPER].register("board",Lt);i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("board",At);let re=class{constructor(e,t,r){d(this,"id");d(this,"type");d(this,"name");d(this,"path");d(this,"linked");d(this,"instanceId");d(this,"logger");this.id=e,this.logger=r.logger,Me(t,this)}updateModel(e){Me(e,this)}async init(){this.logger.debug(`initializing board ${this.id}`)}async load(){this.logger.debug(`loading board ${this.id}`)}};re=Ut([i.kosModel(D)],re);const he={registration:{[D]:{class:re,singleton:!1}},type:D,predicate:i.isKosModel(D),factory:i.Kos.Factory.create(D)},ue={registration:{[T]:{class:exports.BoardContainerModel,singleton:!0},...he.registration},type:T,predicate:i.isKosModel(T),factory:i.Kos.Singleton.create(T)};var xt=Object.defineProperty,zt=Object.getOwnPropertyDescriptor,J=(e,t,r,n)=>{for(var s=n>1?void 0:n?zt(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&xt(t,r,s),s};const L=E.HolderContainer,Bt="/kos/insertion/insert/start",Kt="/kos/insertion/insert/complete",Gt="/kos/insertion/insert/update",kt="/kos/insertion/remove",Ft="/kos/pumpEvent/replaceLine",jt="/kos/handle/*";let O=class{constructor(e,t,r){d(this,"id");d(this,"holders");d(this,"logger");this.id=e,this.holders=new i.KosModelContainer({indexMap:{nozzle:n=>n.nozzlePaths,group:"group"},parentId:e,extensionId:h.HolderIndex}),this.logger=r.logger}updateModel(){}handleHolderEvents(e){var r,n,s;i.KosLog.ifDebug(()=>this.logger.debug("Received holder change event",JSON.stringify(e)));const t=this.holders.getModel(e.path);t&&(this.logger.info(`Received change event for holder ${t.path}. Updating fuel gauge data.`),t.slice.currentVolMl=(r=e.slice)==null?void 0:r.currentVolMl,t.slice.maxVolMl=(n=e.slice)==null?void 0:n.maxVolMl,(s=e==null?void 0:e.container)!=null&&s.enjoyByDate?t.enjoyByDate=new Date(e.container.enjoyByDate):t.enjoyByDate=void 0)}handleInsertion(e){i.KosLog.ifDebug(()=>this.logger.debug("Received insertion event",JSON.stringify(e))),(Array.isArray(e)?e:[e]).forEach(r=>{i.kosAction(()=>{var a,o,p;const n=r.ingredientId,s=this.holders.getModel(r.path);s&&(this.logger.info(`Received insertion event for holder ${s.path}`),s.updateIngredient(n),s.slice.currentVolMl=(a=r.slice)==null?void 0:a.currentVolMl,s.slice.maxVolMl=(o=r.slice)==null?void 0:o.maxVolMl,(p=r==null?void 0:r.container)!=null&&p.enjoyByDate?s.enjoyByDate=new Date(r.container.enjoyByDate):s.enjoyByDate=void 0,r.pumps.forEach(c=>{i.kosAction(()=>{const g=s.pumps.getModel(c.path);g&&(g.ingredientId=c.ingredientId,g.inserted=c.inserted,g.prevIngredientId=c.prevIngredientId)})}))})})}};J([i.kosChild],O.prototype,"holders",2);J([i.kosTopicHandler({topic:jt,websocket:!0,condition:(e,t)=>t.holders.getModel(e.path)!==void 0})],O.prototype,"handleHolderEvents",1);J([i.kosTopicHandler({topic:[Bt,Kt,Gt,kt,Ft],websocket:!0})],O.prototype,"handleInsertion",1);O=J([i.kosModel(L)],O);const ye={registration:{[L]:{class:O,singleton:!0}},type:L,predicate:i.isKosModel(L),factory:i.Kos.Singleton.create(L)},Ht=i.KosLog.createLogger({name:"board-utils"}),Vt=async e=>{const t=await i.KosExtensionUtils.executeDataMapperExtension({extension:h.BoardMapper,data:e,contextData:{}}),{type:r,name:n,path:s,linked:a,instanceId:o,...p}=e,c={...p,...t},g={type:r,name:n,path:s,linked:a,instanceId:o,...c},y=he.factory(e.path)(g);return y.updateModel(g),y},Yt=e=>async t=>{Ht.debug(`adding board ${t.name}`);const r=await Vt(t);e.addModel(r)};var l=(e=>(e.IDLE="IDLE",e.POURING="POURING",e.POUR_STARTING="POUR_STARTING",e.POUR_CANCELING="POUR_CANCELING",e))(l||{});const{URL:Pe}=i.resolveServiceUrl("PUMP_SERVICE"),{postModel:Xt,getOne:Zt}=i.ServiceFactory.build({basePath:`${Pe}/api/kos/holders`});i.KosLog.createLogger({name:"pump-service",group:"Services"});const xe=async({intent:e,pumpId:t,tracker:r})=>{const n=`${Pe}/api/ext/dispense/nozzle/nozzle/pipeline/ingredient/pour/${t}/${e}`,s=await Xt({model:{},urlOverride:n,tracker:r});return s!=null&&s.data&&i.FutureManager.initiateFuture(s.data),s},ze=async(e,t)=>{const r=`${Pe}/api/ext/dispense/nozzle/nozzle/pipeline/ingredient/intent/${e}/${t}/volume`,n=await Zt({urlOverride:r});return n!=null&&n.data?n.data:{volume:-1}};var qt=Object.defineProperty,Jt=Object.getOwnPropertyDescriptor,Be=(e,t,r,n)=>{for(var s=n>1?void 0:n?Jt(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&qt(t,r,s),s};const $=E.Pump;i.ExtensionManager[i.EXTENSION_TROUBLE_MAPPER].register("pump",Dt);let H=class{constructor(e,t){d(this,"id");d(this,"inserted");d(this,"type");d(this,"virtual");d(this,"ingredientId");d(this,"holderPath");d(this,"boardPath");d(this,"nozzlePath");d(this,"childPump");d(this,"name");d(this,"path");d(this,"prevIngredientId");d(this,"state");d(this,"futureHandler");d(this,"currentState",l.IDLE);this.id=e;const{inserted:r,holderPath:n,boardPath:s,nozzlePath:a,name:o,path:p,childPump:c,virtual:g,prevIngredientId:y,state:R,...u}=t;this.inserted=r,this.type=t.type,this.ingredientId=t.ingredientId,this.holderPath=n,this.boardPath=s,this.nozzlePath=a,this.name=o,this.path=p,this.childPump=!!c,this.virtual=!!g,this.prevIngredientId=y,this.state=R,Object.assign(this,u),this.futureHandler=new i.FutureHandler(this)}updateModel(e){const{inserted:t,holderPath:r,boardPath:n,nozzlePath:s,childPump:a,name:o,path:p,...c}=e;this.inserted=t,this.type=e.type,this.ingredientId=e.ingredientId,this.holderPath=r,this.boardPath=n,this.nozzlePath=s,this.childPump=this.childPump?this.childPump:!!a,this.name=o,this.path=p,this.prevIngredientId=e.prevIngredientId,Object.assign(this,c)}get pouringState(){var e;return((e=this.future)==null?void 0:e.endState)||""}get isPouring(){var e;return!!(this.future&&!((e=this.future)!=null&&e.endState))||this.currentState===l.POUR_STARTING||this.currentState===l.POURING}get canPour(){return!!this.ingredientId&&!this.isPouring}onFutureUpdate(e){e.endState&&i.kosAction(()=>{this.currentState=l.IDLE})}async cancelPour(){var e;this.currentState===l.POURING||this.currentState===l.POUR_STARTING?(this.currentState=l.POUR_CANCELING,await((e=this.future)==null?void 0:e.cancelFuture()),i.kosAction(()=>{this.currentState=l.IDLE})):i.KosLog.warn(`Cannot cancel pour in state ${this.currentState}`)}get future(){return this.futureHandler.future}async resolveIntentVolume(e){return await ze(this.path,e)}async performIntent(e,t){const r=typeof e=="string"?e:e.intent;if(!r)throw new Error("No intent provided");try{if(this.currentState===l.IDLE){if(this.currentState=l.POUR_STARTING,!t)throw new Error("No tracker provided");const n=await xe({tracker:t,intent:r,pumpId:this.path});return this.currentState===l.POUR_STARTING&&i.kosAction(()=>{this.currentState=l.POURING}),n==null?void 0:n.data}else throw new Error(`Cannot pour in state ${this.currentState}`)}catch(n){throw i.KosLog.error(n),this.currentState=l.IDLE,n}}};Be([i.kosFuture()],H.prototype,"performIntent",1);H=Be([i.kosModel($)],H);const Ie={registration:{[$]:{class:H,singleton:!1}},type:$,predicate:i.isKosModel($),factory:i.Kos.Factory.create($)},_e=i.KosLog.createLogger({name:"pump-utils"}),Wt=(e,t)=>{const r=(t.pumps??[]).length>1,n={boardPath:t.boardPath,holderPath:t.holderPath,ingredientId:t.ingredientId,childPump:!!t.childPump,virtual:r,inserted:t.inserted,name:t.name,path:t.path,type:t.type,nozzlePath:e,prevIngredientId:t.prevIngredientId,state:t.state},s=Ie.factory(t.path)(n);return s.updateModel(n),s},Ke=e=>t=>r=>n=>{var s;try{_e.debug(`adding pump ${n.name}`);const a=Wt(r.path,n);e.addModel(a);const o=a.holderPath,p=t.holders.getModel(o);p==null||p.pumps.addModel(a),p!=null&&p.nozzlePaths.includes(r.path)||p==null||p.nozzlePaths.push(r.path),(s=n==null?void 0:n.pumps)==null||s.forEach(c=>{const g=a.holderPath,y={...c,childPump:!0,holderPath:g,ingredientId:a.ingredientId};Ke(e)(t)(r)(y)})}catch(a){throw _e.error(`Error mapping assembly pump: ${a}`),a}};var Qt=Object.defineProperty,er=Object.getOwnPropertyDescriptor,K=(e,t,r,n)=>{for(var s=n>1?void 0:n?er(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&Qt(t,r,s),s};const U="assembly-model",Ge="assembly-data",ke="assembly-raw-data";let M=class{constructor(e,t,r){d(this,"id");d(this,"_nozzlePaths",new Set);d(this,"troubleContainer");d(this,"holderContainer");d(this,"boardContainer");d(this,"pumpContainer");d(this,"logger");this.id=e,this.holderContainer=ye.factory({}),this.boardContainer=ue.factory({}),this.pumpContainer=q.factory({}),this.logger=r.logger}updateModel(e){}get allHolders(){return this.holderContainer.holders.data}get holderGroups(){return this.holderContainer.holders.getIndexKeys("group")}get nozzlePaths(){return Array.from(this._nozzlePaths)}getHoldersByGroup(e){return this.holderContainer.holders.getIndexByKey("group",e)}getHoldersByNozzle(e){return this.holderContainer.holders.getIndexByKey("nozzle",e)}get pumpsByNozzle(){return this.pumpContainer.models.idx.byNozzle}get pumpPaths(){return this.pumpContainer.models.data.map(e=>e.path)}get boards(){return this.boardContainer.boardList}async init(){this.logger.debug(`initializing assembly ${this.id}`)}async ready(){var e;(e=this.troubleContainer)==null||e.troubles.increment(),i.ExtensionManager[i.EXTENSION_FEATURE_FLAG_RESOLVER].execute(h.AssemblyFeatureFlags,this)}async load(e){this.logger.debug(`loading assembly ${this.id}`);const t=await le();if((t==null?void 0:t.status)===200){const r=await i.KosExtensionUtils.executeDataMapperExtension({extension:h.AssemblyMapper,data:t.data,contextData:{}});e.set(Ge,r),Object.assign(this,r),Object.entries(r).forEach(([n,s])=>{i.isKosDataModel(s)&&(this.logger.debug(`adding child model ${n} from extension data`),this[i.ChildModels][n]=!0)}),e.set(ke,t.data);for await(const n of t.data.assemblies){const{boards:s=[],holders:a={},nozzles:o=[],core:p,name:c,path:g,...y}=n;this.logger.debug(`adding assembly ${c}`),this.logger.warn(`Assembly rest keys: ${Object.keys(y).join(", ")}`),Object.keys(y).forEach(u=>{var v;if(this.logger.warn(`Enabling feature flag: ${u}`),i.KosFeatureFlags.enableFeature(u),e.set(`assembly-feature-${u}`,y[u]),((v=y[u].state)==null?void 0:v.path)!==void 0){const b=y[u].state.path;this.logger.warn(`Feature flag ${u} state path: ${b}`),e.set(`assembly-state-path-${u}`,b)}});for await(const u of s)this.logger.debug(`adding board ${u.name}`),await Yt(this.boardContainer)(u);for await(const[u,v]of Object.entries(a??{}))for await(const b of v){this.logger.debug(`adding holder ${b.name}`);const fe=await _t(u,b);this.holderContainer.holders.addModel(fe)}const R=Ke(this.pumpContainer)(this.holderContainer);o.forEach(u=>{this._nozzlePaths.add(u.path);const v=R(u);u.pumps.forEach(v)})}}}};K([i.kosDependency({modelType:"trouble-container-model"})],M.prototype,"troubleContainer",2);K([i.kosChild],M.prototype,"holderContainer",2);K([i.kosChild],M.prototype,"boardContainer",2);K([i.kosChild],M.prototype,"pumpContainer",2);M=K([i.kosModel(U)],M);const me={registration:{[U]:{class:M,singleton:!0}},type:U,predicate:i.isKosModel(U),factory:i.Kos.Singleton.create(U)};var tr=Object.getOwnPropertyDescriptor,rr=(e,t,r,n)=>{for(var s=n>1?void 0:n?tr(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=o(s)||s);return s};const x=E.Availability;let ie=class{constructor(e,t,r){d(this,"id");d(this,"data");d(this,"properties");d(this,"available");d(this,"visible");d(this,"groupId");d(this,"rawId");d(this,"altId");d(this,"type");d(this,"note");d(this,"taggedIds");d(this,"parentId");d(this,"logger");this.id=e,this.taggedIds=t.taggedIds||[],this.logger=r.logger,this.available=t.available,this.visible=t.visible,this.groupId=t.groupId,this.rawId=t.rawId,this.altId=t.altId,this.type=t.type,this.parentId=t.kosParentId,this.data=t.data,this.note=t.note,this.properties=t.properties||{}}updateModel(e){this.taggedIds=e.taggedIds||[],this.available=e.available,this.visible=e.visible,this.groupId=e.groupId,this.rawId=e.rawId,this.altId=e.altId,this.type=e.type,this.data=e.data}updateAvailability(e){this.available=e}};ie=rr([i.kosParentAware(),i.kosModel(x)],ie);const V={registration:{[x]:{class:ie,singleton:!1}},type:x,predicate:i.isKosModel(x),factory:i.Kos.Factory.create(x)},{URL:C}=i.resolveServiceUrl("NOZZLE_SERVICE"),{postModel:ve,deleteModel:ir,getOne:nr}=i.ServiceFactory.build({basePath:`${C}/api/nozzle`}),Fe=async(e,t)=>{const r=await ve({model:{},urlOverride:`${C}/api/ext/dispense/nozzle/${e}/pipeline/beverage/pour`,ordered:!0,tracker:t});return r!=null&&r.data&&i.FutureManager.initiateFuture(r.data),r},je=async(e,t,r)=>{const n=await ve({model:{},urlOverride:`${C}/api/ext/dispense/nozzle/${t}/pipeline/beverage/fixed/${e}`,ordered:!0,tracker:r});return n!=null&&n.data&&i.FutureManager.initiateFuture(n.data),n},He=async e=>await nr({urlOverride:`${C}${e}/pipeline/beverage/availability`}),Ve=async(e,t)=>await ve({model:t,urlOverride:`${C}/api/ext/dispense/nozzle/${e}/pipeline/beverage/select`}),Ye=async e=>await ir({id:e,urlOverride:`${C}/api/ext/dispense/nozzle/${e}/pipeline/beverage/select`});var sr=Object.defineProperty,ar=Object.getOwnPropertyDescriptor,m=(e,t,r,n)=>{for(var s=n>1?void 0:n?ar(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&sr(t,r,s),s};const z=E.Nozzle,or=i.createPropKey("beverageTopicPrefix"),Q=e=>e.onPourStart!==void 0&&e.onPourCancel!==void 0&&e.onPourProgress!==void 0,Oe="/kos/nozzle/pour/started",dr="/kos/nozzle/pour/progress",lr="/kos/nozzle/pour/cancel";let P=class{constructor(e,t){d(this,"id");d(this,"path");d(this,"name");d(this,"_selectedBeverage");d(this,"_selectedBrand");d(this,"_additionalItems");d(this,"_availabilityItems");d(this,"futureHandler");d(this,"beverageTopicPrefix");d(this,"topicPrefix");d(this,"urlPrefix");this.id=e,this.path=t.path,this.name=t.name,this.beverageTopicPrefix=t.beverageTopicPrefix,this.topicPrefix=t.topicPrefix,this.urlPrefix=t.urlPrefix,this._selectedBeverage=void 0,this._selectedBrand=void 0,this._additionalItems=[],this.futureHandler=new i.MultipleFutureHandler(this),this._availabilityItems=new i.KosModelContainer({indexMap:{byGroup:"groupId",byParent:"parentId"},parentId:e})}get beverages(){return this._availabilityItems.getIndexByKey("byGroup","beverages")}get brands(){return this._availabilityItems.getIndexByKey("byGroup","brands")}get visibleBrands(){return this.brands.filter(e=>e.visible)}get visibleBeverages(){return this.beverages.filter(e=>e.visible)}get isPouring(){var e;return!!(this.futureHandler.getFuture()&&!((e=this.futureHandler.getFuture())!=null&&e.endState))||this.currentState===l.POUR_STARTING||this.currentState===l.POURING||this.currentState===l.POUR_CANCELING}get canPour(){return!!this._selectedBeverage&&this._selectedBeverage.available&&this.currentState===l.IDLE}get selectedPourable(){return{beverage:this._selectedBeverage,additional:this._additionalItems}}get future(){return this.futureHandler.getFuture()}get pourProgress(){var e;return((e=this.future)==null?void 0:e.progress)??0}updateModel(){}setSelectedBrand(e,t){t&&this.logger.debug("context is currenty being ignored when setting brand"),this._selectedBrand=e,this._selectedBeverage=void 0}get selectedBrand(){return this._selectedBrand}async setSelectedPourable({beverage:e,additional:t,context:r},n=!1){if(!e){const c=await Ye(this.name);if((c==null?void 0:c.status)!==200)throw new Error("Failed to clear pourable");this._selectedBeverage=void 0;return}if(!n&&e===this._selectedBeverage&&i.arraysEqual(this._additionalItems,t)){this.logger.info("No change in selected pourable");return}this._selectedBeverage=e,this._additionalItems=t;let s;try{s=await i.ExtensionManager.dataMapper.executeMapper(h.SelectedPourableMapper,{beverage:e,additional:t,context:r})}catch(c){this.logger.error(`Error executing SelectedPourableMapper, falling back to default payload. Error: ${c}`),s=void 0}const a={bevId:e.rawId};(!s||Object.keys(s).length===0)&&(this.logger.info(`No selected pourable mapper defined, using the default payload ${a}`),s=a);const o=s??a,p=await Ve(this.name,o);if((p==null?void 0:p.status)!==200)throw new Error("Failed to select pourable")}getGroupAvailabilityItems(e){return this._availabilityItems.getIndexByKey("byGroup",e)}getAvailabilityByParent(e){return this._availabilityItems.getIndexByKey("byParent",e)}handlePouringStart(){this.logger.info("Pour started"),i.getAllKosCompanionModels(this).forEach(e=>{var t;Q(e)&&((t=e.onPourStart)==null||t.call(e))})}handlePouringEnd(){this.logger.info("Pour ended")}handleCancelStart(){this.logger.info("Pour canceling")}handleCanceled(){this.logger.info("Pour canceled"),i.getAllKosCompanionModels(this).forEach(t=>{var r;Q(t)&&((r=t.onPourCancel)==null||r.call(t))});const e={nozzleId:this.id};i.EventBus.publish(lr,e)}onFutureUpdate(e){i.getAllKosCompanionModels(this).forEach(n=>{Q(n)&&n.onPourProgress(e)});const r={nozzleId:this.id,progress:e.progress,status:e.status,clientData:e.clientData,futureId:e.futureId,remainingTimeMs:e.remainingTimeMs,endState:e.endState,reason:e.reason,timeRemaining:e.timeRemaining};i.EventBus.publish(dr,r),e.endState&&i.kosAction(()=>{this.currentState===l.POURING&&this.transition("POUR_COMPLETED")})}async pour(e){var t;try{if(this.transition("START_POUR"),!e)throw new Error("No tracker provided");const r=await Fe(this.name,e);this.transition("POUR_ACTIVE");const n={nozzleId:this.id,type:"free"};return i.EventBus.publish(Oe,n),(t=r==null?void 0:r.data)!=null&&t.endState&&this.transition("POUR_COMPLETED"),r}catch(r){throw this.logger.error(r),this.currentState!==l.IDLE&&this.transition("POUR_COMPLETED"),r}}async fixedPour(e,t){var r;try{if(this.transition("START_POUR"),!t)throw new Error("No tracker provided");const n=await je(e,this.name,t);this.transition("POUR_ACTIVE");const s={nozzleId:this.id,type:"fixed"};return i.EventBus.publish(Oe,s),(r=n==null?void 0:n.data)!=null&&r.endState&&this.transition("POUR_COMPLETED"),n}catch(n){throw this.logger.error(n),this.currentState!==l.IDLE&&this.transition("POUR_COMPLETED"),n}}async cancelPour(){var e;this.transition("CANCEL_POUR"),await((e=this.futureHandler.getFuture())==null?void 0:e.cancelFuture()),this.transition("POUR_CANCELED")}updateGroupMembers(){this._availabilityItems.data.forEach(e=>{(e.taggedIds||[]).forEach(r=>{const n=this._availabilityItems.data.find(s=>s.rawId===r);n&&n.parentId!==e.id&&(n.parentId=e.id,this._availabilityItems.updateModel(n))})})}async load(e){var n,s;this.logger.debug(`loading nozzle ${this.id}`);const t=await He(this.urlPrefix);if((t==null?void 0:t.status)!==200)throw new Error("Failed to load nozzle availability");const r=await i.ExtensionManager.loader.executeLoader(h.AvailabilityLoader,{});e==null||e.set(h.AvailabilityLoader,r),e==null||e.set(W.type,this);for(const a of Object.keys((n=t.data)==null?void 0:n.groups)||[])for(const o of((s=t.data)==null?void 0:s.groups[a])||[]){const p=await i.ExtensionManager.dataMapper.executeMapper(h.AvailabilityMapper,{...o,groupId:a},r),c={...o,note:o.note??void 0,kosParentId:this.id,rawId:o.id,groupId:a,data:p,properties:o.properties||{}},g=V.factory(`${this.id}-${a}-${o.id}`)(c);this._availabilityItems.addModel(g)}this.updateGroupMembers()}async updateAvailability(e){const t=i.KosContextManager.getContext(this.id),r=(t==null?void 0:t.get(h.AvailabilityLoader))||{};if(e.rebuild)for(const n of Object.keys(e==null?void 0:e.groups)||[]){this._availabilityItems.getIndexByKey("group",n).filter(a=>!e.groups[n].find(o=>`${this.id}-${n}-${o.id}`===a.id)).forEach(a=>{this._availabilityItems.removeModel(a.id),i.destroyKosModel(a)});for(const a of(e==null?void 0:e.groups[n])||[]){const o=await i.ExtensionManager.dataMapper.executeMapper(h.AvailabilityMapper,{...a,groupId:n},r),p={...a,note:a.note??void 0,kosParentId:this.id,groupId:n,rawId:a.id,data:o,taggedIds:a.taggedIds,properties:a.properties||{}},c=this._availabilityItems.getModel(`${this.id}-${n}-${a.id}`);if(c)c.updateModel(p);else{const g=V.factory(`${this.id}-${n}-${a.id}`)(p);this._availabilityItems.addModel(g)}}}else for(const n of Object.keys(e==null?void 0:e.groups)||[])for(const s of(e==null?void 0:e.groups[n])||[]){const a=await i.ExtensionManager.dataMapper.executeMapper(h.AvailabilityMapper,{...s,groupId:n},r),o={...s,note:s.note??void 0,kosParentId:this.id,groupId:n,rawId:s.id,data:a,type:s.type,taggedIds:s.taggedIds,properties:s.properties||{}},p=this._availabilityItems.getModel(`${this.id}-${n}-${s.id}`);p&&p.updateModel(o)}this.updateGroupMembers()}};m([i.kosChild],P.prototype,"_availabilityItems",2);m([i.kosStateEntry(l.POURING)],P.prototype,"handlePouringStart",1);m([i.kosStateExit(l.POURING)],P.prototype,"handlePouringEnd",1);m([i.kosStateEntry(l.POUR_CANCELING)],P.prototype,"handleCancelStart",1);m([i.kosStateExit(l.POUR_CANCELING)],P.prototype,"handleCanceled",1);m([i.kosFuture(),i.kosStateGuard({allowedStates:[l.IDLE]})],P.prototype,"pour",1);m([i.kosFuture(),i.kosStateGuard({allowedStates:[l.IDLE]})],P.prototype,"fixedPour",1);m([i.kosStateGuard({allowedStates:[l.POUR_STARTING,l.POURING]})],P.prototype,"cancelPour",1);m([i.kosTopicHandler({topic:`${or}/availability`,websocket:!0})],P.prototype,"updateAvailability",1);P=m([i.kosModel(z),i.kosLoggerAware(),i.kosStateMachine({initial:l.IDLE,initializeAt:i.DependencyLifecycle.READY,states:{[l.IDLE]:{on:{START_POUR:l.POUR_STARTING}},[l.POUR_STARTING]:{on:{POUR_ACTIVE:l.POURING,CANCEL_POUR:l.POUR_CANCELING,POUR_COMPLETED:l.IDLE}},[l.POURING]:{on:{CANCEL_POUR:l.POUR_CANCELING,POUR_COMPLETED:l.IDLE}},[l.POUR_CANCELING]:{on:{POUR_CANCELED:l.IDLE}}}},{trackHistory:!1,throwOnInvalid:!1})],P);const W={registration:{[z]:{class:P,singleton:!1}},type:z,predicate:i.isKosModel(z),factory:i.Kos.Factory.create(z)};var cr=Object.defineProperty,pr=Object.getOwnPropertyDescriptor,Xe=(e,t,r,n)=>{for(var s=n>1?void 0:n?pr(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&cr(t,r,s),s};const Ze="device-assembly-model";let Y=class{constructor(e,t,r){d(this,"id");d(this,"deviceNozzles");d(this,"logger");this.id=e,this.logger=r.logger,this.deviceNozzles=new i.KosModelContainer}async init(){this.logger.debug(`initializing device-assembly ${this.id}`)}getNozzle(e){return this.deviceNozzles.getModel(e)}get nozzlePaths(){return this.deviceNozzles.data.map(e=>e.path)}async load(){this.logger.debug(`loading device-assembly ${this.id}`);const e=await le();(e==null?void 0:e.status)===200&&e.data.assemblies.map(r=>r.nozzles??[]).flat().forEach(r=>{var o;const n=r.path,s=((o=r.pipelines.find(p=>p.name==="beverage"))==null?void 0:o.topicPrefix)||"",a=W.factory(n)({path:r.path,name:r.name,urlPrefix:r.urlPrefix,topicPrefix:r.topicPrefix,beverageTopicPrefix:s});this.deviceNozzles.addModel(a)})}};Xe([i.kosChild],Y.prototype,"deviceNozzles",2);Y=Xe([i.kosModel(Ze)],Y);const qe=new i.SingletonKosModelRegistrationFactory({class:Y,type:Ze}),{URL:Je}=i.resolveServiceUrl("GENERIC_POUR_SERVICE"),{postModel:gr}=i.ServiceFactory.build({basePath:`${Je}/api/nozzle`}),We=async(e,t)=>{const r=await gr({model:{},urlOverride:`${Je}${e}`,ordered:!0,tracker:t});return r!=null&&r.data&&i.FutureManager.initiateFuture(r.data),r};var hr=Object.defineProperty,ur=Object.getOwnPropertyDescriptor,_=(e,t,r,n)=>{for(var s=n>1?void 0:n?ur(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&hr(t,r,s),s};const Qe="generic-pour-model",et="/kos/generic/pour/started",tt="/kos/generic/pour/progress",rt="/kos/generic/pour/cancel",ee=e=>e.onPourStart!==void 0&&e.onPourCancel!==void 0&&e.onPourProgress!==void 0;let f=class{constructor(e,t){d(this,"id");d(this,"servicePathFactory");d(this,"pourType");d(this,"selectedId");d(this,"state");this.id=e,this.futureHandler=new i.FutureHandler(this),this.servicePathFactory=t.servicePathFactory,this.pourType=t.pourType||"free",this.selectedId=t.selectedId,this.state=i.ObservableData(t.initialData||{})}get servicePath(){return this.selectedId?this.servicePathFactory(this.selectedId,this.state):""}updateContextData(e,t){this.state[e]=t}removeContextData(e){delete this.state[e]}clearContextData(){this.state=i.ObservableData()}updateModel(e){e.pourType&&(this.pourType=e.pourType),e.initialData&&this.state.setValues(e.initialData)}handlePouringStart(){this.logger.info("Pour started"),i.getAllKosCompanionModels(this).forEach(t=>{var r;ee(t)&&((r=t.onPourStart)==null||r.call(t))});const e={pourTarget:this.id,type:this.pourType};i.EventBus.publish(et,e)}handlePouringEnd(){this.logger.info("Pour ended")}handleCancelStart(){this.logger.info("Pour canceling")}handleCanceled(){this.logger.info("Pour canceled"),i.getAllKosCompanionModels(this).forEach(t=>{var r;ee(t)&&((r=t.onPourCancel)==null||r.call(t))});const e={pourTarget:this.id};i.EventBus.publish(rt,e)}async pour(e){var t;try{if(this.transition("START_POUR"),!e)throw new Error("No tracker provided");const r=await We(this.servicePath,e);return this.transition("POUR_ACTIVE"),(t=r==null?void 0:r.data)!=null&&t.endState&&this.transition("POUR_COMPLETED"),r}catch(r){throw this.logger.error(r),this.currentState!==l.IDLE&&this.transition("POUR_COMPLETED"),r}}async cancelPour(){var e;this.transition("CANCEL_POUR"),await((e=this.futureHandler.getFuture())==null?void 0:e.cancelFuture()),this.transition("POUR_CANCELED")}get isPouring(){var e;return!!(this.future&&!((e=this.future)!=null&&e.endState))||this.currentState===l.POUR_STARTING||this.currentState===l.POURING||this.currentState===l.POUR_CANCELING}get canPour(){return this.currentState===l.IDLE}get pourProgress(){return this.progress??0}onFutureUpdate(e){i.getAllKosCompanionModels(this).forEach(r=>{ee(r)&&r.onPourProgress(e)});const t={pourTarget:this.id,progress:e.progress,status:e.status,clientData:e.clientData,futureId:e.futureId,remainingTimeMs:e.remainingTimeMs,endState:e.endState,reason:e.reason,timeRemaining:e.timeRemaining};i.EventBus.publish(tt,t),e.endState&&i.kosAction(()=>{this.currentState===l.POURING&&this.transition("POUR_COMPLETED")})}};_([i.kosStateEntry(l.POURING)],f.prototype,"handlePouringStart",1);_([i.kosStateExit(l.POURING)],f.prototype,"handlePouringEnd",1);_([i.kosStateEntry(l.POUR_CANCELING)],f.prototype,"handleCancelStart",1);_([i.kosStateExit(l.POUR_CANCELING)],f.prototype,"handleCanceled",1);_([i.kosFuture(),i.kosStateGuard({allowedStates:[l.IDLE]})],f.prototype,"pour",1);_([i.kosStateGuard({allowedStates:[l.POUR_STARTING,l.POURING]})],f.prototype,"cancelPour",1);f=_([i.kosModel(Qe),i.kosLoggerAware(),i.kosFutureAware(),i.kosStateMachine({initial:l.IDLE,initializeAt:i.DependencyLifecycle.READY,states:{[l.IDLE]:{on:{START_POUR:l.POUR_STARTING}},[l.POUR_STARTING]:{on:{POUR_ACTIVE:l.POURING,CANCEL_POUR:l.POUR_CANCELING,POUR_COMPLETED:l.IDLE}},[l.POURING]:{on:{CANCEL_POUR:l.POUR_CANCELING,POUR_COMPLETED:l.IDLE}},[l.POUR_CANCELING]:{on:{POUR_CANCELED:l.IDLE}}}},{trackHistory:!1,throwOnInvalid:!1})],f);const yr=new i.KosModelRegistrationFactory({class:f,type:Qe}),ne={...ae.registration,...se.registration,...ye.registration,...de.registration,...W.registration,...Ie.registration,...q.registration,...V.registration,...me.registration,...ue.registration},it=e=>()=>(i.registerCoreModels(e)(),qe.register(),Object.keys(ne).forEach(t=>{const r=ne[t];i.registerLegacyModel(e)(t,r)}),i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("FirmwareUpdateInProgressTrouble",async t=>{var r;if((r=t.data)!=null&&r.deviceId){const{model:n}=i.getKosModelSync(me.type);if(n){const s=n.boards.find(a=>a.id===t.data.deviceId)?i.getKosModelSync(t.data.deviceId).model:void 0;return{devices:s?s.name:""}}}return{}}),{preload:i.RegistrationManager.model.preloadModel(e),model:i.RegistrationManager.model.register(e),companion:i.RegistrationManager.companion.register(e),legacy:i.RegistrationManager.model.registerLegacyModel(e)}),I={...i.KosModelRegistry};I.dispense={models:it(I)};I.preload=i.RegistrationManager.model.preloadModel(I);I.model=i.RegistrationManager.model.register(I);I.companion=i.RegistrationManager.companion.register(I);I.legacy=i.RegistrationManager.model.registerLegacyModel(I);const Pr=I;exports.Assembly=me;exports.Availability=V;exports.Board=he;exports.BoardContainer=ue;exports.CONTEXT_ASSEMBLY_DATA=Ge;exports.CONTEXT_ASSEMBLY_RAW_DATA=ke;exports.DeviceAssembly=qe;exports.DispenseModelType=E;exports.ExtensionType=h;exports.GenericPour=yr;exports.Holder=de;exports.HolderContainer=ye;exports.Ingredient=se;exports.IngredientContainer=ae;exports.KosModelRegistry=Pr;exports.Nozzle=W;exports.PourState=l;exports.Pump=Ie;exports.PumpContainer=q;exports.PumpIndex=ge;exports.TOPIC_BOARD_LINKED=ce;exports.TOPIC_BOARD_UNLINKED=pe;exports.TOPIC_GENERIC_POUR_CANCEL=rt;exports.TOPIC_GENERIC_POUR_PROGRESS=tt;exports.TOPIC_GENERIC_POUR_STARTED=et;exports.addAssignment=vt;exports.assignHolderIngredient=Ae;exports.clearPourable=Ye;exports.deleteAssignment=ft;exports.getAssembly=le;exports.getAssignments=mt;exports.getAvailability=He;exports.getHolders=yt;exports.getIngredients=Re;exports.getIntentVolume=ze;exports.kosModels=ne;exports.pourNamedPourable=je;exports.pourOnTarget=We;exports.pourPourable=Fe;exports.registerDispenseModels=it;exports.replaceLine=Ne;exports.selectPourable=Ve;exports.sendIntent=xe;exports.sendRfidOverride=Le;exports.unassignHolderIngredient=Te;
2
- //# sourceMappingURL=dispense-registration-manager-DK1ePXkY.cjs.map
1
+ "use strict";var nt=Object.defineProperty;var st=(e,t,r)=>t in e?nt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var d=(e,t,r)=>(st(e,typeof t!="symbol"?t+"":t,r),r);const i=require("@kosdev-code/kos-ui-sdk");require("react");var h=(e=>(e.IngredientLoader="kos.ingredient.loader",e.IngredientMapper="kos.ingredient.mapper",e.IngredientIndex="kos.ingredient.index",e.IngredientTypeMapper="kos.ingredient.type.mapper",e.HolderTypeMapper="kos.holder.type.mapper",e.HolderMapper="kos.holder.mapper",e.HolderIndex="kos.holder.index",e.HolderIngredientMapper="kos.holder.ingredient.mapper",e.AvailabilityMapper="kos.availability.mapper",e.AvailabilityLoader="kos.availability.loader",e.SelectedPourableMapper="kos.selected.pourable.mapper",e.AssemblyMapper="kos.assembly.mapper",e.BoardMapper="kos.board.mapper",e.BoardIndex="kos.board.index",e.PumpIndex="kos.pump.index",e.AssemblyFeatureFlags="kos.assembly.feature.flags",e))(h||{}),E=(e=>(e.Nozzle="nozzle-model",e.Availability="availability-model",e.Holder="holder-model",e.HolderContainer="holder-container-model",e.IngredientContainer="ingredient-container-model",e.Ingredient="ingredient-model",e.Pump="pump-model",e.PumpContainer="pump-container-model",e))(E||{}),at=Object.getOwnPropertyDescriptor,ot=(e,t,r,n)=>{for(var s=n>1?void 0:n?at(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=o(s)||s);return s};const w="ingredient-model";let te=class{constructor(e,{name:t,type:r,data:n,ingredientId:s,...a}){d(this,"id");d(this,"ingredientId");d(this,"name");d(this,"type");d(this,"data");this.id=e,this.ingredientId=s,this.name=t,this.type=r,this.data=n,Object.assign(this,a)}updateModel({name:e,type:t,data:r,ingredientId:n,...s}){this.name=e,this.type=t,this.ingredientId=n,this.data=r,Object.assign(this,s)}};te=ot([i.kosModel(w)],te);const se={registration:{[w]:{class:te,singleton:!1}},type:w,predicate:i.isKosModel(w),factory:i.Kos.Factory.create(w)},{URL:Ce}=i.resolveServiceUrl("INGREDIENT_SERVICE"),{getOne:dt}=i.ServiceFactory.build({basePath:`${Ce}/api/ext/dispense/ingredients`}),Re=async()=>await dt({urlOverride:`${Ce}/api/ext/dispense/ingredients`});var lt=Object.defineProperty,ct=Object.getOwnPropertyDescriptor,we=(e,t,r,n)=>{for(var s=n>1?void 0:n?ct(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&lt(t,r,s),s};const S="ingredient-container-model",pt=i.KosLog.createLogger({name:"ingredient-container-model"});let G=class{constructor(e,t){d(this,"id");d(this,"ingredients");this.id=e,this.ingredients=new i.KosModelContainer({indexMap:{ingredientType:"type"},extensionId:h.IngredientIndex,parentId:e})}updateModel(){}getIngredientsByType(e){return this.ingredients.getIndexByKey("ingredientType",e)}async load(e){var s;pt.debug(`loading ingredient container ${this.id}`);const t=await Re();if((t==null?void 0:t.status)!==200)throw new Error("Failed to load ingredients");const r=await i.KosExtensionUtils.executeLoaderExtension({context:e,extension:h.IngredientLoader}),n=(t==null?void 0:t.data)??{};for(const a of Object.keys(n))for(const o of((s=t==null?void 0:t.data)==null?void 0:s[a])||[]){const p=await i.KosExtensionUtils.executeDataMapperExtension({extension:h.IngredientMapper,data:o,contextData:r}),c=await i.KosExtensionUtils.executePropertyMapperExtension({extension:h.IngredientTypeMapper,data:o,contextData:r}),g={...o,type:c||o.type,...p,data:p},y=se.factory(o.id)(g);this.ingredients.addModel(y)}}};we([i.kosChild],G.prototype,"ingredients",2);G=we([i.kosModel(S)],G);const ae={registration:{[S]:{class:G,singleton:!0}},type:S,predicate:i.isKosModel(S),factory:i.Kos.Singleton.create(S)},{URL:X}=i.resolveServiceUrl("HOLDER_SERVICE"),{getAll:gt,postModel:Se,deleteModel:ht}=i.ServiceFactory.build({basePath:`${X}/api/kos/holders`}),ut=i.KosLog.createLogger({name:"holder-service",group:"Services"}),yt=async()=>await gt({}),Ae=async(e,t)=>{if(!e||!t)throw new Error("Missing holderPath or ingredientId");return await Se({model:{holderPath:e,ingredientId:t},urlOverride:`${X}/api/ext/dispense/assignments`})},Te=async e=>{if(!e)throw new Error("Missing holderPath");return await ht({id:e,urlOverride:`${X}/api/ext/dispense/assignments/${e}`})},Ne=async e=>{if(!e)throw new Error("Missing holderPath");return ut.debug(`sending POST request to /api/ext/dispense/pumpEvents/replaceLine/${e}`),await Se({model:{},urlOverride:`${X}/api/ext/dispense/pumpEvents/replaceLine/${e}`})},{URL:k}=i.resolveServiceUrl("ASSIGNMENT_SERVICE"),{getAll:Pt,postModel:De,deleteModel:It}=i.ServiceFactory.build({destinationAddress:"",basePath:`${k}/api/ext/dispense/assignments`}),F=window.kosUseFos,mt=async()=>await Pt({fos:F}),Le=async(e,t)=>{var s,a,o,p;const r=JSON.stringify(t),n=`${k}/api/ext/dispense/assignments`;try{const c=await De({model:{holderPath:e,factoryJson:r},urlOverride:n});return(c==null?void 0:c.status)===200&&((s=c==null?void 0:c.data)!=null&&s.error)?[c.data.error||"unknownError",c.data]:[void 0,c==null?void 0:c.data]}catch(c){if(c instanceof i.FetchError)return[((o=(a=c.payload)==null?void 0:a.data)==null?void 0:o.error)||"unknownError",(p=c.payload)==null?void 0:p.data]}return["unknownError",void 0]},vt=async e=>{const t=F?`${k}/api/ingredients/assignments/${e.holderPath}`:`${k}/api/ext/dispense/assignments`;return await De({model:{...e,fuelGauge:680},fos:F,urlOverride:t})},ft=async e=>await It({id:e,fos:F});var Et=Object.defineProperty,bt=Object.getOwnPropertyDescriptor,oe=(e,t,r,n)=>{for(var s=n>1?void 0:n?bt(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&Et(t,r,s),s};const A=E.Holder,be=i.KosLog.createLogger({name:"holder-model"});i.ExtensionManager[i.EXTENSION_TROUBLE_MAPPER].register("holder",async e=>{const t=[];return t.push(...e.data.holderPaths),t});i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("pump",async e=>{if(e.data.pumpPath){const{model:t}=i.getKosModelSync(e.data.pumpPath);if(t){const r=t.ingredientId?i.getKosModelSync(t.ingredientId).model:void 0;return{ingredientId:t.ingredientId,ingredientName:(r==null?void 0:r.displayName)??((r==null?void 0:r.name)||""),childPumpName:t.name}}}return{}});i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("holder",async e=>e.data.holderNames.length>0?{holderName:e.data.holderNames[0]||""}:{});i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("container",async e=>{if(e.data.ingredients.length>0){const t=e.data.ingredients[0],{model:r}=i.getKosModelSync(t);return{ingredientName:(r==null?void 0:r.displayName)??((r==null?void 0:r.name)||""),ingredients:e.data.ingredients?e.data.ingredients:[],unknonwnIngredientId:e.data.unknonwnIngredientId??""}}return{}});class Mt extends Error{constructor(r,n){super(n);d(this,"type");this.name="AssignmentError",this.type=r}}let B=class{constructor(e,{path:t,name:r,ingredientSource:n,ingredientId:s,ingredientType:a,slice:o,group:p,data:c,enjoyByDate:g},y){d(this,"id");d(this,"path");d(this,"name");d(this,"ingredientId");d(this,"ingredientType");d(this,"ingredientSource");d(this,"group");d(this,"slice");d(this,"logger");d(this,"data");d(this,"enjoyByDate");d(this,"pumps");d(this,"ingredientContainer");this.id=e,this.path=t,this.name=r,this.ingredientType=a,this.ingredientSource=n,this.ingredientId=s,this.group=p,this.slice=o,this.enjoyByDate=g,this.data=c,this.pumps=new i.KosModelContainer({parentId:e,sortKey:"path"}),this.logger=y.logger}updateModel({path:e,name:t,ingredientSource:r,ingredientId:n,ingredientType:s,group:a,slice:o,enjoyByDate:p,data:c}){this.path=e,this.name=t,this.ingredientId=n,this.ingredientType=s,this.ingredientSource=r,this.enjoyByDate=p,this.slice=o,this.group=a,this.data=c}get hasEnjoyByDate(){return!!this.enjoyByDate&&!this.unassigned}get hasEnjoyByWarning(){var e;return((e=this.troublesByType.EnjoyByTrouble)==null?void 0:e.length)>0}get nozzlePaths(){return this.pumps.data.map(e=>e.nozzlePath)}async cancelPour(){await Promise.all(this.pumps.data.filter(e=>e.isPouring).map(e=>e.cancelPour()))}get canPour(){return!this.shouldDefer&&this.pumps.data.every(e=>e.canPour)}get isPouring(){const e=this.pumps.data.some(t=>t.isPouring);return this.logger.debug(`isPouring: ${!!e}`),e}async performIntent(e){const t=typeof e=="string"?e:e.intent,r=typeof e=="string"?void 0:e.pumpPath,n=r?this.pumps.getModel(r):this.pumps.data[0];return n==null?void 0:n.performIntent({intent:t})}get pourState(){return this.pumps.data.reduce((t,r)=>r.pouringState?r.pouringState:t,"")}get nozzlePath(){var e;return(e=this.pumps.data[0])==null?void 0:e.nozzlePath}get pumpPaths(){return this.pumps.data.map(e=>e.id)}get sortedPumps(){return this.pumps.data.sort((e,t)=>e.virtual&&!t.virtual?-1:!e.virtual&&t.virtual?1:e.name.localeCompare(t.name))}get ingredient(){var t;return this.ingredientId?(t=this.ingredientContainer)==null?void 0:t.ingredients.getModel(this.ingredientId):void 0}get ingredientName(){return this.ingredient?this.ingredient.displayName??this.ingredient.name:this.ingredientId?"unknown":""}get previousIngredient(){var t;return this.prevIngredientId?(t=this.ingredientContainer)==null?void 0:t.ingredients.getModel(this.prevIngredientId):void 0}get previousIngredientName(){return this.previousIngredient?this.previousIngredient.displayName??this.previousIngredient.name:this.prevIngredientId?"unknown":""}get prevIngredientId(){var e,t;return(t=(e=this.pumps.data)==null?void 0:e[0])==null?void 0:t.prevIngredientId}get unassigned(){return(!this.ingredientId||this.ingredientId==="0")&&(!this.prevIngredientId||this.prevIngredientId==="0")}get removed(){return(!this.ingredientId||this.ingredientId==="0")&&this.prevIngredientId!==void 0&&this.prevIngredientId!=="0"}get maxVolume(){return this.slice.maxVolMl??0}get remainingVolume(){return this.slice.currentVolMl??0}get hasMaxVolume(){return this.slice.maxVolMl!==void 0}get hasRemainingVolume(){return this.slice.currentVolMl!==void 0}get fillPercent(){return this.remainingVolume<=0?0:Math.floor((this.remainingVolume||1)/(this.maxVolume||1)*100)}get hasFuelGuage(){return this.hasMaxVolume&&this.hasRemainingVolume}updateIngredient(e){this.ingredientId!==e&&i.kosAction(()=>{this.ingredientId=e})}async resolveIntentVolume(e){const t=this.pumps.data[0];return t?t.resolveIntentVolume(e):{volume:-1}}async overrideRfidCode(e){if(!e)throw new Error("Invalid override");try{const[t,r]=await Le(this.path,e);if(t)throw new Mt(t,`Failed to perform rfid override on holder ${this.id}`);return i.kosAction(()=>{this.ingredientId=r==null?void 0:r.ingredientId}),r}catch(t){throw be.error(`Failed to perform rfid override on holder ${this.id}`,t),t}}async assignIngredient(e){try{e?await Ae(this.path,e):await Te(this.path),i.kosAction(()=>{this.ingredientId=e})}catch(t){throw be.error(`Failed to perform assign ingredient to holder ${this.id}`,t),t}}get shouldDefer(){return this.troubles.some(e=>e.shouldDefer)}async replaceLine(){await Ne(this.path)}};oe([i.kosChild],B.prototype,"pumps",2);oe([i.kosDependency({modelType:ae.type})],B.prototype,"ingredientContainer",2);B=oe([i.kosModel(A),i.kosTroubleAware()],B);const de={registration:{[A]:{class:B,singleton:!1}},type:A,predicate:i.isKosModel(A),factory:i.Kos.Factory.create(A)},_t=async(e,t)=>{var Ee;const r=i.ExtensionManager.propertyMapper.executeMapper(h.HolderIngredientMapper,t),n=i.ExtensionManager.propertyMapper.executeMapper(h.HolderTypeMapper,t)||t.ingType,s=await i.KosExtensionUtils.executeDataMapperExtension({extension:h.HolderMapper,data:t,contextData:{}}),{name:a,path:o,ingredientId:p,ingType:c,ingSource:g,slice:y,...R}=t,u={...R,...s},v=y||{pos:0},b={name:a,path:o,ingredientId:r||p,ingredientType:n||c,ingredientSource:g,enjoyByDate:(Ee=t.container)!=null&&Ee.enjoyByDate?new Date(t.container.enjoyByDate):void 0,slice:v,group:e,data:u};return de.factory(t.path)(b)},{URL:Ot}=i.resolveServiceUrl("ASSEMBLY_SERVICE"),{getOne:Ct}=i.ServiceFactory.build({basePath:`${Ot}/api/kos/device/assemblies`}),Rt=i.KosLog.createLogger({name:"assembly-service",group:"Services"}),le=async()=>(Rt.debug("sending GET for assembly"),await Ct({}));var wt=Object.defineProperty,St=Object.getOwnPropertyDescriptor,Z=(e,t,r,n)=>{for(var s=n>1?void 0:n?St(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&wt(t,r,s),s};const T="board-container-model",ce="/kos/hardware/board/linked",pe="/kos/hardware/board/unlinked";exports.BoardContainerModel=class{constructor(t,r,n){d(this,"id");d(this,"logger");d(this,"models");this.id=t,this.logger=n.logger,this.models=new i.KosModelContainer({parentId:t,extensionId:h.BoardIndex})}get boardList(){return this.models.data}updateModel(){}addModel(t){this.models.addModel(t)}removeModel(t){this.models.removeModel(t)}updateBoard(t){const r=t.path,n=this.models.getModel(r);if(!n){this.logger.warn(`board ${r} not found`);return}n.updateModel(t)}handleBoardLinkEvent(t){this.logger.debug(`handling ${ce} event ${t}`),t?this.updateBoard(t):this.logger.debug("- boardLinkEvent is undefined")}handleBoardUnlinkEvent(t){this.logger.debug(`handling ${pe} event ${t}`),t?this.updateBoard(t):this.logger.debug("- boardLinkEvent is undefined")}};Z([i.kosChild],exports.BoardContainerModel.prototype,"models",2);Z([i.kosTopicHandler({lifecycle:i.DependencyLifecycle.INIT,topic:ce,websocket:!0})],exports.BoardContainerModel.prototype,"handleBoardLinkEvent",1);Z([i.kosTopicHandler({lifecycle:i.DependencyLifecycle.INIT,topic:pe,websocket:!0})],exports.BoardContainerModel.prototype,"handleBoardUnlinkEvent",1);exports.BoardContainerModel=Z([i.kosModel(T)],exports.BoardContainerModel);const At=async e=>{const t=e.data.boardPath,{model:r}=i.getKosModelSync(t);return{boardName:(r==null?void 0:r.name)||""}};var Tt=Object.defineProperty,Nt=Object.getOwnPropertyDescriptor,$e=(e,t,r,n)=>{for(var s=n>1?void 0:n?Nt(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&Tt(t,r,s),s};const N=E.PumpContainer;var ge=(e=>(e.byBoard="byBoard",e.byType="byType",e.byNozzle="byNozzle",e))(ge||{});let j=class{constructor(e,t){d(this,"id");d(this,"pumps");this.id=e,this.pumps=new i.KosModelContainer({indexMap:{byNozzle:r=>r.nozzlePaths,byBoard:r=>r.boardPath,byType:"type"},parentId:e,extensionId:h.PumpIndex})}get pumpModels(){return this.pumps.data}get pumpPaths(){return this.pumpModels.map(e=>e.path)}addModel(e){this.pumps.addModel(e)}removeModel(e){this.pumps.removeModel(e)}getModel(e){return this.pumps.getModel(e)}get models(){return this.pumps}get data(){return this.pumps.data}updateModel(){}async load(){}};$e([i.kosChild],j.prototype,"pumps",2);j=$e([i.kosModel(N)],j);const q={registration:{[N]:{class:j,singleton:!0}},type:N,predicate:i.isKosModel(N),factory:i.Kos.Singleton.create(N)},Ue=async e=>{const t=[],{model:r}=await i.getKosModel(e);return r&&(t.push(r.boardPath),t.push(r.nozzlePath),t.push(r.holderPath)),t},Dt=async e=>{const t=[],r=e.data.pumpPath;t.push(r);const n=await Ue(r);return[...t,...n]},Lt=async e=>{const t=[],r=e.data.boardPath;t.push(e.data.boardPath);const n=await i.getKosModel(q.type);if(n!=null&&n.model){const a=n.model.models.getIndexByKey(ge.byBoard,r).map(p=>Ue(p.path));(await Promise.allSettled(a)).forEach(p=>{p.status==="fulfilled"&&p.value.forEach(c=>t.push(c))})}return Array.from(new Set(t))};var $t=Object.getOwnPropertyDescriptor,Ut=(e,t,r,n)=>{for(var s=n>1?void 0:n?$t(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=o(s)||s);return s};const D="board-model",Me=(e,t)=>{const{type:r,name:n,path:s,linked:a,instanceId:o,link:p,...c}=e;t.type=r,t.name=n,t.path=s,t.linked=a,t.link=Object.freeze(p),t.instanceId=o,Object.assign(t,c)};i.ExtensionManager[i.EXTENSION_TROUBLE_MAPPER].register("board",Lt);i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("board",At);let re=class{constructor(e,t,r){d(this,"id");d(this,"type");d(this,"name");d(this,"path");d(this,"linked");d(this,"instanceId");d(this,"logger");this.id=e,this.logger=r.logger,Me(t,this)}updateModel(e){Me(e,this)}async init(){this.logger.debug(`initializing board ${this.id}`)}async load(){this.logger.debug(`loading board ${this.id}`)}};re=Ut([i.kosModel(D)],re);const he={registration:{[D]:{class:re,singleton:!1}},type:D,predicate:i.isKosModel(D),factory:i.Kos.Factory.create(D)},ue={registration:{[T]:{class:exports.BoardContainerModel,singleton:!0},...he.registration},type:T,predicate:i.isKosModel(T),factory:i.Kos.Singleton.create(T)};var xt=Object.defineProperty,zt=Object.getOwnPropertyDescriptor,J=(e,t,r,n)=>{for(var s=n>1?void 0:n?zt(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&xt(t,r,s),s};const L=E.HolderContainer,Bt="/kos/insertion/insert/start",Kt="/kos/insertion/insert/complete",Gt="/kos/insertion/insert/update",kt="/kos/insertion/remove",Ft="/kos/pumpEvent/replaceLine",jt="/kos/handle/*";let O=class{constructor(e,t,r){d(this,"id");d(this,"holders");d(this,"logger");this.id=e,this.holders=new i.KosModelContainer({indexMap:{nozzle:n=>n.nozzlePaths,group:"group"},parentId:e,extensionId:h.HolderIndex}),this.logger=r.logger}updateModel(){}handleHolderEvents(e){var r,n,s;i.KosLog.ifDebug(()=>this.logger.debug("Received holder change event",JSON.stringify(e)));const t=this.holders.getModel(e.path);t&&(this.logger.info(`Received change event for holder ${t.path}. Updating fuel gauge data.`),t.slice.currentVolMl=(r=e.slice)==null?void 0:r.currentVolMl,t.slice.maxVolMl=(n=e.slice)==null?void 0:n.maxVolMl,(s=e==null?void 0:e.container)!=null&&s.enjoyByDate?t.enjoyByDate=new Date(e.container.enjoyByDate):t.enjoyByDate=void 0)}handleInsertion(e){i.KosLog.ifDebug(()=>this.logger.debug("Received insertion event",JSON.stringify(e))),(Array.isArray(e)?e:[e]).forEach(r=>{i.kosAction(()=>{var a,o,p;const n=r.ingredientId,s=this.holders.getModel(r.path);s&&(this.logger.info(`Received insertion event for holder ${s.path}`),s.updateIngredient(n),s.slice.currentVolMl=(a=r.slice)==null?void 0:a.currentVolMl,s.slice.maxVolMl=(o=r.slice)==null?void 0:o.maxVolMl,(p=r==null?void 0:r.container)!=null&&p.enjoyByDate?s.enjoyByDate=new Date(r.container.enjoyByDate):s.enjoyByDate=void 0,r.pumps.forEach(c=>{i.kosAction(()=>{const g=s.pumps.getModel(c.path);g&&(g.ingredientId=c.ingredientId,g.inserted=c.inserted,g.prevIngredientId=c.prevIngredientId)})}))})})}};J([i.kosChild],O.prototype,"holders",2);J([i.kosTopicHandler({topic:jt,websocket:!0,condition:(e,t)=>t.holders.getModel(e.path)!==void 0})],O.prototype,"handleHolderEvents",1);J([i.kosTopicHandler({topic:[Bt,Kt,Gt,kt,Ft],websocket:!0})],O.prototype,"handleInsertion",1);O=J([i.kosModel(L)],O);const ye={registration:{[L]:{class:O,singleton:!0}},type:L,predicate:i.isKosModel(L),factory:i.Kos.Singleton.create(L)},Ht=i.KosLog.createLogger({name:"board-utils"}),Vt=async e=>{const t=await i.KosExtensionUtils.executeDataMapperExtension({extension:h.BoardMapper,data:e,contextData:{}}),{type:r,name:n,path:s,linked:a,instanceId:o,...p}=e,c={...p,...t},g={type:r,name:n,path:s,linked:a,instanceId:o,...c},y=he.factory(e.path)(g);return y.updateModel(g),y},Yt=e=>async t=>{Ht.debug(`adding board ${t.name}`);const r=await Vt(t);e.addModel(r)};var l=(e=>(e.IDLE="IDLE",e.POURING="POURING",e.POUR_STARTING="POUR_STARTING",e.POUR_CANCELING="POUR_CANCELING",e))(l||{});const{URL:Pe}=i.resolveServiceUrl("PUMP_SERVICE"),{postModel:Xt,getOne:Zt}=i.ServiceFactory.build({basePath:`${Pe}/api/kos/holders`});i.KosLog.createLogger({name:"pump-service",group:"Services"});const xe=async({intent:e,pumpId:t,tracker:r})=>{const n=`${Pe}/api/ext/dispense/nozzle/nozzle/pipeline/ingredient/pour/${t}/${e}`,s=await Xt({model:{},urlOverride:n,tracker:r});return s!=null&&s.data&&i.FutureManager.initiateFuture(s.data),s},ze=async(e,t)=>{const r=`${Pe}/api/ext/dispense/nozzle/nozzle/pipeline/ingredient/intent/${e}/${t}/volume`,n=await Zt({urlOverride:r});return n!=null&&n.data?n.data:{volume:-1}};var qt=Object.defineProperty,Jt=Object.getOwnPropertyDescriptor,Be=(e,t,r,n)=>{for(var s=n>1?void 0:n?Jt(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&qt(t,r,s),s};const $=E.Pump;i.ExtensionManager[i.EXTENSION_TROUBLE_MAPPER].register("pump",Dt);let H=class{constructor(e,t){d(this,"id");d(this,"inserted");d(this,"type");d(this,"virtual");d(this,"ingredientId");d(this,"holderPath");d(this,"boardPath");d(this,"nozzlePath");d(this,"childPump");d(this,"name");d(this,"path");d(this,"prevIngredientId");d(this,"state");d(this,"futureHandler");d(this,"currentState",l.IDLE);this.id=e;const{inserted:r,holderPath:n,boardPath:s,nozzlePath:a,name:o,path:p,childPump:c,virtual:g,prevIngredientId:y,state:R,...u}=t;this.inserted=r,this.type=t.type,this.ingredientId=t.ingredientId,this.holderPath=n,this.boardPath=s,this.nozzlePath=a,this.name=o,this.path=p,this.childPump=!!c,this.virtual=!!g,this.prevIngredientId=y,this.state=R,Object.assign(this,u),this.futureHandler=new i.FutureHandler(this)}updateModel(e){const{inserted:t,holderPath:r,boardPath:n,nozzlePath:s,childPump:a,name:o,path:p,...c}=e;this.inserted=t,this.type=e.type,this.ingredientId=e.ingredientId,this.holderPath=r,this.boardPath=n,this.nozzlePath=s,this.childPump=this.childPump?this.childPump:!!a,this.name=o,this.path=p,this.prevIngredientId=e.prevIngredientId,Object.assign(this,c)}get pouringState(){var e;return((e=this.future)==null?void 0:e.endState)||""}get isPouring(){var e;return!!(this.future&&!((e=this.future)!=null&&e.endState))||this.currentState===l.POUR_STARTING||this.currentState===l.POURING}get canPour(){return!!this.ingredientId&&!this.isPouring}onFutureUpdate(e){e.endState&&i.kosAction(()=>{this.currentState=l.IDLE})}async cancelPour(){var e;this.currentState===l.POURING||this.currentState===l.POUR_STARTING?(this.currentState=l.POUR_CANCELING,await((e=this.future)==null?void 0:e.cancelFuture()),i.kosAction(()=>{this.currentState=l.IDLE})):i.KosLog.warn(`Cannot cancel pour in state ${this.currentState}`)}get future(){return this.futureHandler.future}async resolveIntentVolume(e){return await ze(this.path,e)}async performIntent(e,t){const r=typeof e=="string"?e:e.intent;if(!r)throw new Error("No intent provided");try{if(this.currentState===l.IDLE){if(this.currentState=l.POUR_STARTING,!t)throw new Error("No tracker provided");const n=await xe({tracker:t,intent:r,pumpId:this.path});return this.currentState===l.POUR_STARTING&&i.kosAction(()=>{this.currentState=l.POURING}),n==null?void 0:n.data}else throw new Error(`Cannot pour in state ${this.currentState}`)}catch(n){throw i.KosLog.error(n),this.currentState=l.IDLE,n}}};Be([i.kosFuture()],H.prototype,"performIntent",1);H=Be([i.kosModel($)],H);const Ie={registration:{[$]:{class:H,singleton:!1}},type:$,predicate:i.isKosModel($),factory:i.Kos.Factory.create($)},_e=i.KosLog.createLogger({name:"pump-utils"}),Wt=(e,t)=>{const r=(t.pumps??[]).length>1,n={boardPath:t.boardPath,holderPath:t.holderPath,ingredientId:t.ingredientId,childPump:!!t.childPump,virtual:r,inserted:t.inserted,name:t.name,path:t.path,type:t.type,nozzlePath:e,prevIngredientId:t.prevIngredientId,state:t.state},s=Ie.factory(t.path)(n);return s.updateModel(n),s},Ke=e=>t=>r=>n=>{var s;try{_e.debug(`adding pump ${n.name}`);const a=Wt(r.path,n);e.addModel(a);const o=a.holderPath,p=t.holders.getModel(o);p==null||p.pumps.addModel(a),p!=null&&p.nozzlePaths.includes(r.path)||p==null||p.nozzlePaths.push(r.path),(s=n==null?void 0:n.pumps)==null||s.forEach(c=>{const g=a.holderPath,y={...c,childPump:!0,holderPath:g,ingredientId:a.ingredientId};Ke(e)(t)(r)(y)})}catch(a){throw _e.error(`Error mapping assembly pump: ${a}`),a}};var Qt=Object.defineProperty,er=Object.getOwnPropertyDescriptor,K=(e,t,r,n)=>{for(var s=n>1?void 0:n?er(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&Qt(t,r,s),s};const U="assembly-model",Ge="assembly-data",ke="assembly-raw-data";let M=class{constructor(e,t,r){d(this,"id");d(this,"_nozzlePaths",new Set);d(this,"troubleContainer");d(this,"holderContainer");d(this,"boardContainer");d(this,"pumpContainer");d(this,"logger");this.id=e,this.holderContainer=ye.factory({}),this.boardContainer=ue.factory({}),this.pumpContainer=q.factory({}),this.logger=r.logger}updateModel(e){}get allHolders(){return this.holderContainer.holders.data}get holderGroups(){return this.holderContainer.holders.getIndexKeys("group")}get nozzlePaths(){return Array.from(this._nozzlePaths)}getHoldersByGroup(e){return this.holderContainer.holders.getIndexByKey("group",e)}getHoldersByNozzle(e){return this.holderContainer.holders.getIndexByKey("nozzle",e)}get pumpsByNozzle(){return this.pumpContainer.models.idx.byNozzle}get pumpPaths(){return this.pumpContainer.models.data.map(e=>e.path)}get boards(){return this.boardContainer.boardList}async init(){this.logger.debug(`initializing assembly ${this.id}`)}async ready(){var e;(e=this.troubleContainer)==null||e.troubles.increment(),i.ExtensionManager[i.EXTENSION_FEATURE_FLAG_RESOLVER].execute(h.AssemblyFeatureFlags,this)}async load(e){this.logger.debug(`loading assembly ${this.id}`);const t=await le();if((t==null?void 0:t.status)===200){const r=await i.KosExtensionUtils.executeDataMapperExtension({extension:h.AssemblyMapper,data:t.data,contextData:{}});e.set(Ge,r),Object.assign(this,r),Object.entries(r).forEach(([n,s])=>{i.isKosDataModel(s)&&(this.logger.debug(`adding child model ${n} from extension data`),this[i.ChildModels][n]=!0)}),e.set(ke,t.data);for await(const n of t.data.assemblies){const{boards:s=[],holders:a={},nozzles:o=[],core:p,name:c,path:g,...y}=n;this.logger.debug(`adding assembly ${c}`),this.logger.warn(`Assembly rest keys: ${Object.keys(y).join(", ")}`),Object.keys(y).forEach(u=>{var v;if(this.logger.warn(`Enabling feature flag: ${u}`),i.KosFeatureFlags.enableFeature(u),e.set(`assembly-feature-${u}`,y[u]),((v=y[u].state)==null?void 0:v.path)!==void 0){const b=y[u].state.path;this.logger.warn(`Feature flag ${u} state path: ${b}`),e.set(`assembly-state-path-${u}`,b)}});for await(const u of s)this.logger.debug(`adding board ${u.name}`),await Yt(this.boardContainer)(u);for await(const[u,v]of Object.entries(a??{}))for await(const b of v){this.logger.debug(`adding holder ${b.name}`);const fe=await _t(u,b);this.holderContainer.holders.addModel(fe)}const R=Ke(this.pumpContainer)(this.holderContainer);o.forEach(u=>{this._nozzlePaths.add(u.path);const v=R(u);u.pumps.forEach(v)})}}}};K([i.kosDependency({modelType:"trouble-container-model"})],M.prototype,"troubleContainer",2);K([i.kosChild],M.prototype,"holderContainer",2);K([i.kosChild],M.prototype,"boardContainer",2);K([i.kosChild],M.prototype,"pumpContainer",2);M=K([i.kosModel(U)],M);const me={registration:{[U]:{class:M,singleton:!0}},type:U,predicate:i.isKosModel(U),factory:i.Kos.Singleton.create(U)};var tr=Object.getOwnPropertyDescriptor,rr=(e,t,r,n)=>{for(var s=n>1?void 0:n?tr(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=o(s)||s);return s};const x=E.Availability;let ie=class{constructor(e,t,r){d(this,"id");d(this,"data");d(this,"properties");d(this,"available");d(this,"visible");d(this,"groupId");d(this,"rawId");d(this,"altId");d(this,"type");d(this,"note");d(this,"taggedIds");d(this,"parentId");d(this,"logger");this.id=e,this.taggedIds=t.taggedIds||[],this.logger=r.logger,this.available=t.available,this.visible=t.visible,this.groupId=t.groupId,this.rawId=t.rawId,this.altId=t.altId,this.type=t.type,this.parentId=t.kosParentId,this.data=t.data,this.note=t.note,this.properties=t.properties||{}}updateModel(e){this.taggedIds=e.taggedIds||[],this.available=e.available,this.visible=e.visible,this.groupId=e.groupId,this.rawId=e.rawId,this.altId=e.altId,this.type=e.type,this.data=e.data}updateAvailability(e){this.available=e}};ie=rr([i.kosParentAware(),i.kosModel(x)],ie);const V={registration:{[x]:{class:ie,singleton:!1}},type:x,predicate:i.isKosModel(x),factory:i.Kos.Factory.create(x)},{URL:C}=i.resolveServiceUrl("NOZZLE_SERVICE"),{postModel:ve,deleteModel:ir,getOne:nr}=i.ServiceFactory.build({basePath:`${C}/api/nozzle`}),Fe=async(e,t)=>{const r=await ve({model:{},urlOverride:`${C}/api/ext/dispense/nozzle/${e}/pipeline/beverage/pour`,ordered:!0,tracker:t});return r!=null&&r.data&&i.FutureManager.initiateFuture(r.data),r},je=async(e,t,r)=>{const n=await ve({model:{},urlOverride:`${C}/api/ext/dispense/nozzle/${t}/pipeline/beverage/fixed/${e}`,ordered:!0,tracker:r});return n!=null&&n.data&&i.FutureManager.initiateFuture(n.data),n},He=async e=>await nr({urlOverride:`${C}${e}/pipeline/beverage/availability`}),Ve=async(e,t)=>await ve({model:t,urlOverride:`${C}/api/ext/dispense/nozzle/${e}/pipeline/beverage/select`}),Ye=async e=>await ir({id:e,urlOverride:`${C}/api/ext/dispense/nozzle/${e}/pipeline/beverage/select`});var sr=Object.defineProperty,ar=Object.getOwnPropertyDescriptor,m=(e,t,r,n)=>{for(var s=n>1?void 0:n?ar(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&sr(t,r,s),s};const z=E.Nozzle,or=i.createPropKey("beverageTopicPrefix"),Q=e=>e.onPourStart!==void 0&&e.onPourCancel!==void 0&&e.onPourProgress!==void 0,Oe="/kos/nozzle/pour/started",dr="/kos/nozzle/pour/progress",lr="/kos/nozzle/pour/cancel";let P=class{constructor(e,t){d(this,"id");d(this,"path");d(this,"name");d(this,"_selectedBeverage");d(this,"_selectedBrand");d(this,"_additionalItems");d(this,"_availabilityItems");d(this,"futureHandler");d(this,"beverageTopicPrefix");d(this,"topicPrefix");d(this,"urlPrefix");this.id=e,this.path=t.path,this.name=t.name,this.beverageTopicPrefix=t.beverageTopicPrefix,this.topicPrefix=t.topicPrefix,this.urlPrefix=t.urlPrefix,this._selectedBeverage=void 0,this._selectedBrand=void 0,this._additionalItems=[],this.futureHandler=new i.MultipleFutureHandler(this),this._availabilityItems=new i.KosModelContainer({indexMap:{byGroup:"groupId",byParent:"parentId"},parentId:e})}get beverages(){return this._availabilityItems.getIndexByKey("byGroup","beverages")}get brands(){return this._availabilityItems.getIndexByKey("byGroup","brands")}get visibleBrands(){return this.brands.filter(e=>e.visible)}get visibleBeverages(){return this.beverages.filter(e=>e.visible)}get isPouring(){var e;return!!(this.futureHandler.getFuture()&&!((e=this.futureHandler.getFuture())!=null&&e.endState))||this.currentState===l.POUR_STARTING||this.currentState===l.POURING||this.currentState===l.POUR_CANCELING}get canPour(){return!!this._selectedBeverage&&this._selectedBeverage.available&&this.currentState===l.IDLE}get selectedPourable(){return{beverage:this._selectedBeverage,additional:this._additionalItems}}get future(){return this.futureHandler.getFuture()}get pourProgress(){var e;return((e=this.future)==null?void 0:e.progress)??0}updateModel(){}setSelectedBrand(e,t){t&&this.logger.debug("context is currenty being ignored when setting brand"),this._selectedBrand=e,this._selectedBeverage=void 0}get selectedBrand(){return this._selectedBrand}async setSelectedPourable({beverage:e,additional:t,context:r},n=!1){if(!e){const c=await Ye(this.name);if((c==null?void 0:c.status)!==200)throw new Error("Failed to clear pourable");this._selectedBeverage=void 0;return}if(!n&&e===this._selectedBeverage&&i.arraysEqual(this._additionalItems,t)){this.logger.info("No change in selected pourable");return}this._selectedBeverage=e,this._additionalItems=t;let s;try{s=await i.ExtensionManager.dataMapper.executeMapper(h.SelectedPourableMapper,{beverage:e,additional:t,context:r})}catch(c){this.logger.error(`Error executing SelectedPourableMapper, falling back to default payload. Error: ${c}`),s=void 0}const a={bevId:e.rawId};(!s||Object.keys(s).length===0)&&(this.logger.info(`No selected pourable mapper defined, using the default payload ${a}`),s=a);const o=s??a,p=await Ve(this.name,o);if((p==null?void 0:p.status)!==200)throw new Error("Failed to select pourable")}getGroupAvailabilityItems(e){return this._availabilityItems.getIndexByKey("byGroup",e)}getAvailabilityByParent(e){return this._availabilityItems.getIndexByKey("byParent",e)}handlePouringStart(){this.logger.info("Pour started"),i.getAllKosCompanionModels(this).forEach(e=>{var t;Q(e)&&((t=e.onPourStart)==null||t.call(e))})}handlePouringEnd(){this.logger.info("Pour ended")}handleCancelStart(){this.logger.info("Pour canceling")}handleCanceled(){this.logger.info("Pour canceled"),i.getAllKosCompanionModels(this).forEach(t=>{var r;Q(t)&&((r=t.onPourCancel)==null||r.call(t))});const e={nozzleId:this.id};i.EventBus.publish(lr,e)}onFutureUpdate(e){i.getAllKosCompanionModels(this).forEach(n=>{Q(n)&&n.onPourProgress(e)});const r={nozzleId:this.id,progress:e.progress,status:e.status,clientData:e.clientData,futureId:e.futureId,remainingTimeMs:e.remainingTimeMs,endState:e.endState,reason:e.reason,timeRemaining:e.timeRemaining};i.EventBus.publish(dr,r),e.endState&&i.kosAction(()=>{this.currentState===l.POURING&&this.transition("POUR_COMPLETED")})}async pour(e){var t;try{if(this.transition("START_POUR"),!e)throw new Error("No tracker provided");const r=await Fe(this.name,e);this.transition("POUR_ACTIVE");const n={nozzleId:this.id,type:"free"};return i.EventBus.publish(Oe,n),(t=r==null?void 0:r.data)!=null&&t.endState&&this.transition("POUR_COMPLETED"),r}catch(r){throw this.logger.error(r),this.currentState!==l.IDLE&&this.transition("POUR_COMPLETED"),r}}async fixedPour(e,t){var r;try{if(this.transition("START_POUR"),!t)throw new Error("No tracker provided");const n=await je(e,this.name,t);this.transition("POUR_ACTIVE");const s={nozzleId:this.id,type:"fixed"};return i.EventBus.publish(Oe,s),(r=n==null?void 0:n.data)!=null&&r.endState&&this.transition("POUR_COMPLETED"),n}catch(n){throw this.logger.error(n),this.currentState!==l.IDLE&&this.transition("POUR_COMPLETED"),n}}async cancelPour(){var e;this.transition("CANCEL_POUR"),await((e=this.futureHandler.getFuture())==null?void 0:e.cancelFuture()),this.transition("POUR_CANCELED")}updateGroupMembers(){this._availabilityItems.data.forEach(e=>{(e.taggedIds||[]).forEach(r=>{const n=this._availabilityItems.data.find(s=>s.rawId===r);n&&n.parentId!==e.id&&(n.parentId=e.id,this._availabilityItems.updateModel(n))})})}async load(e){var n,s;this.logger.debug(`loading nozzle ${this.id}`);const t=await He(this.urlPrefix);if((t==null?void 0:t.status)!==200)throw new Error("Failed to load nozzle availability");const r=await i.ExtensionManager.loader.executeLoader(h.AvailabilityLoader,{});e==null||e.set(h.AvailabilityLoader,r),e==null||e.set(W.type,this);for(const a of Object.keys((n=t.data)==null?void 0:n.groups)||[])for(const o of((s=t.data)==null?void 0:s.groups[a])||[]){const p=await i.ExtensionManager.dataMapper.executeMapper(h.AvailabilityMapper,{...o,groupId:a},r),c={...o,note:o.note??void 0,kosParentId:this.id,rawId:o.id,groupId:a,data:p,properties:o.properties||{}},g=V.factory(`${this.id}-${a}-${o.id}`)(c);this._availabilityItems.addModel(g)}this.updateGroupMembers()}async updateAvailability(e){const t=i.KosContextManager.getContext(this.id),r=(t==null?void 0:t.get(h.AvailabilityLoader))||{};if(e.rebuild)for(const n of Object.keys(e==null?void 0:e.groups)||[]){this._availabilityItems.getIndexByKey("group",n).filter(a=>!e.groups[n].find(o=>`${this.id}-${n}-${o.id}`===a.id)).forEach(a=>{this._availabilityItems.removeModel(a.id),i.destroyKosModel(a)});for(const a of(e==null?void 0:e.groups[n])||[]){const o=await i.ExtensionManager.dataMapper.executeMapper(h.AvailabilityMapper,{...a,groupId:n},r),p={...a,note:a.note??void 0,kosParentId:this.id,groupId:n,rawId:a.id,data:o,taggedIds:a.taggedIds,properties:a.properties||{}},c=this._availabilityItems.getModel(`${this.id}-${n}-${a.id}`);if(c)c.updateModel(p);else{const g=V.factory(`${this.id}-${n}-${a.id}`)(p);this._availabilityItems.addModel(g)}}}else for(const n of Object.keys(e==null?void 0:e.groups)||[])for(const s of(e==null?void 0:e.groups[n])||[]){const a=await i.ExtensionManager.dataMapper.executeMapper(h.AvailabilityMapper,{...s,groupId:n},r),o={...s,note:s.note??void 0,kosParentId:this.id,groupId:n,rawId:s.id,data:a,type:s.type,taggedIds:s.taggedIds,properties:s.properties||{}},p=this._availabilityItems.getModel(`${this.id}-${n}-${s.id}`);p&&p.updateModel(o)}this.updateGroupMembers()}};m([i.kosChild],P.prototype,"_availabilityItems",2);m([i.kosStateEntry(l.POURING)],P.prototype,"handlePouringStart",1);m([i.kosStateExit(l.POURING)],P.prototype,"handlePouringEnd",1);m([i.kosStateEntry(l.POUR_CANCELING)],P.prototype,"handleCancelStart",1);m([i.kosStateExit(l.POUR_CANCELING)],P.prototype,"handleCanceled",1);m([i.kosFuture(),i.kosStateGuard({allowedStates:[l.IDLE]})],P.prototype,"pour",1);m([i.kosFuture(),i.kosStateGuard({allowedStates:[l.IDLE]})],P.prototype,"fixedPour",1);m([i.kosStateGuard({allowedStates:[l.POUR_STARTING,l.POURING]})],P.prototype,"cancelPour",1);m([i.kosTopicHandler({topic:`${or}/availability`,websocket:!0})],P.prototype,"updateAvailability",1);P=m([i.kosModel({modelTypeId:z,singleton:!1}),i.kosLoggerAware(),i.kosStateMachine({initial:l.IDLE,initializeAt:i.DependencyLifecycle.READY,states:{[l.IDLE]:{on:{START_POUR:l.POUR_STARTING}},[l.POUR_STARTING]:{on:{POUR_ACTIVE:l.POURING,CANCEL_POUR:l.POUR_CANCELING,POUR_COMPLETED:l.IDLE}},[l.POURING]:{on:{CANCEL_POUR:l.POUR_CANCELING,POUR_COMPLETED:l.IDLE}},[l.POUR_CANCELING]:{on:{POUR_CANCELED:l.IDLE}}}},{trackHistory:!1,throwOnInvalid:!1})],P);const W={registration:{[z]:{class:P,singleton:!1}},type:z,predicate:i.isKosModel(z),factory:i.Kos.Factory.create(z)};var cr=Object.defineProperty,pr=Object.getOwnPropertyDescriptor,Xe=(e,t,r,n)=>{for(var s=n>1?void 0:n?pr(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&cr(t,r,s),s};const Ze="device-assembly-model";let Y=class{constructor(e,t,r){d(this,"id");d(this,"deviceNozzles");d(this,"logger");this.id=e,this.logger=r.logger,this.deviceNozzles=new i.KosModelContainer}async init(){this.logger.debug(`initializing device-assembly ${this.id}`)}getNozzle(e){return this.deviceNozzles.getModel(e)}get nozzlePaths(){return this.deviceNozzles.data.map(e=>e.path)}async load(){this.logger.debug(`loading device-assembly ${this.id}`);const e=await le();(e==null?void 0:e.status)===200&&e.data.assemblies.map(r=>r.nozzles??[]).flat().forEach(r=>{var o;const n=r.path,s=((o=r.pipelines.find(p=>p.name==="beverage"))==null?void 0:o.topicPrefix)||"",a=W.factory(n)({path:r.path,name:r.name,urlPrefix:r.urlPrefix,topicPrefix:r.topicPrefix,beverageTopicPrefix:s});this.deviceNozzles.addModel(a)})}};Xe([i.kosChild],Y.prototype,"deviceNozzles",2);Y=Xe([i.kosModel(Ze)],Y);const qe=new i.SingletonKosModelRegistrationFactory({class:Y,type:Ze}),{URL:Je}=i.resolveServiceUrl("GENERIC_POUR_SERVICE"),{postModel:gr}=i.ServiceFactory.build({basePath:`${Je}/api/nozzle`}),We=async(e,t)=>{const r=await gr({model:{},urlOverride:`${Je}${e}`,ordered:!0,tracker:t});return r!=null&&r.data&&i.FutureManager.initiateFuture(r.data),r};var hr=Object.defineProperty,ur=Object.getOwnPropertyDescriptor,_=(e,t,r,n)=>{for(var s=n>1?void 0:n?ur(t,r):t,a=e.length-1,o;a>=0;a--)(o=e[a])&&(s=(n?o(t,r,s):o(s))||s);return n&&s&&hr(t,r,s),s};const Qe="generic-pour-model",et="/kos/generic/pour/started",tt="/kos/generic/pour/progress",rt="/kos/generic/pour/cancel",ee=e=>e.onPourStart!==void 0&&e.onPourCancel!==void 0&&e.onPourProgress!==void 0;let f=class{constructor(e,t){d(this,"id");d(this,"servicePathFactory");d(this,"pourType");d(this,"selectedId");d(this,"state");this.id=e,this.futureHandler=new i.FutureHandler(this),this.servicePathFactory=t.servicePathFactory,this.pourType=t.pourType||"free",this.selectedId=t.selectedId,this.state=i.ObservableData(t.initialData||{})}get servicePath(){return this.selectedId?this.servicePathFactory(this.selectedId,this.state):""}updateContextData(e,t){this.state[e]=t}removeContextData(e){delete this.state[e]}clearContextData(){this.state=i.ObservableData()}updateModel(e){e.pourType&&(this.pourType=e.pourType),e.initialData&&this.state.setValues(e.initialData)}handlePouringStart(){this.logger.info("Pour started"),i.getAllKosCompanionModels(this).forEach(t=>{var r;ee(t)&&((r=t.onPourStart)==null||r.call(t))});const e={pourTarget:this.id,type:this.pourType};i.EventBus.publish(et,e)}handlePouringEnd(){this.logger.info("Pour ended")}handleCancelStart(){this.logger.info("Pour canceling")}handleCanceled(){this.logger.info("Pour canceled"),i.getAllKosCompanionModels(this).forEach(t=>{var r;ee(t)&&((r=t.onPourCancel)==null||r.call(t))});const e={pourTarget:this.id};i.EventBus.publish(rt,e)}async pour(e){var t;try{if(this.transition("START_POUR"),!e)throw new Error("No tracker provided");const r=await We(this.servicePath,e);return this.transition("POUR_ACTIVE"),(t=r==null?void 0:r.data)!=null&&t.endState&&this.transition("POUR_COMPLETED"),r}catch(r){throw this.logger.error(r),this.currentState!==l.IDLE&&this.transition("POUR_COMPLETED"),r}}async cancelPour(){var e;this.transition("CANCEL_POUR"),await((e=this.futureHandler.getFuture())==null?void 0:e.cancelFuture()),this.transition("POUR_CANCELED")}get isPouring(){var e;return!!(this.future&&!((e=this.future)!=null&&e.endState))||this.currentState===l.POUR_STARTING||this.currentState===l.POURING||this.currentState===l.POUR_CANCELING}get canPour(){return this.currentState===l.IDLE}get pourProgress(){return this.progress??0}onFutureUpdate(e){i.getAllKosCompanionModels(this).forEach(r=>{ee(r)&&r.onPourProgress(e)});const t={pourTarget:this.id,progress:e.progress,status:e.status,clientData:e.clientData,futureId:e.futureId,remainingTimeMs:e.remainingTimeMs,endState:e.endState,reason:e.reason,timeRemaining:e.timeRemaining};i.EventBus.publish(tt,t),e.endState&&i.kosAction(()=>{this.currentState===l.POURING&&this.transition("POUR_COMPLETED")})}};_([i.kosStateEntry(l.POURING)],f.prototype,"handlePouringStart",1);_([i.kosStateExit(l.POURING)],f.prototype,"handlePouringEnd",1);_([i.kosStateEntry(l.POUR_CANCELING)],f.prototype,"handleCancelStart",1);_([i.kosStateExit(l.POUR_CANCELING)],f.prototype,"handleCanceled",1);_([i.kosFuture(),i.kosStateGuard({allowedStates:[l.IDLE]})],f.prototype,"pour",1);_([i.kosStateGuard({allowedStates:[l.POUR_STARTING,l.POURING]})],f.prototype,"cancelPour",1);f=_([i.kosModel(Qe),i.kosLoggerAware(),i.kosFutureAware(),i.kosStateMachine({initial:l.IDLE,initializeAt:i.DependencyLifecycle.READY,states:{[l.IDLE]:{on:{START_POUR:l.POUR_STARTING}},[l.POUR_STARTING]:{on:{POUR_ACTIVE:l.POURING,CANCEL_POUR:l.POUR_CANCELING,POUR_COMPLETED:l.IDLE}},[l.POURING]:{on:{CANCEL_POUR:l.POUR_CANCELING,POUR_COMPLETED:l.IDLE}},[l.POUR_CANCELING]:{on:{POUR_CANCELED:l.IDLE}}}},{trackHistory:!1,throwOnInvalid:!1})],f);const yr=new i.KosModelRegistrationFactory({class:f,type:Qe}),ne={...ae.registration,...se.registration,...ye.registration,...de.registration,...W.registration,...Ie.registration,...q.registration,...V.registration,...me.registration,...ue.registration},it=e=>()=>(i.registerCoreModels(e)(),qe.register(),Object.keys(ne).forEach(t=>{const r=ne[t];i.registerLegacyModel(e)(t,r)}),i.ExtensionManager[i.EXTENSION_TROUBLE_DATA_MAPPER].register("FirmwareUpdateInProgressTrouble",async t=>{var r;if((r=t.data)!=null&&r.deviceId){const{model:n}=i.getKosModelSync(me.type);if(n){const s=n.boards.find(a=>a.id===t.data.deviceId)?i.getKosModelSync(t.data.deviceId).model:void 0;return{devices:s?s.name:""}}}return{}}),{preload:i.RegistrationManager.model.preloadModel(e),model:i.RegistrationManager.model.register(e),companion:i.RegistrationManager.companion.register(e),legacy:i.RegistrationManager.model.registerLegacyModel(e)}),I={...i.KosModelRegistry};I.dispense={models:it(I)};I.preload=i.RegistrationManager.model.preloadModel(I);I.model=i.RegistrationManager.model.register(I);I.companion=i.RegistrationManager.companion.register(I);I.legacy=i.RegistrationManager.model.registerLegacyModel(I);const Pr=I;exports.Assembly=me;exports.Availability=V;exports.Board=he;exports.BoardContainer=ue;exports.CONTEXT_ASSEMBLY_DATA=Ge;exports.CONTEXT_ASSEMBLY_RAW_DATA=ke;exports.DeviceAssembly=qe;exports.DispenseModelType=E;exports.ExtensionType=h;exports.GenericPour=yr;exports.Holder=de;exports.HolderContainer=ye;exports.Ingredient=se;exports.IngredientContainer=ae;exports.KosModelRegistry=Pr;exports.Nozzle=W;exports.PourState=l;exports.Pump=Ie;exports.PumpContainer=q;exports.PumpIndex=ge;exports.TOPIC_BOARD_LINKED=ce;exports.TOPIC_BOARD_UNLINKED=pe;exports.TOPIC_GENERIC_POUR_CANCEL=rt;exports.TOPIC_GENERIC_POUR_PROGRESS=tt;exports.TOPIC_GENERIC_POUR_STARTED=et;exports.addAssignment=vt;exports.assignHolderIngredient=Ae;exports.clearPourable=Ye;exports.deleteAssignment=ft;exports.getAssembly=le;exports.getAssignments=mt;exports.getAvailability=He;exports.getHolders=yt;exports.getIngredients=Re;exports.getIntentVolume=ze;exports.kosModels=ne;exports.pourNamedPourable=je;exports.pourOnTarget=We;exports.pourPourable=Fe;exports.registerDispenseModels=it;exports.replaceLine=Ne;exports.selectPourable=Ve;exports.sendIntent=xe;exports.sendRfidOverride=Le;exports.unassignHolderIngredient=Te;
2
+ //# sourceMappingURL=dispense-registration-manager-Cj0565Ze.cjs.map