@kosdev-code/kos-dispense-sdk 2.1.38 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/dispense-registration-manager-BH0mkCQx.cjs +2672 -0
  2. package/dispense-registration-manager-BH0mkCQx.cjs.map +1 -0
  3. package/dispense-registration-manager-BSKa5Oi9.js +2674 -0
  4. package/dispense-registration-manager-BSKa5Oi9.js.map +1 -0
  5. package/extension-utils-FKfiDSbi.cjs +489 -0
  6. package/extension-utils-FKfiDSbi.cjs.map +1 -0
  7. package/{extension-utils-DrsPfQWC.js → extension-utils-jntF0-vN.js} +185 -159
  8. package/extension-utils-jntF0-vN.js.map +1 -0
  9. package/extensions/control-pour-extension.d.ts +8 -9
  10. package/extensions/control-pour-extension.d.ts.map +1 -1
  11. package/extensions/index.d.ts.map +1 -1
  12. package/index.cjs +139 -1
  13. package/index.cjs.map +1 -1
  14. package/index.d.ts.map +1 -1
  15. package/index.js +124 -124
  16. package/index.js.map +1 -1
  17. package/models/constants/constants.d.ts.map +1 -1
  18. package/models/constants/index.d.ts.map +1 -1
  19. package/models/index.d.ts.map +1 -1
  20. package/models/models/assembly/assembly-model.d.ts +4 -5
  21. package/models/models/assembly/assembly-model.d.ts.map +1 -1
  22. package/models/models/assembly/assembly-registration.d.ts +1 -2
  23. package/models/models/assembly/assembly-registration.d.ts.map +1 -1
  24. package/models/models/assembly/board-utils.d.ts +1 -2
  25. package/models/models/assembly/board-utils.d.ts.map +1 -1
  26. package/models/models/assembly/holder-utils.d.ts +1 -2
  27. package/models/models/assembly/holder-utils.d.ts.map +1 -1
  28. package/models/models/assembly/index.d.ts.map +1 -1
  29. package/models/models/assembly/nozzle-utils.d.ts +1 -2
  30. package/models/models/assembly/nozzle-utils.d.ts.map +1 -1
  31. package/models/models/assembly/pump-utils.d.ts +2 -3
  32. package/models/models/assembly/pump-utils.d.ts.map +1 -1
  33. package/models/models/assembly/services/assembly-services.d.ts +0 -1
  34. package/models/models/assembly/services/assembly-services.d.ts.map +1 -1
  35. package/models/models/assembly/services/index.d.ts.map +1 -1
  36. package/models/models/assembly/types/index.d.ts +2 -3
  37. package/models/models/availability/availability-model.d.ts +1 -2
  38. package/models/models/availability/availability-model.d.ts.map +1 -1
  39. package/models/models/availability/index.d.ts.map +1 -1
  40. package/models/models/availability/types/index.d.ts +0 -1
  41. package/models/models/board/board-container-model.d.ts +2 -3
  42. package/models/models/board/board-container-model.d.ts.map +1 -1
  43. package/models/models/board/board-container-registration.d.ts +2 -3
  44. package/models/models/board/board-container-registration.d.ts.map +1 -1
  45. package/models/models/board/board-model.d.ts +1 -2
  46. package/models/models/board/board-model.d.ts.map +1 -1
  47. package/models/models/board/board-registration.d.ts +1 -2
  48. package/models/models/board/board-registration.d.ts.map +1 -1
  49. package/models/models/board/index.d.ts.map +1 -1
  50. package/models/models/board/types/index.d.ts +0 -2
  51. package/models/models/board/types/services.d.ts.map +1 -1
  52. package/models/models/board/utils/board-trouble-data-mapper.d.ts +1 -2
  53. package/models/models/board/utils/board-trouble-data-mapper.d.ts.map +1 -1
  54. package/models/models/board/utils/board-trouble-resolver.d.ts +0 -1
  55. package/models/models/board/utils/board-trouble-resolver.d.ts.map +1 -1
  56. package/models/models/device-assembly/device-assembly-model.d.ts +2 -3
  57. package/models/models/device-assembly/device-assembly-model.d.ts.map +1 -1
  58. package/models/models/device-assembly/device-assembly-registration.d.ts +2 -3
  59. package/models/models/device-assembly/device-assembly-registration.d.ts.map +1 -1
  60. package/models/models/device-assembly/index.d.ts.map +1 -1
  61. package/models/models/generic-pour/generic-pour-model.d.ts +3 -4
  62. package/models/models/generic-pour/generic-pour-model.d.ts.map +1 -1
  63. package/models/models/generic-pour/generic-pour-registration.d.ts +2 -3
  64. package/models/models/generic-pour/generic-pour-registration.d.ts.map +1 -1
  65. package/models/models/generic-pour/index.d.ts.map +1 -1
  66. package/models/models/generic-pour/services/generic-pour-services.d.ts.map +1 -1
  67. package/models/models/generic-pour/services/index.d.ts.map +1 -1
  68. package/models/models/holder/holder-model.d.ts +1 -2
  69. package/models/models/holder/holder-model.d.ts.map +1 -1
  70. package/models/models/holder/index.d.ts.map +1 -1
  71. package/models/models/holder/services/assignment-services.d.ts.map +1 -1
  72. package/models/models/holder/services/holder-services.d.ts.map +1 -1
  73. package/models/models/holder/services/index.d.ts.map +1 -1
  74. package/models/models/holder/types/index.d.ts +7 -7
  75. package/models/models/holder/utils/holder-utils.d.ts +0 -1
  76. package/models/models/holder/utils/holder-utils.d.ts.map +1 -1
  77. package/models/models/holder-container/holder-container-model.d.ts +1 -2
  78. package/models/models/holder-container/holder-container-model.d.ts.map +1 -1
  79. package/models/models/holder-container/index.d.ts.map +1 -1
  80. package/models/models/holder-container/types/index.d.ts +1 -3
  81. package/models/models/index.d.ts.map +1 -1
  82. package/models/models/ingredient/index.d.ts.map +1 -1
  83. package/models/models/ingredient/ingredient-model.d.ts +1 -2
  84. package/models/models/ingredient/ingredient-model.d.ts.map +1 -1
  85. package/models/models/ingredient/services/index.d.ts.map +1 -1
  86. package/models/models/ingredient/services/ingredient-services.d.ts.map +1 -1
  87. package/models/models/ingredient/types/index.d.ts +0 -2
  88. package/models/models/ingredient-container/index.d.ts.map +1 -1
  89. package/models/models/ingredient-container/ingredient-container-model.d.ts +1 -2
  90. package/models/models/ingredient-container/ingredient-container-model.d.ts.map +1 -1
  91. package/models/models/ingredient-container/types/index.d.ts +1 -3
  92. package/models/models/nozzle/index.d.ts.map +1 -1
  93. package/models/models/nozzle/nozzle-model.d.ts +7 -7
  94. package/models/models/nozzle/nozzle-model.d.ts.map +1 -1
  95. package/models/models/nozzle/services/index.d.ts.map +1 -1
  96. package/models/models/nozzle/services/nozzle-services.d.ts.map +1 -1
  97. package/models/models/nozzle/types/index.d.ts +1 -3
  98. package/models/models/pump/index.d.ts.map +1 -1
  99. package/models/models/pump/pump-model.d.ts +1 -2
  100. package/models/models/pump/pump-model.d.ts.map +1 -1
  101. package/models/models/pump/services/index.d.ts.map +1 -1
  102. package/models/models/pump/services/pump-services.d.ts +3 -5
  103. package/models/models/pump/services/pump-services.d.ts.map +1 -1
  104. package/models/models/pump/types/index.d.ts +1 -3
  105. package/models/models/pump/utils/pump-trouble-resolver.d.ts +0 -1
  106. package/models/models/pump/utils/pump-trouble-resolver.d.ts.map +1 -1
  107. package/models/models/pump-container/index.d.ts.map +1 -1
  108. package/models/models/pump-container/pump-container-model.d.ts +1 -2
  109. package/models/models/pump-container/pump-container-model.d.ts.map +1 -1
  110. package/models/models/pump-container/types/index.d.ts +1 -3
  111. package/models/models/types/assembly.d.ts +1 -0
  112. package/models/models/types/assembly.d.ts.map +1 -1
  113. package/models/models/types/index.d.ts.map +1 -1
  114. package/models/models/types/intent.d.ts +0 -1
  115. package/models/models/types/intent.d.ts.map +1 -1
  116. package/models/models/types/pouring.d.ts.map +1 -1
  117. package/models/utils/dispense-registration-manager.d.ts +5 -6
  118. package/models/utils/dispense-registration-manager.d.ts.map +1 -1
  119. package/models/utils/extension-utils.d.ts +6 -7
  120. package/models/utils/extension-utils.d.ts.map +1 -1
  121. package/models/utils/openapi-index.d.ts.map +1 -1
  122. package/models/utils/registration.d.ts +0 -1
  123. package/models/utils/registration.d.ts.map +1 -1
  124. package/models/utils/service.d.ts +34 -35
  125. package/models/utils/service.d.ts.map +1 -1
  126. package/models/utils/services/dispense/1.6.5/service.d.ts +34 -35
  127. package/models/utils/services/dispense/1.6.5/service.d.ts.map +1 -1
  128. package/models/utils/services/dispense/1.8.1/service.d.ts +34 -35
  129. package/models/utils/services/dispense/1.8.1/service.d.ts.map +1 -1
  130. package/models/utils/services/dispense/daily/service.d.ts +34 -35
  131. package/models/utils/services/dispense/daily/service.d.ts.map +1 -1
  132. package/models/utils/services-index.d.ts.map +1 -1
  133. package/models.cjs +45 -1
  134. package/models.cjs.map +1 -1
  135. package/models.d.ts +1 -0
  136. package/models.js +40 -42
  137. package/models.js.map +1 -1
  138. package/package.json +22 -11
  139. package/pump-provider-D4iVLU-o.cjs +1803 -0
  140. package/pump-provider-D4iVLU-o.cjs.map +1 -0
  141. package/pump-provider-ntLT8vr7.js +1804 -0
  142. package/pump-provider-ntLT8vr7.js.map +1 -0
  143. package/ui/contexts/assembly/assembly-provider.d.ts +1 -2
  144. package/ui/contexts/assembly/assembly-provider.d.ts.map +1 -1
  145. package/ui/contexts/assembly/index.d.ts.map +1 -1
  146. package/ui/contexts/availability/availability-provider.d.ts +1 -2
  147. package/ui/contexts/availability/availability-provider.d.ts.map +1 -1
  148. package/ui/contexts/availability/index.d.ts.map +1 -1
  149. package/ui/contexts/board/board-provider.d.ts +1 -2
  150. package/ui/contexts/board/board-provider.d.ts.map +1 -1
  151. package/ui/contexts/board/index.d.ts.map +1 -1
  152. package/ui/contexts/board-container/board-container-provider.d.ts +1 -2
  153. package/ui/contexts/board-container/board-container-provider.d.ts.map +1 -1
  154. package/ui/contexts/board-container/index.d.ts.map +1 -1
  155. package/ui/contexts/cui-kit/cui-kit.d.ts +1 -2
  156. package/ui/contexts/cui-kit/cui-kit.d.ts.map +1 -1
  157. package/ui/contexts/cui-kit/index.d.ts.map +1 -1
  158. package/ui/contexts/device-assembly/device-assembly-provider.d.ts +1 -2
  159. package/ui/contexts/device-assembly/device-assembly-provider.d.ts.map +1 -1
  160. package/ui/contexts/device-assembly/index.d.ts.map +1 -1
  161. package/ui/contexts/holder/holder-provider.d.ts +1 -2
  162. package/ui/contexts/holder/holder-provider.d.ts.map +1 -1
  163. package/ui/contexts/holder/index.d.ts.map +1 -1
  164. package/ui/contexts/holder-container/holder-container-provider.d.ts +1 -2
  165. package/ui/contexts/holder-container/holder-container-provider.d.ts.map +1 -1
  166. package/ui/contexts/holder-container/index.d.ts.map +1 -1
  167. package/ui/contexts/index.d.ts.map +1 -1
  168. package/ui/contexts/ingredient/index.d.ts.map +1 -1
  169. package/ui/contexts/ingredient/ingredient-provider.d.ts +1 -2
  170. package/ui/contexts/ingredient/ingredient-provider.d.ts.map +1 -1
  171. package/ui/contexts/ingredient-container/index.d.ts.map +1 -1
  172. package/ui/contexts/ingredient-container/ingredient-container-provider.d.ts +1 -2
  173. package/ui/contexts/ingredient-container/ingredient-container-provider.d.ts.map +1 -1
  174. package/ui/contexts/nozzle/index.d.ts.map +1 -1
  175. package/ui/contexts/nozzle/nozzle-provider.d.ts +1 -2
  176. package/ui/contexts/nozzle/nozzle-provider.d.ts.map +1 -1
  177. package/ui/contexts/pump/index.d.ts.map +1 -1
  178. package/ui/contexts/pump/pump-provider.d.ts +1 -2
  179. package/ui/contexts/pump/pump-provider.d.ts.map +1 -1
  180. package/ui/hooks/assembly/index.d.ts.map +1 -1
  181. package/ui/hooks/assembly/use-assembly.d.ts +1 -2
  182. package/ui/hooks/assembly/use-assembly.d.ts.map +1 -1
  183. package/ui/hooks/assembly/with-assembly.d.ts +0 -1
  184. package/ui/hooks/assembly/with-assembly.d.ts.map +1 -1
  185. package/ui/hooks/availability/index.d.ts.map +1 -1
  186. package/ui/hooks/availability/use-availability.d.ts +1 -2
  187. package/ui/hooks/availability/use-availability.d.ts.map +1 -1
  188. package/ui/hooks/availability/with-availability.d.ts +0 -1
  189. package/ui/hooks/availability/with-availability.d.ts.map +1 -1
  190. package/ui/hooks/board/index.d.ts.map +1 -1
  191. package/ui/hooks/board/use-board.d.ts +1 -2
  192. package/ui/hooks/board/use-board.d.ts.map +1 -1
  193. package/ui/hooks/board/with-board.d.ts +0 -1
  194. package/ui/hooks/board/with-board.d.ts.map +1 -1
  195. package/ui/hooks/board-container/index.d.ts.map +1 -1
  196. package/ui/hooks/board-container/use-board-container.d.ts +1 -2
  197. package/ui/hooks/board-container/use-board-container.d.ts.map +1 -1
  198. package/ui/hooks/board-container/with-board-container.d.ts +0 -1
  199. package/ui/hooks/board-container/with-board-container.d.ts.map +1 -1
  200. package/ui/hooks/cui-kit/dispense-topics.d.ts +0 -1
  201. package/ui/hooks/cui-kit/dispense-topics.d.ts.map +1 -1
  202. package/ui/hooks/cui-kit/index.d.ts.map +1 -1
  203. package/ui/hooks/cui-kit/use-ambient-attract-timers.d.ts +0 -1
  204. package/ui/hooks/cui-kit/use-ambient-attract-timers.d.ts.map +1 -1
  205. package/ui/hooks/cui-kit/use-beverages.d.ts +1 -2
  206. package/ui/hooks/cui-kit/use-beverages.d.ts.map +1 -1
  207. package/ui/hooks/cui-kit/use-brands.d.ts +1 -2
  208. package/ui/hooks/cui-kit/use-brands.d.ts.map +1 -1
  209. package/ui/hooks/cui-kit/use-cui-kit.d.ts +3 -4
  210. package/ui/hooks/cui-kit/use-cui-kit.d.ts.map +1 -1
  211. package/ui/hooks/cui-kit/use-default-cui-kit-lifecycle.d.ts +0 -1
  212. package/ui/hooks/cui-kit/use-default-cui-kit-lifecycle.d.ts.map +1 -1
  213. package/ui/hooks/cui-kit/use-dispense-lifecycle.d.ts +0 -1
  214. package/ui/hooks/cui-kit/use-dispense-lifecycle.d.ts.map +1 -1
  215. package/ui/hooks/cui-kit/use-dispense-timers.d.ts +0 -1
  216. package/ui/hooks/cui-kit/use-dispense-timers.d.ts.map +1 -1
  217. package/ui/hooks/cui-kit/use-flavors.d.ts +1 -2
  218. package/ui/hooks/cui-kit/use-flavors.d.ts.map +1 -1
  219. package/ui/hooks/device-assembly/index.d.ts.map +1 -1
  220. package/ui/hooks/device-assembly/use-device-assembly.d.ts +1 -2
  221. package/ui/hooks/device-assembly/use-device-assembly.d.ts.map +1 -1
  222. package/ui/hooks/device-assembly/with-device-assembly.d.ts +0 -1
  223. package/ui/hooks/device-assembly/with-device-assembly.d.ts.map +1 -1
  224. package/ui/hooks/generic-pour/index.d.ts.map +1 -1
  225. package/ui/hooks/generic-pour/use-generic-pour.d.ts +2 -3
  226. package/ui/hooks/generic-pour/use-generic-pour.d.ts.map +1 -1
  227. package/ui/hooks/generic-pour/with-generic-pour.d.ts +0 -1
  228. package/ui/hooks/generic-pour/with-generic-pour.d.ts.map +1 -1
  229. package/ui/hooks/holder/index.d.ts.map +1 -1
  230. package/ui/hooks/holder/use-holder.d.ts +1 -2
  231. package/ui/hooks/holder/use-holder.d.ts.map +1 -1
  232. package/ui/hooks/holder/with-holder.d.ts +0 -1
  233. package/ui/hooks/holder/with-holder.d.ts.map +1 -1
  234. package/ui/hooks/holder-container/index.d.ts.map +1 -1
  235. package/ui/hooks/holder-container/use-holder-container.d.ts +1 -2
  236. package/ui/hooks/holder-container/use-holder-container.d.ts.map +1 -1
  237. package/ui/hooks/holder-container/with-holder-container.d.ts +0 -1
  238. package/ui/hooks/holder-container/with-holder-container.d.ts.map +1 -1
  239. package/ui/hooks/index.d.ts.map +1 -1
  240. package/ui/hooks/ingredient/index.d.ts.map +1 -1
  241. package/ui/hooks/ingredient/use-ingredient-pour.d.ts +2 -3
  242. package/ui/hooks/ingredient/use-ingredient-pour.d.ts.map +1 -1
  243. package/ui/hooks/ingredient/use-ingredient.d.ts +1 -2
  244. package/ui/hooks/ingredient/use-ingredient.d.ts.map +1 -1
  245. package/ui/hooks/ingredient/with-ingredient.d.ts +0 -1
  246. package/ui/hooks/ingredient/with-ingredient.d.ts.map +1 -1
  247. package/ui/hooks/ingredient-container/index.d.ts.map +1 -1
  248. package/ui/hooks/ingredient-container/use-ingredient-container.d.ts +1 -2
  249. package/ui/hooks/ingredient-container/use-ingredient-container.d.ts.map +1 -1
  250. package/ui/hooks/ingredient-container/with-ingredient-container.d.ts +0 -1
  251. package/ui/hooks/ingredient-container/with-ingredient-container.d.ts.map +1 -1
  252. package/ui/hooks/nozzle/index.d.ts.map +1 -1
  253. package/ui/hooks/nozzle/use-dispense-kit.d.ts +0 -1
  254. package/ui/hooks/nozzle/use-dispense-kit.d.ts.map +1 -1
  255. package/ui/hooks/nozzle/use-nozzle.d.ts +1 -2
  256. package/ui/hooks/nozzle/use-nozzle.d.ts.map +1 -1
  257. package/ui/hooks/nozzle/with-nozzle.d.ts +0 -1
  258. package/ui/hooks/nozzle/with-nozzle.d.ts.map +1 -1
  259. package/ui/hooks/nozzle-pour/index.d.ts.map +1 -1
  260. package/ui/hooks/nozzle-pour/use-nozzle-pour.d.ts +3 -4
  261. package/ui/hooks/nozzle-pour/use-nozzle-pour.d.ts.map +1 -1
  262. package/ui/hooks/pour/index.d.ts.map +1 -1
  263. package/ui/hooks/pour/use-pour.d.ts +4 -5
  264. package/ui/hooks/pour/use-pour.d.ts.map +1 -1
  265. package/ui/hooks/pump/index.d.ts.map +1 -1
  266. package/ui/hooks/pump/use-pump.d.ts +1 -2
  267. package/ui/hooks/pump/use-pump.d.ts.map +1 -1
  268. package/ui/hooks/pump/with-pump.d.ts +0 -1
  269. package/ui/hooks/pump/with-pump.d.ts.map +1 -1
  270. package/ui/hooks/utils/pour-strategy/hold-to-pour-intent-strategy.d.ts +1 -2
  271. package/ui/hooks/utils/pour-strategy/hold-to-pour-intent-strategy.d.ts.map +1 -1
  272. package/ui/hooks/utils/pour-strategy/hold-to-pour-strategy.d.ts +0 -1
  273. package/ui/hooks/utils/pour-strategy/hold-to-pour-strategy.d.ts.map +1 -1
  274. package/ui/hooks/utils/pour-strategy/index.d.ts.map +1 -1
  275. package/ui/hooks/utils/pour-strategy/pour-strategy.d.ts +1 -2
  276. package/ui/hooks/utils/pour-strategy/pour-strategy.d.ts.map +1 -1
  277. package/ui/hooks/utils/pour-strategy/tap-or-hold-to-pour-intent-strategy.d.ts +1 -2
  278. package/ui/hooks/utils/pour-strategy/tap-or-hold-to-pour-intent-strategy.d.ts.map +1 -1
  279. package/ui/hooks/utils/pour-strategy/tap-to-pour-intent-strategy.d.ts +1 -2
  280. package/ui/hooks/utils/pour-strategy/tap-to-pour-intent-strategy.d.ts.map +1 -1
  281. package/ui/hooks/utils/pour-strategy/tap-to-pour-strategy.d.ts +0 -1
  282. package/ui/hooks/utils/pour-strategy/tap-to-pour-strategy.d.ts.map +1 -1
  283. package/ui/index.d.ts.map +1 -1
  284. package/ui/utils/pour-context.d.ts.map +1 -1
  285. package/ui.cjs +69 -1
  286. package/ui.cjs.map +1 -1
  287. package/ui.d.ts +1 -0
  288. package/ui.js +66 -70
  289. package/ui.js.map +1 -1
  290. package/dispense-registration-manager-Cj0565Ze.cjs +0 -2
  291. package/dispense-registration-manager-Cj0565Ze.cjs.map +0 -1
  292. package/dispense-registration-manager-CzAqcL8D.js +0 -2044
  293. package/dispense-registration-manager-CzAqcL8D.js.map +0 -1
  294. package/extension-utils-BDyaRwRN.cjs +0 -2
  295. package/extension-utils-BDyaRwRN.cjs.map +0 -1
  296. package/extension-utils-DrsPfQWC.js.map +0 -1
  297. package/kos-models.json +0 -180
  298. package/pump-provider-Bytd6qXc.js +0 -1308
  299. package/pump-provider-Bytd6qXc.js.map +0 -1
  300. package/pump-provider-CTELJBW5.cjs +0 -2
  301. package/pump-provider-CTELJBW5.cjs.map +0 -1
