@milaboratories/pl-middle-layer 1.64.37 → 1.64.39

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 (247) hide show
  1. package/dist/_virtual/{_@oxc-project_runtime@0.123.0/helpers → _@oxc-project_runtime@0.137.0/helpers/esm}/usingCtx.cjs +2 -2
  2. package/dist/_virtual/{_@oxc-project_runtime@0.123.0/helpers → _@oxc-project_runtime@0.137.0/helpers/esm}/usingCtx.js +2 -2
  3. package/dist/block_registry/index.cjs +11 -3
  4. package/dist/block_registry/index.d.ts +3 -2
  5. package/dist/block_registry/index.js +4 -3
  6. package/dist/block_registry/registry-v2-provider.cjs +1 -1
  7. package/dist/block_registry/registry-v2-provider.cjs.map +1 -1
  8. package/dist/block_registry/registry-v2-provider.d.ts.map +1 -1
  9. package/dist/block_registry/registry-v2-provider.js +1 -0
  10. package/dist/block_registry/registry-v2-provider.js.map +1 -1
  11. package/dist/block_registry/registry.cjs +20 -3
  12. package/dist/block_registry/registry.cjs.map +1 -1
  13. package/dist/block_registry/registry.d.ts +7 -1
  14. package/dist/block_registry/registry.d.ts.map +1 -1
  15. package/dist/block_registry/registry.js +17 -1
  16. package/dist/block_registry/registry.js.map +1 -1
  17. package/dist/block_registry/watcher.cjs +21 -2
  18. package/dist/block_registry/watcher.cjs.map +1 -1
  19. package/dist/block_registry/watcher.d.ts +1 -1
  20. package/dist/block_registry/watcher.d.ts.map +1 -1
  21. package/dist/block_registry/watcher.js +21 -3
  22. package/dist/block_registry/watcher.js.map +1 -1
  23. package/dist/block_registry/well_known_registries.cjs.map +1 -1
  24. package/dist/block_registry/well_known_registries.d.ts.map +1 -1
  25. package/dist/block_registry/well_known_registries.js.map +1 -1
  26. package/dist/cfg_render/executor.cjs +2 -2
  27. package/dist/cfg_render/executor.cjs.map +1 -1
  28. package/dist/cfg_render/executor.js.map +1 -1
  29. package/dist/cfg_render/renderer.cjs +0 -1
  30. package/dist/cfg_render/renderer.cjs.map +1 -1
  31. package/dist/cfg_render/renderer.js.map +1 -1
  32. package/dist/cfg_render/traverse.cjs +0 -1
  33. package/dist/cfg_render/traverse.cjs.map +1 -1
  34. package/dist/cfg_render/traverse.js.map +1 -1
  35. package/dist/cfg_render/util.cjs.map +1 -1
  36. package/dist/cfg_render/util.js.map +1 -1
  37. package/dist/debug/index.cjs +1 -0
  38. package/dist/debug/index.cjs.map +1 -1
  39. package/dist/debug/index.js +1 -1
  40. package/dist/debug/index.js.map +1 -1
  41. package/dist/dev_env/index.cjs +9 -1
  42. package/dist/dev_env/index.cjs.map +1 -1
  43. package/dist/dev_env/index.js +1 -1
  44. package/dist/dev_env/index.js.map +1 -1
  45. package/dist/dev_env/util.cjs +1 -1
  46. package/dist/dev_env/util.cjs.map +1 -1
  47. package/dist/dev_env/util.js.map +1 -1
  48. package/dist/index.cjs +2 -0
  49. package/dist/index.d.ts +3 -3
  50. package/dist/index.js +3 -3
  51. package/dist/js_render/computable_context.cjs +8 -5
  52. package/dist/js_render/computable_context.cjs.map +1 -1
  53. package/dist/js_render/computable_context.js +5 -1
  54. package/dist/js_render/computable_context.js.map +1 -1
  55. package/dist/js_render/context.cjs +4 -1
  56. package/dist/js_render/context.cjs.map +1 -1
  57. package/dist/js_render/context.js +4 -1
  58. package/dist/js_render/context.js.map +1 -1
  59. package/dist/js_render/index.cjs +0 -1
  60. package/dist/js_render/index.cjs.map +1 -1
  61. package/dist/js_render/index.js.map +1 -1
  62. package/dist/js_render/service_injectors.cjs +2 -3
  63. package/dist/js_render/service_injectors.cjs.map +1 -1
  64. package/dist/js_render/service_injectors.js +1 -1
  65. package/dist/js_render/service_injectors.js.map +1 -1
  66. package/dist/middle_layer/active_cfg.cjs +0 -1
  67. package/dist/middle_layer/active_cfg.cjs.map +1 -1
  68. package/dist/middle_layer/active_cfg.js.map +1 -1
  69. package/dist/middle_layer/block.cjs +0 -1
  70. package/dist/middle_layer/block.cjs.map +1 -1
  71. package/dist/middle_layer/block.js.map +1 -1
  72. package/dist/middle_layer/block_ctx.cjs +0 -1
  73. package/dist/middle_layer/block_ctx.cjs.map +1 -1
  74. package/dist/middle_layer/block_ctx.js.map +1 -1
  75. package/dist/middle_layer/block_ctx_unsafe.cjs.map +1 -1
  76. package/dist/middle_layer/block_ctx_unsafe.js.map +1 -1
  77. package/dist/middle_layer/driver_kit.cjs +0 -1
  78. package/dist/middle_layer/driver_kit.cjs.map +1 -1
  79. package/dist/middle_layer/driver_kit.js.map +1 -1
  80. package/dist/middle_layer/frontend_path.cjs +5 -1
  81. package/dist/middle_layer/frontend_path.cjs.map +1 -1
  82. package/dist/middle_layer/frontend_path.js +6 -1
  83. package/dist/middle_layer/frontend_path.js.map +1 -1
  84. package/dist/middle_layer/index.cjs +13 -5
  85. package/dist/middle_layer/index.d.ts +2 -1
  86. package/dist/middle_layer/index.js +6 -5
  87. package/dist/middle_layer/middle_layer.cjs +7 -1
  88. package/dist/middle_layer/middle_layer.cjs.map +1 -1
  89. package/dist/middle_layer/middle_layer.d.ts.map +1 -1
  90. package/dist/middle_layer/middle_layer.js +7 -0
  91. package/dist/middle_layer/middle_layer.js.map +1 -1
  92. package/dist/middle_layer/navigation_states.cjs +0 -1
  93. package/dist/middle_layer/navigation_states.cjs.map +1 -1
  94. package/dist/middle_layer/navigation_states.js.map +1 -1
  95. package/dist/middle_layer/ops.cjs +1 -1
  96. package/dist/middle_layer/ops.cjs.map +1 -1
  97. package/dist/middle_layer/ops.d.ts.map +1 -1
  98. package/dist/middle_layer/ops.js.map +1 -1
  99. package/dist/middle_layer/project.cjs +9 -2
  100. package/dist/middle_layer/project.cjs.map +1 -1
  101. package/dist/middle_layer/project.d.ts.map +1 -1
  102. package/dist/middle_layer/project.js +5 -1
  103. package/dist/middle_layer/project.js.map +1 -1
  104. package/dist/middle_layer/project_list.cjs +2 -1
  105. package/dist/middle_layer/project_list.cjs.map +1 -1
  106. package/dist/middle_layer/project_list.js +1 -1
  107. package/dist/middle_layer/project_list.js.map +1 -1
  108. package/dist/middle_layer/project_overview.cjs +0 -1
  109. package/dist/middle_layer/project_overview.cjs.map +1 -1
  110. package/dist/middle_layer/project_overview.js.map +1 -1
  111. package/dist/middle_layer/project_overview_light.cjs +0 -1
  112. package/dist/middle_layer/project_overview_light.cjs.map +1 -1
  113. package/dist/middle_layer/project_overview_light.js.map +1 -1
  114. package/dist/middle_layer/render.cjs +0 -1
  115. package/dist/middle_layer/render.cjs.map +1 -1
  116. package/dist/middle_layer/render.js.map +1 -1
  117. package/dist/middle_layer/types.d.ts.map +1 -1
  118. package/dist/middle_layer/util.cjs +0 -1
  119. package/dist/middle_layer/util.cjs.map +1 -1
  120. package/dist/middle_layer/util.js.map +1 -1
  121. package/dist/model/args.cjs +1 -1
  122. package/dist/model/args.cjs.map +1 -1
  123. package/dist/model/args.js +1 -1
  124. package/dist/model/args.js.map +1 -1
  125. package/dist/model/block_pack_spec.cjs +5 -0
  126. package/dist/model/block_pack_spec.cjs.map +1 -1
  127. package/dist/model/block_pack_spec.d.ts +19 -2
  128. package/dist/model/block_pack_spec.d.ts.map +1 -1
  129. package/dist/model/block_pack_spec.js +5 -1
  130. package/dist/model/block_pack_spec.js.map +1 -1
  131. package/dist/model/frontend.d.ts.map +1 -1
  132. package/dist/model/index.d.ts +2 -1
  133. package/dist/model/project_helper.cjs +2 -1
  134. package/dist/model/project_helper.cjs.map +1 -1
  135. package/dist/model/project_helper.d.ts +1 -1
  136. package/dist/model/project_helper.d.ts.map +1 -1
  137. package/dist/model/project_helper.js +2 -0
  138. package/dist/model/project_helper.js.map +1 -1
  139. package/dist/model/project_model.cjs +2 -1
  140. package/dist/model/project_model.cjs.map +1 -1
  141. package/dist/model/project_model.d.ts.map +1 -1
  142. package/dist/model/project_model.js +2 -2
  143. package/dist/model/project_model.js.map +1 -1
  144. package/dist/model/project_model_util.cjs +4 -3
  145. package/dist/model/project_model_util.cjs.map +1 -1
  146. package/dist/model/project_model_util.js +4 -4
  147. package/dist/model/project_model_util.js.map +1 -1
  148. package/dist/model/template_spec.d.ts.map +1 -1
  149. package/dist/mutator/block-pack/block_pack.cjs +41 -4
  150. package/dist/mutator/block-pack/block_pack.cjs.map +1 -1
  151. package/dist/mutator/block-pack/block_pack.d.ts.map +1 -1
  152. package/dist/mutator/block-pack/block_pack.js +40 -4
  153. package/dist/mutator/block-pack/block_pack.js.map +1 -1
  154. package/dist/mutator/block-pack/frontend.cjs +5 -1
  155. package/dist/mutator/block-pack/frontend.cjs.map +1 -1
  156. package/dist/mutator/block-pack/frontend.js +6 -1
  157. package/dist/mutator/block-pack/frontend.js.map +1 -1
  158. package/dist/mutator/block-pack/required_capabilities.cjs +0 -1
  159. package/dist/mutator/block-pack/required_capabilities.cjs.map +1 -1
  160. package/dist/mutator/block-pack/required_capabilities.js.map +1 -1
  161. package/dist/mutator/context_export.cjs +0 -1
  162. package/dist/mutator/context_export.cjs.map +1 -1
  163. package/dist/mutator/context_export.js.map +1 -1
  164. package/dist/mutator/migration.cjs +0 -1
  165. package/dist/mutator/migration.cjs.map +1 -1
  166. package/dist/mutator/migration.js.map +1 -1
  167. package/dist/mutator/project.cjs +22 -4
  168. package/dist/mutator/project.cjs.map +1 -1
  169. package/dist/mutator/project.js +21 -4
  170. package/dist/mutator/project.js.map +1 -1
  171. package/dist/mutator/template/direct_template_loader.cjs +0 -1
  172. package/dist/mutator/template/direct_template_loader.cjs.map +1 -1
  173. package/dist/mutator/template/direct_template_loader.js.map +1 -1
  174. package/dist/mutator/template/direct_template_loader_v3.cjs +0 -1
  175. package/dist/mutator/template/direct_template_loader_v3.cjs.map +1 -1
  176. package/dist/mutator/template/direct_template_loader_v3.js.map +1 -1
  177. package/dist/mutator/template/render_block.cjs +4 -1
  178. package/dist/mutator/template/render_block.cjs.map +1 -1
  179. package/dist/mutator/template/render_block.js +1 -1
  180. package/dist/mutator/template/render_block.js.map +1 -1
  181. package/dist/mutator/template/render_template.cjs +0 -1
  182. package/dist/mutator/template/render_template.cjs.map +1 -1
  183. package/dist/mutator/template/render_template.d.ts.map +1 -1
  184. package/dist/mutator/template/render_template.js.map +1 -1
  185. package/dist/mutator/template/template_cache.cjs +6 -3
  186. package/dist/mutator/template/template_cache.cjs.map +1 -1
  187. package/dist/mutator/template/template_cache.d.ts +1 -2
  188. package/dist/mutator/template/template_cache.d.ts.map +1 -1
  189. package/dist/mutator/template/template_cache.js +6 -2
  190. package/dist/mutator/template/template_cache.js.map +1 -1
  191. package/dist/mutator/template/template_loading.cjs +1 -1
  192. package/dist/mutator/template/template_loading.cjs.map +1 -1
  193. package/dist/mutator/template/template_loading.d.ts.map +1 -1
  194. package/dist/mutator/template/template_loading.js.map +1 -1
  195. package/dist/network_check/network_check.cjs +0 -1
  196. package/dist/network_check/network_check.cjs.map +1 -1
  197. package/dist/network_check/network_check.d.ts.map +1 -1
  198. package/dist/network_check/network_check.js.map +1 -1
  199. package/dist/network_check/pings.cjs +3 -1
  200. package/dist/network_check/pings.cjs.map +1 -1
  201. package/dist/network_check/pings.js +1 -1
  202. package/dist/network_check/pings.js.map +1 -1
  203. package/dist/network_check/template.cjs +10 -3
  204. package/dist/network_check/template.cjs.map +1 -1
  205. package/dist/network_check/template.js +1 -1
  206. package/dist/network_check/template.js.map +1 -1
  207. package/dist/pool/data.cjs +12 -1
  208. package/dist/pool/data.cjs.map +1 -1
  209. package/dist/pool/data.d.ts.map +1 -1
  210. package/dist/pool/data.js +3 -1
  211. package/dist/pool/data.js.map +1 -1
  212. package/dist/pool/driver.cjs +8 -1
  213. package/dist/pool/driver.cjs.map +1 -1
  214. package/dist/pool/driver.d.ts.map +1 -1
  215. package/dist/pool/driver.js +7 -0
  216. package/dist/pool/driver.js.map +1 -1
  217. package/dist/pool/index.cjs +5 -2
  218. package/dist/pool/index.d.ts +2 -1
  219. package/dist/pool/index.js +3 -2
  220. package/dist/pool/p_object_collection.cjs +1 -1
  221. package/dist/pool/p_object_collection.cjs.map +1 -1
  222. package/dist/pool/p_object_collection.js.map +1 -1
  223. package/dist/pool/result_pool.cjs +2 -1
  224. package/dist/pool/result_pool.cjs.map +1 -1
  225. package/dist/pool/result_pool.js +2 -0
  226. package/dist/pool/result_pool.js.map +1 -1
  227. package/dist/service_factories.cjs +0 -1
  228. package/dist/service_factories.cjs.map +1 -1
  229. package/dist/service_factories.js.map +1 -1
  230. package/dist/worker/WorkerManager.cjs +3 -2
  231. package/dist/worker/WorkerManager.cjs.map +1 -1
  232. package/dist/worker/WorkerManager.js +2 -1
  233. package/dist/worker/WorkerManager.js.map +1 -1
  234. package/dist/worker/worker.cjs +0 -1
  235. package/dist/worker/worker.cjs.map +1 -1
  236. package/dist/worker/worker.js.map +1 -1
  237. package/dist/worker/workerApi.cjs +0 -1
  238. package/dist/worker/workerApi.cjs.map +1 -1
  239. package/dist/worker/workerApi.js.map +1 -1
  240. package/package.json +15 -15
  241. package/src/block_registry/registry.ts +19 -0
  242. package/src/block_registry/watcher.ts +25 -2
  243. package/src/middle_layer/frontend_path.ts +22 -2
  244. package/src/model/block_pack_spec.ts +24 -1
  245. package/src/mutator/block-pack/block_pack.ts +61 -2
  246. package/src/mutator/block-pack/frontend.ts +20 -2
  247. package/src/mutator/template/template_cache.ts +10 -2
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerManager.cjs","names":["Worker","path"],"sources":["../../src/worker/WorkerManager.ts"],"sourcesContent":["import path from \"node:path\";\nimport { Worker } from \"node:worker_threads\";\nimport type { Scheme } from \"./workerApi\";\n\nexport class WorkerManager implements AsyncDisposable {\n private nextMessageId = 0;\n private worker: Worker;\n private pendingRequests = new Map<\n number,\n { resolve: (value: unknown) => void; reject: (reason?: unknown) => void }\n >();\n\n constructor() {\n const workerPath: string | undefined =\n typeof global !== \"undefined\" && \"__WORKER_PATH__\" in global\n ? (global.__WORKER_PATH__ as string)\n : path.resolve(\n import.meta.dirname,\n `worker.${typeof module !== \"undefined\" ? \"cjs\" : \"js\"}`,\n );\n\n const worker = (this.worker = new Worker(workerPath, { workerData: {} }));\n\n worker.on(\"message\", ({ id, data, error }) => {\n const { resolve, reject } = this.pendingRequests.get(id)!;\n this.pendingRequests.delete(id);\n if (error) {\n reject(new Error(error));\n } else {\n resolve(data);\n }\n });\n\n worker.on(\"error\", (msg) => {\n console.error(\"Worker error\", msg);\n this.rejectAllPendingRequests(msg);\n });\n }\n\n private rejectAllPendingRequests(msg: unknown) {\n Array.from(this.pendingRequests.values()).map(({ reject }) => {\n reject(msg);\n });\n }\n\n async process<\n Type extends keyof Scheme,\n Args extends Scheme[Type][\"args\"],\n Response extends Scheme[Type][\"response\"],\n >(type: Type, ...args: Args): Promise<Response> {\n return new Promise<Response>((resolve, reject) => {\n const id = ++this.nextMessageId;\n this.pendingRequests.set(id, { resolve: resolve as (value: unknown) => void, reject });\n this.worker.postMessage({ id, type, args });\n });\n }\n\n async terminate() {\n this.rejectAllPendingRequests(new Error(\"Worker terminated\"));\n await this.worker.terminate();\n }\n\n [Symbol.asyncDispose]() {\n return this.terminate();\n }\n}\n"],"mappings":";;;;;AAIA,IAAa,gBAAb,MAAsD;CACpD,gBAAwB;CACxB;CACA,kCAA0B,IAAI,KAG3B;CAEH,cAAc;EASZ,MAAM,SAAU,KAAK,SAAS,IAAIA,oBAAAA,OAPhC,OAAO,WAAW,eAAe,qBAAqB,SACjD,OAAO,kBACRC,UAAAA,QAAK,QAAA,WAEH,UAAU,OAAO,WAAW,cAAc,QAAQ,OACnD,EAE8C,EAAE,YAAY,EAAE,EAAE,CAAC;AAExE,SAAO,GAAG,YAAY,EAAE,IAAI,MAAM,YAAY;GAC5C,MAAM,EAAE,SAAS,WAAW,KAAK,gBAAgB,IAAI,GAAG;AACxD,QAAK,gBAAgB,OAAO,GAAG;AAC/B,OAAI,MACF,QAAO,IAAI,MAAM,MAAM,CAAC;OAExB,SAAQ,KAAK;IAEf;AAEF,SAAO,GAAG,UAAU,QAAQ;AAC1B,WAAQ,MAAM,gBAAgB,IAAI;AAClC,QAAK,yBAAyB,IAAI;IAClC;;CAGJ,yBAAiC,KAAc;AAC7C,QAAM,KAAK,KAAK,gBAAgB,QAAQ,CAAC,CAAC,KAAK,EAAE,aAAa;AAC5D,UAAO,IAAI;IACX;;CAGJ,MAAM,QAIJ,MAAY,GAAG,MAA+B;AAC9C,SAAO,IAAI,SAAmB,SAAS,WAAW;GAChD,MAAM,KAAK,EAAE,KAAK;AAClB,QAAK,gBAAgB,IAAI,IAAI;IAAW;IAAqC;IAAQ,CAAC;AACtF,QAAK,OAAO,YAAY;IAAE;IAAI;IAAM;IAAM,CAAC;IAC3C;;CAGJ,MAAM,YAAY;AAChB,OAAK,yCAAyB,IAAI,MAAM,oBAAoB,CAAC;AAC7D,QAAM,KAAK,OAAO,WAAW;;CAG/B,CAAC,OAAO,gBAAgB;AACtB,SAAO,KAAK,WAAW"}
1
+ {"version":3,"file":"WorkerManager.cjs","names":["path","Worker"],"sources":["../../src/worker/WorkerManager.ts"],"sourcesContent":["import path from \"node:path\";\nimport { Worker } from \"node:worker_threads\";\nimport type { Scheme } from \"./workerApi\";\n\nexport class WorkerManager implements AsyncDisposable {\n private nextMessageId = 0;\n private worker: Worker;\n private pendingRequests = new Map<\n number,\n { resolve: (value: unknown) => void; reject: (reason?: unknown) => void }\n >();\n\n constructor() {\n const workerPath: string | undefined =\n typeof global !== \"undefined\" && \"__WORKER_PATH__\" in global\n ? (global.__WORKER_PATH__ as string)\n : path.resolve(\n import.meta.dirname,\n `worker.${typeof module !== \"undefined\" ? \"cjs\" : \"js\"}`,\n );\n\n const worker = (this.worker = new Worker(workerPath, { workerData: {} }));\n\n worker.on(\"message\", ({ id, data, error }) => {\n const { resolve, reject } = this.pendingRequests.get(id)!;\n this.pendingRequests.delete(id);\n if (error) {\n reject(new Error(error));\n } else {\n resolve(data);\n }\n });\n\n worker.on(\"error\", (msg) => {\n console.error(\"Worker error\", msg);\n this.rejectAllPendingRequests(msg);\n });\n }\n\n private rejectAllPendingRequests(msg: unknown) {\n Array.from(this.pendingRequests.values()).map(({ reject }) => {\n reject(msg);\n });\n }\n\n async process<\n Type extends keyof Scheme,\n Args extends Scheme[Type][\"args\"],\n Response extends Scheme[Type][\"response\"],\n >(type: Type, ...args: Args): Promise<Response> {\n return new Promise<Response>((resolve, reject) => {\n const id = ++this.nextMessageId;\n this.pendingRequests.set(id, { resolve: resolve as (value: unknown) => void, reject });\n this.worker.postMessage({ id, type, args });\n });\n }\n\n async terminate() {\n this.rejectAllPendingRequests(new Error(\"Worker terminated\"));\n await this.worker.terminate();\n }\n\n [Symbol.asyncDispose]() {\n return this.terminate();\n }\n}\n"],"mappings":";;;;;AAIA,IAAa,gBAAb,MAAsD;CACpD,gBAAwB;CACxB;CACA,kCAA0B,IAAI,IAG5B;CAEF,cAAc;EACZ,MAAM,aACJ,OAAO,WAAW,eAAe,qBAAqB,SACjD,OAAO,kBACRA,UAAAA,QAAK,QAAA,WAEH,UAAU,OAAO,WAAW,cAAc,QAAQ,MACpD;EAEN,MAAM,SAAU,KAAK,SAAS,IAAIC,oBAAAA,OAAO,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC;EAEvE,OAAO,GAAG,YAAY,EAAE,IAAI,MAAM,YAAY;GAC5C,MAAM,EAAE,SAAS,WAAW,KAAK,gBAAgB,IAAI,EAAE;GACvD,KAAK,gBAAgB,OAAO,EAAE;GAC9B,IAAI,OACF,OAAO,IAAI,MAAM,KAAK,CAAC;QAEvB,QAAQ,IAAI;EAEhB,CAAC;EAED,OAAO,GAAG,UAAU,QAAQ;GAC1B,QAAQ,MAAM,gBAAgB,GAAG;GACjC,KAAK,yBAAyB,GAAG;EACnC,CAAC;CACH;CAEA,yBAAiC,KAAc;EAC7C,MAAM,KAAK,KAAK,gBAAgB,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,aAAa;GAC5D,OAAO,GAAG;EACZ,CAAC;CACH;CAEA,MAAM,QAIJ,MAAY,GAAG,MAA+B;EAC9C,OAAO,IAAI,SAAmB,SAAS,WAAW;GAChD,MAAM,KAAK,EAAE,KAAK;GAClB,KAAK,gBAAgB,IAAI,IAAI;IAAW;IAAqC;GAAO,CAAC;GACrF,KAAK,OAAO,YAAY;IAAE;IAAI;IAAM;GAAK,CAAC;EAC5C,CAAC;CACH;CAEA,MAAM,YAAY;EAChB,KAAK,yCAAyB,IAAI,MAAM,mBAAmB,CAAC;EAC5D,MAAM,KAAK,OAAO,UAAU;CAC9B;CAEA,CAAC,OAAO,gBAAgB;EACtB,OAAO,KAAK,UAAU;CACxB;AACF"}
@@ -6,7 +6,8 @@ var WorkerManager = class {
6
6
  worker;
7
7
  pendingRequests = /* @__PURE__ */ new Map();
8
8
  constructor() {
9
- const worker = this.worker = new Worker(typeof global !== "undefined" && "__WORKER_PATH__" in global ? global.__WORKER_PATH__ : path.resolve(import.meta.dirname, `worker.${typeof module !== "undefined" ? "cjs" : "js"}`), { workerData: {} });
9
+ const workerPath = typeof global !== "undefined" && "__WORKER_PATH__" in global ? global.__WORKER_PATH__ : path.resolve(import.meta.dirname, `worker.${typeof module !== "undefined" ? "cjs" : "js"}`);
10
+ const worker = this.worker = new Worker(workerPath, { workerData: {} });
10
11
  worker.on("message", ({ id, data, error }) => {
11
12
  const { resolve, reject } = this.pendingRequests.get(id);
12
13
  this.pendingRequests.delete(id);
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerManager.js","names":[],"sources":["../../src/worker/WorkerManager.ts"],"sourcesContent":["import path from \"node:path\";\nimport { Worker } from \"node:worker_threads\";\nimport type { Scheme } from \"./workerApi\";\n\nexport class WorkerManager implements AsyncDisposable {\n private nextMessageId = 0;\n private worker: Worker;\n private pendingRequests = new Map<\n number,\n { resolve: (value: unknown) => void; reject: (reason?: unknown) => void }\n >();\n\n constructor() {\n const workerPath: string | undefined =\n typeof global !== \"undefined\" && \"__WORKER_PATH__\" in global\n ? (global.__WORKER_PATH__ as string)\n : path.resolve(\n import.meta.dirname,\n `worker.${typeof module !== \"undefined\" ? \"cjs\" : \"js\"}`,\n );\n\n const worker = (this.worker = new Worker(workerPath, { workerData: {} }));\n\n worker.on(\"message\", ({ id, data, error }) => {\n const { resolve, reject } = this.pendingRequests.get(id)!;\n this.pendingRequests.delete(id);\n if (error) {\n reject(new Error(error));\n } else {\n resolve(data);\n }\n });\n\n worker.on(\"error\", (msg) => {\n console.error(\"Worker error\", msg);\n this.rejectAllPendingRequests(msg);\n });\n }\n\n private rejectAllPendingRequests(msg: unknown) {\n Array.from(this.pendingRequests.values()).map(({ reject }) => {\n reject(msg);\n });\n }\n\n async process<\n Type extends keyof Scheme,\n Args extends Scheme[Type][\"args\"],\n Response extends Scheme[Type][\"response\"],\n >(type: Type, ...args: Args): Promise<Response> {\n return new Promise<Response>((resolve, reject) => {\n const id = ++this.nextMessageId;\n this.pendingRequests.set(id, { resolve: resolve as (value: unknown) => void, reject });\n this.worker.postMessage({ id, type, args });\n });\n }\n\n async terminate() {\n this.rejectAllPendingRequests(new Error(\"Worker terminated\"));\n await this.worker.terminate();\n }\n\n [Symbol.asyncDispose]() {\n return this.terminate();\n }\n}\n"],"mappings":";;;AAIA,IAAa,gBAAb,MAAsD;CACpD,gBAAwB;CACxB;CACA,kCAA0B,IAAI,KAG3B;CAEH,cAAc;EASZ,MAAM,SAAU,KAAK,SAAS,IAAI,OAPhC,OAAO,WAAW,eAAe,qBAAqB,SACjD,OAAO,kBACR,KAAK,QACH,OAAO,KAAK,SACZ,UAAU,OAAO,WAAW,cAAc,QAAQ,OACnD,EAE8C,EAAE,YAAY,EAAE,EAAE,CAAC;AAExE,SAAO,GAAG,YAAY,EAAE,IAAI,MAAM,YAAY;GAC5C,MAAM,EAAE,SAAS,WAAW,KAAK,gBAAgB,IAAI,GAAG;AACxD,QAAK,gBAAgB,OAAO,GAAG;AAC/B,OAAI,MACF,QAAO,IAAI,MAAM,MAAM,CAAC;OAExB,SAAQ,KAAK;IAEf;AAEF,SAAO,GAAG,UAAU,QAAQ;AAC1B,WAAQ,MAAM,gBAAgB,IAAI;AAClC,QAAK,yBAAyB,IAAI;IAClC;;CAGJ,yBAAiC,KAAc;AAC7C,QAAM,KAAK,KAAK,gBAAgB,QAAQ,CAAC,CAAC,KAAK,EAAE,aAAa;AAC5D,UAAO,IAAI;IACX;;CAGJ,MAAM,QAIJ,MAAY,GAAG,MAA+B;AAC9C,SAAO,IAAI,SAAmB,SAAS,WAAW;GAChD,MAAM,KAAK,EAAE,KAAK;AAClB,QAAK,gBAAgB,IAAI,IAAI;IAAW;IAAqC;IAAQ,CAAC;AACtF,QAAK,OAAO,YAAY;IAAE;IAAI;IAAM;IAAM,CAAC;IAC3C;;CAGJ,MAAM,YAAY;AAChB,OAAK,yCAAyB,IAAI,MAAM,oBAAoB,CAAC;AAC7D,QAAM,KAAK,OAAO,WAAW;;CAG/B,CAAC,OAAO,gBAAgB;AACtB,SAAO,KAAK,WAAW"}
1
+ {"version":3,"file":"WorkerManager.js","names":[],"sources":["../../src/worker/WorkerManager.ts"],"sourcesContent":["import path from \"node:path\";\nimport { Worker } from \"node:worker_threads\";\nimport type { Scheme } from \"./workerApi\";\n\nexport class WorkerManager implements AsyncDisposable {\n private nextMessageId = 0;\n private worker: Worker;\n private pendingRequests = new Map<\n number,\n { resolve: (value: unknown) => void; reject: (reason?: unknown) => void }\n >();\n\n constructor() {\n const workerPath: string | undefined =\n typeof global !== \"undefined\" && \"__WORKER_PATH__\" in global\n ? (global.__WORKER_PATH__ as string)\n : path.resolve(\n import.meta.dirname,\n `worker.${typeof module !== \"undefined\" ? \"cjs\" : \"js\"}`,\n );\n\n const worker = (this.worker = new Worker(workerPath, { workerData: {} }));\n\n worker.on(\"message\", ({ id, data, error }) => {\n const { resolve, reject } = this.pendingRequests.get(id)!;\n this.pendingRequests.delete(id);\n if (error) {\n reject(new Error(error));\n } else {\n resolve(data);\n }\n });\n\n worker.on(\"error\", (msg) => {\n console.error(\"Worker error\", msg);\n this.rejectAllPendingRequests(msg);\n });\n }\n\n private rejectAllPendingRequests(msg: unknown) {\n Array.from(this.pendingRequests.values()).map(({ reject }) => {\n reject(msg);\n });\n }\n\n async process<\n Type extends keyof Scheme,\n Args extends Scheme[Type][\"args\"],\n Response extends Scheme[Type][\"response\"],\n >(type: Type, ...args: Args): Promise<Response> {\n return new Promise<Response>((resolve, reject) => {\n const id = ++this.nextMessageId;\n this.pendingRequests.set(id, { resolve: resolve as (value: unknown) => void, reject });\n this.worker.postMessage({ id, type, args });\n });\n }\n\n async terminate() {\n this.rejectAllPendingRequests(new Error(\"Worker terminated\"));\n await this.worker.terminate();\n }\n\n [Symbol.asyncDispose]() {\n return this.terminate();\n }\n}\n"],"mappings":";;;AAIA,IAAa,gBAAb,MAAsD;CACpD,gBAAwB;CACxB;CACA,kCAA0B,IAAI,IAG5B;CAEF,cAAc;EACZ,MAAM,aACJ,OAAO,WAAW,eAAe,qBAAqB,SACjD,OAAO,kBACR,KAAK,QACH,OAAO,KAAK,SACZ,UAAU,OAAO,WAAW,cAAc,QAAQ,MACpD;EAEN,MAAM,SAAU,KAAK,SAAS,IAAI,OAAO,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC;EAEvE,OAAO,GAAG,YAAY,EAAE,IAAI,MAAM,YAAY;GAC5C,MAAM,EAAE,SAAS,WAAW,KAAK,gBAAgB,IAAI,EAAE;GACvD,KAAK,gBAAgB,OAAO,EAAE;GAC9B,IAAI,OACF,OAAO,IAAI,MAAM,KAAK,CAAC;QAEvB,QAAQ,IAAI;EAEhB,CAAC;EAED,OAAO,GAAG,UAAU,QAAQ;GAC1B,QAAQ,MAAM,gBAAgB,GAAG;GACjC,KAAK,yBAAyB,GAAG;EACnC,CAAC;CACH;CAEA,yBAAiC,KAAc;EAC7C,MAAM,KAAK,KAAK,gBAAgB,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,aAAa;GAC5D,OAAO,GAAG;EACZ,CAAC;CACH;CAEA,MAAM,QAIJ,MAAY,GAAG,MAA+B;EAC9C,OAAO,IAAI,SAAmB,SAAS,WAAW;GAChD,MAAM,KAAK,EAAE,KAAK;GAClB,KAAK,gBAAgB,IAAI,IAAI;IAAW;IAAqC;GAAO,CAAC;GACrF,KAAK,OAAO,YAAY;IAAE;IAAI;IAAM;GAAK,CAAC;EAC5C,CAAC;CACH;CAEA,MAAM,YAAY;EAChB,KAAK,yCAAyB,IAAI,MAAM,mBAAmB,CAAC;EAC5D,MAAM,KAAK,OAAO,UAAU;CAC9B;CAEA,CAAC,OAAO,gBAAgB;EACtB,OAAO,KAAK,UAAU;CACxB;AACF"}
@@ -1,4 +1,3 @@
1
- require("../_virtual/_rolldown/runtime.cjs");
2
1
  const require_workerApi = require("./workerApi.cjs");
3
2
  let node_worker_threads = require("node:worker_threads");
4
3
  //#region src/worker/worker.ts
@@ -1 +1 @@
1
- {"version":3,"file":"worker.cjs","names":["parentPort","workerApi"],"sources":["../../src/worker/worker.ts"],"sourcesContent":["import { parentPort } from \"node:worker_threads\";\nimport { workerApi, type Scheme } from \"./workerApi\";\n\nif (!parentPort) {\n throw new Error(\"Parent port is not available\");\n}\n\nparentPort.on(\"message\", ({ id, type, args }: { id: number; type: unknown; args: unknown[] }) => {\n (workerApi[type as keyof Scheme] as (...args: unknown[]) => Promise<unknown>)(...args)\n .then((r) => {\n parentPort?.postMessage({ id, data: r });\n })\n .catch((e) => {\n parentPort?.postMessage({ id, error: e instanceof Error ? e.message : String(e) });\n });\n});\n"],"mappings":";;;;AAGA,IAAI,CAACA,oBAAAA,WACH,OAAM,IAAI,MAAM,+BAA+B;AAGjDA,oBAAAA,WAAW,GAAG,YAAY,EAAE,IAAI,MAAM,WAA2D;AAC9FC,mBAAAA,UAAU,MAAmE,GAAG,KAAK,CACnF,MAAM,MAAM;AACX,sBAAA,YAAY,YAAY;GAAE;GAAI,MAAM;GAAG,CAAC;GACxC,CACD,OAAO,MAAM;AACZ,sBAAA,YAAY,YAAY;GAAE;GAAI,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;GAAE,CAAC;GAClF;EACJ"}
1
+ {"version":3,"file":"worker.cjs","names":["parentPort","workerApi"],"sources":["../../src/worker/worker.ts"],"sourcesContent":["import { parentPort } from \"node:worker_threads\";\nimport { workerApi, type Scheme } from \"./workerApi\";\n\nif (!parentPort) {\n throw new Error(\"Parent port is not available\");\n}\n\nparentPort.on(\"message\", ({ id, type, args }: { id: number; type: unknown; args: unknown[] }) => {\n (workerApi[type as keyof Scheme] as (...args: unknown[]) => Promise<unknown>)(...args)\n .then((r) => {\n parentPort?.postMessage({ id, data: r });\n })\n .catch((e) => {\n parentPort?.postMessage({ id, error: e instanceof Error ? e.message : String(e) });\n });\n});\n"],"mappings":";;;AAGA,IAAI,CAACA,oBAAAA,YACH,MAAM,IAAI,MAAM,8BAA8B;AAGhDA,oBAAAA,WAAW,GAAG,YAAY,EAAE,IAAI,MAAM,WAA2D;CAC/F,kBAACC,UAAU,KAAqB,CAA8C,GAAG,IAAI,CAAC,CACnF,MAAM,MAAM;EACX,oBAAA,YAAY,YAAY;GAAE;GAAI,MAAM;EAAE,CAAC;CACzC,CAAC,CAAC,CACD,OAAO,MAAM;EACZ,oBAAA,YAAY,YAAY;GAAE;GAAI,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;EAAE,CAAC;CACnF,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","names":[],"sources":["../../src/worker/worker.ts"],"sourcesContent":["import { parentPort } from \"node:worker_threads\";\nimport { workerApi, type Scheme } from \"./workerApi\";\n\nif (!parentPort) {\n throw new Error(\"Parent port is not available\");\n}\n\nparentPort.on(\"message\", ({ id, type, args }: { id: number; type: unknown; args: unknown[] }) => {\n (workerApi[type as keyof Scheme] as (...args: unknown[]) => Promise<unknown>)(...args)\n .then((r) => {\n parentPort?.postMessage({ id, data: r });\n })\n .catch((e) => {\n parentPort?.postMessage({ id, error: e instanceof Error ? e.message : String(e) });\n });\n});\n"],"mappings":";;;AAGA,IAAI,CAAC,WACH,OAAM,IAAI,MAAM,+BAA+B;AAGjD,WAAW,GAAG,YAAY,EAAE,IAAI,MAAM,WAA2D;AAC9F,WAAU,MAAmE,GAAG,KAAK,CACnF,MAAM,MAAM;AACX,cAAY,YAAY;GAAE;GAAI,MAAM;GAAG,CAAC;GACxC,CACD,OAAO,MAAM;AACZ,cAAY,YAAY;GAAE;GAAI,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;GAAE,CAAC;GAClF;EACJ"}
1
+ {"version":3,"file":"worker.js","names":[],"sources":["../../src/worker/worker.ts"],"sourcesContent":["import { parentPort } from \"node:worker_threads\";\nimport { workerApi, type Scheme } from \"./workerApi\";\n\nif (!parentPort) {\n throw new Error(\"Parent port is not available\");\n}\n\nparentPort.on(\"message\", ({ id, type, args }: { id: number; type: unknown; args: unknown[] }) => {\n (workerApi[type as keyof Scheme] as (...args: unknown[]) => Promise<unknown>)(...args)\n .then((r) => {\n parentPort?.postMessage({ id, data: r });\n })\n .catch((e) => {\n parentPort?.postMessage({ id, error: e instanceof Error ? e.message : String(e) });\n });\n});\n"],"mappings":";;;AAGA,IAAI,CAAC,YACH,MAAM,IAAI,MAAM,8BAA8B;AAGhD,WAAW,GAAG,YAAY,EAAE,IAAI,MAAM,WAA2D;CAC/F,UAAW,KAAqB,CAA8C,GAAG,IAAI,CAAC,CACnF,MAAM,MAAM;EACX,YAAY,YAAY;GAAE;GAAI,MAAM;EAAE,CAAC;CACzC,CAAC,CAAC,CACD,OAAO,MAAM;EACZ,YAAY,YAAY;GAAE;GAAI,OAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;EAAE,CAAC;CACnF,CAAC;AACL,CAAC"}
@@ -1,4 +1,3 @@
1
- require("../_virtual/_rolldown/runtime.cjs");
2
1
  let _milaboratories_pl_model_backend = require("@milaboratories/pl-model-backend");
3
2
  //#region src/worker/workerApi.ts
4
3
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"workerApi.cjs","names":[],"sources":["../../src/worker/workerApi.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/require-await */\nimport { parseTemplate } from \"@milaboratories/pl-model-backend\";\n\n/**\n * Add there all heavy synchronous operations that can be moved to the worker thread.\n */\nexport const workerApi = {\n parseTemplate: async (payload: Uint8Array) => {\n const t1 = performance.now();\n const result = parseTemplate(payload);\n const t2 = performance.now();\n const dt = t2 - t1;\n if (dt > 100) console.warn(`parseTemplate in worker took ${dt}ms`);\n return result;\n },\n} satisfies Record<string, (...args: any[]) => Promise<unknown>>;\n\ntype ToScheme<T extends Record<string, (...args: any[]) => any>> = {\n [K in keyof T]: {\n args: Parameters<T[K]>;\n response: Awaited<ReturnType<T[K]>>;\n };\n};\n\nexport type Scheme = ToScheme<typeof workerApi>;\n"],"mappings":";;;;;;AAMA,MAAa,YAAY,EACvB,eAAe,OAAO,YAAwB;CAC5C,MAAM,KAAK,YAAY,KAAK;CAC5B,MAAM,UAAA,GAAA,iCAAA,eAAuB,QAAQ;CAErC,MAAM,KADK,YAAY,KAAK,GACZ;AAChB,KAAI,KAAK,IAAK,SAAQ,KAAK,gCAAgC,GAAG,IAAI;AAClE,QAAO;GAEV"}
1
+ {"version":3,"file":"workerApi.cjs","names":[],"sources":["../../src/worker/workerApi.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/require-await */\nimport { parseTemplate } from \"@milaboratories/pl-model-backend\";\n\n/**\n * Add there all heavy synchronous operations that can be moved to the worker thread.\n */\nexport const workerApi = {\n parseTemplate: async (payload: Uint8Array) => {\n const t1 = performance.now();\n const result = parseTemplate(payload);\n const t2 = performance.now();\n const dt = t2 - t1;\n if (dt > 100) console.warn(`parseTemplate in worker took ${dt}ms`);\n return result;\n },\n} satisfies Record<string, (...args: any[]) => Promise<unknown>>;\n\ntype ToScheme<T extends Record<string, (...args: any[]) => any>> = {\n [K in keyof T]: {\n args: Parameters<T[K]>;\n response: Awaited<ReturnType<T[K]>>;\n };\n};\n\nexport type Scheme = ToScheme<typeof workerApi>;\n"],"mappings":";;;;;AAMA,MAAa,YAAY,EACvB,eAAe,OAAO,YAAwB;CAC5C,MAAM,KAAK,YAAY,IAAI;CAC3B,MAAM,UAAA,GAAA,iCAAA,cAAA,CAAuB,OAAO;CAEpC,MAAM,KADK,YAAY,IACX,IAAI;CAChB,IAAI,KAAK,KAAK,QAAQ,KAAK,gCAAgC,GAAG,GAAG;CACjE,OAAO;AACT,EACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"workerApi.js","names":[],"sources":["../../src/worker/workerApi.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/require-await */\nimport { parseTemplate } from \"@milaboratories/pl-model-backend\";\n\n/**\n * Add there all heavy synchronous operations that can be moved to the worker thread.\n */\nexport const workerApi = {\n parseTemplate: async (payload: Uint8Array) => {\n const t1 = performance.now();\n const result = parseTemplate(payload);\n const t2 = performance.now();\n const dt = t2 - t1;\n if (dt > 100) console.warn(`parseTemplate in worker took ${dt}ms`);\n return result;\n },\n} satisfies Record<string, (...args: any[]) => Promise<unknown>>;\n\ntype ToScheme<T extends Record<string, (...args: any[]) => any>> = {\n [K in keyof T]: {\n args: Parameters<T[K]>;\n response: Awaited<ReturnType<T[K]>>;\n };\n};\n\nexport type Scheme = ToScheme<typeof workerApi>;\n"],"mappings":";;;;;AAMA,MAAa,YAAY,EACvB,eAAe,OAAO,YAAwB;CAC5C,MAAM,KAAK,YAAY,KAAK;CAC5B,MAAM,SAAS,cAAc,QAAQ;CAErC,MAAM,KADK,YAAY,KAAK,GACZ;AAChB,KAAI,KAAK,IAAK,SAAQ,KAAK,gCAAgC,GAAG,IAAI;AAClE,QAAO;GAEV"}
1
+ {"version":3,"file":"workerApi.js","names":[],"sources":["../../src/worker/workerApi.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/require-await */\nimport { parseTemplate } from \"@milaboratories/pl-model-backend\";\n\n/**\n * Add there all heavy synchronous operations that can be moved to the worker thread.\n */\nexport const workerApi = {\n parseTemplate: async (payload: Uint8Array) => {\n const t1 = performance.now();\n const result = parseTemplate(payload);\n const t2 = performance.now();\n const dt = t2 - t1;\n if (dt > 100) console.warn(`parseTemplate in worker took ${dt}ms`);\n return result;\n },\n} satisfies Record<string, (...args: any[]) => Promise<unknown>>;\n\ntype ToScheme<T extends Record<string, (...args: any[]) => any>> = {\n [K in keyof T]: {\n args: Parameters<T[K]>;\n response: Awaited<ReturnType<T[K]>>;\n };\n};\n\nexport type Scheme = ToScheme<typeof workerApi>;\n"],"mappings":";;;;;AAMA,MAAa,YAAY,EACvB,eAAe,OAAO,YAAwB;CAC5C,MAAM,KAAK,YAAY,IAAI;CAC3B,MAAM,SAAS,cAAc,OAAO;CAEpC,MAAM,KADK,YAAY,IACX,IAAI;CAChB,IAAI,KAAK,KAAK,QAAQ,KAAK,gCAAgC,GAAG,GAAG;CACjE,OAAO;AACT,EACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/pl-middle-layer",
3
- "version": "1.64.37",
3
+ "version": "1.64.39",
4
4
  "description": "Pl Middle Layer",
5
5
  "keywords": [],
6
6
  "license": "UNLICENSED",
@@ -31,23 +31,23 @@
31
31
  "utility-types": "^3.11.0",
32
32
  "yaml": "^2.8.0",
33
33
  "zod": "~3.25.76",
34
- "@milaboratories/pf-spec-driver": "1.4.15",
35
34
  "@milaboratories/computable": "2.9.5",
35
+ "@milaboratories/pf-driver": "1.7.14",
36
+ "@milaboratories/pf-spec-driver": "1.4.16",
36
37
  "@milaboratories/helpers": "1.14.2",
37
- "@milaboratories/pf-driver": "1.7.13",
38
- "@milaboratories/pl-errors": "1.4.23",
39
- "@milaboratories/pl-client": "3.11.5",
38
+ "@milaboratories/pl-client": "3.12.0",
39
+ "@milaboratories/pl-drivers": "1.16.2",
40
40
  "@milaboratories/pl-deployments": "3.0.8",
41
- "@milaboratories/pl-drivers": "1.16.1",
42
- "@milaboratories/pl-model-common": "1.46.2",
41
+ "@milaboratories/pl-errors": "1.4.24",
43
42
  "@milaboratories/pl-http": "1.2.4",
44
- "@milaboratories/pl-model-backend": "1.4.8",
45
- "@milaboratories/pl-model-middle-layer": "1.30.8",
46
- "@milaboratories/resolve-helper": "1.1.3",
43
+ "@milaboratories/pl-model-backend": "1.4.9",
44
+ "@milaboratories/pl-model-common": "1.46.2",
45
+ "@milaboratories/pl-model-middle-layer": "1.30.9",
46
+ "@milaboratories/pl-tree": "1.12.14",
47
47
  "@milaboratories/ts-helpers": "1.8.3",
48
- "@milaboratories/pl-tree": "1.12.13",
49
- "@platforma-sdk/block-tools": "2.11.3",
50
- "@platforma-sdk/model": "1.79.17",
48
+ "@milaboratories/resolve-helper": "1.1.3",
49
+ "@platforma-sdk/block-tools": "2.11.5",
50
+ "@platforma-sdk/model": "1.79.20",
51
51
  "@platforma-sdk/workflow-tengo": "6.6.5"
52
52
  },