@@ -0,0 +1,2672 @@
1
+ "use strict";
2
+ const kosUiSdk = require("@kosdev-code/kos-ui-sdk");
3
+ require("react");
4
+ var ExtensionType = /* @__PURE__ */ ((ExtensionType2) => {
5
+ ExtensionType2["IngredientLoader"] = "kos.ingredient.loader";
6
+ ExtensionType2["IngredientMapper"] = "kos.ingredient.mapper";
7
+ ExtensionType2["IngredientIndex"] = "kos.ingredient.index";
8
+ ExtensionType2["IngredientTypeMapper"] = "kos.ingredient.type.mapper";
9
+ ExtensionType2["HolderTypeMapper"] = "kos.holder.type.mapper";
10
+ ExtensionType2["HolderMapper"] = "kos.holder.mapper";
11
+ ExtensionType2["HolderIndex"] = "kos.holder.index";
12
+ ExtensionType2["HolderIngredientMapper"] = "kos.holder.ingredient.mapper";
13
+ ExtensionType2["AvailabilityMapper"] = "kos.availability.mapper";
14
+ ExtensionType2["AvailabilityLoader"] = "kos.availability.loader";
15
+ ExtensionType2["SelectedPourableMapper"] = "kos.selected.pourable.mapper";
16
+ ExtensionType2["AssemblyMapper"] = "kos.assembly.mapper";
17
+ ExtensionType2["BoardMapper"] = "kos.board.mapper";
18
+ ExtensionType2["BoardIndex"] = "kos.board.index";
19
+ ExtensionType2["PumpIndex"] = "kos.pump.index";
20
+ ExtensionType2["AssemblyFeatureFlags"] = "kos.assembly.feature.flags";
21
+ return ExtensionType2;
22
+ })(ExtensionType || {});
23
+ var DispenseModelType = /* @__PURE__ */ ((DispenseModelType2) => {
24
+ DispenseModelType2["Nozzle"] = "nozzle-model";
25
+ DispenseModelType2["Availability"] = "availability-model";
26
+ DispenseModelType2["Holder"] = "holder-model";
27
+ DispenseModelType2["HolderContainer"] = "holder-container-model";
28
+ DispenseModelType2["IngredientContainer"] = "ingredient-container-model";
29
+ DispenseModelType2["Ingredient"] = "ingredient-model";
30
+ DispenseModelType2["Pump"] = "pump-model";
31
+ DispenseModelType2["PumpContainer"] = "pump-container-model";
32
+ return DispenseModelType2;
33
+ })(DispenseModelType || {});
34
+ var __getOwnPropDesc$c = Object.getOwnPropertyDescriptor;
35
+ var __decorateClass$c = (decorators, target, key, kind) => {
36
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$c(target, key) : target;
37
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
38
+ if (decorator = decorators[i])
39
+ result = decorator(result) || result;
40
+ return result;
41
+ };
42
+ const MODEL_TYPE$c = "ingredient-model";
43
+ let IngredientModelImpl = class {
44
+ id;
45
+ ingredientId;
46
+ name;
47
+ type;
48
+ data;
49
+ constructor(modelId, {
50
+ name,
51
+ type,
52
+ data,
53
+ ingredientId,
54
+ ...rest
55
+ }) {
56
+ this.id = modelId;
57
+ this.ingredientId = ingredientId;
58
+ this.name = name;
59
+ this.type = type;
60
+ this.data = data;
61
+ Object.assign(this, rest);
62
+ }
63
+ updateModel({
64
+ name,
65
+ type,
66
+ data,
67
+ ingredientId,
68
+ ...rest
69
+ }) {
70
+ this.name = name;
71
+ this.type = type;
72
+ this.ingredientId = ingredientId;
73
+ this.data = data;
74
+ Object.assign(this, rest);
75
+ }
76
+ // -------------------LIFECYCLE----------------------------
77
+ // -------------------ENTITY----------------------------
78
+ };
79
+ IngredientModelImpl = __decorateClass$c([
80
+ kosUiSdk.kosModel(MODEL_TYPE$c)
81
+ ], IngredientModelImpl);
82
+ const Ingredient = {
83
+ registration: {
84
+ [MODEL_TYPE$c]: {
85
+ class: IngredientModelImpl,
86
+ singleton: false
87
+ }
88
+ },
89
+ type: MODEL_TYPE$c,
90
+ predicate: kosUiSdk.isKosModel(MODEL_TYPE$c),
91
+ factory: kosUiSdk.Kos.Factory.create(MODEL_TYPE$c)
92
+ };
93
+ const { URL: URL$6 } = kosUiSdk.resolveServiceUrl("INGREDIENT_SERVICE");
94
+ const { getOne: getOne$3 } = kosUiSdk.ServiceFactory.build({
95
+ basePath: `${URL$6}/api/ext/dispense/ingredients`
96
+ });
97
+ const getIngredients = async () => {
98
+ const response = await getOne$3({
99
+ urlOverride: `${URL$6}/api/ext/dispense/ingredients`
100
+ });
101
+ return response;
102
+ };
103
+ var __defProp$9 = Object.defineProperty;
104
+ var __getOwnPropDesc$b = Object.getOwnPropertyDescriptor;
105
+ var __decorateClass$b = (decorators, target, key, kind) => {
106
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$b(target, key) : target;
107
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
108
+ if (decorator = decorators[i])
109
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
110
+ if (kind && result) __defProp$9(target, key, result);
111
+ return result;
112
+ };
113
+ const MODEL_TYPE$b = "ingredient-container-model";
114
+ const log$3 = kosUiSdk.KosLog.createLogger({ name: "ingredient-container-model" });
115
+ let IngredientContainerModelImpl = class {
116
+ id;
117
+ ingredients;
118
+ constructor(modelId, options) {
119
+ this.id = modelId;
120
+ this.ingredients = new kosUiSdk.KosModelContainer({
121
+ indexMap: {
122
+ ingredientType: "type"
123
+ },
124
+ extensionId: ExtensionType.IngredientIndex,
125
+ parentId: modelId
126
+ });
127
+ }
128
+ updateModel() {
129
+ }
130
+ // -------------------LIFECYCLE----------------------------
131
+ getIngredientsByType(type) {
132
+ return this.ingredients.getIndexByKey("ingredientType", type);
133
+ }
134
+ async load(context) {
135
+ log$3.debug(`loading ingredient container ${this.id}`);
136
+ const allIngredients = await getIngredients();
137
+ if (allIngredients?.status !== 200) {
138
+ throw new Error("Failed to load ingredients");
139
+ }
140
+ const ingredientContext = await kosUiSdk.KosExtensionUtils.executeLoaderExtension({
141
+ context,
142
+ extension: ExtensionType.IngredientLoader
143
+ });
144
+ const ingredientData = allIngredients?.data ?? {};
145
+ for (const key of Object.keys(ingredientData)) {
146
+ for (const ingredientData2 of allIngredients?.data?.[key] || []) {
147
+ const data = await kosUiSdk.KosExtensionUtils.executeDataMapperExtension({
148
+ extension: ExtensionType.IngredientMapper,
149
+ data: ingredientData2,
150
+ contextData: ingredientContext
151
+ });
152
+ const type = await kosUiSdk.KosExtensionUtils.executePropertyMapperExtension({
153
+ extension: ExtensionType.IngredientTypeMapper,
154
+ data: ingredientData2,
155
+ contextData: ingredientContext
156
+ });
157
+ const ingredientOptions = {
158
+ ...ingredientData2,
159
+ type: type || ingredientData2.type,
160
+ ...data,
161
+ data
162
+ };
163
+ const ingredient = Ingredient.factory(ingredientData2.id)(
164
+ ingredientOptions
165
+ );
166
+ this.ingredients.addModel(ingredient);
167
+ }
168
+ }
169
+ }
170
+ // -------------------ENTITY----------------------------
171
+ };
172
+ __decorateClass$b([
173
+ kosUiSdk.kosChild
174
+ ], IngredientContainerModelImpl.prototype, "ingredients", 2);
175
+ IngredientContainerModelImpl = __decorateClass$b([
176
+ kosUiSdk.kosModel(MODEL_TYPE$b)
177
+ ], IngredientContainerModelImpl);
178
+ const IngredientContainer = {
179
+ registration: {
180
+ [MODEL_TYPE$b]: {
181
+ class: IngredientContainerModelImpl,
182
+ singleton: true
183
+ }
184
+ },
185
+ type: MODEL_TYPE$b,
186
+ predicate: kosUiSdk.isKosModel(MODEL_TYPE$b),
187
+ factory: kosUiSdk.Kos.Singleton.create(MODEL_TYPE$b)
188
+ };
189
+ const { URL: URL$5 } = kosUiSdk.resolveServiceUrl("HOLDER_SERVICE");
190
+ const { getAll: getAll$1, postModel: postModel$4, deleteModel: deleteModel$2 } = kosUiSdk.ServiceFactory.build({
191
+ basePath: `${URL$5}/api/kos/holders`
192
+ });
193
+ const log$2 = kosUiSdk.KosLog.createLogger({
194
+ name: "holder-service",
195
+ group: "Services"
196
+ });
197
+ const getHolders = async () => {
198
+ const response = await getAll$1({});
199
+ return response;
200
+ };
201
+ const assignHolderIngredient = async (holderPath, ingredientId) => {
202
+ if (!holderPath || !ingredientId) {
203
+ throw new Error("Missing holderPath or ingredientId");
204
+ }
205
+ const response = await postModel$4({
206
+ model: { holderPath, ingredientId },
207
+ urlOverride: `${URL$5}/api/ext/dispense/assignments`
208
+ });
209
+ return response;
210
+ };
211
+ const unassignHolderIngredient = async (holderPath) => {
212
+ if (!holderPath) {
213
+ throw new Error("Missing holderPath");
214
+ }
215
+ const response = await deleteModel$2({
216
+ id: holderPath,
217
+ urlOverride: `${URL$5}/api/ext/dispense/assignments/${holderPath}`
218
+ });
219
+ return response;
220
+ };
221
+ const replaceLine = async (holderPath) => {
222
+ if (!holderPath) throw new Error("Missing holderPath");
223
+ log$2.debug(
224
+ `sending POST request to /api/ext/dispense/pumpEvents/replaceLine/${holderPath}`
225
+ );
226
+ const response = await postModel$4({
227
+ model: {},
228
+ urlOverride: `${URL$5}/api/ext/dispense/pumpEvents/replaceLine/${holderPath}`
229
+ });
230
+ return response;
231
+ };
232
+ const { URL: URL$4 } = kosUiSdk.resolveServiceUrl("ASSIGNMENT_SERVICE");
233
+ const { getAll, postModel: postModel$3, deleteModel: deleteModel$1 } = kosUiSdk.ServiceFactory.build({
234
+ destinationAddress: "",
235
+ basePath: `${URL$4}/api/ext/dispense/assignments`
236
+ });
237
+ const useFos = window.kosUseFos;
238
+ const getAssignments = async () => {
239
+ const response = await getAll({ fos: useFos });
240
+ return response;
241
+ };
242
+ const sendRfidOverride = async (holderPath, overrides) => {
243
+ const factoryJson = JSON.stringify(overrides);
244
+ const url = `${URL$4}/api/ext/dispense/assignments`;
245
+ try {
246
+ const response = await postModel$3({
247
+ model: { holderPath, factoryJson },
248
+ urlOverride: url
249
+ });
250
+ if (response?.status === 200 && response?.data?.error) {
251
+ return [response.data.error || "unknownError", response.data];
252
+ }
253
+ return [void 0, response?.data];
254
+ } catch (error) {
255
+ if (error instanceof kosUiSdk.FetchError) {
256
+ return [
257
+ error.payload?.data?.error || "unknownError",
258
+ error.payload?.data
259
+ ];
260
+ }
261
+ }
262
+ return ["unknownError", void 0];
263
+ };
264
+ const addAssignment = async (assignment) => {
265
+ const url = useFos ? `${URL$4}/api/ingredients/assignments/${assignment.holderPath}` : `${URL$4}/api/ext/dispense/assignments`;
266
+ const response = await postModel$3({
267
+ model: { ...assignment, fuelGauge: 680 },
268
+ fos: useFos,
269
+ urlOverride: url
270
+ });
271
+ return response;
272
+ };
273
+ const deleteAssignment = async (id) => {
274
+ const response = await deleteModel$1({ id, fos: useFos });
275
+ return response;
276
+ };
277
+ var __defProp$8 = Object.defineProperty;
278
+ var __getOwnPropDesc$a = Object.getOwnPropertyDescriptor;
279
+ var __decorateClass$a = (decorators, target, key, kind) => {
280
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$a(target, key) : target;
281
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
282
+ if (decorator = decorators[i])
283
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
284
+ if (kind && result) __defProp$8(target, key, result);
285
+ return result;
286
+ };
287
+ const MODEL_TYPE$a = DispenseModelType.Holder;
288
+ const log$1 = kosUiSdk.KosLog.createLogger({ name: "holder-model" });
289
+ kosUiSdk.ExtensionManager[kosUiSdk.EXTENSION_TROUBLE_MAPPER].register(
290
+ "holder",
291
+ async (trouble) => {
292
+ const result = [];
293
+ result.push(...trouble.data.holderPaths);
294
+ return result;
295
+ }
296
+ );
297
+ kosUiSdk.ExtensionManager[kosUiSdk.EXTENSION_TROUBLE_DATA_MAPPER].register(
298
+ "pump",
299
+ async (trouble) => {
300
+ if (trouble.data.pumpPath) {
301
+ const { model: pumpModel } = kosUiSdk.getKosModelSync(
302
+ trouble.data.pumpPath
303
+ );
304
+ if (pumpModel) {
305
+ const ingredientModel = pumpModel.ingredientId ? kosUiSdk.getKosModelSync(pumpModel.ingredientId).model : void 0;
306
+ return {
307
+ ingredientId: pumpModel.ingredientId,
308
+ ingredientName: ingredientModel?.displayName ?? (ingredientModel?.name || ""),
309
+ childPumpName: pumpModel.name
310
+ };
311
+ }
312
+ }
313
+ return {};
314
+ }
315
+ );
316
+ kosUiSdk.ExtensionManager[kosUiSdk.EXTENSION_TROUBLE_DATA_MAPPER].register(
317
+ "holder",
318
+ async (trouble) => {
319
+ if (trouble.data.holderNames.length > 0) {
320
+ const holderName = trouble.data.holderNames[0];
321
+ return {
322
+ holderName: holderName || ""
323
+ };
324
+ }
325
+ return {};
326
+ }
327
+ );
328
+ kosUiSdk.ExtensionManager[kosUiSdk.EXTENSION_TROUBLE_DATA_MAPPER].register(
329
+ "container",
330
+ async (trouble) => {
331
+ if (trouble.data.ingredients.length > 0) {
332
+ const ingredientId = trouble.data.ingredients[0];
333
+ const { model } = kosUiSdk.getKosModelSync(ingredientId);
334
+ return {
335
+ ingredientName: model?.displayName ?? (model?.name || ""),
336
+ ingredients: trouble.data.ingredients ? trouble.data.ingredients : [],
337
+ unknonwnIngredientId: trouble.data.unknonwnIngredientId ?? ""
338
+ };
339
+ }
340
+ return {};
341
+ }
342
+ );
343
+ class AssignmentError extends Error {
344
+ type;
345
+ constructor(type, message) {
346
+ super(message);
347
+ this.name = "AssignmentError";
348
+ this.type = type;
349
+ }
350
+ }
351
+ let HolderModelImpl = class {
352
+ id;
353
+ path;
354
+ name;
355
+ ingredientId;
356
+ ingredientType;
357
+ ingredientSource;
358
+ group;
359
+ slice;
360
+ logger;
361
+ data;
362
+ enjoyByDate;
363
+ attributes;
364
+ pumps;
365
+ ingredientContainer;
366
+ constructor(modelId, {
367
+ path,
368
+ name,
369
+ ingredientSource,
370
+ ingredientId,
371
+ ingredientType,
372
+ slice,
373
+ group,
374
+ data,
375
+ enjoyByDate,
376
+ attributes
377
+ }, context) {
378
+ this.id = modelId;
379
+ this.path = path;
380
+ this.name = name;
381
+ this.ingredientType = ingredientType;
382
+ this.ingredientSource = ingredientSource;
383
+ this.ingredientId = ingredientId;
384
+ this.group = group;
385
+ this.slice = slice;
386
+ this.enjoyByDate = enjoyByDate;
387
+ this.data = data;
388
+ this.pumps = new kosUiSdk.KosModelContainer({
389
+ parentId: modelId,
390
+ sortKey: "path"
391
+ });
392
+ this.attributes = attributes || {};
393
+ this.logger = context.logger;
394
+ }
395
+ updateModel({
396
+ path,
397
+ name,
398
+ ingredientSource,
399
+ ingredientId,
400
+ ingredientType,
401
+ group,
402
+ slice,
403
+ enjoyByDate,
404
+ data
405
+ }) {
406
+ this.path = path;
407
+ this.name = name;
408
+ this.ingredientId = ingredientId;
409
+ this.ingredientType = ingredientType;
410
+ this.ingredientSource = ingredientSource;
411
+ this.enjoyByDate = enjoyByDate;
412
+ this.slice = slice;
413
+ this.group = group;
414
+ this.data = data;
415
+ }
416
+ get hasEnjoyByDate() {
417
+ return !!this.enjoyByDate && !this.unassigned;
418
+ }
419
+ get hasEnjoyByWarning() {
420
+ return this.troublesByType["EnjoyByTrouble"]?.length > 0;
421
+ }
422
+ get nozzlePaths() {
423
+ return this.pumps.data.map((pump) => pump.nozzlePath);
424
+ }
425
+ async cancelPour() {
426
+ await Promise.all(
427
+ this.pumps.data.filter((pump) => pump.isPouring).map((pump) => pump.cancelPour())
428
+ );
429
+ }
430
+ get canPour() {
431
+ return !this.shouldDefer && this.pumps.data.every((pump) => pump.canPour);
432
+ }
433
+ get isPouring() {
434
+ const _isPouring = this.pumps.data.some((pump) => pump.isPouring);
435
+ this.logger.debug(`isPouring: ${!!_isPouring}`);
436
+ return _isPouring;
437
+ }
438
+ async performIntent(props) {
439
+ const intent = typeof props === "string" ? props : props.intent;
440
+ const pumpPath = typeof props === "string" ? void 0 : props.pumpPath;
441
+ const pump = pumpPath ? this.pumps.getModel(pumpPath) : this.pumps.data[0];
442
+ return pump?.performIntent({ intent });
443
+ }
444
+ get pourState() {
445
+ const state = this.pumps.data.reduce((resolvedState, pump) => {
446
+ if (pump.pouringState) {
447
+ return pump.pouringState;
448
+ }
449
+ return resolvedState;
450
+ }, "");
451
+ return state;
452
+ }
453
+ get nozzlePath() {
454
+ return this.pumps.data[0]?.nozzlePath;
455
+ }
456
+ get pumpPaths() {
457
+ return this.pumps.data.map((pump) => pump.id);
458
+ }
459
+ get sortedPumps() {
460
+ return this.pumps.data.sort((a, b) => {
461
+ if (a.virtual && !b.virtual) {
462
+ return -1;
463
+ }
464
+ if (!a.virtual && b.virtual) {
465
+ return 1;
466
+ }
467
+ return a.name.localeCompare(b.name);
468
+ });
469
+ }
470
+ get ingredient() {
471
+ if (!this.ingredientId) {
472
+ return void 0;
473
+ }
474
+ const ingredient = this.ingredientContainer?.ingredients.getModel(
475
+ this.ingredientId
476
+ );
477
+ return ingredient;
478
+ }
479
+ get ingredientName() {
480
+ if (this.ingredient) {
481
+ return this.ingredient.displayName ?? this.ingredient.name;
482
+ } else if (this.ingredientId) {
483
+ return "unknown";
484
+ } else {
485
+ return "";
486
+ }
487
+ }
488
+ get previousIngredient() {
489
+ if (!this.prevIngredientId) {
490
+ return void 0;
491
+ }
492
+ const ingredient = this.ingredientContainer?.ingredients.getModel(
493
+ this.prevIngredientId
494
+ );
495
+ return ingredient;
496
+ }
497
+ get previousIngredientName() {
498
+ if (this.previousIngredient) {
499
+ return this.previousIngredient.displayName ?? this.previousIngredient.name;
500
+ } else if (this.prevIngredientId) {
501
+ return "unknown";
502
+ } else {
503
+ return "";
504
+ }
505
+ }
506
+ get prevIngredientId() {
507
+ return this.pumps.data?.[0]?.prevIngredientId;
508
+ }
509
+ get unassigned() {
510
+ return (!this.ingredientId || this.ingredientId === "0") && (!this.prevIngredientId || this.prevIngredientId === "0");
511
+ }
512
+ get removed() {
513
+ return (!this.ingredientId || this.ingredientId === "0") && this.prevIngredientId !== void 0 && this.prevIngredientId !== "0";
514
+ }
515
+ get maxVolume() {
516
+ return this.slice.maxVolMl ?? 0;
517
+ }
518
+ get remainingVolume() {
519
+ return this.slice.currentVolMl ?? 0;
520
+ }
521
+ get hasMaxVolume() {
522
+ return this.slice.maxVolMl !== void 0;
523
+ }
524
+ get hasRemainingVolume() {
525
+ return this.slice.currentVolMl !== void 0;
526
+ }
527
+ get fillPercent() {
528
+ return this.remainingVolume <= 0 ? 0 : Math.floor((this.remainingVolume || 1) / (this.maxVolume || 1) * 100);
529
+ }
530
+ get hasFuelGuage() {
531
+ return this.hasMaxVolume && this.hasRemainingVolume;
532
+ }
533
+ updateIngredient(ingredientId) {
534
+ if (this.ingredientId === ingredientId) {
535
+ return;
536
+ }
537
+ kosUiSdk.kosAction(() => {
538
+ this.ingredientId = ingredientId;
539
+ });
540
+ }
541
+ async resolveIntentVolume(intent) {
542
+ const pump = this.pumps.data[0];
543
+ if (!pump) {
544
+ return { volume: -1 };
545
+ }
546
+ return pump.resolveIntentVolume(intent);
547
+ }
548
+ async overrideRfidCode(overrides) {
549
+ if (!overrides) {
550
+ throw new Error("Invalid override");
551
+ }
552
+ try {
553
+ const [error, result] = await sendRfidOverride(this.path, overrides);
554
+ if (error) {
555
+ throw new AssignmentError(
556
+ error,
557
+ `Failed to perform rfid override on holder ${this.id}`
558
+ );
559
+ }
560
+ kosUiSdk.kosAction(() => {
561
+ this.ingredientId = result?.ingredientId;
562
+ });
563
+ return result;
564
+ } catch (e) {
565
+ log$1.error(`Failed to perform rfid override on holder ${this.id}`, e);
566
+ throw e;
567
+ }
568
+ }
569
+ async assignIngredient(ingredientId) {
570
+ try {
571
+ if (ingredientId) {
572
+ await assignHolderIngredient(this.path, ingredientId);
573
+ } else {
574
+ await unassignHolderIngredient(this.path);
575
+ }
576
+ kosUiSdk.kosAction(() => {
577
+ this.ingredientId = ingredientId;
578
+ });
579
+ } catch (e) {
580
+ log$1.error(`Failed to perform assign ingredient to holder ${this.id}`, e);
581
+ throw e;
582
+ }
583
+ }
584
+ /**
585
+ * @kosApiLevel 3
586
+ */
587
+ get shouldDefer() {
588
+ return this.troubles.some((trouble) => trouble.shouldDefer);
589
+ }
590
+ async replaceLine() {
591
+ await replaceLine(this.path);
592
+ return;
593
+ }
594
+ // -------------------LIFECYCLE----------------------------
595
+ // ----------------------------------
596
+ // UNCOMMENT FOR TESTING FUEL GAUGE
597
+ // ----------------------------------
598
+ // async load() {
599
+ // const random = Math.max(1000, Math.floor(Math.random() * 5000));
600
+ // this.slice.maxVolMl = 1000;
601
+ // setInterval(() => {
602
+ // kosAction(() => {
603
+ // if (this.remainingVolume < -100) {
604
+ // this.slice.maxVolMl = 1000;
605
+ // this.slice.currentVolMl = this.maxVolume;
606
+ // } else {
607
+ // this.slice.currentVolMl = this.remainingVolume - 50;
608
+ // }
609
+ // });
610
+ // }, random);
611
+ // }
612
+ // -------------------ENTITY----------------------------
613
+ };
614
+ __decorateClass$a([
615
+ kosUiSdk.kosChild
616
+ ], HolderModelImpl.prototype, "pumps", 2);
617
+ __decorateClass$a([
618
+ kosUiSdk.kosDependency({ modelType: IngredientContainer.type })
619
+ ], HolderModelImpl.prototype, "ingredientContainer", 2);
620
+ HolderModelImpl = __decorateClass$a([
621
+ kosUiSdk.kosModel(MODEL_TYPE$a),
622
+ kosUiSdk.kosTroubleAware()
623
+ ], HolderModelImpl);
624
+ const Holder = {
625
+ registration: {
626
+ [MODEL_TYPE$a]: {
627
+ class: HolderModelImpl,
628
+ singleton: false
629
+ }
630
+ },
631
+ type: MODEL_TYPE$a,
632
+ predicate: kosUiSdk.isKosModel(MODEL_TYPE$a),
633
+ factory: kosUiSdk.Kos.Factory.create(MODEL_TYPE$a)
634
+ };
635
+ const mapAssemblyHolderToModel = async (group, holderData) => {
636
+ const _ingredientId = kosUiSdk.ExtensionManager.propertyMapper.executeMapper(
637
+ ExtensionType.HolderIngredientMapper,
638
+ holderData
639
+ );
640
+ const type = kosUiSdk.ExtensionManager.propertyMapper.executeMapper(
641
+ ExtensionType.HolderTypeMapper,
642
+ holderData
643
+ ) || holderData.ingType;
644
+ const holderExtData = await kosUiSdk.KosExtensionUtils.executeDataMapperExtension({
645
+ extension: ExtensionType.HolderMapper,
646
+ data: holderData,
647
+ contextData: {}
648
+ });
649
+ const {
650
+ name,
651
+ path,
652
+ ingredientId,
653
+ ingType,
654
+ ingSource,
655
+ slice,
656
+ attributes,
657
+ ...rest
658
+ } = holderData;
659
+ const extData = { ...rest, ...holderExtData };
660
+ const sliceData = slice || { pos: 0 };
661
+ const holderOptions = {
662
+ name,
663
+ path,
664
+ ingredientId: _ingredientId || ingredientId,
665
+ ingredientType: type || ingType,
666
+ ingredientSource: ingSource,
667
+ enjoyByDate: holderData.container?.enjoyByDate ? new Date(holderData.container.enjoyByDate) : void 0,
668
+ slice: sliceData,
669
+ group,
670
+ attributes,
671
+ data: extData
672
+ };
673
+ const holder = Holder.factory(holderData.path)(holderOptions);
674
+ return holder;
675
+ };
676
+ const { URL: URL$3 } = kosUiSdk.resolveServiceUrl("ASSEMBLY_SERVICE");
677
+ const { getOne: getOne$2 } = kosUiSdk.ServiceFactory.build({
678
+ basePath: `${URL$3}/api/kos/device/assemblies`
679
+ });
680
+ const log = kosUiSdk.KosLog.createLogger({
681
+ name: "assembly-service",
682
+ group: "Services"
683
+ });
684
+ const getAssembly = async () => {
685
+ log.debug("sending GET for assembly");
686
+ const response = await getOne$2({});
687
+ return response;
688
+ };
689
+ var __defProp$7 = Object.defineProperty;
690
+ var __getOwnPropDesc$9 = Object.getOwnPropertyDescriptor;
691
+ var __decorateClass$9 = (decorators, target, key, kind) => {
692
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$9(target, key) : target;
693
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
694
+ if (decorator = decorators[i])
695
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
696
+ if (kind && result) __defProp$7(target, key, result);
697
+ return result;
698
+ };
699
+ const MODEL_TYPE$9 = "board-container-model";
700
+ const TOPIC_BOARD_LINKED = "/kos/hardware/board/linked";
701
+ const TOPIC_BOARD_UNLINKED = "/kos/hardware/board/unlinked";
702
+ exports.BoardContainerModel = class BoardContainerModel {
703
+ id;
704
+ logger;
705
+ models;
706
+ constructor(modelId, options, context) {
707
+ this.id = modelId;
708
+ this.logger = context.logger;
709
+ this.models = new kosUiSdk.KosModelContainer({
710
+ parentId: modelId,
711
+ extensionId: ExtensionType.BoardIndex
712
+ });
713
+ }
714
+ get boardList() {
715
+ return this.models.data;
716
+ }
717
+ updateModel() {
718
+ }
719
+ addModel(model) {
720
+ this.models.addModel(model);
721
+ }
722
+ removeModel(id) {
723
+ this.models.removeModel(id);
724
+ }
725
+ updateBoard(boardLinkEvent) {
726
+ const boardId = boardLinkEvent.path;
727
+ const board = this.models.getModel(boardId);
728
+ if (!board) {
729
+ this.logger.warn(`board ${boardId} not found`);
730
+ return;
731
+ }
732
+ board.updateModel(boardLinkEvent);
733
+ }
734
+ handleBoardLinkEvent(boardLinkEvent) {
735
+ this.logger.debug(`handling ${TOPIC_BOARD_LINKED} event ${boardLinkEvent}`);
736
+ if (boardLinkEvent) {
737
+ this.updateBoard(boardLinkEvent);
738
+ } else {
739
+ this.logger.debug(`- boardLinkEvent is undefined`);
740
+ }
741
+ }
742
+ handleBoardUnlinkEvent(boardLinkEvent) {
743
+ this.logger.debug(
744
+ `handling ${TOPIC_BOARD_UNLINKED} event ${boardLinkEvent}`
745
+ );
746
+ if (boardLinkEvent) {
747
+ this.updateBoard(boardLinkEvent);
748
+ } else {
749
+ this.logger.debug(`- boardLinkEvent is undefined`);
750
+ }
751
+ }
752
+ };
753
+ __decorateClass$9([
754
+ kosUiSdk.kosChild
755
+ ], exports.BoardContainerModel.prototype, "models", 2);
756
+ __decorateClass$9([
757
+ kosUiSdk.kosTopicHandler({
758
+ lifecycle: kosUiSdk.DependencyLifecycle.INIT,
759
+ topic: TOPIC_BOARD_LINKED,
760
+ websocket: true
761
+ })
762
+ ], exports.BoardContainerModel.prototype, "handleBoardLinkEvent", 1);
763
+ __decorateClass$9([
764
+ kosUiSdk.kosTopicHandler({
765
+ lifecycle: kosUiSdk.DependencyLifecycle.INIT,
766
+ topic: TOPIC_BOARD_UNLINKED,
767
+ websocket: true
768
+ })
769
+ ], exports.BoardContainerModel.prototype, "handleBoardUnlinkEvent", 1);
770
+ exports.BoardContainerModel = __decorateClass$9([
771
+ kosUiSdk.kosModel(MODEL_TYPE$9)
772
+ ], exports.BoardContainerModel);
773
+ const boardTroubleDataMapper = async (trouble) => {
774
+ const boardPath = trouble.data.boardPath;
775
+ const { model } = kosUiSdk.getKosModelSync(boardPath);
776
+ return {
777
+ boardName: model?.name || ""
778
+ };
779
+ };
780
+ var __defProp$6 = Object.defineProperty;
781
+ var __getOwnPropDesc$8 = Object.getOwnPropertyDescriptor;
782
+ var __decorateClass$8 = (decorators, target, key, kind) => {
783
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$8(target, key) : target;
784
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
785
+ if (decorator = decorators[i])
786
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
787
+ if (kind && result) __defProp$6(target, key, result);
788
+ return result;
789
+ };
790
+ const MODEL_TYPE$8 = DispenseModelType.PumpContainer;
791
+ var PumpIndex = /* @__PURE__ */ ((PumpIndex2) => {
792
+ PumpIndex2["byBoard"] = "byBoard";
793
+ PumpIndex2["byType"] = "byType";
794
+ PumpIndex2["byNozzle"] = "byNozzle";
795
+ return PumpIndex2;
796
+ })(PumpIndex || {});
797
+ let PumpContainerModelImpl = class {
798
+ id;
799
+ pumps;
800
+ constructor(modelId, options) {
801
+ this.id = modelId;
802
+ this.pumps = new kosUiSdk.KosModelContainer({
803
+ indexMap: {
804
+ byNozzle: (pump) => pump.nozzlePaths,
805
+ byBoard: (pump) => pump.boardPath,
806
+ byType: "type"
807
+ },
808
+ parentId: modelId,
809
+ extensionId: ExtensionType.PumpIndex
810
+ });
811
+ }
812
+ /**
813
+ * The collection of pump models.
814
+ */
815
+ get pumpModels() {
816
+ return this.pumps.data;
817
+ }
818
+ /**
819
+ * The collection of pump paths.
820
+ */
821
+ get pumpPaths() {
822
+ return this.pumpModels.map((pump) => pump.path);
823
+ }
824
+ addModel(model) {
825
+ this.pumps.addModel(model);
826
+ }
827
+ removeModel(id) {
828
+ this.pumps.removeModel(id);
829
+ }
830
+ getModel(id) {
831
+ return this.pumps.getModel(id);
832
+ }
833
+ get models() {
834
+ return this.pumps;
835
+ }
836
+ get data() {
837
+ return this.pumps.data;
838
+ }
839
+ updateModel() {
840
+ }
841
+ // -------------------LIFECYCLE----------------------------
842
+ async load() {
843
+ }
844
+ // -------------------ENTITY----------------------------
845
+ };
846
+ __decorateClass$8([
847
+ kosUiSdk.kosChild
848
+ ], PumpContainerModelImpl.prototype, "pumps", 2);
849
+ PumpContainerModelImpl = __decorateClass$8([
850
+ kosUiSdk.kosModel(MODEL_TYPE$8)
851
+ ], PumpContainerModelImpl);
852
+ const PumpContainer = {
853
+ registration: {
854
+ [MODEL_TYPE$8]: {
855
+ class: PumpContainerModelImpl,
856
+ singleton: true
857
+ }
858
+ },
859
+ type: MODEL_TYPE$8,
860
+ predicate: kosUiSdk.isKosModel(MODEL_TYPE$8),
861
+ factory: kosUiSdk.Kos.Singleton.create(
862
+ MODEL_TYPE$8
863
+ )
864
+ };
865
+ const getPumpRelatedPaths = async (pumpPath) => {
866
+ const result = [];
867
+ const { model } = await kosUiSdk.getKosModel(pumpPath);
868
+ if (model) {
869
+ result.push(model.boardPath);
870
+ result.push(model.nozzlePath);
871
+ result.push(model.holderPath);
872
+ }
873
+ return result;
874
+ };
875
+ const pumpTroubleResolver = async (trouble) => {
876
+ const result = [];
877
+ const pumpPath = trouble.data.pumpPath;
878
+ result.push(pumpPath);
879
+ const relatedPaths = await getPumpRelatedPaths(pumpPath);
880
+ return [...result, ...relatedPaths];
881
+ };
882
+ const boardTroubleResolver = async (trouble) => {
883
+ const result = [];
884
+ const boardPath = trouble.data.boardPath;
885
+ result.push(trouble.data.boardPath);
886
+ const pumpContainer = await kosUiSdk.getKosModel(
887
+ PumpContainer.type
888
+ );
889
+ if (pumpContainer?.model) {
890
+ const boardPumps = pumpContainer.model.models.getIndexByKey(
891
+ PumpIndex.byBoard,
892
+ boardPath
893
+ );
894
+ const pumpPromises = boardPumps.map(
895
+ (pump) => getPumpRelatedPaths(pump.path)
896
+ );
897
+ const pumpResults = await Promise.allSettled(pumpPromises);
898
+ pumpResults.forEach((r) => {
899
+ if (r.status === "fulfilled") {
900
+ r.value.forEach((path) => result.push(path));
901
+ }
902
+ });
903
+ }
904
+ return Array.from(new Set(result));
905
+ };
906
+ var __getOwnPropDesc$7 = Object.getOwnPropertyDescriptor;
907
+ var __decorateClass$7 = (decorators, target, key, kind) => {
908
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$7(target, key) : target;
909
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
910
+ if (decorator = decorators[i])
911
+ result = decorator(result) || result;
912
+ return result;
913
+ };
914
+ const MODEL_TYPE$7 = "board-model";
915
+ const mapOptionsToModel = (options, model) => {
916
+ const { type, name, path, linked, instanceId, link, ...rest } = options;
917
+ model.type = type;
918
+ model.name = name;
919
+ model.path = path;
920
+ model.linked = linked;
921
+ model.link = Object.freeze(link);
922
+ model.instanceId = instanceId;
923
+ Object.assign(model, rest);
924
+ };
925
+ kosUiSdk.ExtensionManager[kosUiSdk.EXTENSION_TROUBLE_MAPPER].register(
926
+ "board",
927
+ boardTroubleResolver
928
+ );
929
+ kosUiSdk.ExtensionManager[kosUiSdk.EXTENSION_TROUBLE_DATA_MAPPER].register(
930
+ "board",
931
+ boardTroubleDataMapper
932
+ );
933
+ let BoardModelImpl = class {
934
+ id;
935
+ type;
936
+ name;
937
+ path;
938
+ linked;
939
+ instanceId;
940
+ logger;
941
+ constructor(modelId, options, context) {
942
+ this.id = modelId;
943
+ this.logger = context.logger;
944
+ mapOptionsToModel(options, this);
945
+ }
946
+ updateModel(options) {
947
+ mapOptionsToModel(options, this);
948
+ }
949
+ // -------------------LIFECYCLE----------------------------
950
+ async init() {
951
+ this.logger.debug(`initializing board ${this.id}`);
952
+ }
953
+ async load() {
954
+ this.logger.debug(`loading board ${this.id}`);
955
+ }
956
+ };
957
+ BoardModelImpl = __decorateClass$7([
958
+ kosUiSdk.kosModel(MODEL_TYPE$7)
959
+ ], BoardModelImpl);
960
+ const Board = {
961
+ registration: {
962
+ [MODEL_TYPE$7]: {
963
+ class: BoardModelImpl,
964
+ singleton: false
965
+ }
966
+ },
967
+ type: MODEL_TYPE$7,
968
+ predicate: kosUiSdk.isKosModel(MODEL_TYPE$7),
969
+ factory: kosUiSdk.Kos.Factory.create(MODEL_TYPE$7)
970
+ };
971
+ const BoardContainer = {
972
+ registration: {
973
+ [MODEL_TYPE$9]: {
974
+ class: exports.BoardContainerModel,
975
+ singleton: true
976
+ },
977
+ ...Board.registration
978
+ },
979
+ type: MODEL_TYPE$9,
980
+ predicate: kosUiSdk.isKosModel(MODEL_TYPE$9),
981
+ factory: kosUiSdk.Kos.Singleton.create(
982
+ MODEL_TYPE$9
983
+ )
984
+ };
985
+ var __defProp$5 = Object.defineProperty;
986
+ var __getOwnPropDesc$6 = Object.getOwnPropertyDescriptor;
987
+ var __decorateClass$6 = (decorators, target, key, kind) => {
988
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$6(target, key) : target;
989
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
990
+ if (decorator = decorators[i])
991
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
992
+ if (kind && result) __defProp$5(target, key, result);
993
+ return result;
994
+ };
995
+ const MODEL_TYPE$6 = DispenseModelType.HolderContainer;
996
+ const TOPIC_INSERT_START = "/kos/insertion/insert/start";
997
+ const TOPIC_INSERT_COMPLETE = "/kos/insertion/insert/complete";
998
+ const TOPIC_INSERT_UPDATE = "/kos/insertion/insert/update";
999
+ const TOPIC_REMOVE = "/kos/insertion/remove";
1000
+ const TOPIC_REPLACE_LINE = "/kos/pumpEvent/replaceLine";
1001
+ const TOPIC_HOLDER_CHANGED = "/kos/handle/*";
1002
+ let HolderContainerModelImpl = class {
1003
+ id;
1004
+ holders;
1005
+ logger;
1006
+ constructor(modelId, _options, context) {
1007
+ this.id = modelId;
1008
+ this.holders = new kosUiSdk.KosModelContainer({
1009
+ indexMap: {
1010
+ nozzle: (holder) => holder.nozzlePaths,
1011
+ group: "group"
1012
+ },
1013
+ parentId: modelId,
1014
+ extensionId: ExtensionType.HolderIndex
1015
+ });
1016
+ this.logger = context.logger;
1017
+ }
1018
+ updateModel() {
1019
+ }
1020
+ handleHolderEvents(event) {
1021
+ kosUiSdk.KosLog.ifDebug(
1022
+ () => this.logger.debug("Received holder change event", JSON.stringify(event))
1023
+ );
1024
+ const holder = this.holders.getModel(event.path);
1025
+ if (holder) {
1026
+ this.logger.info(
1027
+ `Received change event for holder ${holder.path}. Updating fuel gauge data.`
1028
+ );
1029
+ holder.slice.currentVolMl = event.slice?.currentVolMl;
1030
+ holder.slice.maxVolMl = event.slice?.maxVolMl;
1031
+ if (event?.container?.enjoyByDate) {
1032
+ holder.enjoyByDate = new Date(event.container.enjoyByDate);
1033
+ } else {
1034
+ holder.enjoyByDate = void 0;
1035
+ }
1036
+ }
1037
+ }
1038
+ handleInsertion(data) {
1039
+ kosUiSdk.KosLog.ifDebug(
1040
+ () => this.logger.debug("Received insertion event", JSON.stringify(data))
1041
+ );
1042
+ const wrappedData = Array.isArray(data) ? data : [data];
1043
+ wrappedData.forEach((event) => {
1044
+ kosUiSdk.kosAction(() => {
1045
+ const ingredientId = event.ingredientId;
1046
+ const holder = this.holders.getModel(event.path);
1047
+ if (holder) {
1048
+ this.logger.info(
1049
+ `Received insertion event for holder ${holder.path}`
1050
+ );
1051
+ holder.updateIngredient(ingredientId);
1052
+ holder.slice.currentVolMl = event.slice?.currentVolMl;
1053
+ holder.slice.maxVolMl = event.slice?.maxVolMl;
1054
+ if (event?.container?.enjoyByDate) {
1055
+ holder.enjoyByDate = new Date(event.container.enjoyByDate);
1056
+ } else {
1057
+ holder.enjoyByDate = void 0;
1058
+ }
1059
+ event.pumps.forEach((pump) => {
1060
+ kosUiSdk.kosAction(() => {
1061
+ const pumpModel = holder.pumps.getModel(pump.path);
1062
+ if (pumpModel) {
1063
+ pumpModel.ingredientId = pump.ingredientId;
1064
+ pumpModel.inserted = pump.inserted;
1065
+ pumpModel.prevIngredientId = pump.prevIngredientId;
1066
+ }
1067
+ });
1068
+ });
1069
+ }
1070
+ });
1071
+ });
1072
+ }
1073
+ // -------------------ENTITY----------------------------
1074
+ };
1075
+ __decorateClass$6([
1076
+ kosUiSdk.kosChild
1077
+ ], HolderContainerModelImpl.prototype, "holders", 2);
1078
+ __decorateClass$6([
1079
+ kosUiSdk.kosTopicHandler({
1080
+ topic: TOPIC_HOLDER_CHANGED,
1081
+ websocket: true,
1082
+ condition: (event, model) => model.holders.getModel(event.path) !== void 0
1083
+ })
1084
+ ], HolderContainerModelImpl.prototype, "handleHolderEvents", 1);
1085
+ __decorateClass$6([
1086
+ kosUiSdk.kosTopicHandler({
1087
+ topic: [
1088
+ TOPIC_INSERT_START,
1089
+ TOPIC_INSERT_COMPLETE,
1090
+ TOPIC_INSERT_UPDATE,
1091
+ TOPIC_REMOVE,
1092
+ TOPIC_REPLACE_LINE
1093
+ ],
1094
+ websocket: true
1095
+ })
1096
+ ], HolderContainerModelImpl.prototype, "handleInsertion", 1);
1097
+ HolderContainerModelImpl = __decorateClass$6([
1098
+ kosUiSdk.kosModel(MODEL_TYPE$6)
1099
+ ], HolderContainerModelImpl);
1100
+ const HolderContainer = {
1101
+ registration: {
1102
+ [MODEL_TYPE$6]: {
1103
+ class: HolderContainerModelImpl,
1104
+ singleton: true
1105
+ }
1106
+ },
1107
+ type: MODEL_TYPE$6,
1108
+ predicate: kosUiSdk.isKosModel(MODEL_TYPE$6),
1109
+ factory: kosUiSdk.Kos.Singleton.create(
1110
+ MODEL_TYPE$6
1111
+ )
1112
+ };
1113
+ const Logger$1 = kosUiSdk.KosLog.createLogger({ name: "board-utils" });
1114
+ const mapAssemblyBoardToModel = async (board) => {
1115
+ const boardExtData = await kosUiSdk.KosExtensionUtils.executeDataMapperExtension({
1116
+ extension: ExtensionType.BoardMapper,
1117
+ data: board,
1118
+ contextData: {}
1119
+ });
1120
+ const { type, name, path, linked, instanceId, ...rest } = board;
1121
+ const extData = { ...rest, ...boardExtData };
1122
+ const options = {
1123
+ type,
1124
+ name,
1125
+ path,
1126
+ linked,
1127
+ instanceId,
1128
+ ...extData
1129
+ };
1130
+ const boardModel = Board.factory(board.path)(options);
1131
+ boardModel.updateModel(options);
1132
+ return boardModel;
1133
+ };
1134
+ const assemblyBoardMap = (boardContainer) => async (board) => {
1135
+ Logger$1.debug(`adding board ${board.name}`);
1136
+ const boardModel = await mapAssemblyBoardToModel(board);
1137
+ boardContainer.addModel(boardModel);
1138
+ };
1139
+ var PourState = /* @__PURE__ */ ((PourState2) => {
1140
+ PourState2["IDLE"] = "IDLE";
1141
+ PourState2["POURING"] = "POURING";
1142
+ PourState2["POUR_STARTING"] = "POUR_STARTING";
1143
+ PourState2["POUR_CANCELING"] = "POUR_CANCELING";
1144
+ return PourState2;
1145
+ })(PourState || {});
1146
+ const { URL: URL$2 } = kosUiSdk.resolveServiceUrl("PUMP_SERVICE");
1147
+ const { postModel: postModel$2, getOne: getOne$1 } = kosUiSdk.ServiceFactory.build({
1148
+ basePath: `${URL$2}/api/kos/holders`
1149
+ });
1150
+ kosUiSdk.KosLog.createLogger({
1151
+ name: "pump-service",
1152
+ group: "Services"
1153
+ });
1154
+ const sendIntent = async ({
1155
+ intent,
1156
+ pumpId,
1157
+ tracker
1158
+ }) => {
1159
+ const url = `${URL$2}/api/ext/dispense/nozzle/nozzle/pipeline/ingredient/pour/${pumpId}/${intent}`;
1160
+ const response = await postModel$2({ model: {}, urlOverride: url, tracker });
1161
+ if (response?.data) {
1162
+ kosUiSdk.FutureManager.initiateFuture(response.data);
1163
+ }
1164
+ return response;
1165
+ };
1166
+ const getIntentVolume = async (pumpId, intent) => {
1167
+ const url = `${URL$2}/api/ext/dispense/nozzle/nozzle/pipeline/ingredient/intent/${pumpId}/${intent}/volume`;
1168
+ const response = await getOne$1({ urlOverride: url });
1169
+ if (!response?.data) {
1170
+ return { volume: -1 };
1171
+ }
1172
+ return response.data;
1173
+ };
1174
+ var __defProp$4 = Object.defineProperty;
1175
+ var __getOwnPropDesc$5 = Object.getOwnPropertyDescriptor;
1176
+ var __decorateClass$5 = (decorators, target, key, kind) => {
1177
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$5(target, key) : target;
1178
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
1179
+ if (decorator = decorators[i])
1180
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1181
+ if (kind && result) __defProp$4(target, key, result);
1182
+ return result;
1183
+ };
1184
+ const MODEL_TYPE$5 = DispenseModelType.Pump;
1185
+ kosUiSdk.ExtensionManager[kosUiSdk.EXTENSION_TROUBLE_MAPPER].register(
1186
+ "pump",
1187
+ pumpTroubleResolver
1188
+ );
1189
+ let PumpModelImpl = class {
1190
+ id;
1191
+ inserted;
1192
+ type;
1193
+ virtual;
1194
+ ingredientId;
1195
+ holderPath;
1196
+ boardPath;
1197
+ nozzlePath;
1198
+ childPump;
1199
+ name;
1200
+ path;
1201
+ prevIngredientId;
1202
+ /**
1203
+ * @kosApiLevel 12
1204
+ */
1205
+ state;
1206
+ futureHandler;
1207
+ currentState = PourState.IDLE;
1208
+ constructor(modelId, options) {
1209
+ this.id = modelId;
1210
+ const {
1211
+ inserted,
1212
+ holderPath,
1213
+ boardPath,
1214
+ nozzlePath,
1215
+ name,
1216
+ path,
1217
+ childPump,
1218
+ virtual,
1219
+ prevIngredientId,
1220
+ state,
1221
+ ...rest
1222
+ } = options;
1223
+ this.inserted = inserted;
1224
+ this.type = options.type;
1225
+ this.ingredientId = options.ingredientId;
1226
+ this.holderPath = holderPath;
1227
+ this.boardPath = boardPath;
1228
+ this.nozzlePath = nozzlePath;
1229
+ this.name = name;
1230
+ this.path = path;
1231
+ this.childPump = !!childPump;
1232
+ this.virtual = !!virtual;
1233
+ this.prevIngredientId = prevIngredientId;
1234
+ this.state = state;
1235
+ Object.assign(this, rest);
1236
+ this.futureHandler = new kosUiSdk.FutureHandler(this);
1237
+ }
1238
+ updateModel(options) {
1239
+ const {
1240
+ inserted,
1241
+ holderPath,
1242
+ boardPath,
1243
+ nozzlePath,
1244
+ childPump,
1245
+ name,
1246
+ path,
1247
+ ...rest
1248
+ } = options;
1249
+ this.inserted = inserted;
1250
+ this.type = options.type;
1251
+ this.ingredientId = options.ingredientId;
1252
+ this.holderPath = holderPath;
1253
+ this.boardPath = boardPath;
1254
+ this.nozzlePath = nozzlePath;
1255
+ this.childPump = this.childPump ? this.childPump : !!childPump;
1256
+ this.name = name;
1257
+ this.path = path;
1258
+ this.prevIngredientId = options.prevIngredientId;
1259
+ Object.assign(this, rest);
1260
+ }
1261
+ // -------------------LIFECYCLE----------------------------
1262
+ get pouringState() {
1263
+ return this.future?.endState || "";
1264
+ }
1265
+ get isPouring() {
1266
+ return !!(this.future && !this.future?.endState) || this.currentState === PourState.POUR_STARTING || this.currentState === PourState.POURING;
1267
+ }
1268
+ get canPour() {
1269
+ return !!this.ingredientId && !this.isPouring;
1270
+ }
1271
+ onFutureUpdate(future) {
1272
+ if (future.endState) {
1273
+ kosUiSdk.kosAction(() => {
1274
+ this.currentState = PourState.IDLE;
1275
+ });
1276
+ }
1277
+ }
1278
+ async cancelPour() {
1279
+ if (this.currentState === PourState.POURING || this.currentState === PourState.POUR_STARTING) {
1280
+ this.currentState = PourState.POUR_CANCELING;
1281
+ await this.future?.cancelFuture();
1282
+ kosUiSdk.kosAction(() => {
1283
+ this.currentState = PourState.IDLE;
1284
+ });
1285
+ } else {
1286
+ kosUiSdk.KosLog.warn(`Cannot cancel pour in state ${this.currentState}`);
1287
+ }
1288
+ }
1289
+ get future() {
1290
+ return this.futureHandler.future;
1291
+ }
1292
+ async resolveIntentVolume(intent) {
1293
+ return await getIntentVolume(this.path, intent);
1294
+ }
1295
+ async performIntent(props, tracker) {
1296
+ const intent = typeof props === "string" ? props : props.intent;
1297
+ if (!intent) {
1298
+ throw new Error("No intent provided");
1299
+ }
1300
+ try {
1301
+ if (this.currentState === PourState.IDLE) {
1302
+ this.currentState = PourState.POUR_STARTING;
1303
+ if (!tracker) {
1304
+ throw new Error("No tracker provided");
1305
+ }
1306
+ const result = await sendIntent({
1307
+ tracker,
1308
+ intent,
1309
+ pumpId: this.path
1310
+ });
1311
+ if (this.currentState === PourState.POUR_STARTING) {
1312
+ kosUiSdk.kosAction(() => {
1313
+ this.currentState = PourState.POURING;
1314
+ });
1315
+ }
1316
+ return result?.data;
1317
+ } else {
1318
+ throw new Error(`Cannot pour in state ${this.currentState}`);
1319
+ }
1320
+ } catch (e) {
1321
+ kosUiSdk.KosLog.error(e);
1322
+ this.currentState = PourState.IDLE;
1323
+ throw e;
1324
+ }
1325
+ }
1326
+ // -------------------ENTITY----------------------------
1327
+ };
1328
+ __decorateClass$5([
1329
+ kosUiSdk.kosFuture()
1330
+ ], PumpModelImpl.prototype, "performIntent", 1);
1331
+ PumpModelImpl = __decorateClass$5([
1332
+ kosUiSdk.kosModel(MODEL_TYPE$5)
1333
+ ], PumpModelImpl);
1334
+ const Pump = {
1335
+ registration: {
1336
+ [MODEL_TYPE$5]: {
1337
+ class: PumpModelImpl,
1338
+ singleton: false
1339
+ }
1340
+ },
1341
+ type: MODEL_TYPE$5,
1342
+ predicate: kosUiSdk.isKosModel(MODEL_TYPE$5),
1343
+ factory: kosUiSdk.Kos.Factory.create(MODEL_TYPE$5)
1344
+ };
1345
+ const Logger = kosUiSdk.KosLog.createLogger({ name: "pump-utils" });
1346
+ const mapAssemblyPumpToModel = (nozzlePath, pump) => {
1347
+ const virtual = (pump.pumps ?? []).length > 1;
1348
+ const options = {
1349
+ boardPath: pump.boardPath,
1350
+ holderPath: pump.holderPath,
1351
+ ingredientId: pump.ingredientId,
1352
+ childPump: !!pump.childPump,
1353
+ virtual,
1354
+ inserted: pump.inserted,
1355
+ name: pump.name,
1356
+ path: pump.path,
1357
+ type: pump.type,
1358
+ nozzlePath,
1359
+ prevIngredientId: pump.prevIngredientId,
1360
+ state: pump.state
1361
+ };
1362
+ const pumpModel = Pump.factory(pump.path)(options);
1363
+ pumpModel.updateModel(options);
1364
+ return pumpModel;
1365
+ };
1366
+ const assemblyPumpMap = (pumpContainer) => (holderContainer) => (nozzle) => (assemblyPump) => {
1367
+ try {
1368
+ Logger.debug(`adding pump ${assemblyPump.name}`);
1369
+ const pump = mapAssemblyPumpToModel(nozzle.path, assemblyPump);
1370
+ pumpContainer.addModel(pump);
1371
+ const holderPath = pump.holderPath;
1372
+ const holder = holderContainer.holders.getModel(holderPath);
1373
+ holder?.pumps.addModel(pump);
1374
+ if (!holder?.nozzlePaths.includes(nozzle.path)) {
1375
+ holder?.nozzlePaths.push(nozzle.path);
1376
+ }
1377
+ assemblyPump?.pumps?.forEach((subPump) => {
1378
+ const subHolderPath = pump.holderPath;
1379
+ const subPumpData = {
1380
+ ...subPump,
1381
+ childPump: true,
1382
+ holderPath: subHolderPath,
1383
+ ingredientId: pump.ingredientId
1384
+ };
1385
+ assemblyPumpMap(pumpContainer)(holderContainer)(nozzle)(subPumpData);
1386
+ });
1387
+ } catch (error) {
1388
+ Logger.error(`Error mapping assembly pump: ${error}`);
1389
+ throw error;
1390
+ }
1391
+ };
1392
+ var __defProp$3 = Object.defineProperty;
1393
+ var __getOwnPropDesc$4 = Object.getOwnPropertyDescriptor;
1394
+ var __decorateClass$4 = (decorators, target, key, kind) => {
1395
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$4(target, key) : target;
1396
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
1397
+ if (decorator = decorators[i])
1398
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1399
+ if (kind && result) __defProp$3(target, key, result);
1400
+ return result;
1401
+ };
1402
+ const MODEL_TYPE$4 = "assembly-model";
1403
+ const CONTEXT_ASSEMBLY_DATA = "assembly-data";
1404
+ const CONTEXT_ASSEMBLY_RAW_DATA = "assembly-raw-data";
1405
+ let AssemblyModelImpl = class {
1406
+ id;
1407
+ _nozzlePaths = /* @__PURE__ */ new Set();
1408
+ troubleContainer;
1409
+ holderContainer;
1410
+ boardContainer;
1411
+ pumpContainer;
1412
+ logger;
1413
+ constructor(modelId, _options, context) {
1414
+ this.id = modelId;
1415
+ this.holderContainer = HolderContainer.factory({});
1416
+ this.boardContainer = BoardContainer.factory({});
1417
+ this.pumpContainer = PumpContainer.factory({});
1418
+ this.logger = context.logger;
1419
+ }
1420
+ updateModel(_options) {
1421
+ }
1422
+ get allHolders() {
1423
+ return this.holderContainer.holders.data;
1424
+ }
1425
+ get holderGroups() {
1426
+ return this.holderContainer.holders.getIndexKeys("group");
1427
+ }
1428
+ get nozzlePaths() {
1429
+ return Array.from(this._nozzlePaths);
1430
+ }
1431
+ getHoldersByGroup(group) {
1432
+ return this.holderContainer.holders.getIndexByKey("group", group);
1433
+ }
1434
+ getHoldersByNozzle(nozzlePath) {
1435
+ return this.holderContainer.holders.getIndexByKey("nozzle", nozzlePath);
1436
+ }
1437
+ /**
1438
+ * Returns a map of the pumps associated with each nozzle
1439
+ *
1440
+ * Can be used in conjunction with the nozzlePaths to get the pumps associated with each nozzle
1441
+ * @returns Record<string, PumpModel[]>
1442
+ */
1443
+ get pumpsByNozzle() {
1444
+ return this.pumpContainer.models.idx.byNozzle;
1445
+ }
1446
+ /**
1447
+ * Returns a list of all fo the pumps paths across the entire assembly.
1448
+ */
1449
+ get pumpPaths() {
1450
+ return this.pumpContainer.models.data.map((pump) => pump.path);
1451
+ }
1452
+ get boards() {
1453
+ return this.boardContainer.boardList;
1454
+ }
1455
+ // -------------------LIFECYCLE----------------------------
1456
+ async init() {
1457
+ this.logger.debug(`initializing assembly ${this.id}`);
1458
+ }
1459
+ async ready() {
1460
+ this.troubleContainer?.troubles.increment();
1461
+ kosUiSdk.ExtensionManager[kosUiSdk.EXTENSION_FEATURE_FLAG_RESOLVER].execute(
1462
+ ExtensionType.AssemblyFeatureFlags,
1463
+ this
1464
+ );
1465
+ }
1466
+ async load(context) {
1467
+ this.logger.debug(`loading assembly ${this.id}`);
1468
+ const result = await getAssembly();
1469
+ if (result?.status === 200) {
1470
+ const data = await kosUiSdk.KosExtensionUtils.executeDataMapperExtension({
1471
+ extension: ExtensionType.AssemblyMapper,
1472
+ data: result.data,
1473
+ contextData: {}
1474
+ });
1475
+ context.set(CONTEXT_ASSEMBLY_DATA, data);
1476
+ Object.assign(this, data);
1477
+ Object.entries(data).forEach(([key, value]) => {
1478
+ if (kosUiSdk.isKosDataModel(value)) {
1479
+ this.logger.debug(`adding child model ${key} from extension data`);
1480
+ this[kosUiSdk.ChildModels][key] = true;
1481
+ }
1482
+ });
1483
+ context.set(CONTEXT_ASSEMBLY_RAW_DATA, result.data);
1484
+ for await (const assembly of result.data.assemblies) {
1485
+ const {
1486
+ boards = [],
1487
+ holders: assemblyHolders = {},
1488
+ nozzles = [],
1489
+ core: _core,
1490
+ name,
1491
+ path: _path,
1492
+ ...rest
1493
+ } = assembly;
1494
+ this.logger.debug(`adding assembly ${name}`);
1495
+ this.logger.warn(`Assembly rest keys: ${Object.keys(rest).join(", ")}`);
1496
+ Object.keys(rest).forEach((key) => {
1497
+ this.logger.warn(`Enabling feature flag: ${key}`);
1498
+ kosUiSdk.KosFeatureFlags.enableFeature(key);
1499
+ context.set(`assembly-feature-${key}`, rest[key]);
1500
+ if (rest[key]["state"]?.["path"] !== void 0) {
1501
+ const statePath = rest[key]["state"]["path"];
1502
+ this.logger.warn(`Feature flag ${key} state path: ${statePath}`);
1503
+ context.set(`assembly-state-path-${key}`, statePath);
1504
+ }
1505
+ });
1506
+ for await (const board of boards) {
1507
+ this.logger.debug(`adding board ${board.name}`);
1508
+ const mapper = assemblyBoardMap(this.boardContainer);
1509
+ await mapper(board);
1510
+ }
1511
+ for await (const [group, holders] of Object.entries(
1512
+ assemblyHolders ?? {}
1513
+ )) {
1514
+ for await (const holder of holders) {
1515
+ this.logger.debug(`adding holder ${holder.name}`);
1516
+ const holderModel = await mapAssemblyHolderToModel(group, holder);
1517
+ this.holderContainer.holders.addModel(holderModel);
1518
+ }
1519
+ }
1520
+ const nozzlePumpMap = assemblyPumpMap(this.pumpContainer)(
1521
+ this.holderContainer
1522
+ );
1523
+ nozzles.forEach((nozzle) => {
1524
+ this._nozzlePaths.add(nozzle.path);
1525
+ const pumpMap = nozzlePumpMap(nozzle);
1526
+ nozzle.pumps.forEach(pumpMap);
1527
+ });
1528
+ }
1529
+ }
1530
+ }
1531
+ };
1532
+ __decorateClass$4([
1533
+ kosUiSdk.kosDependency({
1534
+ modelType: "trouble-container-model"
1535
+ })
1536
+ ], AssemblyModelImpl.prototype, "troubleContainer", 2);
1537
+ __decorateClass$4([
1538
+ kosUiSdk.kosChild
1539
+ ], AssemblyModelImpl.prototype, "holderContainer", 2);
1540
+ __decorateClass$4([
1541
+ kosUiSdk.kosChild
1542
+ ], AssemblyModelImpl.prototype, "boardContainer", 2);
1543
+ __decorateClass$4([
1544
+ kosUiSdk.kosChild
1545
+ ], AssemblyModelImpl.prototype, "pumpContainer", 2);
1546
+ AssemblyModelImpl = __decorateClass$4([
1547
+ kosUiSdk.kosModel(MODEL_TYPE$4)
1548
+ ], AssemblyModelImpl);
1549
+ const Assembly = {
1550
+ registration: {
1551
+ [MODEL_TYPE$4]: {
1552
+ class: AssemblyModelImpl,
1553
+ singleton: true
1554
+ }
1555
+ },
1556
+ type: MODEL_TYPE$4,
1557
+ predicate: kosUiSdk.isKosModel(MODEL_TYPE$4),
1558
+ factory: kosUiSdk.Kos.Singleton.create(MODEL_TYPE$4)
1559
+ };
1560
+ var __getOwnPropDesc$3 = Object.getOwnPropertyDescriptor;
1561
+ var __decorateClass$3 = (decorators, target, key, kind) => {
1562
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$3(target, key) : target;
1563
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
1564
+ if (decorator = decorators[i])
1565
+ result = decorator(result) || result;
1566
+ return result;
1567
+ };
1568
+ const MODEL_TYPE$3 = DispenseModelType.Availability;
1569
+ let AvailabilityModelImpl = class {
1570
+ id;
1571
+ data;
1572
+ properties;
1573
+ available;
1574
+ visible;
1575
+ groupId;
1576
+ rawId;
1577
+ altId;
1578
+ type;
1579
+ note;
1580
+ taggedIds;
1581
+ parentId;
1582
+ logger;
1583
+ constructor(modelId, options, context) {
1584
+ this.id = modelId;
1585
+ this.taggedIds = options.taggedIds || [];
1586
+ this.logger = context.logger;
1587
+ this.available = options.available;
1588
+ this.visible = options.visible;
1589
+ this.groupId = options.groupId;
1590
+ this.rawId = options.rawId;
1591
+ this.altId = options.altId;
1592
+ this.type = options.type;
1593
+ this.parentId = options.kosParentId;
1594
+ this.data = options.data;
1595
+ this.note = options.note;
1596
+ this.properties = options.properties || {};
1597
+ }
1598
+ updateModel(options) {
1599
+ this.taggedIds = options.taggedIds || [];
1600
+ this.available = options.available;
1601
+ this.visible = options.visible;
1602
+ this.groupId = options.groupId;
1603
+ this.rawId = options.rawId;
1604
+ this.altId = options.altId;
1605
+ this.type = options.type;
1606
+ this.data = options.data;
1607
+ }
1608
+ updateAvailability(available) {
1609
+ this.available = available;
1610
+ }
1611
+ // -------------------LIFECYCLE----------------------------
1612
+ // -------------------ENTITY----------------------------
1613
+ };
1614
+ AvailabilityModelImpl = __decorateClass$3([
1615
+ kosUiSdk.kosParentAware(),
1616
+ kosUiSdk.kosModel(MODEL_TYPE$3)
1617
+ ], AvailabilityModelImpl);
1618
+ const Availability = {
1619
+ registration: {
1620
+ [MODEL_TYPE$3]: {
1621
+ class: AvailabilityModelImpl,
1622
+ singleton: false
1623
+ }
1624
+ },
1625
+ type: MODEL_TYPE$3,
1626
+ predicate: kosUiSdk.isKosModel(MODEL_TYPE$3),
1627
+ factory: kosUiSdk.Kos.Factory.create(
1628
+ MODEL_TYPE$3
1629
+ )
1630
+ };
1631
+ const { URL: URL$1 } = kosUiSdk.resolveServiceUrl("NOZZLE_SERVICE");
1632
+ const { postModel: postModel$1, deleteModel, getOne } = kosUiSdk.ServiceFactory.build({
1633
+ basePath: `${URL$1}/api/nozzle`
1634
+ });
1635
+ const pourPourable = async (nozzleId, tracker) => {
1636
+ const response = await postModel$1({
1637
+ model: {},
1638
+ urlOverride: `${URL$1}/api/ext/dispense/nozzle/${nozzleId}/pipeline/beverage/pour/selected/maxVolume`,
1639
+ ordered: true,
1640
+ tracker
1641
+ });
1642
+ if (response?.data) {
1643
+ kosUiSdk.FutureManager.initiateFuture(response.data);
1644
+ }
1645
+ return response;
1646
+ };
1647
+ const pourNamedPourable = async (name, nozzleId, tracker) => {
1648
+ const response = await postModel$1({
1649
+ model: {},
1650
+ urlOverride: `${URL$1}/api/ext/dispense/nozzle/${nozzleId}/pipeline/beverage/fixed/${name}`,
1651
+ ordered: true,
1652
+ tracker
1653
+ });
1654
+ if (response?.data) {
1655
+ kosUiSdk.FutureManager.initiateFuture(response.data);
1656
+ }
1657
+ return response;
1658
+ };
1659
+ const getAvailability = async (urlPrefix) => {
1660
+ const response = await getOne({
1661
+ urlOverride: `${URL$1}${urlPrefix}/pipeline/beverage/availability`
1662
+ });
1663
+ return response;
1664
+ };
1665
+ const selectPourable = async (nozzleId, payload) => {
1666
+ const response = await postModel$1({
1667
+ model: payload,
1668
+ urlOverride: `${URL$1}/api/ext/dispense/nozzle/${nozzleId}/pipeline/beverage/select`
1669
+ });
1670
+ return response;
1671
+ };
1672
+ const clearPourable = async (nozzleId) => {
1673
+ const response = await deleteModel({
1674
+ id: nozzleId,
1675
+ urlOverride: `${URL$1}/api/ext/dispense/nozzle/${nozzleId}/pipeline/beverage/select`
1676
+ });
1677
+ return response;
1678
+ };
1679
+ var __defProp$2 = Object.defineProperty;
1680
+ var __getOwnPropDesc$2 = Object.getOwnPropertyDescriptor;
1681
+ var __decorateClass$2 = (decorators, target, key, kind) => {
1682
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$2(target, key) : target;
1683
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
1684
+ if (decorator = decorators[i])
1685
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1686
+ if (kind && result) __defProp$2(target, key, result);
1687
+ return result;
1688
+ };
1689
+ const MODEL_TYPE$2 = DispenseModelType.Nozzle;
1690
+ const PROP_BEVERAGE_TOPIC_PREFIX = kosUiSdk.createPropKey(
1691
+ "beverageTopicPrefix"
1692
+ );
1693
+ const isPourAware$1 = (model) => model.onPourStart !== void 0 && model.onPourCancel !== void 0 && model.onPourProgress !== void 0;
1694
+ const TOPIC_NOZZLE_POUR_STARTED = "/kos/nozzle/pour/started";
1695
+ const TOPIC_NOZZLE_POUR_PROGRESS = "/kos/nozzle/pour/progress";
1696
+ const TOPIC_NOZZLE_POUR_CANCEL = "/kos/nozzle/pour/cancel";
1697
+ let NozzleModelImpl = class {
1698
+ /** the unique identifier for this nozzle.*/
1699
+ id;
1700
+ path;
1701
+ name;
1702
+ _selectedBeverage;
1703
+ _selectedBrand;
1704
+ _additionalItems;
1705
+ _availabilityItems;
1706
+ futureHandler;
1707
+ beverageTopicPrefix;
1708
+ topicPrefix;
1709
+ urlPrefix;
1710
+ /**
1711
+ * The availability nodes that can be dispensed from this nozzle.
1712
+ * This is a subset of the availability for the entire dispenser
1713
+ * and is determined by the nodes associated with a nozzle.
1714
+ */
1715
+ get beverages() {
1716
+ return this._availabilityItems.getIndexByKey("byGroup", "beverages");
1717
+ }
1718
+ /**
1719
+ * The availability nodes that have been grouped into the "brands" group.
1720
+ *
1721
+ */
1722
+ get brands() {
1723
+ return this._availabilityItems.getIndexByKey("byGroup", "brands");
1724
+ }
1725
+ get visibleBrands() {
1726
+ return this.brands.filter((brand) => brand.visible);
1727
+ }
1728
+ get visibleBeverages() {
1729
+ return this.beverages.filter((beverage) => beverage.visible);
1730
+ }
1731
+ /**
1732
+ * A derived value that indicates if the nozzle is currently pouring a beverage.
1733
+ * @readonly
1734
+ */
1735
+ get isPouring() {
1736
+ return !!(this.futureHandler.getFuture() && !this.futureHandler.getFuture()?.endState) || this.currentState === PourState.POUR_STARTING || this.currentState === PourState.POURING || this.currentState === PourState.POUR_CANCELING;
1737
+ }
1738
+ /**
1739
+ * A derived value that indicates if the nozzle is currently available to pour a beverage.
1740
+ *
1741
+ * This will generally be determined by whether there is a currently selected pourable AND
1742
+ * the nozzle is not currently pouring.
1743
+ *
1744
+ * The value is observable and will change when the selected pourable changes or the nozzle
1745
+ * starts or stops pouring.
1746
+ * @readonly
1747
+ * */
1748
+ get canPour() {
1749
+ return !!this._selectedBeverage && this._selectedBeverage.available && this.currentState === PourState.IDLE;
1750
+ }
1751
+ /**
1752
+ * The selected pourable for this nozzle. Its shape is determined by the results of the
1753
+ * {@link ExtensionType.SelectedPourableMapper} extension.
1754
+ * @readonly
1755
+ *
1756
+ * */
1757
+ get selectedPourable() {
1758
+ return {
1759
+ beverage: this._selectedBeverage,
1760
+ additional: this._additionalItems
1761
+ };
1762
+ }
1763
+ get future() {
1764
+ return this.futureHandler.getFuture();
1765
+ }
1766
+ get pourProgress() {
1767
+ return this.future?.progress ?? 0;
1768
+ }
1769
+ constructor(modelId, options) {
1770
+ this.id = modelId;
1771
+ this.path = options.path;
1772
+ this.name = options.name;
1773
+ this.beverageTopicPrefix = options.beverageTopicPrefix;
1774
+ this.topicPrefix = options.topicPrefix;
1775
+ this.urlPrefix = options.urlPrefix;
1776
+ this._selectedBeverage = void 0;
1777
+ this._selectedBrand = void 0;
1778
+ this._additionalItems = [];
1779
+ this.futureHandler = new kosUiSdk.MultipleFutureHandler(this);
1780
+ this._availabilityItems = new kosUiSdk.KosModelContainer({
1781
+ indexMap: {
1782
+ byGroup: "groupId",
1783
+ byParent: "parentId"
1784
+ },
1785
+ parentId: modelId
1786
+ });
1787
+ }
1788
+ updateModel() {
1789
+ }
1790
+ // -------------------LIFECYCLE----------------------------
1791
+ setSelectedBrand(brand, _context) {
1792
+ if (_context) {
1793
+ this.logger.debug(`context is currenty being ignored when setting brand`);
1794
+ }
1795
+ this._selectedBrand = brand;
1796
+ this._selectedBeverage = void 0;
1797
+ }
1798
+ get selectedBrand() {
1799
+ return this._selectedBrand;
1800
+ }
1801
+ /**
1802
+ * Set the values used to determine the selected pourable for this nozzle.
1803
+ *
1804
+ * @param pourable The pourable to set.
1805
+ * @param pourable.beverage The beverage selected.
1806
+ * @param pourable.additional The additional items such as flavors or other items that could be incorporated
1807
+ * into the pourable.
1808
+ * */
1809
+ async setSelectedPourable({ beverage, additional, context }, forceUpdate = false) {
1810
+ if (!beverage) {
1811
+ const response2 = await clearPourable(this.name);
1812
+ if (response2?.status !== 200) {
1813
+ throw new Error("Failed to clear pourable");
1814
+ }
1815
+ this._selectedBeverage = void 0;
1816
+ return;
1817
+ }
1818
+ if (!forceUpdate && beverage === this._selectedBeverage && kosUiSdk.arraysEqual(this._additionalItems, additional)) {
1819
+ this.logger.info("No change in selected pourable");
1820
+ return;
1821
+ }
1822
+ this._selectedBeverage = beverage;
1823
+ this._additionalItems = additional;
1824
+ let selectedPayload;
1825
+ try {
1826
+ selectedPayload = await kosUiSdk.ExtensionManager.dataMapper.executeMapper(
1827
+ ExtensionType.SelectedPourableMapper,
1828
+ {
1829
+ beverage,
1830
+ additional,
1831
+ context
1832
+ }
1833
+ );
1834
+ } catch (e) {
1835
+ this.logger.error(
1836
+ `Error executing SelectedPourableMapper, falling back to default payload. Error: ${e}`
1837
+ );
1838
+ selectedPayload = void 0;
1839
+ }
1840
+ const defaultPayload = {
1841
+ bevId: beverage.rawId
1842
+ };
1843
+ if (!selectedPayload || Object.keys(selectedPayload).length === 0) {
1844
+ this.logger.info(
1845
+ `No selected pourable mapper defined, using the default payload ${defaultPayload}`
1846
+ );
1847
+ selectedPayload = defaultPayload;
1848
+ }
1849
+ const payload = selectedPayload ?? defaultPayload;
1850
+ const response = await selectPourable(this.name, payload);
1851
+ if (response?.status !== 200) {
1852
+ throw new Error("Failed to select pourable");
1853
+ }
1854
+ }
1855
+ /**
1856
+ * Utility method that will return the availability nodes that belong to the specified
1857
+ * group as defined in the dispenser beverage graph. For example, a dispenser
1858
+ * implementation may group availability nodes by Brand, Beverage, or Flavors
1859
+ *
1860
+ * @param groupId The group to filter by.
1861
+ * @returns The availability nodes that are available to be dispensed from this nozzle
1862
+ * and are in the specified group.
1863
+ * */
1864
+ getGroupAvailabilityItems(groupId) {
1865
+ return this._availabilityItems.getIndexByKey(
1866
+ "byGroup",
1867
+ groupId
1868
+ );
1869
+ }
1870
+ /**
1871
+ * Utility method that will return the availability nodes that are tagged with the specified parent id.
1872
+ *
1873
+ * This is useful when brandsets use the taggedIds property to associate nodes with a parent node. For example,
1874
+ * when organizing a brandset into brands and beverages, the brand nodes will be tagged with the beverage nodes.
1875
+ *
1876
+ * @param parentId - The parent id to filter by.
1877
+ * @returns the availability nodes that are tagged with the specified parent id.
1878
+ */
1879
+ getAvailabilityByParent(parentId) {
1880
+ return this._availabilityItems.getIndexByKey(
1881
+ "byParent",
1882
+ parentId
1883
+ );
1884
+ }
1885
+ handlePouringStart() {
1886
+ this.logger.info("Pour started");
1887
+ kosUiSdk.getAllKosCompanionModels(this).forEach((model) => {
1888
+ if (isPourAware$1(model)) {
1889
+ model.onPourStart?.();
1890
+ }
1891
+ });
1892
+ }
1893
+ handlePouringEnd() {
1894
+ this.logger.info("Pour ended");
1895
+ }
1896
+ handleCancelStart() {
1897
+ this.logger.info("Pour canceling");
1898
+ }
1899
+ handleCanceled() {
1900
+ this.logger.info("Pour canceled");
1901
+ kosUiSdk.getAllKosCompanionModels(this).forEach((model) => {
1902
+ if (isPourAware$1(model)) {
1903
+ model.onPourCancel?.();
1904
+ }
1905
+ });
1906
+ const evt = {
1907
+ nozzleId: this.id
1908
+ };
1909
+ kosUiSdk.EventBus.publish(TOPIC_NOZZLE_POUR_CANCEL, evt);
1910
+ }
1911
+ // ============================================================================
1912
+ // Future Lifecycle Handler
1913
+ // ============================================================================
1914
+ onFutureUpdate(future) {
1915
+ const companions = kosUiSdk.getAllKosCompanionModels(this);
1916
+ companions.forEach((model) => {
1917
+ if (isPourAware$1(model)) {
1918
+ model.onPourProgress(future);
1919
+ }
1920
+ });
1921
+ const evt = {
1922
+ nozzleId: this.id,
1923
+ progress: future.progress,
1924
+ status: future.status,
1925
+ clientData: future.clientData,
1926
+ futureId: future.futureId,
1927
+ remainingTimeMs: future.remainingTimeMs,
1928
+ endState: future.endState,
1929
+ reason: future.reason,
1930
+ timeRemaining: future.timeRemaining
1931
+ };
1932
+ kosUiSdk.EventBus.publish(TOPIC_NOZZLE_POUR_PROGRESS, evt);
1933
+ if (future.endState) {
1934
+ kosUiSdk.kosAction(() => {
1935
+ if (this.currentState === PourState.POURING) {
1936
+ this.transition("POUR_COMPLETED");
1937
+ }
1938
+ });
1939
+ }
1940
+ }
1941
+ // Inherits throwOnInvalid: false from class
1942
+ async pour(tracker) {
1943
+ try {
1944
+ this.transition("START_POUR");
1945
+ if (!tracker) {
1946
+ throw new Error("No tracker provided");
1947
+ }
1948
+ const result = await pourPourable(this.name, tracker);
1949
+ this.transition("POUR_ACTIVE");
1950
+ const evt = {
1951
+ nozzleId: this.id,
1952
+ type: "free"
1953
+ };
1954
+ kosUiSdk.EventBus.publish(TOPIC_NOZZLE_POUR_STARTED, evt);
1955
+ if (result?.data?.endState) {
1956
+ this.transition("POUR_COMPLETED");
1957
+ }
1958
+ return result;
1959
+ } catch (e) {
1960
+ this.logger.error(e);
1961
+ if (this.currentState !== PourState.IDLE) {
1962
+ this.transition("POUR_COMPLETED");
1963
+ }
1964
+ throw e;
1965
+ }
1966
+ }
1967
+ // Inherits throwOnInvalid: false from class
1968
+ async fixedPour(name, tracker) {
1969
+ try {
1970
+ this.transition("START_POUR");
1971
+ if (!tracker) {
1972
+ throw new Error("No tracker provided");
1973
+ }
1974
+ const result = await pourNamedPourable(name, this.name, tracker);
1975
+ this.transition("POUR_ACTIVE");
1976
+ const evt = {
1977
+ nozzleId: this.id,
1978
+ type: "fixed"
1979
+ };
1980
+ kosUiSdk.EventBus.publish(TOPIC_NOZZLE_POUR_STARTED, evt);
1981
+ if (result?.data?.endState) {
1982
+ this.transition("POUR_COMPLETED");
1983
+ }
1984
+ return result;
1985
+ } catch (e) {
1986
+ this.logger.error(e);
1987
+ if (this.currentState !== PourState.IDLE) {
1988
+ this.transition("POUR_COMPLETED");
1989
+ }
1990
+ throw e;
1991
+ }
1992
+ }
1993
+ // Inherits throwOnInvalid: false - silently ignore if already idle
1994
+ async cancelPour() {
1995
+ this.transition("CANCEL_POUR");
1996
+ await this.futureHandler.getFuture()?.cancelFuture();
1997
+ this.transition("POUR_CANCELED");
1998
+ }
1999
+ updateGroupMembers() {
2000
+ this._availabilityItems.data.forEach((item) => {
2001
+ const taggedIds = item.taggedIds || [];
2002
+ taggedIds.forEach((taggedId) => {
2003
+ const childItem = this._availabilityItems.data.find(
2004
+ (beverage) => beverage.rawId === taggedId
2005
+ );
2006
+ if (childItem && childItem.parentId !== item.id) {
2007
+ childItem.parentId = item.id;
2008
+ this._availabilityItems.updateModel(childItem);
2009
+ }
2010
+ });
2011
+ });
2012
+ }
2013
+ async reload() {
2014
+ this.logger.info(`reloading nozzle ${this.id}`);
2015
+ const context = kosUiSdk.KosContextManager.getContext(this.id);
2016
+ context?.get(ExtensionType.AvailabilityLoader) || {};
2017
+ const availability = await getAvailability(this.urlPrefix);
2018
+ if (availability?.status !== 200 || !availability?.data) {
2019
+ this.logger.error("Failed to load nozzle availability");
2020
+ return;
2021
+ }
2022
+ const update = availability?.data;
2023
+ if (update) {
2024
+ await this.updateAvailability(update);
2025
+ }
2026
+ }
2027
+ /** @internal */
2028
+ async load(context) {
2029
+ this.logger.debug(`loading nozzle ${this.id}`);
2030
+ const availability = await getAvailability(this.urlPrefix);
2031
+ if (availability?.status !== 200) {
2032
+ throw new Error("Failed to load nozzle availability");
2033
+ }
2034
+ const beverageContext = await kosUiSdk.ExtensionManager.loader.executeLoader(
2035
+ ExtensionType.AvailabilityLoader,
2036
+ {}
2037
+ );
2038
+ context?.set(ExtensionType.AvailabilityLoader, beverageContext);
2039
+ context?.set(Nozzle.type, this);
2040
+ for (const group of Object.keys(availability.data?.groups) || []) {
2041
+ for (const beverageData of availability.data?.groups[group] || []) {
2042
+ const extensionData = await kosUiSdk.ExtensionManager.dataMapper.executeMapper(
2043
+ ExtensionType.AvailabilityMapper,
2044
+ { ...beverageData, groupId: group },
2045
+ beverageContext
2046
+ );
2047
+ const beverageOptions = {
2048
+ ...beverageData,
2049
+ note: beverageData.note ?? void 0,
2050
+ kosParentId: this.id,
2051
+ rawId: beverageData.id,
2052
+ groupId: group,
2053
+ data: extensionData,
2054
+ properties: beverageData.properties || {}
2055
+ };
2056
+ const beverage = Availability.factory(
2057
+ `${this.id}-${group}-${beverageData.id}`
2058
+ )(beverageOptions);
2059
+ this._availabilityItems.addModel(beverage);
2060
+ }
2061
+ }
2062
+ this.updateGroupMembers();
2063
+ }
2064
+ async updateAvailability(update) {
2065
+ const context = kosUiSdk.KosContextManager.getContext(this.id);
2066
+ const beverageContext = context?.get(ExtensionType.AvailabilityLoader) || {};
2067
+ if (update.rebuild) {
2068
+ this.logger.info(
2069
+ `Received rebuild update for nozzle ${this.path}, rebuilding entire availability set`
2070
+ );
2071
+ for (const group of Object.keys(update?.groups) || []) {
2072
+ const deletedBeverages = this._availabilityItems.getIndexByKey("group", group).filter(
2073
+ (beverage) => !update.groups[group].find(
2074
+ (b) => `${this.id}-${group}-${b.id}` === beverage.id
2075
+ )
2076
+ );
2077
+ deletedBeverages.forEach((beverage) => {
2078
+ this.logger.info(
2079
+ `Removing beverage ${beverage.id} from nozzle ${this.path} due to rebuild update`
2080
+ );
2081
+ this._availabilityItems.removeModel(beverage.id);
2082
+ kosUiSdk.destroyKosModel(beverage);
2083
+ });
2084
+ for (const beverageData of update?.groups[group] || []) {
2085
+ const extensionData = await kosUiSdk.ExtensionManager.dataMapper.executeMapper(
2086
+ ExtensionType.AvailabilityMapper,
2087
+ { ...beverageData, groupId: group },
2088
+ beverageContext
2089
+ );
2090
+ const beverageOptions = {
2091
+ ...beverageData,
2092
+ note: beverageData.note ?? void 0,
2093
+ kosParentId: this.id,
2094
+ groupId: group,
2095
+ rawId: beverageData.id,
2096
+ data: extensionData,
2097
+ taggedIds: beverageData.taggedIds,
2098
+ properties: beverageData.properties || {}
2099
+ };
2100
+ const existing = this._availabilityItems.getModel(
2101
+ `${this.id}-${group}-${beverageData.id}`
2102
+ );
2103
+ if (existing) {
2104
+ if (existing.available !== beverageOptions.available) {
2105
+ this.logger.info(
2106
+ `Updating availability of beverage ${existing.id} in nozzle ${this.path} to ${beverageOptions.available}`
2107
+ );
2108
+ }
2109
+ existing.updateModel(beverageOptions);
2110
+ } else {
2111
+ this.logger.info(
2112
+ `Adding beverage ${beverageData.id} to nozzle ${this.path}`
2113
+ );
2114
+ const beverage = Availability.factory(
2115
+ `${this.id}-${group}-${beverageData.id}`
2116
+ )(beverageOptions);
2117
+ this._availabilityItems.addModel(beverage);
2118
+ }
2119
+ }
2120
+ }
2121
+ } else {
2122
+ this.logger.info(
2123
+ `Received delta update for nozzle ${this.path}, updating availability nodes`
2124
+ );
2125
+ for (const group of Object.keys(update?.groups) || []) {
2126
+ for (const beverageData of update?.groups[group] || []) {
2127
+ const extensionData = await kosUiSdk.ExtensionManager.dataMapper.executeMapper(
2128
+ ExtensionType.AvailabilityMapper,
2129
+ { ...beverageData, groupId: group },
2130
+ beverageContext
2131
+ );
2132
+ const beverageOptions = {
2133
+ ...beverageData,
2134
+ note: beverageData.note ?? void 0,
2135
+ kosParentId: this.id,
2136
+ groupId: group,
2137
+ rawId: beverageData.id,
2138
+ data: extensionData,
2139
+ type: beverageData.type,
2140
+ taggedIds: beverageData.taggedIds,
2141
+ properties: beverageData.properties || {}
2142
+ };
2143
+ const existing = this._availabilityItems.getModel(
2144
+ `${this.id}-${group}-${beverageData.id}`
2145
+ );
2146
+ if (existing) {
2147
+ if (existing.available !== beverageOptions.available) {
2148
+ this.logger.info(
2149
+ `Updating availability of beverage ${existing.id} in nozzle ${this.path} to ${beverageOptions.available}`
2150
+ );
2151
+ }
2152
+ existing.updateModel(beverageOptions);
2153
+ }
2154
+ }
2155
+ }
2156
+ }
2157
+ this.updateGroupMembers();
2158
+ }
2159
+ // -------------------ENTITY----------------------------
2160
+ };
2161
+ __decorateClass$2([
2162
+ kosUiSdk.kosChild
2163
+ ], NozzleModelImpl.prototype, "_availabilityItems", 2);
2164
+ __decorateClass$2([
2165
+ kosUiSdk.kosStateEntry(PourState.POURING)
2166
+ ], NozzleModelImpl.prototype, "handlePouringStart", 1);
2167
+ __decorateClass$2([
2168
+ kosUiSdk.kosStateExit(PourState.POURING)
2169
+ ], NozzleModelImpl.prototype, "handlePouringEnd", 1);
2170
+ __decorateClass$2([
2171
+ kosUiSdk.kosStateEntry(PourState.POUR_CANCELING)
2172
+ ], NozzleModelImpl.prototype, "handleCancelStart", 1);
2173
+ __decorateClass$2([
2174
+ kosUiSdk.kosStateExit(PourState.POUR_CANCELING)
2175
+ ], NozzleModelImpl.prototype, "handleCanceled", 1);
2176
+ __decorateClass$2([
2177
+ kosUiSdk.kosFuture(),
2178
+ kosUiSdk.kosStateGuard({ allowedStates: [PourState.IDLE] })
2179
+ ], NozzleModelImpl.prototype, "pour", 1);
2180
+ __decorateClass$2([
2181
+ kosUiSdk.kosFuture(),
2182
+ kosUiSdk.kosStateGuard({ allowedStates: [PourState.IDLE] })
2183
+ ], NozzleModelImpl.prototype, "fixedPour", 1);
2184
+ __decorateClass$2([
2185
+ kosUiSdk.kosStateGuard({
2186
+ allowedStates: [PourState.POUR_STARTING, PourState.POURING]
2187
+ })
2188
+ ], NozzleModelImpl.prototype, "cancelPour", 1);
2189
+ __decorateClass$2([
2190
+ kosUiSdk.kosTopicHandler({
2191
+ topic: `${PROP_BEVERAGE_TOPIC_PREFIX}/availability`,
2192
+ websocket: true
2193
+ })
2194
+ ], NozzleModelImpl.prototype, "updateAvailability", 1);
2195
+ NozzleModelImpl = __decorateClass$2([
2196
+ kosUiSdk.kosModel({ modelTypeId: MODEL_TYPE$2, singleton: false }),
2197
+ kosUiSdk.kosLoggerAware(),
2198
+ kosUiSdk.kosStateMachine(
2199
+ {
2200
+ initial: PourState.IDLE,
2201
+ initializeAt: kosUiSdk.DependencyLifecycle.READY,
2202
+ states: {
2203
+ [PourState.IDLE]: {
2204
+ on: {
2205
+ START_POUR: PourState.POUR_STARTING
2206
+ }
2207
+ },
2208
+ [PourState.POUR_STARTING]: {
2209
+ on: {
2210
+ POUR_ACTIVE: PourState.POURING,
2211
+ CANCEL_POUR: PourState.POUR_CANCELING,
2212
+ POUR_COMPLETED: PourState.IDLE
2213
+ }
2214
+ },
2215
+ [PourState.POURING]: {
2216
+ on: {
2217
+ CANCEL_POUR: PourState.POUR_CANCELING,
2218
+ POUR_COMPLETED: PourState.IDLE
2219
+ }
2220
+ },
2221
+ [PourState.POUR_CANCELING]: {
2222
+ on: {
2223
+ POUR_CANCELED: PourState.IDLE
2224
+ }
2225
+ }
2226
+ }
2227
+ },
2228
+ {
2229
+ trackHistory: false,
2230
+ throwOnInvalid: false
2231
+ // Gracefully ignore invalid state calls (expected runtime scenarios)
2232
+ }
2233
+ )
2234
+ ], NozzleModelImpl);
2235
+ const Nozzle = {
2236
+ registration: {
2237
+ [MODEL_TYPE$2]: {
2238
+ class: NozzleModelImpl,
2239
+ singleton: false
2240
+ }
2241
+ },
2242
+ type: MODEL_TYPE$2,
2243
+ predicate: kosUiSdk.isKosModel(MODEL_TYPE$2),
2244
+ factory: kosUiSdk.Kos.Factory.create(MODEL_TYPE$2)
2245
+ };
2246
+ var __defProp$1 = Object.defineProperty;
2247
+ var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
2248
+ var __decorateClass$1 = (decorators, target, key, kind) => {
2249
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$1(target, key) : target;
2250
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
2251
+ if (decorator = decorators[i])
2252
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
2253
+ if (kind && result) __defProp$1(target, key, result);
2254
+ return result;
2255
+ };
2256
+ const MODEL_TYPE$1 = "device-assembly-model";
2257
+ let DeviceAssemblyModelImpl = class {
2258
+ id;
2259
+ deviceNozzles;
2260
+ logger;
2261
+ constructor(modelId, _options, context) {
2262
+ this.id = modelId;
2263
+ this.logger = context.logger;
2264
+ this.deviceNozzles = new kosUiSdk.KosModelContainer();
2265
+ }
2266
+ // -------------------LIFECYCLE----------------------------
2267
+ async init() {
2268
+ this.logger.debug(`initializing device-assembly ${this.id}`);
2269
+ }
2270
+ getNozzle(path) {
2271
+ return this.deviceNozzles.getModel(path);
2272
+ }
2273
+ get nozzlePaths() {
2274
+ return this.deviceNozzles.data.map((nozzle) => nozzle.path);
2275
+ }
2276
+ async load() {
2277
+ this.logger.debug(`loading device-assembly ${this.id}`);
2278
+ const result = await getAssembly();
2279
+ if (result?.status === 200) {
2280
+ const nozzles = result.data.assemblies.map((assembly) => assembly.nozzles ?? []).flat();
2281
+ nozzles.forEach((nozzleData) => {
2282
+ const nozzleId = nozzleData.path;
2283
+ const beverageTopicPrefix = nozzleData.pipelines.find((pipeline) => pipeline.name === "beverage")?.topicPrefix || "";
2284
+ const nozzle = Nozzle.factory(nozzleId)({
2285
+ path: nozzleData.path,
2286
+ name: nozzleData.name,
2287
+ urlPrefix: nozzleData.urlPrefix,
2288
+ topicPrefix: nozzleData.topicPrefix,
2289
+ beverageTopicPrefix
2290
+ });
2291
+ this.deviceNozzles.addModel(nozzle);
2292
+ });
2293
+ }
2294
+ }
2295
+ };
2296
+ __decorateClass$1([
2297
+ kosUiSdk.kosChild
2298
+ ], DeviceAssemblyModelImpl.prototype, "deviceNozzles", 2);
2299
+ DeviceAssemblyModelImpl = __decorateClass$1([
2300
+ kosUiSdk.kosModel(MODEL_TYPE$1)
2301
+ ], DeviceAssemblyModelImpl);
2302
+ const DeviceAssembly = new kosUiSdk.SingletonKosModelRegistrationFactory({
2303
+ class: DeviceAssemblyModelImpl,
2304
+ type: MODEL_TYPE$1
2305
+ });
2306
+ const { URL } = kosUiSdk.resolveServiceUrl("GENERIC_POUR_SERVICE");
2307
+ const { postModel } = kosUiSdk.ServiceFactory.build({
2308
+ basePath: `${URL}/api/nozzle`
2309
+ });
2310
+ const pourOnTarget = async (path, tracker) => {
2311
+ const response = await postModel({
2312
+ model: {},
2313
+ urlOverride: `${URL}${path}`,
2314
+ ordered: true,
2315
+ tracker
2316
+ });
2317
+ if (response?.data) {
2318
+ kosUiSdk.FutureManager.initiateFuture(response.data);
2319
+ }
2320
+ return response;
2321
+ };
2322
+ var __defProp = Object.defineProperty;
2323
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
2324
+ var __decorateClass = (decorators, target, key, kind) => {
2325
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
2326
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
2327
+ if (decorator = decorators[i])
2328
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
2329
+ if (kind && result) __defProp(target, key, result);
2330
+ return result;
2331
+ };
2332
+ const MODEL_TYPE = "generic-pour-model";
2333
+ const TOPIC_GENERIC_POUR_STARTED = "/kos/generic/pour/started";
2334
+ const TOPIC_GENERIC_POUR_PROGRESS = "/kos/generic/pour/progress";
2335
+ const TOPIC_GENERIC_POUR_CANCEL = "/kos/generic/pour/cancel";
2336
+ const isPourAware = (model) => model.onPourStart !== void 0 && model.onPourCancel !== void 0 && model.onPourProgress !== void 0;
2337
+ let GenericPourModelImpl = class {
2338
+ id;
2339
+ /**
2340
+ * @kosApiLevel 5
2341
+ */
2342
+ servicePathFactory;
2343
+ pourType;
2344
+ /**
2345
+ * @kosApiLevel 5
2346
+ */
2347
+ selectedId;
2348
+ state;
2349
+ constructor(modelId, options) {
2350
+ this.id = modelId;
2351
+ this.futureHandler = new kosUiSdk.FutureHandler(this);
2352
+ this.servicePathFactory = options.servicePathFactory;
2353
+ this.pourType = options.pourType || "free";
2354
+ this.selectedId = options.selectedId;
2355
+ this.state = kosUiSdk.ObservableData(options.initialData || {});
2356
+ }
2357
+ get servicePath() {
2358
+ if (!this.selectedId) {
2359
+ return "";
2360
+ }
2361
+ return this.servicePathFactory(this.selectedId, this.state);
2362
+ }
2363
+ /**
2364
+ * @kosApiLevel 12
2365
+ */
2366
+ updateContextData(key, value) {
2367
+ this.state[key] = value;
2368
+ }
2369
+ /**
2370
+ * @kosApiLevel 12
2371
+ */
2372
+ removeContextData(key) {
2373
+ delete this.state[key];
2374
+ }
2375
+ /**
2376
+ * @kosApiLevel 12
2377
+ */
2378
+ clearContextData() {
2379
+ this.state = kosUiSdk.ObservableData();
2380
+ }
2381
+ /**
2382
+ * @kosApiLevel 14
2383
+ */
2384
+ updateModel(options) {
2385
+ if (options.pourType) {
2386
+ this.pourType = options.pourType;
2387
+ }
2388
+ if (options.initialData) {
2389
+ this.state.setValues(options.initialData);
2390
+ }
2391
+ }
2392
+ handlePouringStart() {
2393
+ this.logger.info("Pour started");
2394
+ kosUiSdk.getAllKosCompanionModels(this).forEach((model) => {
2395
+ if (isPourAware(model)) {
2396
+ model.onPourStart?.();
2397
+ }
2398
+ });
2399
+ const evt = {
2400
+ pourTarget: this.id,
2401
+ type: this.pourType
2402
+ };
2403
+ kosUiSdk.EventBus.publish(TOPIC_GENERIC_POUR_STARTED, evt);
2404
+ }
2405
+ handlePouringEnd() {
2406
+ this.logger.info("Pour ended");
2407
+ }
2408
+ handleCancelStart() {
2409
+ this.logger.info("Pour canceling");
2410
+ }
2411
+ handleCanceled() {
2412
+ this.logger.info("Pour canceled");
2413
+ kosUiSdk.getAllKosCompanionModels(this).forEach((model) => {
2414
+ if (isPourAware(model)) {
2415
+ model.onPourCancel?.();
2416
+ }
2417
+ });
2418
+ const evt = {
2419
+ pourTarget: this.id
2420
+ };
2421
+ kosUiSdk.EventBus.publish(TOPIC_GENERIC_POUR_CANCEL, evt);
2422
+ }
2423
+ // Inherits throwOnInvalid: false from class
2424
+ async pour(tracker) {
2425
+ try {
2426
+ this.transition("START_POUR");
2427
+ if (!tracker) {
2428
+ throw new Error("No tracker provided");
2429
+ }
2430
+ const result = await pourOnTarget(this.servicePath, tracker);
2431
+ this.transition("POUR_ACTIVE");
2432
+ if (result?.data?.endState) {
2433
+ this.transition("POUR_COMPLETED");
2434
+ }
2435
+ return result;
2436
+ } catch (e) {
2437
+ this.logger.error(e);
2438
+ if (this.currentState !== PourState.IDLE) {
2439
+ this.transition("POUR_COMPLETED");
2440
+ }
2441
+ throw e;
2442
+ }
2443
+ }
2444
+ // Inherits throwOnInvalid: false - silently ignore if already idle
2445
+ async cancelPour() {
2446
+ this.transition("CANCEL_POUR");
2447
+ await this.futureHandler.getFuture()?.cancelFuture();
2448
+ this.transition("POUR_CANCELED");
2449
+ }
2450
+ // ============================================================================
2451
+ // Computed Properties
2452
+ // ============================================================================
2453
+ /**
2454
+ * A derived value that indicates if the nozzle is currently pouring a beverage.
2455
+ * @readonly
2456
+ */
2457
+ get isPouring() {
2458
+ return !!(this.future && !this.future?.endState) || this.currentState === PourState.POUR_STARTING || this.currentState === PourState.POURING || this.currentState === PourState.POUR_CANCELING;
2459
+ }
2460
+ /**
2461
+ * A derived value that indicates if the pour target is currently available to pour a beverage.
2462
+ *
2463
+ * Generally this means that the pour target is currently idle and not in the process of pouring,
2464
+ * initiating a pour, or canceling a pour.
2465
+ * The value is observable and will change when the selected pourable changes or the pour target
2466
+ * starts or stops pouring.
2467
+ * @readonly
2468
+ */
2469
+ get canPour() {
2470
+ return this.currentState === PourState.IDLE;
2471
+ }
2472
+ get pourProgress() {
2473
+ return this.progress ?? 0;
2474
+ }
2475
+ // ============================================================================
2476
+ // Future Lifecycle Handler
2477
+ // ============================================================================
2478
+ onFutureUpdate(future) {
2479
+ kosUiSdk.getAllKosCompanionModels(this).forEach((model) => {
2480
+ if (isPourAware(model)) {
2481
+ model.onPourProgress(future);
2482
+ }
2483
+ });
2484
+ const evt = {
2485
+ pourTarget: this.id,
2486
+ progress: future.progress,
2487
+ status: future.status,
2488
+ clientData: future.clientData,
2489
+ futureId: future.futureId,
2490
+ remainingTimeMs: future.remainingTimeMs,
2491
+ endState: future.endState,
2492
+ reason: future.reason,
2493
+ timeRemaining: future.timeRemaining
2494
+ };
2495
+ kosUiSdk.EventBus.publish(TOPIC_GENERIC_POUR_PROGRESS, evt);
2496
+ if (future.endState) {
2497
+ kosUiSdk.kosAction(() => {
2498
+ if (this.currentState === PourState.POURING) {
2499
+ this.transition("POUR_COMPLETED");
2500
+ }
2501
+ });
2502
+ }
2503
+ }
2504
+ };
2505
+ __decorateClass([
2506
+ kosUiSdk.kosStateEntry(PourState.POURING)
2507
+ ], GenericPourModelImpl.prototype, "handlePouringStart", 1);
2508
+ __decorateClass([
2509
+ kosUiSdk.kosStateExit(PourState.POURING)
2510
+ ], GenericPourModelImpl.prototype, "handlePouringEnd", 1);
2511
+ __decorateClass([
2512
+ kosUiSdk.kosStateEntry(PourState.POUR_CANCELING)
2513
+ ], GenericPourModelImpl.prototype, "handleCancelStart", 1);
2514
+ __decorateClass([
2515
+ kosUiSdk.kosStateExit(PourState.POUR_CANCELING)
2516
+ ], GenericPourModelImpl.prototype, "handleCanceled", 1);
2517
+ __decorateClass([
2518
+ kosUiSdk.kosFuture(),
2519
+ kosUiSdk.kosStateGuard({ allowedStates: [PourState.IDLE] })
2520
+ ], GenericPourModelImpl.prototype, "pour", 1);
2521
+ __decorateClass([
2522
+ kosUiSdk.kosStateGuard({
2523
+ allowedStates: [PourState.POUR_STARTING, PourState.POURING]
2524
+ })
2525
+ ], GenericPourModelImpl.prototype, "cancelPour", 1);
2526
+ GenericPourModelImpl = __decorateClass([
2527
+ kosUiSdk.kosModel(MODEL_TYPE),
2528
+ kosUiSdk.kosLoggerAware(),
2529
+ kosUiSdk.kosFutureAware(),
2530
+ kosUiSdk.kosStateMachine(
2531
+ {
2532
+ initial: PourState.IDLE,
2533
+ initializeAt: kosUiSdk.DependencyLifecycle.READY,
2534
+ states: {
2535
+ [PourState.IDLE]: {
2536
+ on: {
2537
+ START_POUR: PourState.POUR_STARTING
2538
+ }
2539
+ },
2540
+ [PourState.POUR_STARTING]: {
2541
+ on: {
2542
+ POUR_ACTIVE: PourState.POURING,
2543
+ CANCEL_POUR: PourState.POUR_CANCELING,
2544
+ POUR_COMPLETED: PourState.IDLE
2545
+ }
2546
+ },
2547
+ [PourState.POURING]: {
2548
+ on: {
2549
+ CANCEL_POUR: PourState.POUR_CANCELING,
2550
+ POUR_COMPLETED: PourState.IDLE
2551
+ }
2552
+ },
2553
+ [PourState.POUR_CANCELING]: {
2554
+ on: {
2555
+ POUR_CANCELED: PourState.IDLE
2556
+ }
2557
+ }
2558
+ }
2559
+ },
2560
+ {
2561
+ trackHistory: false,
2562
+ throwOnInvalid: false
2563
+ // Gracefully ignore invalid state calls (expected runtime scenarios)
2564
+ }
2565
+ )
2566
+ ], GenericPourModelImpl);
2567
+ const GenericPour = new kosUiSdk.KosModelRegistrationFactory({
2568
+ class: GenericPourModelImpl,
2569
+ type: MODEL_TYPE
2570
+ });
2571
+ const kosModels = {
2572
+ ...IngredientContainer.registration,
2573
+ ...Ingredient.registration,
2574
+ ...HolderContainer.registration,
2575
+ ...Holder.registration,
2576
+ ...Nozzle.registration,
2577
+ ...Pump.registration,
2578
+ ...PumpContainer.registration,
2579
+ ...Availability.registration,
2580
+ ...Assembly.registration,
2581
+ ...BoardContainer.registration
2582
+ };
2583
+ const registerDispenseModels = (root) => () => {
2584
+ kosUiSdk.registerCoreModels(root)();
2585
+ DeviceAssembly.register();
2586
+ Object.keys(kosModels).forEach((key) => {
2587
+ const model = kosModels[key];
2588
+ kosUiSdk.registerLegacyModel(root)(key, model);
2589
+ });
2590
+ kosUiSdk.ExtensionManager[kosUiSdk.EXTENSION_TROUBLE_DATA_MAPPER].register(
2591
+ "FirmwareUpdateInProgressTrouble",
2592
+ async (trouble) => {
2593
+ if (trouble.data?.deviceId) {
2594
+ const { model: assemblyModel } = kosUiSdk.getKosModelSync(
2595
+ Assembly.type
2596
+ );
2597
+ if (assemblyModel) {
2598
+ const boardModel = assemblyModel.boards.find(
2599
+ (b) => b.id === trouble.data.deviceId
2600
+ ) ? kosUiSdk.getKosModelSync(trouble.data.deviceId).model : void 0;
2601
+ return {
2602
+ devices: boardModel ? boardModel.name : ""
2603
+ };
2604
+ }
2605
+ }
2606
+ return {};
2607
+ }
2608
+ );
2609
+ return {
2610
+ preload: kosUiSdk.RegistrationManager.model.preloadModel(root),
2611
+ model: kosUiSdk.RegistrationManager.model.register(root),
2612
+ companion: kosUiSdk.RegistrationManager.companion.register(root),
2613
+ legacy: kosUiSdk.RegistrationManager.model.registerLegacyModel(root)
2614
+ };
2615
+ };
2616
+ const _KosModelRegistry = {
2617
+ ...kosUiSdk.KosModelRegistry
2618
+ };
2619
+ _KosModelRegistry.dispense = {
2620
+ models: registerDispenseModels(_KosModelRegistry)
2621
+ };
2622
+ _KosModelRegistry.preload = kosUiSdk.RegistrationManager.model.preloadModel(_KosModelRegistry);
2623
+ _KosModelRegistry.model = kosUiSdk.RegistrationManager.model.register(_KosModelRegistry);
2624
+ _KosModelRegistry.companion = kosUiSdk.RegistrationManager.companion.register(_KosModelRegistry);
2625
+ _KosModelRegistry.legacy = kosUiSdk.RegistrationManager.model.registerLegacyModel(_KosModelRegistry);
2626
+ const KosModelRegistry = _KosModelRegistry;
2627
+ exports.Assembly = Assembly;
2628
+ exports.Availability = Availability;
2629
+ exports.Board = Board;
2630
+ exports.BoardContainer = BoardContainer;
2631
+ exports.CONTEXT_ASSEMBLY_DATA = CONTEXT_ASSEMBLY_DATA;
2632
+ exports.CONTEXT_ASSEMBLY_RAW_DATA = CONTEXT_ASSEMBLY_RAW_DATA;
2633
+ exports.DeviceAssembly = DeviceAssembly;
2634
+ exports.DispenseModelType = DispenseModelType;
2635
+ exports.ExtensionType = ExtensionType;
2636
+ exports.GenericPour = GenericPour;
2637
+ exports.Holder = Holder;
2638
+ exports.HolderContainer = HolderContainer;
2639
+ exports.Ingredient = Ingredient;
2640
+ exports.IngredientContainer = IngredientContainer;
2641
+ exports.KosModelRegistry = KosModelRegistry;
2642
+ exports.Nozzle = Nozzle;
2643
+ exports.PourState = PourState;
2644
+ exports.Pump = Pump;
2645
+ exports.PumpContainer = PumpContainer;
2646
+ exports.PumpIndex = PumpIndex;
2647
+ exports.TOPIC_BOARD_LINKED = TOPIC_BOARD_LINKED;
2648
+ exports.TOPIC_BOARD_UNLINKED = TOPIC_BOARD_UNLINKED;
2649
+ exports.TOPIC_GENERIC_POUR_CANCEL = TOPIC_GENERIC_POUR_CANCEL;
2650
+ exports.TOPIC_GENERIC_POUR_PROGRESS = TOPIC_GENERIC_POUR_PROGRESS;
2651
+ exports.TOPIC_GENERIC_POUR_STARTED = TOPIC_GENERIC_POUR_STARTED;
2652
+ exports.addAssignment = addAssignment;
2653
+ exports.assignHolderIngredient = assignHolderIngredient;
2654
+ exports.clearPourable = clearPourable;
2655
+ exports.deleteAssignment = deleteAssignment;
2656
+ exports.getAssembly = getAssembly;
2657
+ exports.getAssignments = getAssignments;
2658
+ exports.getAvailability = getAvailability;
2659
+ exports.getHolders = getHolders;
2660
+ exports.getIngredients = getIngredients;
2661
+ exports.getIntentVolume = getIntentVolume;
2662
+ exports.kosModels = kosModels;
2663
+ exports.pourNamedPourable = pourNamedPourable;
2664
+ exports.pourOnTarget = pourOnTarget;
2665
+ exports.pourPourable = pourPourable;
2666
+ exports.registerDispenseModels = registerDispenseModels;
2667
+ exports.replaceLine = replaceLine;
2668
+ exports.selectPourable = selectPourable;
2669
+ exports.sendIntent = sendIntent;
2670
+ exports.sendRfidOverride = sendRfidOverride;
2671
+ exports.unassignHolderIngredient = unassignHolderIngredient;
2672
+ //# sourceMappingURL=dispense-registration-manager-BH0mkCQx.cjs.map