53
53
  "devDependencies": {
@@ -57,8 +57,8 @@
57
57
  "typescript": "~5.9.3",
58
58
  "vitest": "^4.1.3",
59
59
  "@milaboratories/build-configs": "2.0.0",
60
- "@milaboratories/ts-builder": "1.5.2",
61
- "@milaboratories/ts-configs": "1.2.3"
60
+ "@milaboratories/ts-configs": "1.3.0",
61
+ "@milaboratories/ts-builder": "1.6.0"
62
62
  },
63
63
  "engines": {
64
64
  "node": ">=22.19.0"
@@ -63,6 +63,25 @@ export async function getDevV2PacketMtime(
63
63
  return (wfStats.mtimeNs > modelStats.mtimeNs ? wfStats.mtimeNs : modelStats.mtimeNs).toString();
64
64
  }
65
65
 
66
+ /** Mtime for a `from-pack-v2` locator: prefer the manifest `timestamp`, else
67
+ * stat the `ui.tgz` archive. Must be called identically by `block_pack.ts`
68
+ * prepare (which bakes the result into the spec) and the update watcher (which
69
+ * recomputes it to diff against the stored value) — divergence makes the block
70
+ * flap perpetually "update available". */
71
+ export async function getFromPackV2Mtime(packDir: string, uiTgzPath: string): Promise<string> {
72
+ try {
73
+ const manifestPath = path.join(packDir, "manifest.json");
74
+ const raw = JSON.parse(await fs.promises.readFile(manifestPath, { encoding: "utf-8" })) as {
75
+ timestamp?: unknown;
76
+ };
77
+ if (typeof raw.timestamp === "number") return String(raw.timestamp);
78
+ } catch {
79
+ // fall through to stat
80
+ }
81
+ const stat = await fs.promises.stat(uiTgzPath, { bigint: true });
82
+ return stat.mtimeNs.toString();
83
+ }
84
+
66
85
  export class BlockPackRegistry {
67
86
  constructor(
68
87
  private readonly v2Provider: V2RegistryProvider,
@@ -12,8 +12,12 @@ import {
12
12
  StableChannel,
13
13
  } from "@milaboratories/pl-model-middle-layer";
14
14
  import type { Dispatcher } from "undici";
15
- import { getDevV1PacketMtime, getDevV2PacketMtime } from "./registry";
16
- import { tryLoadPackDescription } from "@platforma-sdk/block-tools";
15
+ import { getDevV1PacketMtime, getDevV2PacketMtime, getFromPackV2Mtime } from "./registry";
16
+ import {
17
+ loadPackDescriptionFromManifest,
18
+ tryLoadPackDescription,
19
+ } from "@platforma-sdk/block-tools";
20
+ import { fileURLToPath } from "node:url";
17
21
  import type { MiLogger } from "@milaboratories/ts-helpers";
18
22
  import type { V2RegistryProvider } from "./registry-v2-provider";
19
23
  import * as semver from "semver";
@@ -63,6 +67,8 @@ export class BlockUpdateWatcher extends PollComputablePool<
63
67
  return `dev_1_${req.currentSpec.folder}_${req.currentSpec.mtime}`;
64
68
  case "dev-v2":
65
69
  return `dev_2_${req.currentSpec.folder}_${req.currentSpec.mtime}`;
70
+ case "from-pack-v2":
71
+ return `from_pack_v2_${req.currentSpec.packUrl}_${req.currentSpec.mtime}`;
66
72
  case "from-registry-v2":
67
73
  return `from_registry_v2_${canonicalize(req)!}`;
68
74
  default:
@@ -98,6 +104,23 @@ export class BlockUpdateWatcher extends PollComputablePool<
98
104
  }
99
105
  }
100
106
 
107
+ case "from-pack-v2": {
108
+ try {
109
+ // Match block_pack.ts prepare exactly: convert the file: URL at this
110
+ // edge, load the same description, feed the same inputs to the shared
111
+ // mtime helper — so the recomputed value is byte-identical to what
112
+ // prepare baked into cSpec.mtime.
113
+ const packDir = fileURLToPath(cSpec.packUrl);
114
+ const description = await loadPackDescriptionFromManifest(packDir);
115
+ const mtime = await getFromPackV2Mtime(packDir, description.components.ui.folder);
116
+ if (mtime === cSpec.mtime) return { suggestions: [] };
117
+ else return { mainSuggestion: { ...cSpec, mtime }, suggestions: [] };
118
+ } catch (err: unknown) {
119
+ this.logger.warn(err);
120
+ return { suggestions: [] };
121
+ }
122
+ }
123
+
101
124
  case "from-registry-v2": {
102
125
  try {
103
126
  const { versionLock, skipVersion } = req.settings;
@@ -3,8 +3,16 @@ import type { MiddleLayerEnvironment } from "./middle_layer";
3
3
  import type { ComputableStableDefined } from "@milaboratories/computable";
4
4
  import { Computable } from "@milaboratories/computable";
5
5
  import { Pl, resourceTypesEqual } from "@milaboratories/pl-client";
6
- import type { FrontendFromFolderData, FrontendFromUrlData } from "../model";
7
- import { FrontendFromFolderResourceType, FrontendFromUrlResourceType } from "../model";
6
+ import type {
7
+ FrontendFromFolderData,
8
+ FrontendFromLocalTgzData,
9
+ FrontendFromUrlData,
10
+ } from "../model";
11
+ import {
12
+ FrontendFromFolderResourceType,
13
+ FrontendFromLocalTgzResourceType,
14
+ FrontendFromUrlResourceType,
15
+ } from "../model";
8
16
  import type { UrlResult } from "@milaboratories/pl-drivers";
9
17
  import { projectFieldName } from "../model/project_model";
10
18
  import { BlockPackFrontendField } from "../mutator/block-pack/block_pack";
@@ -29,6 +37,18 @@ function kernel(
29
37
  `Frontend path signature mismatch for: ${data.path}`,
30
38
  );
31
39
  return data.path;
40
+ } else if (resourceTypesEqual(node.resourceType, FrontendFromLocalTgzResourceType)) {
41
+ const data = node.getDataAsJson<FrontendFromLocalTgzData>();
42
+ if (data === undefined) throw new Error(`No resource data.`);
43
+ env.signer.verify(
44
+ `${data.path}:${data.mtime}`,
45
+ data.signature,
46
+ `Frontend path signature mismatch for: ${data.path}`,
47
+ );
48
+ // Lazily unpack the local ui.tgz through the download driver, so it
49
+ // inherits the driver's space recycling + usage-tracking (same as the
50
+ // registry url path), instead of serving an eagerly-unpacked folder.
51
+ return env.frontendDownloadDriver.getLocalTgz(data.path, data.mtime).withStableType();
32
52
  } else {
33
53
  throw new Error(`Unsupported resource type: ${JSON.stringify(node.resourceType)}`);
34
54
  }
@@ -3,7 +3,7 @@ import type { ResourceType } from "@milaboratories/pl-client";
3
3
  import type { BlockConfigContainer } from "@platforma-sdk/model";
4
4
  import type { BlockPackSpec } from "@milaboratories/pl-model-middle-layer";
5
5
 
6
- export type FrontendSpec = FrontendFromUrl | FrontendFromFolder;
6
+ export type FrontendSpec = FrontendFromUrl | FrontendFromFolder | FrontendFromLocalTgz;
7
7
 
8
8
  export interface FrontendFromUrlData {
9
9
  url: string;
@@ -35,6 +35,29 @@ export interface FrontendFromFolder extends FrontendFromFolderData {
35
35
  type: "local";
36
36
  }
37
37
 
38
+ export interface FrontendFromLocalTgzData {
39
+ /** Absolute path to a local `ui.tgz` archive. */
40
+ path: string;
41
+ /** Modification stamp of the source block; part of the cache key so the
42
+ * unpacked UI is re-derived when the block changes. */
43
+ mtime: string;
44
+ /** HMAC signature of `path + ":" + mtime` using local secret, encoded as hex. */
45
+ signature: string;
46
+ }
47
+
48
+ export const FrontendFromLocalTgzResourceType: ResourceType = {
49
+ name: "Frontend/FromLocalTgz",
50
+ version: "1",
51
+ };
52
+
53
+ /** Directs user of the block pack to lazily unpack the frontend from a local
54
+ * `ui.tgz` archive via the download driver — so it inherits the driver's
55
+ * usage-tracking and space recycling (unlike `local`, which serves a folder
56
+ * path directly). Used by the `from-pack-v2` loader for npm-consumed blocks. */
57
+ export interface FrontendFromLocalTgz extends FrontendFromLocalTgzData {
58
+ type: "local-tgz";
59
+ }
60
+
38
61
  /** Direct instructions to create block-pack from client. Currently, this
39
62
  * is the only block-pack spec that can be directly materialized. */
40
63
  export interface BlockPackExplicit {
@@ -6,16 +6,21 @@ import type { Signer } from "@milaboratories/ts-helpers";
6
6
  import { assertNever } from "@milaboratories/ts-helpers";
7
7
  import type { Branded } from "@milaboratories/pl-model-common";
8
8
  import fs from "node:fs";
9
+ import { fileURLToPath } from "node:url";
9
10
  import type { Dispatcher } from "undici";
10
11
  import { request } from "undici";
11
12
  import { createFrontend } from "./frontend";
12
13
  import { requiredCapabilitiesFromTemplate } from "./required_capabilities";
13
14
  import type { BlockConfigContainer } from "@platforma-sdk/model";
14
15
  import { Code } from "@platforma-sdk/model";
15
- import { loadPackDescription, RegistryV1 } from "@platforma-sdk/block-tools";
16
+ import {
17
+ loadPackDescription,
18
+ loadPackDescriptionFromManifest,
19
+ RegistryV1,
20
+ } from "@platforma-sdk/block-tools";
16
21
  import type { BlockPackInfo } from "../../model/block_pack";
17
22
  import { resolveDevPacket } from "../../dev_env";
18
- import { getDevV2PacketMtime } from "../../block_registry";
23
+ import { getDevV2PacketMtime, getFromPackV2Mtime } from "../../block_registry";
19
24
  import type { V2RegistryProvider } from "../../block_registry/registry-v2-provider";
20
25
  import { LRUCache } from "lru-cache";
21
26
  import canonicalize from "canonicalize";
@@ -97,6 +102,17 @@ export class BlockPackPreparer {
97
102
  return parseStringConfig(configContent);
98
103
  }
99
104
 
105
+ case "from-pack-v2": {
106
+ // packUrl is a file: URL (the facade emits URLs, not paths); convert at
107
+ // this Node boundary before touching the filesystem.
108
+ const packDir = fileURLToPath(spec.packUrl);
109
+ const description = await loadPackDescriptionFromManifest(packDir);
110
+ const configContent = await fs.promises.readFile(description.components.model.file, {
111
+ encoding: "utf-8",
112
+ });
113
+ return parseStringConfig(configContent);
114
+ }
115
+
100
116
  case "from-registry-v1": {
101
117
  const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;
102
118
 
@@ -229,6 +245,49 @@ export class BlockPackPreparer {
229
245
  };
230
246
  }
231
247
 
248
+ case "from-pack-v2": {
249
+ // packUrl is a file: URL (the facade emits URLs, not paths); convert at
250
+ // this Node boundary before touching the filesystem.
251
+ const packDir = fileURLToPath(spec.packUrl);
252
+ const description = await loadPackDescriptionFromManifest(packDir);
253
+ const config = parseStringConfig(
254
+ await fs.promises.readFile(description.components.model.file, {
255
+ encoding: "utf-8",
256
+ }),
257
+ );
258
+ const workflowContent = await fs.promises.readFile(
259
+ description.components.workflow.main.file,
260
+ );
261
+ // UI ships as ui.tgz inside block-pack/; its absolute path is carried
262
+ // in the ui folder slot. The tarball is unpacked lazily at serve-time by
263
+ // the download driver (local-tgz frontend), not eagerly here — so it
264
+ // inherits the driver's usage-tracking and space recycling.
265
+ const uiTgzPath = description.components.ui.folder;
266
+ const source = { ...spec };
267
+ let mtime = spec.mtime;
268
+ if (mtime === undefined) {
269
+ // No explicit mtime: derive one so the frontend cache key invalidates
270
+ // when the block changes.
271
+ mtime = await getFromPackV2Mtime(packDir, uiTgzPath);
272
+ source.mtime = mtime;
273
+ }
274
+ return {
275
+ type: "explicit",
276
+ template: {
277
+ type: "explicit",
278
+ content: workflowContent,
279
+ },
280
+ config,
281
+ frontend: {
282
+ type: "local-tgz",
283
+ path: uiTgzPath,
284
+ mtime,
285
+ signature: this.signer.sign(`${uiTgzPath}:${mtime}`),
286
+ },
287
+ source,
288
+ };
289
+ }
290
+
232
291
  case "from-registry-v1": {
233
292
  const urlPrefix = `${tSlash(spec.registryUrl)}${RegistryV1.packageContentPrefix({ organization: spec.id.organization, package: spec.id.name, version: spec.id.version })}`;
234
293
 
@@ -1,6 +1,15 @@
1
1
  import type { AnyResourceRef, PlTransaction } from "@milaboratories/pl-client";
2
- import type { FrontendFromFolderData, FrontendFromUrlData, FrontendSpec } from "../../model";
3
- import { FrontendFromFolderResourceType, FrontendFromUrlResourceType } from "../../model";
2
+ import type {
3
+ FrontendFromFolderData,
4
+ FrontendFromLocalTgzData,
5
+ FrontendFromUrlData,
6
+ FrontendSpec,
7
+ } from "../../model";
8
+ import {
9
+ FrontendFromFolderResourceType,
10
+ FrontendFromLocalTgzResourceType,
11
+ FrontendFromUrlResourceType,
12
+ } from "../../model";
4
13
  import { assertNever } from "@milaboratories/ts-helpers";
5
14
 
6
15
  export function createFrontend(tx: PlTransaction, spec: FrontendSpec): AnyResourceRef {
@@ -18,6 +27,15 @@ export function createFrontend(tx: PlTransaction, spec: FrontendSpec): AnyResour
18
27
  signature: spec.signature,
19
28
  } as FrontendFromFolderData),
20
29
  );
30
+ case "local-tgz":
31
+ return tx.createValue(
32
+ FrontendFromLocalTgzResourceType,
33
+ JSON.stringify({
34
+ path: spec.path,
35
+ mtime: spec.mtime,
36
+ signature: spec.signature,
37
+ } as FrontendFromLocalTgzData),
38
+ );
21
39
  default:
22
40
  return assertNever(spec);
23
41
  }
@@ -348,6 +348,14 @@ function flattenV3Tree(data: CompiledTemplateV3): CacheableNode[] {
348
348
  }
349
349
 
350
350
  function processTemplate(tpl: TemplateDataV3): string {
351
+ // Defensive: a template can carry no embedded version at runtime even
352
+ // though the type says `string` — the compiler writes `packageJson.version`
353
+ // unchecked, so a template built from a package with no `version` field
354
+ // yields undefined. Identity is fully covered by name + sourceHash, so the
355
+ // placeholder is safe for both the cache key and the backend resource's
356
+ // required Version field.
357
+ const version = tpl.version ?? "0.0.0";
358
+
351
359
  // Process children first (bottom-up)
352
360
  const childHashes: string[] = [];
353
361
  const children: { fieldName: string; hash: string }[] = [];
@@ -385,7 +393,7 @@ function flattenV3Tree(data: CompiledTemplateV3): CacheableNode[] {
385
393
  .update(PlTemplateV1.type.version)
386
394
  .update(tpl.hashOverride ?? "no-override")
387
395
  .update(tpl.name)
388
- .update(tpl.version)
396
+ .update(version)
389
397
  .update(tpl.sourceHash);
390
398
  for (const child of children) {
391
399
  h.update("child:" + child.fieldName + ":" + child.hash);
@@ -400,7 +408,7 @@ function flattenV3Tree(data: CompiledTemplateV3): CacheableNode[] {
400
408
  const sourceCode = getSourceCode(tpl.name, sources, tpl.sourceHash);
401
409
  const tplRef = tx.createStruct(
402
410
  PlTemplateV1.type,
403
- JSON.stringify(PlTemplateV1.fromV3Data(tpl, sourceCode).data),
411
+ JSON.stringify(PlTemplateV1.fromV3Data({ ...tpl, version }, sourceCode).data),
404
412
  );
405
413
  for (const child of children) {
406
414
  const fld = field(tplRef, child.fieldName);