@milaboratories/pl-middle-layer 1.55.1 → 1.55.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/dist/_virtual/{_@oxc-project_runtime@0.114.0 → _@oxc-project_runtime@0.123.0}/helpers/usingCtx.cjs +2 -4
  2. package/dist/_virtual/{_@oxc-project_runtime@0.114.0 → _@oxc-project_runtime@0.123.0}/helpers/usingCtx.js +2 -3
  3. package/dist/_virtual/_rolldown/runtime.cjs +7 -13
  4. package/dist/block_registry/index.cjs +3 -3
  5. package/dist/block_registry/index.js +3 -3
  6. package/dist/block_registry/registry-v2-provider.cjs +2 -3
  7. package/dist/block_registry/registry-v2-provider.cjs.map +1 -1
  8. package/dist/block_registry/registry-v2-provider.d.ts.map +1 -0
  9. package/dist/block_registry/registry-v2-provider.js +1 -2
  10. package/dist/block_registry/registry-v2-provider.js.map +1 -1
  11. package/dist/block_registry/registry.cjs +3 -4
  12. package/dist/block_registry/registry.cjs.map +1 -1
  13. package/dist/block_registry/registry.d.ts.map +1 -0
  14. package/dist/block_registry/registry.js +1 -2
  15. package/dist/block_registry/registry.js.map +1 -1
  16. package/dist/block_registry/watcher.cjs +3 -4
  17. package/dist/block_registry/watcher.cjs.map +1 -1
  18. package/dist/block_registry/watcher.d.ts.map +1 -0
  19. package/dist/block_registry/watcher.js +1 -2
  20. package/dist/block_registry/watcher.js.map +1 -1
  21. package/dist/block_registry/well_known_registries.cjs +1 -2
  22. package/dist/block_registry/well_known_registries.cjs.map +1 -1
  23. package/dist/block_registry/well_known_registries.d.ts.map +1 -0
  24. package/dist/block_registry/well_known_registries.js +1 -1
  25. package/dist/cfg_render/executor.cjs +4 -5
  26. package/dist/cfg_render/executor.cjs.map +1 -1
  27. package/dist/cfg_render/executor.js +1 -2
  28. package/dist/cfg_render/executor.js.map +1 -1
  29. package/dist/cfg_render/renderer.cjs +4 -5
  30. package/dist/cfg_render/renderer.cjs.map +1 -1
  31. package/dist/cfg_render/renderer.js +1 -2
  32. package/dist/cfg_render/renderer.js.map +1 -1
  33. package/dist/cfg_render/traverse.cjs +2 -3
  34. package/dist/cfg_render/traverse.cjs.map +1 -1
  35. package/dist/cfg_render/traverse.js +1 -2
  36. package/dist/cfg_render/traverse.js.map +1 -1
  37. package/dist/cfg_render/util.cjs +2 -3
  38. package/dist/cfg_render/util.cjs.map +1 -1
  39. package/dist/cfg_render/util.js +1 -2
  40. package/dist/cfg_render/util.js.map +1 -1
  41. package/dist/debug/index.cjs +1 -2
  42. package/dist/debug/index.cjs.map +1 -1
  43. package/dist/debug/index.js +1 -1
  44. package/dist/debug/index.js.map +1 -1
  45. package/dist/dev_env/index.cjs +3 -4
  46. package/dist/dev_env/index.cjs.map +1 -1
  47. package/dist/dev_env/index.js +1 -2
  48. package/dist/dev_env/index.js.map +1 -1
  49. package/dist/dev_env/util.cjs +2 -3
  50. package/dist/dev_env/util.cjs.map +1 -1
  51. package/dist/dev_env/util.js +1 -2
  52. package/dist/dev_env/util.js.map +1 -1
  53. package/dist/index.cjs +48 -44
  54. package/dist/index.d.ts +0 -3
  55. package/dist/index.js +5 -10
  56. package/dist/js_render/computable_context.cjs +5 -6
  57. package/dist/js_render/computable_context.cjs.map +1 -1
  58. package/dist/js_render/computable_context.js +2 -3
  59. package/dist/js_render/computable_context.js.map +1 -1
  60. package/dist/js_render/context.cjs +3 -4
  61. package/dist/js_render/context.cjs.map +1 -1
  62. package/dist/js_render/context.js +1 -2
  63. package/dist/js_render/context.js.map +1 -1
  64. package/dist/js_render/index.cjs +4 -5
  65. package/dist/js_render/index.cjs.map +1 -1
  66. package/dist/js_render/index.js +1 -2
  67. package/dist/js_render/index.js.map +1 -1
  68. package/dist/js_render/service_injectors.cjs +3 -4
  69. package/dist/js_render/service_injectors.cjs.map +1 -1
  70. package/dist/js_render/service_injectors.js +2 -3
  71. package/dist/js_render/service_injectors.js.map +1 -1
  72. package/dist/middle_layer/active_cfg.cjs +7 -8
  73. package/dist/middle_layer/active_cfg.cjs.map +1 -1
  74. package/dist/middle_layer/active_cfg.js +1 -2
  75. package/dist/middle_layer/active_cfg.js.map +1 -1
  76. package/dist/middle_layer/block.cjs +8 -9
  77. package/dist/middle_layer/block.cjs.map +1 -1
  78. package/dist/middle_layer/block.js +1 -2
  79. package/dist/middle_layer/block.js.map +1 -1
  80. package/dist/middle_layer/block_ctx.cjs +5 -6
  81. package/dist/middle_layer/block_ctx.cjs.map +1 -1
  82. package/dist/middle_layer/block_ctx.js +1 -2
  83. package/dist/middle_layer/block_ctx.js.map +1 -1
  84. package/dist/middle_layer/block_ctx_unsafe.cjs +1 -2
  85. package/dist/middle_layer/block_ctx_unsafe.cjs.map +1 -1
  86. package/dist/middle_layer/block_ctx_unsafe.js +1 -1
  87. package/dist/middle_layer/block_ctx_unsafe.js.map +1 -1
  88. package/dist/middle_layer/driver_kit.cjs +5 -6
  89. package/dist/middle_layer/driver_kit.cjs.map +1 -1
  90. package/dist/middle_layer/driver_kit.d.ts +0 -1
  91. package/dist/middle_layer/driver_kit.d.ts.map +1 -0
  92. package/dist/middle_layer/driver_kit.js +1 -2
  93. package/dist/middle_layer/driver_kit.js.map +1 -1
  94. package/dist/middle_layer/frontend_path.cjs +6 -7
  95. package/dist/middle_layer/frontend_path.cjs.map +1 -1
  96. package/dist/middle_layer/frontend_path.js +1 -2
  97. package/dist/middle_layer/frontend_path.js.map +1 -1
  98. package/dist/middle_layer/index.cjs +5 -5
  99. package/dist/middle_layer/index.js +5 -5
  100. package/dist/middle_layer/middle_layer.cjs +15 -16
  101. package/dist/middle_layer/middle_layer.cjs.map +1 -1
  102. package/dist/middle_layer/middle_layer.d.ts +0 -2
  103. package/dist/middle_layer/middle_layer.d.ts.map +1 -0
  104. package/dist/middle_layer/middle_layer.js +1 -2
  105. package/dist/middle_layer/middle_layer.js.map +1 -1
  106. package/dist/middle_layer/navigation_states.cjs +2 -3
  107. package/dist/middle_layer/navigation_states.cjs.map +1 -1
  108. package/dist/middle_layer/navigation_states.js +1 -2
  109. package/dist/middle_layer/navigation_states.js.map +1 -1
  110. package/dist/middle_layer/ops.cjs +5 -7
  111. package/dist/middle_layer/ops.cjs.map +1 -1
  112. package/dist/middle_layer/ops.d.ts +0 -1
  113. package/dist/middle_layer/ops.d.ts.map +1 -0
  114. package/dist/middle_layer/ops.js +1 -2
  115. package/dist/middle_layer/ops.js.map +1 -1
  116. package/dist/middle_layer/project.cjs +12 -13
  117. package/dist/middle_layer/project.cjs.map +1 -1
  118. package/dist/middle_layer/project.d.ts +0 -1
  119. package/dist/middle_layer/project.d.ts.map +1 -0
  120. package/dist/middle_layer/project.js +1 -2
  121. package/dist/middle_layer/project.js.map +1 -1
  122. package/dist/middle_layer/project_list.cjs +3 -4
  123. package/dist/middle_layer/project_list.cjs.map +1 -1
  124. package/dist/middle_layer/project_list.d.ts +0 -4
  125. package/dist/middle_layer/project_list.d.ts.map +1 -0
  126. package/dist/middle_layer/project_list.js +1 -2
  127. package/dist/middle_layer/project_list.js.map +1 -1
  128. package/dist/middle_layer/project_overview.cjs +9 -10
  129. package/dist/middle_layer/project_overview.cjs.map +1 -1
  130. package/dist/middle_layer/project_overview.js +1 -2
  131. package/dist/middle_layer/project_overview.js.map +1 -1
  132. package/dist/middle_layer/project_overview_light.cjs +4 -5
  133. package/dist/middle_layer/project_overview_light.cjs.map +1 -1
  134. package/dist/middle_layer/project_overview_light.js +1 -2
  135. package/dist/middle_layer/project_overview_light.js.map +1 -1
  136. package/dist/middle_layer/render.cjs +5 -6
  137. package/dist/middle_layer/render.cjs.map +1 -1
  138. package/dist/middle_layer/render.js +1 -2
  139. package/dist/middle_layer/render.js.map +1 -1
  140. package/dist/middle_layer/types.d.ts.map +1 -0
  141. package/dist/middle_layer/util.cjs +4 -5
  142. package/dist/middle_layer/util.cjs.map +1 -1
  143. package/dist/middle_layer/util.js +1 -2
  144. package/dist/middle_layer/util.js.map +1 -1
  145. package/dist/model/args.cjs +2 -3
  146. package/dist/model/args.cjs.map +1 -1
  147. package/dist/model/args.js +1 -2
  148. package/dist/model/args.js.map +1 -1
  149. package/dist/model/block_pack_spec.cjs +1 -2
  150. package/dist/model/block_pack_spec.cjs.map +1 -1
  151. package/dist/model/block_pack_spec.d.ts.map +1 -0
  152. package/dist/model/block_pack_spec.js +1 -1
  153. package/dist/model/frontend.d.ts.map +1 -0
  154. package/dist/model/project_helper.cjs +3 -4
  155. package/dist/model/project_helper.cjs.map +1 -1
  156. package/dist/model/project_helper.d.ts.map +1 -0
  157. package/dist/model/project_helper.js +1 -2
  158. package/dist/model/project_helper.js.map +1 -1
  159. package/dist/model/project_model.cjs +1 -6
  160. package/dist/model/project_model.cjs.map +1 -1
  161. package/dist/model/project_model.d.ts +0 -1
  162. package/dist/model/project_model.d.ts.map +1 -0
  163. package/dist/model/project_model.js +2 -4
  164. package/dist/model/project_model.js.map +1 -1
  165. package/dist/model/project_model_util.cjs +2 -3
  166. package/dist/model/project_model_util.cjs.map +1 -1
  167. package/dist/model/project_model_util.js +1 -2
  168. package/dist/model/project_model_util.js.map +1 -1
  169. package/dist/model/project_model_v1.cjs +1 -5
  170. package/dist/model/project_model_v1.cjs.map +1 -1
  171. package/dist/model/project_model_v1.js +2 -4
  172. package/dist/model/project_model_v1.js.map +1 -1
  173. package/dist/model/template_spec.d.ts.map +1 -0
  174. package/dist/mutator/block-pack/block_pack.cjs +9 -10
  175. package/dist/mutator/block-pack/block_pack.cjs.map +1 -1
  176. package/dist/mutator/block-pack/block_pack.d.ts +0 -1
  177. package/dist/mutator/block-pack/block_pack.d.ts.map +1 -0
  178. package/dist/mutator/block-pack/block_pack.js +2 -3
  179. package/dist/mutator/block-pack/block_pack.js.map +1 -1
  180. package/dist/mutator/block-pack/frontend.cjs +3 -4
  181. package/dist/mutator/block-pack/frontend.cjs.map +1 -1
  182. package/dist/mutator/block-pack/frontend.js +1 -2
  183. package/dist/mutator/block-pack/frontend.js.map +1 -1
  184. package/dist/mutator/context_export.cjs +4 -5
  185. package/dist/mutator/context_export.cjs.map +1 -1
  186. package/dist/mutator/context_export.js +1 -2
  187. package/dist/mutator/context_export.js.map +1 -1
  188. package/dist/mutator/migration.cjs +13 -14
  189. package/dist/mutator/migration.cjs.map +1 -1
  190. package/dist/mutator/migration.js +11 -12
  191. package/dist/mutator/migration.js.map +1 -1
  192. package/dist/mutator/project.cjs +13 -14
  193. package/dist/mutator/project.cjs.map +1 -1
  194. package/dist/mutator/project.d.ts +0 -3
  195. package/dist/mutator/project.d.ts.map +1 -0
  196. package/dist/mutator/project.js +6 -7
  197. package/dist/mutator/project.js.map +1 -1
  198. package/dist/mutator/template/direct_template_loader.cjs +3 -4
  199. package/dist/mutator/template/direct_template_loader.cjs.map +1 -1
  200. package/dist/mutator/template/direct_template_loader.js +1 -2
  201. package/dist/mutator/template/direct_template_loader.js.map +1 -1
  202. package/dist/mutator/template/direct_template_loader_v3.cjs +2 -3
  203. package/dist/mutator/template/direct_template_loader_v3.cjs.map +1 -1
  204. package/dist/mutator/template/direct_template_loader_v3.js +1 -2
  205. package/dist/mutator/template/direct_template_loader_v3.js.map +1 -1
  206. package/dist/mutator/template/render_block.cjs +4 -6
  207. package/dist/mutator/template/render_block.cjs.map +1 -1
  208. package/dist/mutator/template/render_block.js +2 -4
  209. package/dist/mutator/template/render_block.js.map +1 -1
  210. package/dist/mutator/template/render_template.cjs +2 -3
  211. package/dist/mutator/template/render_template.cjs.map +1 -1
  212. package/dist/mutator/template/render_template.d.ts.map +1 -0
  213. package/dist/mutator/template/render_template.js +1 -2
  214. package/dist/mutator/template/render_template.js.map +1 -1
  215. package/dist/mutator/template/template_cache.cjs +6 -10
  216. package/dist/mutator/template/template_cache.cjs.map +1 -1
  217. package/dist/mutator/template/template_cache.d.ts +2 -3
  218. package/dist/mutator/template/template_cache.d.ts.map +1 -0
  219. package/dist/mutator/template/template_cache.js +4 -8
  220. package/dist/mutator/template/template_cache.js.map +1 -1
  221. package/dist/mutator/template/template_loading.cjs +3 -4
  222. package/dist/mutator/template/template_loading.cjs.map +1 -1
  223. package/dist/mutator/template/template_loading.d.ts.map +1 -0
  224. package/dist/mutator/template/template_loading.js +1 -2
  225. package/dist/mutator/template/template_loading.js.map +1 -1
  226. package/dist/network_check/network_check.cjs +4 -5
  227. package/dist/network_check/network_check.cjs.map +1 -1
  228. package/dist/network_check/network_check.d.ts.map +1 -0
  229. package/dist/network_check/network_check.js +1 -2
  230. package/dist/network_check/network_check.js.map +1 -1
  231. package/dist/network_check/pings.cjs +2 -3
  232. package/dist/network_check/pings.cjs.map +1 -1
  233. package/dist/network_check/pings.js +1 -2
  234. package/dist/network_check/pings.js.map +1 -1
  235. package/dist/network_check/template.cjs +4 -5
  236. package/dist/network_check/template.cjs.map +1 -1
  237. package/dist/network_check/template.js +1 -2
  238. package/dist/network_check/template.js.map +1 -1
  239. package/dist/pool/data.cjs +2 -3
  240. package/dist/pool/data.cjs.map +1 -1
  241. package/dist/pool/data.d.ts +0 -1
  242. package/dist/pool/data.d.ts.map +1 -0
  243. package/dist/pool/data.js +1 -2
  244. package/dist/pool/data.js.map +1 -1
  245. package/dist/pool/driver.cjs +3 -4
  246. package/dist/pool/driver.cjs.map +1 -1
  247. package/dist/pool/driver.d.ts +0 -1
  248. package/dist/pool/driver.d.ts.map +1 -0
  249. package/dist/pool/driver.js +1 -2
  250. package/dist/pool/driver.js.map +1 -1
  251. package/dist/pool/index.cjs +2 -2
  252. package/dist/pool/index.d.ts +1 -2
  253. package/dist/pool/index.js +2 -2
  254. package/dist/pool/p_object_collection.cjs +3 -4
  255. package/dist/pool/p_object_collection.cjs.map +1 -1
  256. package/dist/pool/p_object_collection.d.ts.map +1 -0
  257. package/dist/pool/p_object_collection.js +1 -2
  258. package/dist/pool/p_object_collection.js.map +1 -1
  259. package/dist/pool/result_pool.cjs +7 -8
  260. package/dist/pool/result_pool.cjs.map +1 -1
  261. package/dist/pool/result_pool.d.ts +1 -3
  262. package/dist/pool/result_pool.js +1 -2
  263. package/dist/pool/result_pool.js.map +1 -1
  264. package/dist/service_factories.cjs +2 -3
  265. package/dist/service_factories.cjs.map +1 -1
  266. package/dist/service_factories.js +1 -2
  267. package/dist/service_factories.js.map +1 -1
  268. package/dist/worker/WorkerManager.cjs +2 -3
  269. package/dist/worker/WorkerManager.cjs.map +1 -1
  270. package/dist/worker/WorkerManager.js +1 -2
  271. package/dist/worker/WorkerManager.js.map +1 -1
  272. package/dist/worker/worker.cjs +3 -4
  273. package/dist/worker/worker.cjs.map +1 -1
  274. package/dist/worker/worker.js +1 -2
  275. package/dist/worker/worker.js.map +1 -1
  276. package/dist/worker/workerApi.cjs +2 -3
  277. package/dist/worker/workerApi.cjs.map +1 -1
  278. package/dist/worker/workerApi.js +1 -2
  279. package/dist/worker/workerApi.js.map +1 -1
  280. package/package.json +15 -15
@@ -1 +1 @@
1
- {"version":3,"file":"driver_kit.cjs","names":["DefaultDriverKitOpsSettings","DefaultDriverKitOpsPaths","HmacSha256Signer","DownloadDriver","DownloadBlobToURLDriver","UploadDriver","LogsStreamDriver","LogsDriver","LsDriver","createPFrameDriver","DownloadUrlDriver"],"sources":["../../src/middle_layer/driver_kit.ts"],"sourcesContent":["import type { PlClient } from \"@milaboratories/pl-client\";\nimport type { InternalLsDriver } from \"@milaboratories/pl-drivers\";\nimport {\n createDownloadClient,\n createLogsClient,\n createUploadBlobClient,\n createUploadProgressClient,\n DownloadDriver,\n DownloadBlobToURLDriver,\n LogsDriver,\n LogsStreamDriver,\n LsDriver,\n UploadDriver,\n DownloadUrlDriver,\n} from \"@milaboratories/pl-drivers\";\nimport type * as Sdk from \"@milaboratories/pl-model-common\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport { isAsyncDisposable } from \"@milaboratories/helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { InternalPFrameDriver } from \"../pool\";\nimport { createPFrameDriver } from \"../pool\";\nimport type { DriverKitOps, DriverKitOpsConstructor } from \"./ops\";\nimport { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings } from \"./ops\";\n\n/**\n * Drivers offered by the middle-layer for internal consumers,\n * like configuration rendering routines.\n *\n * This intertface is basically a version of the DriverKit from\n * UI SDK with extended API.\n * */\nexport interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {\n /** Dispose the driver kit and all its resources. */\n dispose(): Promise<void>;\n\n // override with wider interface\n readonly blobDriver: DownloadDriver;\n // override with wider interface\n readonly blobToURLDriver: DownloadBlobToURLDriver;\n // override with wider interface\n readonly logDriver: LogsDriver;\n // override with wider interface\n readonly lsDriver: InternalLsDriver;\n // override with wider interface\n readonly pFrameDriver: InternalPFrameDriver;\n // override with wider interface\n readonly frontendDriver: DownloadUrlDriver;\n\n /**\n * Signer is initialized from local secret in drivers initialization routine,\n * so constitutes a part of the driver kit\n * */\n readonly signer: Signer;\n\n /**\n * Used to retrieve upload progress, and initiate upload porecesses driven by\n * upload requests from block outputs.\n * */\n readonly uploadDriver: UploadDriver;\n}\n\nexport async function initDriverKit(\n pl: PlClient,\n workdir: string,\n frontendDownloadPath: string,\n _ops: DriverKitOpsConstructor,\n): Promise<MiddleLayerDriverKit> {\n const ops: DriverKitOps = {\n ...DefaultDriverKitOpsSettings,\n ...DefaultDriverKitOpsPaths(workdir),\n ..._ops,\n };\n\n const signer = new HmacSha256Signer(ops.localSecret);\n\n const downloadClient = createDownloadClient(ops.logger, pl, ops.localProjections);\n const logsClient = createLogsClient(pl, ops.logger);\n const uploadBlobClient = createUploadBlobClient(pl, ops.logger);\n const uploadProgressClient = createUploadProgressClient(pl, ops.logger);\n\n const blobDriver = await DownloadDriver.init(\n ops.logger,\n downloadClient,\n logsClient,\n ops.blobDownloadPath,\n ops.blobDownloadRangesCachePath,\n signer,\n ops.blobDriverOps,\n );\n\n const blobToURLDriver = new DownloadBlobToURLDriver(\n ops.logger,\n signer,\n downloadClient,\n ops.downloadBlobToURLPath,\n ops.downloadBlobToURLDriverOps,\n );\n\n const uploadDriver = new UploadDriver(\n ops.logger,\n signer,\n uploadBlobClient,\n uploadProgressClient,\n ops.uploadDriverOps,\n );\n const logsStreamDriver = new LogsStreamDriver(ops.logger, logsClient, ops.logStreamDriverOps);\n const logDriver = new LogsDriver(ops.logger, logsStreamDriver, blobDriver);\n const lsDriver = await LsDriver.init(\n ops.logger,\n pl,\n signer,\n ops.localProjections,\n ops.openFileDialogCallback,\n ops.virtualLocalStoragesOverride,\n );\n\n const pFrameDriver = await createPFrameDriver({\n blobDriver,\n logger: ops.logger,\n spillPath: ops.pframesSpillPath,\n options: ops.pFrameDriverOps,\n });\n\n const frontendDownloadDriver = new DownloadUrlDriver(\n ops.logger,\n pl.httpDispatcher,\n frontendDownloadPath,\n signer,\n ops.frontendDownloadDriverOps,\n );\n\n const driverKit = {\n blobDriver,\n blobToURLDriver: blobToURLDriver,\n logDriver,\n lsDriver,\n signer,\n uploadDriver,\n pFrameDriver,\n frontendDriver: frontendDownloadDriver,\n };\n\n const dispose = async () => {\n const disposePromises = Object.values(driverKit).flatMap((driver) =>\n isAsyncDisposable(driver) ? [driver[Symbol.asyncDispose]()] : [],\n );\n await Promise.all(disposePromises);\n };\n\n return {\n ...driverKit,\n dispose,\n [Symbol.asyncDispose]: dispose,\n };\n}\n"],"mappings":";;;;;;;;;AA6DA,eAAsB,cACpB,IACA,SACA,sBACA,MAC+B;CAC/B,MAAM,MAAoB;EACxB,GAAGA;EACH,GAAGC,qCAAyB,QAAQ;EACpC,GAAG;EACJ;CAED,MAAM,SAAS,IAAIC,4CAAiB,IAAI,YAAY;CAEpD,MAAM,sEAAsC,IAAI,QAAQ,IAAI,IAAI,iBAAiB;CACjF,MAAM,8DAA8B,IAAI,IAAI,OAAO;CACnD,MAAM,0EAA0C,IAAI,IAAI,OAAO;CAC/D,MAAM,kFAAkD,IAAI,IAAI,OAAO;CAEvE,MAAM,aAAa,MAAMC,0CAAe,KACtC,IAAI,QACJ,gBACA,YACA,IAAI,kBACJ,IAAI,6BACJ,QACA,IAAI,cACL;CAED,MAAM,kBAAkB,IAAIC,mDAC1B,IAAI,QACJ,QACA,gBACA,IAAI,uBACJ,IAAI,2BACL;CAED,MAAM,eAAe,IAAIC,wCACvB,IAAI,QACJ,QACA,kBACA,sBACA,IAAI,gBACL;CACD,MAAM,mBAAmB,IAAIC,4CAAiB,IAAI,QAAQ,YAAY,IAAI,mBAAmB;CA0B7F,MAAM,YAAY;EAChB;EACiB;EACjB,WA5BgB,IAAIC,sCAAW,IAAI,QAAQ,kBAAkB,WAAW;EA6BxE,UA5Be,MAAMC,oCAAS,KAC9B,IAAI,QACJ,IACA,QACA,IAAI,kBACJ,IAAI,wBACJ,IAAI,6BACL;EAsBC;EACA;EACA,cAtBmB,MAAMC,kCAAmB;GAC5C;GACA,QAAQ,IAAI;GACZ,WAAW,IAAI;GACf,SAAS,IAAI;GACd,CAAC;EAkBA,gBAhB6B,IAAIC,6CACjC,IAAI,QACJ,GAAG,gBACH,sBACA,QACA,IAAI,0BACL;EAWA;CAED,MAAM,UAAU,YAAY;EAC1B,MAAM,kBAAkB,OAAO,OAAO,UAAU,CAAC,SAAS,0DACtC,OAAO,GAAG,CAAC,OAAO,OAAO,eAAe,CAAC,GAAG,EAAE,CACjE;AACD,QAAM,QAAQ,IAAI,gBAAgB;;AAGpC,QAAO;EACL,GAAG;EACH;GACC,OAAO,eAAe;EACxB"}
1
+ {"version":3,"file":"driver_kit.cjs","names":["DefaultDriverKitOpsSettings","DefaultDriverKitOpsPaths","HmacSha256Signer","DownloadDriver","DownloadBlobToURLDriver","UploadDriver","LogsStreamDriver","LogsDriver","LsDriver","createPFrameDriver","DownloadUrlDriver"],"sources":["../../src/middle_layer/driver_kit.ts"],"sourcesContent":["import type { PlClient } from \"@milaboratories/pl-client\";\nimport type { InternalLsDriver } from \"@milaboratories/pl-drivers\";\nimport {\n createDownloadClient,\n createLogsClient,\n createUploadBlobClient,\n createUploadProgressClient,\n DownloadDriver,\n DownloadBlobToURLDriver,\n LogsDriver,\n LogsStreamDriver,\n LsDriver,\n UploadDriver,\n DownloadUrlDriver,\n} from \"@milaboratories/pl-drivers\";\nimport type * as Sdk from \"@milaboratories/pl-model-common\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport { isAsyncDisposable } from \"@milaboratories/helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { InternalPFrameDriver } from \"../pool\";\nimport { createPFrameDriver } from \"../pool\";\nimport type { DriverKitOps, DriverKitOpsConstructor } from \"./ops\";\nimport { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings } from \"./ops\";\n\n/**\n * Drivers offered by the middle-layer for internal consumers,\n * like configuration rendering routines.\n *\n * This intertface is basically a version of the DriverKit from\n * UI SDK with extended API.\n * */\nexport interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {\n /** Dispose the driver kit and all its resources. */\n dispose(): Promise<void>;\n\n // override with wider interface\n readonly blobDriver: DownloadDriver;\n // override with wider interface\n readonly blobToURLDriver: DownloadBlobToURLDriver;\n // override with wider interface\n readonly logDriver: LogsDriver;\n // override with wider interface\n readonly lsDriver: InternalLsDriver;\n // override with wider interface\n readonly pFrameDriver: InternalPFrameDriver;\n // override with wider interface\n readonly frontendDriver: DownloadUrlDriver;\n\n /**\n * Signer is initialized from local secret in drivers initialization routine,\n * so constitutes a part of the driver kit\n * */\n readonly signer: Signer;\n\n /**\n * Used to retrieve upload progress, and initiate upload porecesses driven by\n * upload requests from block outputs.\n * */\n readonly uploadDriver: UploadDriver;\n}\n\nexport async function initDriverKit(\n pl: PlClient,\n workdir: string,\n frontendDownloadPath: string,\n _ops: DriverKitOpsConstructor,\n): Promise<MiddleLayerDriverKit> {\n const ops: DriverKitOps = {\n ...DefaultDriverKitOpsSettings,\n ...DefaultDriverKitOpsPaths(workdir),\n ..._ops,\n };\n\n const signer = new HmacSha256Signer(ops.localSecret);\n\n const downloadClient = createDownloadClient(ops.logger, pl, ops.localProjections);\n const logsClient = createLogsClient(pl, ops.logger);\n const uploadBlobClient = createUploadBlobClient(pl, ops.logger);\n const uploadProgressClient = createUploadProgressClient(pl, ops.logger);\n\n const blobDriver = await DownloadDriver.init(\n ops.logger,\n downloadClient,\n logsClient,\n ops.blobDownloadPath,\n ops.blobDownloadRangesCachePath,\n signer,\n ops.blobDriverOps,\n );\n\n const blobToURLDriver = new DownloadBlobToURLDriver(\n ops.logger,\n signer,\n downloadClient,\n ops.downloadBlobToURLPath,\n ops.downloadBlobToURLDriverOps,\n );\n\n const uploadDriver = new UploadDriver(\n ops.logger,\n signer,\n uploadBlobClient,\n uploadProgressClient,\n ops.uploadDriverOps,\n );\n const logsStreamDriver = new LogsStreamDriver(ops.logger, logsClient, ops.logStreamDriverOps);\n const logDriver = new LogsDriver(ops.logger, logsStreamDriver, blobDriver);\n const lsDriver = await LsDriver.init(\n ops.logger,\n pl,\n signer,\n ops.localProjections,\n ops.openFileDialogCallback,\n ops.virtualLocalStoragesOverride,\n );\n\n const pFrameDriver = await createPFrameDriver({\n blobDriver,\n logger: ops.logger,\n spillPath: ops.pframesSpillPath,\n options: ops.pFrameDriverOps,\n });\n\n const frontendDownloadDriver = new DownloadUrlDriver(\n ops.logger,\n pl.httpDispatcher,\n frontendDownloadPath,\n signer,\n ops.frontendDownloadDriverOps,\n );\n\n const driverKit = {\n blobDriver,\n blobToURLDriver: blobToURLDriver,\n logDriver,\n lsDriver,\n signer,\n uploadDriver,\n pFrameDriver,\n frontendDriver: frontendDownloadDriver,\n };\n\n const dispose = async () => {\n const disposePromises = Object.values(driverKit).flatMap((driver) =>\n isAsyncDisposable(driver) ? [driver[Symbol.asyncDispose]()] : [],\n );\n await Promise.all(disposePromises);\n };\n\n return {\n ...driverKit,\n dispose,\n [Symbol.asyncDispose]: dispose,\n };\n}\n"],"mappings":";;;;;;;;AA6DA,eAAsB,cACpB,IACA,SACA,sBACA,MAC+B;CAC/B,MAAM,MAAoB;EACxB,GAAGA,YAAAA;EACH,GAAGC,YAAAA,yBAAyB,QAAQ;EACpC,GAAG;EACJ;CAED,MAAM,SAAS,IAAIC,2BAAAA,iBAAiB,IAAI,YAAY;CAEpD,MAAM,kBAAA,GAAA,2BAAA,sBAAsC,IAAI,QAAQ,IAAI,IAAI,iBAAiB;CACjF,MAAM,cAAA,GAAA,2BAAA,kBAA8B,IAAI,IAAI,OAAO;CACnD,MAAM,oBAAA,GAAA,2BAAA,wBAA0C,IAAI,IAAI,OAAO;CAC/D,MAAM,wBAAA,GAAA,2BAAA,4BAAkD,IAAI,IAAI,OAAO;CAEvE,MAAM,aAAa,MAAMC,2BAAAA,eAAe,KACtC,IAAI,QACJ,gBACA,YACA,IAAI,kBACJ,IAAI,6BACJ,QACA,IAAI,cACL;CAED,MAAM,kBAAkB,IAAIC,2BAAAA,wBAC1B,IAAI,QACJ,QACA,gBACA,IAAI,uBACJ,IAAI,2BACL;CAED,MAAM,eAAe,IAAIC,2BAAAA,aACvB,IAAI,QACJ,QACA,kBACA,sBACA,IAAI,gBACL;CACD,MAAM,mBAAmB,IAAIC,2BAAAA,iBAAiB,IAAI,QAAQ,YAAY,IAAI,mBAAmB;CA0B7F,MAAM,YAAY;EAChB;EACiB;EACjB,WA5BgB,IAAIC,2BAAAA,WAAW,IAAI,QAAQ,kBAAkB,WAAW;EA6BxE,UA5Be,MAAMC,2BAAAA,SAAS,KAC9B,IAAI,QACJ,IACA,QACA,IAAI,kBACJ,IAAI,wBACJ,IAAI,6BACL;EAsBC;EACA;EACA,cAtBmB,MAAMC,eAAAA,mBAAmB;GAC5C;GACA,QAAQ,IAAI;GACZ,WAAW,IAAI;GACf,SAAS,IAAI;GACd,CAAC;EAkBA,gBAhB6B,IAAIC,2BAAAA,kBACjC,IAAI,QACJ,GAAG,gBACH,sBACA,QACA,IAAI,0BACL;EAWA;CAED,MAAM,UAAU,YAAY;EAC1B,MAAM,kBAAkB,OAAO,OAAO,UAAU,CAAC,SAAS,YAAA,GAAA,wBAAA,mBACtC,OAAO,GAAG,CAAC,OAAO,OAAO,eAAe,CAAC,GAAG,EAAE,CACjE;AACD,QAAM,QAAQ,IAAI,gBAAgB;;AAGpC,QAAO;EACL,GAAG;EACH;GACC,OAAO,eAAe;EACxB"}
@@ -1,5 +1,4 @@
1
1
  import { InternalPFrameDriver } from "../pool/driver.js";
2
- import "../pool/index.js";
3
2
  import { DriverKitOpsConstructor } from "./ops.js";
4
3
  import { Signer } from "@milaboratories/ts-helpers";
5
4
  import { PlClient } from "@milaboratories/pl-client";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver_kit.d.ts","names":[],"sources":["../../src/middle_layer/driver_kit.ts"],"mappings":";;;;;;;;;;AA+BA;;;;;UAAiB,oBAAA,SAA6B,GAAA,CAAI,SAAA,EAAW,eAAA;EASvC;EAPpB,OAAA,IAAW,OAAA;EAAA,SAGF,UAAA,EAAY,cAAA;EAAA,SAEZ,eAAA,EAAiB,uBAAA;EAAA,SAEjB,SAAA,EAAW,UAAA;EAAA,SAEX,QAAA,EAAU,gBAAA;EAAA,SAEV,YAAA,EAAc,oBAAA;EAAA,SAEd,cAAA,EAAgB,iBAAA;EAfiD;;;;EAAA,SAqBjE,MAAA,EAAQ,MAAA;EAnBjB;;;;EAAA,SAyBS,YAAA,EAAc,YAAA;AAAA;AAAA,iBAGH,aAAA,CACpB,EAAA,EAAI,QAAA,EACJ,OAAA,UACA,oBAAA,UACA,IAAA,EAAM,uBAAA,GACL,OAAA,CAAQ,oBAAA"}
@@ -4,7 +4,6 @@ import { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings } from "./ops.js"
4
4
  import { HmacSha256Signer } from "@milaboratories/ts-helpers";
5
5
  import { isAsyncDisposable } from "@milaboratories/helpers";
6
6
  import { DownloadBlobToURLDriver, DownloadDriver, DownloadUrlDriver, LogsDriver, LogsStreamDriver, LsDriver, UploadDriver, createDownloadClient, createLogsClient, createUploadBlobClient, createUploadProgressClient } from "@milaboratories/pl-drivers";
7
-
8
7
  //#region src/middle_layer/driver_kit.ts
9
8
  async function initDriverKit(pl, workdir, frontendDownloadPath, _ops) {
10
9
  const ops = {
@@ -46,7 +45,7 @@ async function initDriverKit(pl, workdir, frontendDownloadPath, _ops) {
46
45
  [Symbol.asyncDispose]: dispose
47
46
  };
48
47
  }
49
-
50
48
  //#endregion
51
49
  export { initDriverKit };
50
+
52
51
  //# sourceMappingURL=driver_kit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"driver_kit.js","names":[],"sources":["../../src/middle_layer/driver_kit.ts"],"sourcesContent":["import type { PlClient } from \"@milaboratories/pl-client\";\nimport type { InternalLsDriver } from \"@milaboratories/pl-drivers\";\nimport {\n createDownloadClient,\n createLogsClient,\n createUploadBlobClient,\n createUploadProgressClient,\n DownloadDriver,\n DownloadBlobToURLDriver,\n LogsDriver,\n LogsStreamDriver,\n LsDriver,\n UploadDriver,\n DownloadUrlDriver,\n} from \"@milaboratories/pl-drivers\";\nimport type * as Sdk from \"@milaboratories/pl-model-common\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport { isAsyncDisposable } from \"@milaboratories/helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { InternalPFrameDriver } from \"../pool\";\nimport { createPFrameDriver } from \"../pool\";\nimport type { DriverKitOps, DriverKitOpsConstructor } from \"./ops\";\nimport { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings } from \"./ops\";\n\n/**\n * Drivers offered by the middle-layer for internal consumers,\n * like configuration rendering routines.\n *\n * This intertface is basically a version of the DriverKit from\n * UI SDK with extended API.\n * */\nexport interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {\n /** Dispose the driver kit and all its resources. */\n dispose(): Promise<void>;\n\n // override with wider interface\n readonly blobDriver: DownloadDriver;\n // override with wider interface\n readonly blobToURLDriver: DownloadBlobToURLDriver;\n // override with wider interface\n readonly logDriver: LogsDriver;\n // override with wider interface\n readonly lsDriver: InternalLsDriver;\n // override with wider interface\n readonly pFrameDriver: InternalPFrameDriver;\n // override with wider interface\n readonly frontendDriver: DownloadUrlDriver;\n\n /**\n * Signer is initialized from local secret in drivers initialization routine,\n * so constitutes a part of the driver kit\n * */\n readonly signer: Signer;\n\n /**\n * Used to retrieve upload progress, and initiate upload porecesses driven by\n * upload requests from block outputs.\n * */\n readonly uploadDriver: UploadDriver;\n}\n\nexport async function initDriverKit(\n pl: PlClient,\n workdir: string,\n frontendDownloadPath: string,\n _ops: DriverKitOpsConstructor,\n): Promise<MiddleLayerDriverKit> {\n const ops: DriverKitOps = {\n ...DefaultDriverKitOpsSettings,\n ...DefaultDriverKitOpsPaths(workdir),\n ..._ops,\n };\n\n const signer = new HmacSha256Signer(ops.localSecret);\n\n const downloadClient = createDownloadClient(ops.logger, pl, ops.localProjections);\n const logsClient = createLogsClient(pl, ops.logger);\n const uploadBlobClient = createUploadBlobClient(pl, ops.logger);\n const uploadProgressClient = createUploadProgressClient(pl, ops.logger);\n\n const blobDriver = await DownloadDriver.init(\n ops.logger,\n downloadClient,\n logsClient,\n ops.blobDownloadPath,\n ops.blobDownloadRangesCachePath,\n signer,\n ops.blobDriverOps,\n );\n\n const blobToURLDriver = new DownloadBlobToURLDriver(\n ops.logger,\n signer,\n downloadClient,\n ops.downloadBlobToURLPath,\n ops.downloadBlobToURLDriverOps,\n );\n\n const uploadDriver = new UploadDriver(\n ops.logger,\n signer,\n uploadBlobClient,\n uploadProgressClient,\n ops.uploadDriverOps,\n );\n const logsStreamDriver = new LogsStreamDriver(ops.logger, logsClient, ops.logStreamDriverOps);\n const logDriver = new LogsDriver(ops.logger, logsStreamDriver, blobDriver);\n const lsDriver = await LsDriver.init(\n ops.logger,\n pl,\n signer,\n ops.localProjections,\n ops.openFileDialogCallback,\n ops.virtualLocalStoragesOverride,\n );\n\n const pFrameDriver = await createPFrameDriver({\n blobDriver,\n logger: ops.logger,\n spillPath: ops.pframesSpillPath,\n options: ops.pFrameDriverOps,\n });\n\n const frontendDownloadDriver = new DownloadUrlDriver(\n ops.logger,\n pl.httpDispatcher,\n frontendDownloadPath,\n signer,\n ops.frontendDownloadDriverOps,\n );\n\n const driverKit = {\n blobDriver,\n blobToURLDriver: blobToURLDriver,\n logDriver,\n lsDriver,\n signer,\n uploadDriver,\n pFrameDriver,\n frontendDriver: frontendDownloadDriver,\n };\n\n const dispose = async () => {\n const disposePromises = Object.values(driverKit).flatMap((driver) =>\n isAsyncDisposable(driver) ? [driver[Symbol.asyncDispose]()] : [],\n );\n await Promise.all(disposePromises);\n };\n\n return {\n ...driverKit,\n dispose,\n [Symbol.asyncDispose]: dispose,\n };\n}\n"],"mappings":";;;;;;;;AA6DA,eAAsB,cACpB,IACA,SACA,sBACA,MAC+B;CAC/B,MAAM,MAAoB;EACxB,GAAG;EACH,GAAG,yBAAyB,QAAQ;EACpC,GAAG;EACJ;CAED,MAAM,SAAS,IAAI,iBAAiB,IAAI,YAAY;CAEpD,MAAM,iBAAiB,qBAAqB,IAAI,QAAQ,IAAI,IAAI,iBAAiB;CACjF,MAAM,aAAa,iBAAiB,IAAI,IAAI,OAAO;CACnD,MAAM,mBAAmB,uBAAuB,IAAI,IAAI,OAAO;CAC/D,MAAM,uBAAuB,2BAA2B,IAAI,IAAI,OAAO;CAEvE,MAAM,aAAa,MAAM,eAAe,KACtC,IAAI,QACJ,gBACA,YACA,IAAI,kBACJ,IAAI,6BACJ,QACA,IAAI,cACL;CAED,MAAM,kBAAkB,IAAI,wBAC1B,IAAI,QACJ,QACA,gBACA,IAAI,uBACJ,IAAI,2BACL;CAED,MAAM,eAAe,IAAI,aACvB,IAAI,QACJ,QACA,kBACA,sBACA,IAAI,gBACL;CACD,MAAM,mBAAmB,IAAI,iBAAiB,IAAI,QAAQ,YAAY,IAAI,mBAAmB;CA0B7F,MAAM,YAAY;EAChB;EACiB;EACjB,WA5BgB,IAAI,WAAW,IAAI,QAAQ,kBAAkB,WAAW;EA6BxE,UA5Be,MAAM,SAAS,KAC9B,IAAI,QACJ,IACA,QACA,IAAI,kBACJ,IAAI,wBACJ,IAAI,6BACL;EAsBC;EACA;EACA,cAtBmB,MAAM,mBAAmB;GAC5C;GACA,QAAQ,IAAI;GACZ,WAAW,IAAI;GACf,SAAS,IAAI;GACd,CAAC;EAkBA,gBAhB6B,IAAI,kBACjC,IAAI,QACJ,GAAG,gBACH,sBACA,QACA,IAAI,0BACL;EAWA;CAED,MAAM,UAAU,YAAY;EAC1B,MAAM,kBAAkB,OAAO,OAAO,UAAU,CAAC,SAAS,WACxD,kBAAkB,OAAO,GAAG,CAAC,OAAO,OAAO,eAAe,CAAC,GAAG,EAAE,CACjE;AACD,QAAM,QAAQ,IAAI,gBAAgB;;AAGpC,QAAO;EACL,GAAG;EACH;GACC,OAAO,eAAe;EACxB"}
1
+ {"version":3,"file":"driver_kit.js","names":[],"sources":["../../src/middle_layer/driver_kit.ts"],"sourcesContent":["import type { PlClient } from \"@milaboratories/pl-client\";\nimport type { InternalLsDriver } from \"@milaboratories/pl-drivers\";\nimport {\n createDownloadClient,\n createLogsClient,\n createUploadBlobClient,\n createUploadProgressClient,\n DownloadDriver,\n DownloadBlobToURLDriver,\n LogsDriver,\n LogsStreamDriver,\n LsDriver,\n UploadDriver,\n DownloadUrlDriver,\n} from \"@milaboratories/pl-drivers\";\nimport type * as Sdk from \"@milaboratories/pl-model-common\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport { isAsyncDisposable } from \"@milaboratories/helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { InternalPFrameDriver } from \"../pool\";\nimport { createPFrameDriver } from \"../pool\";\nimport type { DriverKitOps, DriverKitOpsConstructor } from \"./ops\";\nimport { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings } from \"./ops\";\n\n/**\n * Drivers offered by the middle-layer for internal consumers,\n * like configuration rendering routines.\n *\n * This intertface is basically a version of the DriverKit from\n * UI SDK with extended API.\n * */\nexport interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {\n /** Dispose the driver kit and all its resources. */\n dispose(): Promise<void>;\n\n // override with wider interface\n readonly blobDriver: DownloadDriver;\n // override with wider interface\n readonly blobToURLDriver: DownloadBlobToURLDriver;\n // override with wider interface\n readonly logDriver: LogsDriver;\n // override with wider interface\n readonly lsDriver: InternalLsDriver;\n // override with wider interface\n readonly pFrameDriver: InternalPFrameDriver;\n // override with wider interface\n readonly frontendDriver: DownloadUrlDriver;\n\n /**\n * Signer is initialized from local secret in drivers initialization routine,\n * so constitutes a part of the driver kit\n * */\n readonly signer: Signer;\n\n /**\n * Used to retrieve upload progress, and initiate upload porecesses driven by\n * upload requests from block outputs.\n * */\n readonly uploadDriver: UploadDriver;\n}\n\nexport async function initDriverKit(\n pl: PlClient,\n workdir: string,\n frontendDownloadPath: string,\n _ops: DriverKitOpsConstructor,\n): Promise<MiddleLayerDriverKit> {\n const ops: DriverKitOps = {\n ...DefaultDriverKitOpsSettings,\n ...DefaultDriverKitOpsPaths(workdir),\n ..._ops,\n };\n\n const signer = new HmacSha256Signer(ops.localSecret);\n\n const downloadClient = createDownloadClient(ops.logger, pl, ops.localProjections);\n const logsClient = createLogsClient(pl, ops.logger);\n const uploadBlobClient = createUploadBlobClient(pl, ops.logger);\n const uploadProgressClient = createUploadProgressClient(pl, ops.logger);\n\n const blobDriver = await DownloadDriver.init(\n ops.logger,\n downloadClient,\n logsClient,\n ops.blobDownloadPath,\n ops.blobDownloadRangesCachePath,\n signer,\n ops.blobDriverOps,\n );\n\n const blobToURLDriver = new DownloadBlobToURLDriver(\n ops.logger,\n signer,\n downloadClient,\n ops.downloadBlobToURLPath,\n ops.downloadBlobToURLDriverOps,\n );\n\n const uploadDriver = new UploadDriver(\n ops.logger,\n signer,\n uploadBlobClient,\n uploadProgressClient,\n ops.uploadDriverOps,\n );\n const logsStreamDriver = new LogsStreamDriver(ops.logger, logsClient, ops.logStreamDriverOps);\n const logDriver = new LogsDriver(ops.logger, logsStreamDriver, blobDriver);\n const lsDriver = await LsDriver.init(\n ops.logger,\n pl,\n signer,\n ops.localProjections,\n ops.openFileDialogCallback,\n ops.virtualLocalStoragesOverride,\n );\n\n const pFrameDriver = await createPFrameDriver({\n blobDriver,\n logger: ops.logger,\n spillPath: ops.pframesSpillPath,\n options: ops.pFrameDriverOps,\n });\n\n const frontendDownloadDriver = new DownloadUrlDriver(\n ops.logger,\n pl.httpDispatcher,\n frontendDownloadPath,\n signer,\n ops.frontendDownloadDriverOps,\n );\n\n const driverKit = {\n blobDriver,\n blobToURLDriver: blobToURLDriver,\n logDriver,\n lsDriver,\n signer,\n uploadDriver,\n pFrameDriver,\n frontendDriver: frontendDownloadDriver,\n };\n\n const dispose = async () => {\n const disposePromises = Object.values(driverKit).flatMap((driver) =>\n isAsyncDisposable(driver) ? [driver[Symbol.asyncDispose]()] : [],\n );\n await Promise.all(disposePromises);\n };\n\n return {\n ...driverKit,\n dispose,\n [Symbol.asyncDispose]: dispose,\n };\n}\n"],"mappings":";;;;;;;AA6DA,eAAsB,cACpB,IACA,SACA,sBACA,MAC+B;CAC/B,MAAM,MAAoB;EACxB,GAAG;EACH,GAAG,yBAAyB,QAAQ;EACpC,GAAG;EACJ;CAED,MAAM,SAAS,IAAI,iBAAiB,IAAI,YAAY;CAEpD,MAAM,iBAAiB,qBAAqB,IAAI,QAAQ,IAAI,IAAI,iBAAiB;CACjF,MAAM,aAAa,iBAAiB,IAAI,IAAI,OAAO;CACnD,MAAM,mBAAmB,uBAAuB,IAAI,IAAI,OAAO;CAC/D,MAAM,uBAAuB,2BAA2B,IAAI,IAAI,OAAO;CAEvE,MAAM,aAAa,MAAM,eAAe,KACtC,IAAI,QACJ,gBACA,YACA,IAAI,kBACJ,IAAI,6BACJ,QACA,IAAI,cACL;CAED,MAAM,kBAAkB,IAAI,wBAC1B,IAAI,QACJ,QACA,gBACA,IAAI,uBACJ,IAAI,2BACL;CAED,MAAM,eAAe,IAAI,aACvB,IAAI,QACJ,QACA,kBACA,sBACA,IAAI,gBACL;CACD,MAAM,mBAAmB,IAAI,iBAAiB,IAAI,QAAQ,YAAY,IAAI,mBAAmB;CA0B7F,MAAM,YAAY;EAChB;EACiB;EACjB,WA5BgB,IAAI,WAAW,IAAI,QAAQ,kBAAkB,WAAW;EA6BxE,UA5Be,MAAM,SAAS,KAC9B,IAAI,QACJ,IACA,QACA,IAAI,kBACJ,IAAI,wBACJ,IAAI,6BACL;EAsBC;EACA;EACA,cAtBmB,MAAM,mBAAmB;GAC5C;GACA,QAAQ,IAAI;GACZ,WAAW,IAAI;GACf,SAAS,IAAI;GACd,CAAC;EAkBA,gBAhB6B,IAAI,kBACjC,IAAI,QACJ,GAAG,gBACH,sBACA,QACA,IAAI,0BACL;EAWA;CAED,MAAM,UAAU,YAAY;EAC1B,MAAM,kBAAkB,OAAO,OAAO,UAAU,CAAC,SAAS,WACxD,kBAAkB,OAAO,GAAG,CAAC,OAAO,OAAO,eAAe,CAAC,GAAG,EAAE,CACjE;AACD,QAAM,QAAQ,IAAI,gBAAgB;;AAGpC,QAAO;EACL,GAAG;EACH;GACC,OAAO,eAAe;EACxB"}
@@ -1,11 +1,10 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
- const require_project_model = require('../model/project_model.cjs');
3
- const require_block_pack_spec = require('../model/block_pack_spec.cjs');
4
- const require_block_pack = require('../mutator/block-pack/block_pack.cjs');
5
- const require_util = require('./util.cjs');
1
+ require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_project_model = require("../model/project_model.cjs");
3
+ const require_block_pack_spec = require("../model/block_pack_spec.cjs");
4
+ const require_block_pack = require("../mutator/block-pack/block_pack.cjs");
5
+ const require_util = require("./util.cjs");
6
6
  let _milaboratories_pl_client = require("@milaboratories/pl-client");
7
7
  let _milaboratories_computable = require("@milaboratories/computable");
8
-
9
8
  //#region src/middle_layer/frontend_path.ts
10
9
  function kernel(frontendRes, env) {
11
10
  const node = frontendRes.node();
@@ -52,7 +51,7 @@ function frontendData(projectEntry, id, env) {
52
51
  };
53
52
  }, { mode: "StableOnlyLive" });
54
53
  }
55
-
56
54
  //#endregion
57
55
  exports.frontendData = frontendData;
56
+
58
57
  //# sourceMappingURL=frontend_path.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"frontend_path.cjs","names":["FrontendFromUrlResourceType","FrontendFromFolderResourceType","Computable","getBlockPackInfo","projectFieldName","Pl","BlockPackFrontendField"],"sources":["../../src/middle_layer/frontend_path.ts"],"sourcesContent":["import type { PlTreeEntry, PlTreeEntryAccessor } from \"@milaboratories/pl-tree\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport { Pl, resourceTypesEqual } from \"@milaboratories/pl-client\";\nimport type { FrontendFromFolderData, FrontendFromUrlData } from \"../model\";\nimport { FrontendFromFolderResourceType, FrontendFromUrlResourceType } from \"../model\";\nimport type { UrlResult } from \"@milaboratories/pl-drivers\";\nimport { projectFieldName } from \"../model/project_model\";\nimport { BlockPackFrontendField } from \"../mutator/block-pack/block_pack\";\nimport { getBlockPackInfo } from \"./util\";\nimport type { FrontendData } from \"../model/frontend\";\n\nfunction kernel(\n frontendRes: PlTreeEntryAccessor,\n env: MiddleLayerEnvironment,\n): undefined | string | ComputableStableDefined<UrlResult> {\n const node = frontendRes.node();\n if (resourceTypesEqual(node.resourceType, FrontendFromUrlResourceType)) {\n const data = node.getDataAsJson<FrontendFromUrlData>();\n if (data === undefined) throw new Error(`No resource data.`);\n return env.frontendDownloadDriver.getUrl(new URL(data.url)).withStableType();\n } else if (resourceTypesEqual(node.resourceType, FrontendFromFolderResourceType)) {\n const data = node.getDataAsJson<FrontendFromFolderData>();\n if (data === undefined) throw new Error(`No resource data.`);\n env.signer.verify(\n data.path,\n data.signature,\n `Frontend path signature mismatch for: ${data.path}`,\n );\n return data.path;\n } else {\n throw new Error(`Unsupported resource type: ${JSON.stringify(node.resourceType)}`);\n }\n}\n\nfunction frontendUrlComputable(\n entry: PlTreeEntry | undefined,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<string> | undefined {\n if (entry === undefined) return undefined;\n return Computable.make(\n (c) => {\n return kernel(c.accessor(entry), env);\n },\n {\n postprocessValue: (v) => {\n if (v === undefined) return undefined;\n if (typeof v === \"string\") return v;\n if (v.error !== undefined) throw new Error(v.error);\n return v.url;\n },\n },\n ).withStableType();\n}\n\nexport function frontendData(\n projectEntry: PlTreeEntry,\n id: string,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<FrontendData> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(projectEntry).node();\n const bp = getBlockPackInfo(prj, id);\n const frontendEntry = prj\n .traverse(\n {\n field: projectFieldName(id, \"blockPack\"),\n assertFieldType: \"Dynamic\",\n },\n { field: Pl.HolderRefField, assertFieldType: \"Input\", errorIfFieldNotFound: true },\n { field: BlockPackFrontendField, assertFieldType: \"Input\" },\n )\n ?.persist();\n return {\n url: frontendUrlComputable(frontendEntry, env),\n sdkVersion: bp?.cfg.sdkVersion,\n };\n },\n { mode: \"StableOnlyLive\" },\n ) as ComputableStableDefined<FrontendData>;\n}\n"],"mappings":";;;;;;;;;AAaA,SAAS,OACP,aACA,KACyD;CACzD,MAAM,OAAO,YAAY,MAAM;AAC/B,uDAAuB,KAAK,cAAcA,oDAA4B,EAAE;EACtE,MAAM,OAAO,KAAK,eAAoC;AACtD,MAAI,SAAS,OAAW,OAAM,IAAI,MAAM,oBAAoB;AAC5D,SAAO,IAAI,uBAAuB,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,gBAAgB;8DAChD,KAAK,cAAcC,uDAA+B,EAAE;EAChF,MAAM,OAAO,KAAK,eAAuC;AACzD,MAAI,SAAS,OAAW,OAAM,IAAI,MAAM,oBAAoB;AAC5D,MAAI,OAAO,OACT,KAAK,MACL,KAAK,WACL,yCAAyC,KAAK,OAC/C;AACD,SAAO,KAAK;OAEZ,OAAM,IAAI,MAAM,8BAA8B,KAAK,UAAU,KAAK,aAAa,GAAG;;AAItF,SAAS,sBACP,OACA,KAC6C;AAC7C,KAAI,UAAU,OAAW,QAAO;AAChC,QAAOC,sCAAW,MACf,MAAM;AACL,SAAO,OAAO,EAAE,SAAS,MAAM,EAAE,IAAI;IAEvC,EACE,mBAAmB,MAAM;AACvB,MAAI,MAAM,OAAW,QAAO;AAC5B,MAAI,OAAO,MAAM,SAAU,QAAO;AAClC,MAAI,EAAE,UAAU,OAAW,OAAM,IAAI,MAAM,EAAE,MAAM;AACnD,SAAO,EAAE;IAEZ,CACF,CAAC,gBAAgB;;AAGpB,SAAgB,aACd,cACA,IACA,KACuC;AACvC,QAAOA,sCAAW,MACf,QAAQ;EACP,MAAM,MAAM,IAAI,SAAS,aAAa,CAAC,MAAM;EAC7C,MAAM,KAAKC,8BAAiB,KAAK,GAAG;EACpC,MAAM,gBAAgB,IACnB,SACC;GACE,OAAOC,uCAAiB,IAAI,YAAY;GACxC,iBAAiB;GAClB,EACD;GAAE,OAAOC,6BAAG;GAAgB,iBAAiB;GAAS,sBAAsB;GAAM,EAClF;GAAE,OAAOC;GAAwB,iBAAiB;GAAS,CAC5D,EACC,SAAS;AACb,SAAO;GACL,KAAK,sBAAsB,eAAe,IAAI;GAC9C,YAAY,IAAI,IAAI;GACrB;IAEH,EAAE,MAAM,kBAAkB,CAC3B"}
1
+ {"version":3,"file":"frontend_path.cjs","names":["FrontendFromUrlResourceType","FrontendFromFolderResourceType","Computable","getBlockPackInfo","projectFieldName","Pl","BlockPackFrontendField"],"sources":["../../src/middle_layer/frontend_path.ts"],"sourcesContent":["import type { PlTreeEntry, PlTreeEntryAccessor } from \"@milaboratories/pl-tree\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport { Pl, resourceTypesEqual } from \"@milaboratories/pl-client\";\nimport type { FrontendFromFolderData, FrontendFromUrlData } from \"../model\";\nimport { FrontendFromFolderResourceType, FrontendFromUrlResourceType } from \"../model\";\nimport type { UrlResult } from \"@milaboratories/pl-drivers\";\nimport { projectFieldName } from \"../model/project_model\";\nimport { BlockPackFrontendField } from \"../mutator/block-pack/block_pack\";\nimport { getBlockPackInfo } from \"./util\";\nimport type { FrontendData } from \"../model/frontend\";\n\nfunction kernel(\n frontendRes: PlTreeEntryAccessor,\n env: MiddleLayerEnvironment,\n): undefined | string | ComputableStableDefined<UrlResult> {\n const node = frontendRes.node();\n if (resourceTypesEqual(node.resourceType, FrontendFromUrlResourceType)) {\n const data = node.getDataAsJson<FrontendFromUrlData>();\n if (data === undefined) throw new Error(`No resource data.`);\n return env.frontendDownloadDriver.getUrl(new URL(data.url)).withStableType();\n } else if (resourceTypesEqual(node.resourceType, FrontendFromFolderResourceType)) {\n const data = node.getDataAsJson<FrontendFromFolderData>();\n if (data === undefined) throw new Error(`No resource data.`);\n env.signer.verify(\n data.path,\n data.signature,\n `Frontend path signature mismatch for: ${data.path}`,\n );\n return data.path;\n } else {\n throw new Error(`Unsupported resource type: ${JSON.stringify(node.resourceType)}`);\n }\n}\n\nfunction frontendUrlComputable(\n entry: PlTreeEntry | undefined,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<string> | undefined {\n if (entry === undefined) return undefined;\n return Computable.make(\n (c) => {\n return kernel(c.accessor(entry), env);\n },\n {\n postprocessValue: (v) => {\n if (v === undefined) return undefined;\n if (typeof v === \"string\") return v;\n if (v.error !== undefined) throw new Error(v.error);\n return v.url;\n },\n },\n ).withStableType();\n}\n\nexport function frontendData(\n projectEntry: PlTreeEntry,\n id: string,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<FrontendData> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(projectEntry).node();\n const bp = getBlockPackInfo(prj, id);\n const frontendEntry = prj\n .traverse(\n {\n field: projectFieldName(id, \"blockPack\"),\n assertFieldType: \"Dynamic\",\n },\n { field: Pl.HolderRefField, assertFieldType: \"Input\", errorIfFieldNotFound: true },\n { field: BlockPackFrontendField, assertFieldType: \"Input\" },\n )\n ?.persist();\n return {\n url: frontendUrlComputable(frontendEntry, env),\n sdkVersion: bp?.cfg.sdkVersion,\n };\n },\n { mode: \"StableOnlyLive\" },\n ) as ComputableStableDefined<FrontendData>;\n}\n"],"mappings":";;;;;;;;AAaA,SAAS,OACP,aACA,KACyD;CACzD,MAAM,OAAO,YAAY,MAAM;AAC/B,MAAA,GAAA,0BAAA,oBAAuB,KAAK,cAAcA,wBAAAA,4BAA4B,EAAE;EACtE,MAAM,OAAO,KAAK,eAAoC;AACtD,MAAI,SAAS,KAAA,EAAW,OAAM,IAAI,MAAM,oBAAoB;AAC5D,SAAO,IAAI,uBAAuB,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,gBAAgB;8DAChD,KAAK,cAAcC,wBAAAA,+BAA+B,EAAE;EAChF,MAAM,OAAO,KAAK,eAAuC;AACzD,MAAI,SAAS,KAAA,EAAW,OAAM,IAAI,MAAM,oBAAoB;AAC5D,MAAI,OAAO,OACT,KAAK,MACL,KAAK,WACL,yCAAyC,KAAK,OAC/C;AACD,SAAO,KAAK;OAEZ,OAAM,IAAI,MAAM,8BAA8B,KAAK,UAAU,KAAK,aAAa,GAAG;;AAItF,SAAS,sBACP,OACA,KAC6C;AAC7C,KAAI,UAAU,KAAA,EAAW,QAAO,KAAA;AAChC,QAAOC,2BAAAA,WAAW,MACf,MAAM;AACL,SAAO,OAAO,EAAE,SAAS,MAAM,EAAE,IAAI;IAEvC,EACE,mBAAmB,MAAM;AACvB,MAAI,MAAM,KAAA,EAAW,QAAO,KAAA;AAC5B,MAAI,OAAO,MAAM,SAAU,QAAO;AAClC,MAAI,EAAE,UAAU,KAAA,EAAW,OAAM,IAAI,MAAM,EAAE,MAAM;AACnD,SAAO,EAAE;IAEZ,CACF,CAAC,gBAAgB;;AAGpB,SAAgB,aACd,cACA,IACA,KACuC;AACvC,QAAOA,2BAAAA,WAAW,MACf,QAAQ;EACP,MAAM,MAAM,IAAI,SAAS,aAAa,CAAC,MAAM;EAC7C,MAAM,KAAKC,aAAAA,iBAAiB,KAAK,GAAG;EACpC,MAAM,gBAAgB,IACnB,SACC;GACE,OAAOC,sBAAAA,iBAAiB,IAAI,YAAY;GACxC,iBAAiB;GAClB,EACD;GAAE,OAAOC,0BAAAA,GAAG;GAAgB,iBAAiB;GAAS,sBAAsB;GAAM,EAClF;GAAE,OAAOC,mBAAAA;GAAwB,iBAAiB;GAAS,CAC5D,EACC,SAAS;AACb,SAAO;GACL,KAAK,sBAAsB,eAAe,IAAI;GAC9C,YAAY,IAAI,IAAI;GACrB;IAEH,EAAE,MAAM,kBAAkB,CAC3B"}
@@ -4,7 +4,6 @@ import { BlockPackFrontendField } from "../mutator/block-pack/block_pack.js";
4
4
  import { getBlockPackInfo } from "./util.js";
5
5
  import { Pl, resourceTypesEqual } from "@milaboratories/pl-client";
6
6
  import { Computable } from "@milaboratories/computable";
7
-
8
7
  //#region src/middle_layer/frontend_path.ts
9
8
  function kernel(frontendRes, env) {
10
9
  const node = frontendRes.node();
@@ -51,7 +50,7 @@ function frontendData(projectEntry, id, env) {
51
50
  };
52
51
  }, { mode: "StableOnlyLive" });
53
52
  }
54
-
55
53
  //#endregion
56
54
  export { frontendData };
55
+
57
56
  //# sourceMappingURL=frontend_path.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"frontend_path.js","names":[],"sources":["../../src/middle_layer/frontend_path.ts"],"sourcesContent":["import type { PlTreeEntry, PlTreeEntryAccessor } from \"@milaboratories/pl-tree\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport { Pl, resourceTypesEqual } from \"@milaboratories/pl-client\";\nimport type { FrontendFromFolderData, FrontendFromUrlData } from \"../model\";\nimport { FrontendFromFolderResourceType, FrontendFromUrlResourceType } from \"../model\";\nimport type { UrlResult } from \"@milaboratories/pl-drivers\";\nimport { projectFieldName } from \"../model/project_model\";\nimport { BlockPackFrontendField } from \"../mutator/block-pack/block_pack\";\nimport { getBlockPackInfo } from \"./util\";\nimport type { FrontendData } from \"../model/frontend\";\n\nfunction kernel(\n frontendRes: PlTreeEntryAccessor,\n env: MiddleLayerEnvironment,\n): undefined | string | ComputableStableDefined<UrlResult> {\n const node = frontendRes.node();\n if (resourceTypesEqual(node.resourceType, FrontendFromUrlResourceType)) {\n const data = node.getDataAsJson<FrontendFromUrlData>();\n if (data === undefined) throw new Error(`No resource data.`);\n return env.frontendDownloadDriver.getUrl(new URL(data.url)).withStableType();\n } else if (resourceTypesEqual(node.resourceType, FrontendFromFolderResourceType)) {\n const data = node.getDataAsJson<FrontendFromFolderData>();\n if (data === undefined) throw new Error(`No resource data.`);\n env.signer.verify(\n data.path,\n data.signature,\n `Frontend path signature mismatch for: ${data.path}`,\n );\n return data.path;\n } else {\n throw new Error(`Unsupported resource type: ${JSON.stringify(node.resourceType)}`);\n }\n}\n\nfunction frontendUrlComputable(\n entry: PlTreeEntry | undefined,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<string> | undefined {\n if (entry === undefined) return undefined;\n return Computable.make(\n (c) => {\n return kernel(c.accessor(entry), env);\n },\n {\n postprocessValue: (v) => {\n if (v === undefined) return undefined;\n if (typeof v === \"string\") return v;\n if (v.error !== undefined) throw new Error(v.error);\n return v.url;\n },\n },\n ).withStableType();\n}\n\nexport function frontendData(\n projectEntry: PlTreeEntry,\n id: string,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<FrontendData> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(projectEntry).node();\n const bp = getBlockPackInfo(prj, id);\n const frontendEntry = prj\n .traverse(\n {\n field: projectFieldName(id, \"blockPack\"),\n assertFieldType: \"Dynamic\",\n },\n { field: Pl.HolderRefField, assertFieldType: \"Input\", errorIfFieldNotFound: true },\n { field: BlockPackFrontendField, assertFieldType: \"Input\" },\n )\n ?.persist();\n return {\n url: frontendUrlComputable(frontendEntry, env),\n sdkVersion: bp?.cfg.sdkVersion,\n };\n },\n { mode: \"StableOnlyLive\" },\n ) as ComputableStableDefined<FrontendData>;\n}\n"],"mappings":";;;;;;;;AAaA,SAAS,OACP,aACA,KACyD;CACzD,MAAM,OAAO,YAAY,MAAM;AAC/B,KAAI,mBAAmB,KAAK,cAAc,4BAA4B,EAAE;EACtE,MAAM,OAAO,KAAK,eAAoC;AACtD,MAAI,SAAS,OAAW,OAAM,IAAI,MAAM,oBAAoB;AAC5D,SAAO,IAAI,uBAAuB,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,gBAAgB;YACnE,mBAAmB,KAAK,cAAc,+BAA+B,EAAE;EAChF,MAAM,OAAO,KAAK,eAAuC;AACzD,MAAI,SAAS,OAAW,OAAM,IAAI,MAAM,oBAAoB;AAC5D,MAAI,OAAO,OACT,KAAK,MACL,KAAK,WACL,yCAAyC,KAAK,OAC/C;AACD,SAAO,KAAK;OAEZ,OAAM,IAAI,MAAM,8BAA8B,KAAK,UAAU,KAAK,aAAa,GAAG;;AAItF,SAAS,sBACP,OACA,KAC6C;AAC7C,KAAI,UAAU,OAAW,QAAO;AAChC,QAAO,WAAW,MACf,MAAM;AACL,SAAO,OAAO,EAAE,SAAS,MAAM,EAAE,IAAI;IAEvC,EACE,mBAAmB,MAAM;AACvB,MAAI,MAAM,OAAW,QAAO;AAC5B,MAAI,OAAO,MAAM,SAAU,QAAO;AAClC,MAAI,EAAE,UAAU,OAAW,OAAM,IAAI,MAAM,EAAE,MAAM;AACnD,SAAO,EAAE;IAEZ,CACF,CAAC,gBAAgB;;AAGpB,SAAgB,aACd,cACA,IACA,KACuC;AACvC,QAAO,WAAW,MACf,QAAQ;EACP,MAAM,MAAM,IAAI,SAAS,aAAa,CAAC,MAAM;EAC7C,MAAM,KAAK,iBAAiB,KAAK,GAAG;EACpC,MAAM,gBAAgB,IACnB,SACC;GACE,OAAO,iBAAiB,IAAI,YAAY;GACxC,iBAAiB;GAClB,EACD;GAAE,OAAO,GAAG;GAAgB,iBAAiB;GAAS,sBAAsB;GAAM,EAClF;GAAE,OAAO;GAAwB,iBAAiB;GAAS,CAC5D,EACC,SAAS;AACb,SAAO;GACL,KAAK,sBAAsB,eAAe,IAAI;GAC9C,YAAY,IAAI,IAAI;GACrB;IAEH,EAAE,MAAM,kBAAkB,CAC3B"}
1
+ {"version":3,"file":"frontend_path.js","names":[],"sources":["../../src/middle_layer/frontend_path.ts"],"sourcesContent":["import type { PlTreeEntry, PlTreeEntryAccessor } from \"@milaboratories/pl-tree\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport { Pl, resourceTypesEqual } from \"@milaboratories/pl-client\";\nimport type { FrontendFromFolderData, FrontendFromUrlData } from \"../model\";\nimport { FrontendFromFolderResourceType, FrontendFromUrlResourceType } from \"../model\";\nimport type { UrlResult } from \"@milaboratories/pl-drivers\";\nimport { projectFieldName } from \"../model/project_model\";\nimport { BlockPackFrontendField } from \"../mutator/block-pack/block_pack\";\nimport { getBlockPackInfo } from \"./util\";\nimport type { FrontendData } from \"../model/frontend\";\n\nfunction kernel(\n frontendRes: PlTreeEntryAccessor,\n env: MiddleLayerEnvironment,\n): undefined | string | ComputableStableDefined<UrlResult> {\n const node = frontendRes.node();\n if (resourceTypesEqual(node.resourceType, FrontendFromUrlResourceType)) {\n const data = node.getDataAsJson<FrontendFromUrlData>();\n if (data === undefined) throw new Error(`No resource data.`);\n return env.frontendDownloadDriver.getUrl(new URL(data.url)).withStableType();\n } else if (resourceTypesEqual(node.resourceType, FrontendFromFolderResourceType)) {\n const data = node.getDataAsJson<FrontendFromFolderData>();\n if (data === undefined) throw new Error(`No resource data.`);\n env.signer.verify(\n data.path,\n data.signature,\n `Frontend path signature mismatch for: ${data.path}`,\n );\n return data.path;\n } else {\n throw new Error(`Unsupported resource type: ${JSON.stringify(node.resourceType)}`);\n }\n}\n\nfunction frontendUrlComputable(\n entry: PlTreeEntry | undefined,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<string> | undefined {\n if (entry === undefined) return undefined;\n return Computable.make(\n (c) => {\n return kernel(c.accessor(entry), env);\n },\n {\n postprocessValue: (v) => {\n if (v === undefined) return undefined;\n if (typeof v === \"string\") return v;\n if (v.error !== undefined) throw new Error(v.error);\n return v.url;\n },\n },\n ).withStableType();\n}\n\nexport function frontendData(\n projectEntry: PlTreeEntry,\n id: string,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<FrontendData> {\n return Computable.make(\n (ctx) => {\n const prj = ctx.accessor(projectEntry).node();\n const bp = getBlockPackInfo(prj, id);\n const frontendEntry = prj\n .traverse(\n {\n field: projectFieldName(id, \"blockPack\"),\n assertFieldType: \"Dynamic\",\n },\n { field: Pl.HolderRefField, assertFieldType: \"Input\", errorIfFieldNotFound: true },\n { field: BlockPackFrontendField, assertFieldType: \"Input\" },\n )\n ?.persist();\n return {\n url: frontendUrlComputable(frontendEntry, env),\n sdkVersion: bp?.cfg.sdkVersion,\n };\n },\n { mode: \"StableOnlyLive\" },\n ) as ComputableStableDefined<FrontendData>;\n}\n"],"mappings":";;;;;;;AAaA,SAAS,OACP,aACA,KACyD;CACzD,MAAM,OAAO,YAAY,MAAM;AAC/B,KAAI,mBAAmB,KAAK,cAAc,4BAA4B,EAAE;EACtE,MAAM,OAAO,KAAK,eAAoC;AACtD,MAAI,SAAS,KAAA,EAAW,OAAM,IAAI,MAAM,oBAAoB;AAC5D,SAAO,IAAI,uBAAuB,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,gBAAgB;YACnE,mBAAmB,KAAK,cAAc,+BAA+B,EAAE;EAChF,MAAM,OAAO,KAAK,eAAuC;AACzD,MAAI,SAAS,KAAA,EAAW,OAAM,IAAI,MAAM,oBAAoB;AAC5D,MAAI,OAAO,OACT,KAAK,MACL,KAAK,WACL,yCAAyC,KAAK,OAC/C;AACD,SAAO,KAAK;OAEZ,OAAM,IAAI,MAAM,8BAA8B,KAAK,UAAU,KAAK,aAAa,GAAG;;AAItF,SAAS,sBACP,OACA,KAC6C;AAC7C,KAAI,UAAU,KAAA,EAAW,QAAO,KAAA;AAChC,QAAO,WAAW,MACf,MAAM;AACL,SAAO,OAAO,EAAE,SAAS,MAAM,EAAE,IAAI;IAEvC,EACE,mBAAmB,MAAM;AACvB,MAAI,MAAM,KAAA,EAAW,QAAO,KAAA;AAC5B,MAAI,OAAO,MAAM,SAAU,QAAO;AAClC,MAAI,EAAE,UAAU,KAAA,EAAW,OAAM,IAAI,MAAM,EAAE,MAAM;AACnD,SAAO,EAAE;IAEZ,CACF,CAAC,gBAAgB;;AAGpB,SAAgB,aACd,cACA,IACA,KACuC;AACvC,QAAO,WAAW,MACf,QAAQ;EACP,MAAM,MAAM,IAAI,SAAS,aAAa,CAAC,MAAM;EAC7C,MAAM,KAAK,iBAAiB,KAAK,GAAG;EACpC,MAAM,gBAAgB,IACnB,SACC;GACE,OAAO,iBAAiB,IAAI,YAAY;GACxC,iBAAiB;GAClB,EACD;GAAE,OAAO,GAAG;GAAgB,iBAAiB;GAAS,sBAAsB;GAAM,EAClF;GAAE,OAAO;GAAwB,iBAAiB;GAAS,CAC5D,EACC,SAAS;AACb,SAAO;GACL,KAAK,sBAAsB,eAAe,IAAI;GAC9C,YAAY,IAAI,IAAI;GACrB;IAEH,EAAE,MAAM,kBAAkB,CAC3B"}
@@ -1,5 +1,5 @@
1
- const require_project_list = require('./project_list.cjs');
2
- const require_project = require('./project.cjs');
3
- const require_ops = require('./ops.cjs');
4
- const require_driver_kit = require('./driver_kit.cjs');
5
- const require_middle_layer = require('./middle_layer.cjs');
1
+ require("./project_list.cjs");
2
+ require("./project.cjs");
3
+ require("./ops.cjs");
4
+ require("./driver_kit.cjs");
5
+ require("./middle_layer.cjs");
@@ -1,5 +1,5 @@
1
- import { ProjectsField } from "./project_list.js";
2
- import { Project } from "./project.js";
3
- import { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings, DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings } from "./ops.js";
4
- import { initDriverKit } from "./driver_kit.js";
5
- import { MiddleLayer } from "./middle_layer.js";
1
+ import "./project_list.js";
2
+ import "./project.js";
3
+ import "./ops.js";
4
+ import "./driver_kit.js";
5
+ import "./middle_layer.js";
@@ -1,17 +1,17 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
- const require_registry_v2_provider = require('../block_registry/registry-v2-provider.cjs');
3
- require('../block_registry/index.cjs');
4
- const require_project_model = require('../model/project_model.cjs');
5
- const require_project_list = require('./project_list.cjs');
6
- const require_block_pack = require('../mutator/block-pack/block_pack.cjs');
7
- const require_index$1 = require('../debug/index.cjs');
8
- const require_project = require('../mutator/project.cjs');
9
- const require_project$1 = require('./project.cjs');
10
- const require_ops = require('./ops.cjs');
11
- const require_watcher = require('../block_registry/watcher.cjs');
12
- const require_driver_kit = require('./driver_kit.cjs');
13
- const require_service_factories = require('../service_factories.cjs');
14
- const require_project_helper = require('../model/project_helper.cjs');
1
+ require("../_virtual/_rolldown/runtime.cjs");
2
+ const require_registry_v2_provider = require("../block_registry/registry-v2-provider.cjs");
3
+ require("../block_registry/index.cjs");
4
+ const require_project_model = require("../model/project_model.cjs");
5
+ const require_project_list = require("./project_list.cjs");
6
+ const require_block_pack = require("../mutator/block-pack/block_pack.cjs");
7
+ const require_index$1 = require("../debug/index.cjs");
8
+ const require_project = require("../mutator/project.cjs");
9
+ const require_project$1 = require("./project.cjs");
10
+ const require_ops = require("./ops.cjs");
11
+ const require_watcher = require("../block_registry/watcher.cjs");
12
+ const require_driver_kit = require("./driver_kit.cjs");
13
+ const require_service_factories = require("../service_factories.cjs");
14
+ const require_project_helper = require("../model/project_helper.cjs");
15
15
  let _platforma_sdk_model = require("@platforma-sdk/model");
16
16
  let undici = require("undici");
17
17
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
@@ -20,7 +20,6 @@ let _milaboratories_computable = require("@milaboratories/computable");
20
20
  let node_crypto = require("node:crypto");
21
21
  let quickjs_emscripten = require("quickjs-emscripten");
22
22
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
23
-
24
23
  //#region src/middle_layer/middle_layer.ts
25
24
  /**
26
25
  * Main access object to work with pl from UI.
@@ -246,7 +245,7 @@ var MiddleLayer = class MiddleLayer {
246
245
  return new MiddleLayer(env, driverKit, driverKit.signer, projects, openedProjects, projectListTC.tree, v2RegistryProvider, projectListTC.computable);
247
246
  }
248
247
  };
249
-
250
248
  //#endregion
251
249
  exports.MiddleLayer = MiddleLayer;
250
+
252
251
  //# sourceMappingURL=middle_layer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"middle_layer.cjs","names":["createProject","withProjectAuthored","ProjectMetaKey","isNotNullResourceId","duplicateProject","Project","HmacSha256Signer","DefaultMiddleLayerOpsSettings","DefaultMiddleLayerOpsPaths","getDebugFlags","ProjectsField","ProjectsResourceType","initDriverKit","RetryAgent","V2RegistryProvider","BlockPackPreparer","RuntimeCapabilities","createModelServiceRegistry","BlockEventDispatcher","BlockUpdateWatcher","ProjectHelper","WatchableValue","createProjectList"],"sources":["../../src/middle_layer/middle_layer.ts"],"sourcesContent":["import type { PlClient, ResourceId } from \"@milaboratories/pl-client\";\nimport {\n field,\n isNotNullResourceId,\n isNullResourceId,\n toGlobalResourceId,\n} from \"@milaboratories/pl-client\";\nimport { createProjectList, ProjectsField, ProjectsResourceType } from \"./project_list\";\nimport { createProject, duplicateProject, withProjectAuthored } from \"../mutator/project\";\nimport { ProjectMetaKey } from \"../model/project_model\";\nimport type { SynchronizedTreeState } from \"@milaboratories/pl-tree\";\nimport { BlockPackPreparer } from \"../mutator/block-pack/block_pack\";\nimport type { MiLogger, Signer } from \"@milaboratories/ts-helpers\";\nimport { BlockEventDispatcher } from \"@milaboratories/ts-helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { WatchableValue } from \"@milaboratories/computable\";\nimport { Project } from \"./project\";\nimport type { MiddleLayerOps, MiddleLayerOpsConstructor } from \"./ops\";\nimport { DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings } from \"./ops\";\nimport { randomUUID } from \"node:crypto\";\nimport type { ProjectListEntry } from \"../model\";\nimport type {\n AuthorMarker,\n ProjectMeta,\n BlockPlatform,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { BlockUpdateWatcher } from \"../block_registry/watcher\";\nimport type { QuickJSWASMModule } from \"quickjs-emscripten\";\nimport { getQuickJS } from \"quickjs-emscripten\";\nimport type { MiddleLayerDriverKit } from \"./driver_kit\";\nimport { initDriverKit } from \"./driver_kit\";\nimport type { BlockCodeFeatureFlags, DriverKit, SupportedRequirement } from \"@platforma-sdk/model\";\nimport { RuntimeCapabilities } from \"@platforma-sdk/model\";\nimport {\n type ModelServiceRegistry,\n registerServiceCapabilities,\n} from \"@milaboratories/pl-model-common\";\nimport { createModelServiceRegistry } from \"../service_factories\";\nimport type { DownloadUrlDriver } from \"@milaboratories/pl-drivers\";\nimport { V2RegistryProvider } from \"../block_registry\";\nimport type { Dispatcher } from \"undici\";\nimport { RetryAgent } from \"undici\";\nimport { getDebugFlags } from \"../debug\";\nimport { ProjectHelper } from \"../model/project_helper\";\n\nexport interface MiddleLayerEnvironment {\n dispose(): Promise<void>;\n readonly pl: PlClient;\n readonly runtimeCapabilities: RuntimeCapabilities;\n readonly logger: MiLogger;\n readonly blockEventDispatcher: BlockEventDispatcher;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n readonly serviceRegistry: ModelServiceRegistry;\n readonly projectHelper: ProjectHelper;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n public readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>,\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /**\n * Get the OS where backend is running.\n * For old backend versions returns undefined.\n */\n public get serverPlatform(): BlockPlatform | undefined {\n return this.pl.serverInfo.platform as BlockPlatform | undefined;\n }\n\n /** Adds a runtime capability to the middle layer. */\n public addRuntimeCapability(\n requirement: SupportedRequirement,\n value: number | boolean = true,\n ): void {\n this.env.runtimeCapabilities.addSupportedRequirement(requirement, value);\n }\n\n /** Checks if the given block feature flags are compatible with the runtime capabilities. */\n public checkBlockCompatibility(featureFlags: BlockCodeFeatureFlags | undefined): boolean {\n return this.env.runtimeCapabilities.checkCompatibility(featureFlags);\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n /** Returns the service registry for service introspection. */\n public get serviceRegistry(): ModelServiceRegistry {\n return this.env.serviceRegistry;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx(\"MLCreateProject\", async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), \"Dynamic\", prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker,\n ): Promise<void> {\n await withProjectAuthored(\n this.env.projectHelper,\n this.pl,\n rid,\n author,\n (prj) => {\n prj.setMeta(meta);\n },\n { name: \"setProjectMeta\" },\n );\n await this.projectListTree.refreshState();\n }\n\n /** Permanently deletes project from the project list, this will result in\n * destruction of all attached objects, like files, analysis results etc. */\n public async deleteProject(id: string): Promise<void> {\n await this.pl.withWriteTx(\"MLRemoveProject\", async (tx) => {\n tx.removeField(field(this.projectListResourceId, id));\n await tx.commit();\n });\n await this.projectListTree.refreshState();\n }\n\n /**\n * Duplicates an existing project and adds the copy to this user's project list.\n *\n * @param sourceRid - resource id of the project to duplicate\n * @param rename - optional function that receives the source label and all existing\n * project labels (read within the same transaction), and returns the label for the copy\n * @param id - optional id for the new project list entry (defaults to random UUID)\n */\n public async duplicateProject(\n sourceRid: ResourceId,\n rename?: (previousLabel: string, existingLabels: string[]) => string,\n id: string = randomUUID(),\n ): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx(\"MLDuplicateProject\", async (tx) => {\n // Read source project meta\n const sourceMeta = await tx.getKValueJson<ProjectMeta>(sourceRid, ProjectMetaKey);\n\n // Read all existing project labels from the project list (parallel reads)\n const projectListData = await tx.getResourceData(this.projectListResourceId, true);\n const projectRids = projectListData.fields.map((f) => f.value).filter(isNotNullResourceId);\n const existingLabels = (\n await Promise.all(\n projectRids.map((rid) => tx.getKValueJson<ProjectMeta>(rid, ProjectMetaKey)),\n )\n ).map((m) => m.label);\n\n // Compute new label\n const newLabel = rename ? rename(sourceMeta.label, existingLabels) : sourceMeta.label;\n\n // Create the duplicate\n const newPrj = await duplicateProject(tx, sourceRid, { label: newLabel });\n\n // Attach to project list\n tx.createField(field(this.projectListResourceId, id), \"Dynamic\", newPrj);\n await tx.commit();\n return await toGlobalResourceId(newPrj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n //\n // Projects\n //\n\n private readonly openedProjectsByRid = new Map<ResourceId, Project>();\n\n private async projectIdToResourceId(id: string): Promise<ResourceId> {\n return await this.pl.withReadTx(\"Project id to resource id\", async (tx) => {\n const rid = (await tx.getField(field(this.projectListResourceId, id))).value;\n if (isNullResourceId(rid)) throw new Error(\"Unexpected project list structure.\");\n return rid;\n });\n }\n\n private async ensureProjectRid(id: ResourceId | string): Promise<ResourceId> {\n if (typeof id === \"string\") return await this.projectIdToResourceId(id);\n else return id;\n }\n\n /** Opens a project, and starts corresponding project maintenance loop. */\n public async openProject(id: ResourceId | string) {\n const rid = await this.ensureProjectRid(id);\n if (this.openedProjectsByRid.has(rid)) throw new Error(`Project ${rid} already opened`);\n this.openedProjectsByRid.set(rid, await Project.init(this.env, rid));\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Closes the project, and deallocate all corresponding resources. */\n public async closeProject(rid: ResourceId): Promise<void> {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n this.openedProjectsByRid.delete(rid);\n await prj.destroy();\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Returns a project access object for opened project, for the given project\n * resource id. */\n public getOpenedProject(rid: ResourceId): Project {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n return prj;\n }\n\n /** Returns true if project with given resource id is currently opened. */\n public isProjectOpened(rid: ResourceId): boolean {\n return this.openedProjectsByRid.has(rid);\n }\n\n /**\n * Deallocates all runtime resources consumed by this object and awaits\n * actual termination of event loops and other processes associated with\n * them.\n */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.dispose();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Returns a block event dispatcher, which can be used to listen to block events. */\n public get blockEventDispatcher(): BlockEventDispatcher {\n return this.env.blockEventDispatcher;\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor,\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops,\n };\n\n // overriding debug options from environment variables\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n ops.debugOps.dumpInitialTreeState = getDebugFlags().dumpInitialTreeState;\n\n const projects = await pl.withWriteTx(\"MLInitialization\", async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, \"Dynamic\");\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops.frontendDownloadPath, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher);\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher,\n );\n\n const quickJs = await getQuickJS();\n\n const runtimeCapabilities = new RuntimeCapabilities();\n // add runtime capabilities of model here\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 1);\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 2);\n runtimeCapabilities.addSupportedRequirement(\"requiresCreatePTable\", 2);\n registerServiceCapabilities((flag, value) =>\n runtimeCapabilities.addSupportedRequirement(flag, value),\n );\n // runtime capabilities of the desktop are to be added by the desktop app / test framework\n\n const serviceRegistry = createModelServiceRegistry({ logger });\n\n const env: MiddleLayerEnvironment = {\n pl,\n blockEventDispatcher: new BlockEventDispatcher(),\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver: driverKit.frontendDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel,\n }),\n runtimeCapabilities,\n serviceRegistry,\n quickJs,\n projectHelper: new ProjectHelper(quickJs, logger),\n dispose: async () => {\n await serviceRegistry.dispose();\n await retryHttpDispatcher.destroy();\n await driverKit.dispose();\n },\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable,\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"middle_layer.cjs","names":["createProject","withProjectAuthored","ProjectMetaKey","isNotNullResourceId","duplicateProject","Project","HmacSha256Signer","DefaultMiddleLayerOpsSettings","DefaultMiddleLayerOpsPaths","getDebugFlags","ProjectsField","ProjectsResourceType","initDriverKit","RetryAgent","V2RegistryProvider","BlockPackPreparer","RuntimeCapabilities","createModelServiceRegistry","BlockEventDispatcher","BlockUpdateWatcher","ProjectHelper","WatchableValue","createProjectList"],"sources":["../../src/middle_layer/middle_layer.ts"],"sourcesContent":["import type { PlClient, ResourceId } from \"@milaboratories/pl-client\";\nimport {\n field,\n isNotNullResourceId,\n isNullResourceId,\n toGlobalResourceId,\n} from \"@milaboratories/pl-client\";\nimport { createProjectList, ProjectsField, ProjectsResourceType } from \"./project_list\";\nimport { createProject, duplicateProject, withProjectAuthored } from \"../mutator/project\";\nimport { ProjectMetaKey } from \"../model/project_model\";\nimport type { SynchronizedTreeState } from \"@milaboratories/pl-tree\";\nimport { BlockPackPreparer } from \"../mutator/block-pack/block_pack\";\nimport type { MiLogger, Signer } from \"@milaboratories/ts-helpers\";\nimport { BlockEventDispatcher } from \"@milaboratories/ts-helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { WatchableValue } from \"@milaboratories/computable\";\nimport { Project } from \"./project\";\nimport type { MiddleLayerOps, MiddleLayerOpsConstructor } from \"./ops\";\nimport { DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings } from \"./ops\";\nimport { randomUUID } from \"node:crypto\";\nimport type { ProjectListEntry } from \"../model\";\nimport type {\n AuthorMarker,\n ProjectMeta,\n BlockPlatform,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { BlockUpdateWatcher } from \"../block_registry/watcher\";\nimport type { QuickJSWASMModule } from \"quickjs-emscripten\";\nimport { getQuickJS } from \"quickjs-emscripten\";\nimport type { MiddleLayerDriverKit } from \"./driver_kit\";\nimport { initDriverKit } from \"./driver_kit\";\nimport type { BlockCodeFeatureFlags, DriverKit, SupportedRequirement } from \"@platforma-sdk/model\";\nimport { RuntimeCapabilities } from \"@platforma-sdk/model\";\nimport {\n type ModelServiceRegistry,\n registerServiceCapabilities,\n} from \"@milaboratories/pl-model-common\";\nimport { createModelServiceRegistry } from \"../service_factories\";\nimport type { DownloadUrlDriver } from \"@milaboratories/pl-drivers\";\nimport { V2RegistryProvider } from \"../block_registry\";\nimport type { Dispatcher } from \"undici\";\nimport { RetryAgent } from \"undici\";\nimport { getDebugFlags } from \"../debug\";\nimport { ProjectHelper } from \"../model/project_helper\";\n\nexport interface MiddleLayerEnvironment {\n dispose(): Promise<void>;\n readonly pl: PlClient;\n readonly runtimeCapabilities: RuntimeCapabilities;\n readonly logger: MiLogger;\n readonly blockEventDispatcher: BlockEventDispatcher;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n readonly serviceRegistry: ModelServiceRegistry;\n readonly projectHelper: ProjectHelper;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n public readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>,\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /**\n * Get the OS where backend is running.\n * For old backend versions returns undefined.\n */\n public get serverPlatform(): BlockPlatform | undefined {\n return this.pl.serverInfo.platform as BlockPlatform | undefined;\n }\n\n /** Adds a runtime capability to the middle layer. */\n public addRuntimeCapability(\n requirement: SupportedRequirement,\n value: number | boolean = true,\n ): void {\n this.env.runtimeCapabilities.addSupportedRequirement(requirement, value);\n }\n\n /** Checks if the given block feature flags are compatible with the runtime capabilities. */\n public checkBlockCompatibility(featureFlags: BlockCodeFeatureFlags | undefined): boolean {\n return this.env.runtimeCapabilities.checkCompatibility(featureFlags);\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n /** Returns the service registry for service introspection. */\n public get serviceRegistry(): ModelServiceRegistry {\n return this.env.serviceRegistry;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx(\"MLCreateProject\", async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), \"Dynamic\", prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker,\n ): Promise<void> {\n await withProjectAuthored(\n this.env.projectHelper,\n this.pl,\n rid,\n author,\n (prj) => {\n prj.setMeta(meta);\n },\n { name: \"setProjectMeta\" },\n );\n await this.projectListTree.refreshState();\n }\n\n /** Permanently deletes project from the project list, this will result in\n * destruction of all attached objects, like files, analysis results etc. */\n public async deleteProject(id: string): Promise<void> {\n await this.pl.withWriteTx(\"MLRemoveProject\", async (tx) => {\n tx.removeField(field(this.projectListResourceId, id));\n await tx.commit();\n });\n await this.projectListTree.refreshState();\n }\n\n /**\n * Duplicates an existing project and adds the copy to this user's project list.\n *\n * @param sourceRid - resource id of the project to duplicate\n * @param rename - optional function that receives the source label and all existing\n * project labels (read within the same transaction), and returns the label for the copy\n * @param id - optional id for the new project list entry (defaults to random UUID)\n */\n public async duplicateProject(\n sourceRid: ResourceId,\n rename?: (previousLabel: string, existingLabels: string[]) => string,\n id: string = randomUUID(),\n ): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx(\"MLDuplicateProject\", async (tx) => {\n // Read source project meta\n const sourceMeta = await tx.getKValueJson<ProjectMeta>(sourceRid, ProjectMetaKey);\n\n // Read all existing project labels from the project list (parallel reads)\n const projectListData = await tx.getResourceData(this.projectListResourceId, true);\n const projectRids = projectListData.fields.map((f) => f.value).filter(isNotNullResourceId);\n const existingLabels = (\n await Promise.all(\n projectRids.map((rid) => tx.getKValueJson<ProjectMeta>(rid, ProjectMetaKey)),\n )\n ).map((m) => m.label);\n\n // Compute new label\n const newLabel = rename ? rename(sourceMeta.label, existingLabels) : sourceMeta.label;\n\n // Create the duplicate\n const newPrj = await duplicateProject(tx, sourceRid, { label: newLabel });\n\n // Attach to project list\n tx.createField(field(this.projectListResourceId, id), \"Dynamic\", newPrj);\n await tx.commit();\n return await toGlobalResourceId(newPrj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n //\n // Projects\n //\n\n private readonly openedProjectsByRid = new Map<ResourceId, Project>();\n\n private async projectIdToResourceId(id: string): Promise<ResourceId> {\n return await this.pl.withReadTx(\"Project id to resource id\", async (tx) => {\n const rid = (await tx.getField(field(this.projectListResourceId, id))).value;\n if (isNullResourceId(rid)) throw new Error(\"Unexpected project list structure.\");\n return rid;\n });\n }\n\n private async ensureProjectRid(id: ResourceId | string): Promise<ResourceId> {\n if (typeof id === \"string\") return await this.projectIdToResourceId(id);\n else return id;\n }\n\n /** Opens a project, and starts corresponding project maintenance loop. */\n public async openProject(id: ResourceId | string) {\n const rid = await this.ensureProjectRid(id);\n if (this.openedProjectsByRid.has(rid)) throw new Error(`Project ${rid} already opened`);\n this.openedProjectsByRid.set(rid, await Project.init(this.env, rid));\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Closes the project, and deallocate all corresponding resources. */\n public async closeProject(rid: ResourceId): Promise<void> {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n this.openedProjectsByRid.delete(rid);\n await prj.destroy();\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Returns a project access object for opened project, for the given project\n * resource id. */\n public getOpenedProject(rid: ResourceId): Project {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n return prj;\n }\n\n /** Returns true if project with given resource id is currently opened. */\n public isProjectOpened(rid: ResourceId): boolean {\n return this.openedProjectsByRid.has(rid);\n }\n\n /**\n * Deallocates all runtime resources consumed by this object and awaits\n * actual termination of event loops and other processes associated with\n * them.\n */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.dispose();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Returns a block event dispatcher, which can be used to listen to block events. */\n public get blockEventDispatcher(): BlockEventDispatcher {\n return this.env.blockEventDispatcher;\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor,\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops,\n };\n\n // overriding debug options from environment variables\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n ops.debugOps.dumpInitialTreeState = getDebugFlags().dumpInitialTreeState;\n\n const projects = await pl.withWriteTx(\"MLInitialization\", async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, \"Dynamic\");\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops.frontendDownloadPath, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher);\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher,\n );\n\n const quickJs = await getQuickJS();\n\n const runtimeCapabilities = new RuntimeCapabilities();\n // add runtime capabilities of model here\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 1);\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 2);\n runtimeCapabilities.addSupportedRequirement(\"requiresCreatePTable\", 2);\n registerServiceCapabilities((flag, value) =>\n runtimeCapabilities.addSupportedRequirement(flag, value),\n );\n // runtime capabilities of the desktop are to be added by the desktop app / test framework\n\n const serviceRegistry = createModelServiceRegistry({ logger });\n\n const env: MiddleLayerEnvironment = {\n pl,\n blockEventDispatcher: new BlockEventDispatcher(),\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver: driverKit.frontendDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel,\n }),\n runtimeCapabilities,\n serviceRegistry,\n quickJs,\n projectHelper: new ProjectHelper(quickJs, logger),\n dispose: async () => {\n await serviceRegistry.dispose();\n await retryHttpDispatcher.destroy();\n await driverKit.dispose();\n },\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable,\n );\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,5 @@
1
1
  import { V2RegistryProvider } from "../block_registry/registry-v2-provider.js";
2
- import "../block_registry/index.js";
3
2
  import { ProjectListEntry as ProjectListEntry$1 } from "../model/project_model.js";
4
- import "../model/index.js";
5
3
  import { BlockPackPreparer } from "../mutator/block-pack/block_pack.js";
6
4
  import { Project } from "./project.js";
7
5
  import { MiddleLayerOps, MiddleLayerOpsConstructor } from "./ops.js";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middle_layer.d.ts","names":[],"sources":["../../src/middle_layer/middle_layer.ts"],"mappings":";;;;;;;;;;;;;;;;;;;UA8CiB,sBAAA;EACf,OAAA,IAAW,OAAA;EAAA,SACF,EAAA,EAAI,QAAA;EAAA,SACJ,mBAAA,EAAqB,mBAAA;EAAA,SACrB,MAAA,EAAQ,QAAA;EAAA,SACR,oBAAA,EAAsB,oBAAA;EAAA,SACtB,cAAA,EAAgB,UAAA;EAAA,SAChB,mBAAA,EAAqB,UAAA;EAAA,SACrB,MAAA,EAAQ,MAAA;EAAA,SACR,GAAA,EAAK,cAAA;EAAA,SACL,UAAA,EAAY,iBAAA;EAAA,SACZ,sBAAA,EAAwB,iBAAA;EAAA,SACxB,kBAAA,EAAoB,kBAAA;EAAA,SACpB,OAAA,EAAS,iBAAA;EAAA,SACT,SAAA,EAAW,oBAAA;EAAA,SACX,eAAA,EAAiB,oBAAA;EAAA,SACjB,aAAA,EAAe,aAAA;AAAA;;;;;;;;;;;;;cAeb,WAAA;EAAA,iBAOQ,GAAA;EAAA,SACD,SAAA,EAAW,SAAA;EAAA,SACX,MAAA,EAAQ,MAAA;EAAA,iBACP,qBAAA;EAAA,iBACA,kBAAA;EAAA,iBACA,eAAA;EAAA,SACD,qBAAA,EAAuB,kBAAA;EAAA,SAZzB,EAAA,EAAI,QAAA;EAvBX;EAAA,SA0BO,WAAA,EAAa,uBAAA,CAAwB,kBAAA;EAAA,QAE9C,WAAA,CAAA;EA3Bc;;;;EAAA,IA6CV,cAAA,CAAA,GAAkB,aAAA;EA1CpB;EA+CF,oBAAA,CACL,WAAA,EAAa,oBAAA,EACb,KAAA;EAhDO;EAsDF,uBAAA,CAAwB,YAAA,EAAc,qBAAA;EArDpC;EAAA,IA0DE,iBAAA,CAAA,GAAqB,oBAAA;EAzDvB;EAAA,IA8DE,eAAA,CAAA,GAAmB,oBAAA;EA9DO;EAuExB,aAAA,CAAc,IAAA,EAAM,WAAA,EAAa,EAAA,YAA4B,OAAA,CAAQ,UAAA;EAxDvE;EAoEE,cAAA,CACX,GAAA,EAAK,UAAA,EACL,IAAA,EAAM,WAAA,EACN,MAAA,GAAS,YAAA,GACR,OAAA;;;EAgBU,aAAA,CAAc,EAAA,WAAa,OAAA;EA3EC;;;;;;;;EA2F5B,gBAAA,CACX,SAAA,EAAW,UAAA,EACX,MAAA,IAAU,aAAA,UAAuB,cAAA,uBACjC,EAAA,YACC,OAAA,CAAQ,UAAA;EAAA,iBAiCM,mBAAA;EAAA,QAEH,qBAAA;EAAA,QAQA,gBAAA;EAlFP;EAwFM,WAAA,CAAY,EAAA,EAAI,UAAA,YAAmB,OAAA;EAtFrC;EA8FE,YAAA,CAAa,GAAA,EAAK,UAAA,GAAa,OAAA;EA7EJ;;EAuFjC,gBAAA,CAAiB,GAAA,EAAK,UAAA,GAAa,OAAA;EAnEvC;EA0EI,eAAA,CAAgB,GAAA,EAAK,UAAA;EAzBoB;;;;;EAkCnC,KAAA,CAAA,GAAK,OAAA;EAAA;EASL,wBAAA,CAAA,GAAwB,OAAA;EAWF;;EAAA,OALrB,mBAAA,CAAA;EAcH;EAAA,IATA,oBAAA,CAAA,GAAwB,oBAAA;EASzB;EAAA,OAJU,IAAA,CAClB,EAAA,EAAI,QAAA,EACJ,OAAA,UACA,IAAA,EAAM,yBAAA,GACL,OAAA,CAAQ,WAAA;AAAA"}
@@ -19,7 +19,6 @@ import { WatchableValue } from "@milaboratories/computable";
19
19
  import { randomUUID } from "node:crypto";
20
20
  import { getQuickJS } from "quickjs-emscripten";
21
21
  import { registerServiceCapabilities } from "@milaboratories/pl-model-common";
22
-
23
22
  //#region src/middle_layer/middle_layer.ts
24
23
  /**
25
24
  * Main access object to work with pl from UI.
@@ -245,7 +244,7 @@ var MiddleLayer = class MiddleLayer {
245
244
  return new MiddleLayer(env, driverKit, driverKit.signer, projects, openedProjects, projectListTC.tree, v2RegistryProvider, projectListTC.computable);
246
245
  }
247
246
  };
248
-
249
247
  //#endregion
250
248
  export { MiddleLayer };
249
+
251
250
  //# sourceMappingURL=middle_layer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"middle_layer.js","names":[],"sources":["../../src/middle_layer/middle_layer.ts"],"sourcesContent":["import type { PlClient, ResourceId } from \"@milaboratories/pl-client\";\nimport {\n field,\n isNotNullResourceId,\n isNullResourceId,\n toGlobalResourceId,\n} from \"@milaboratories/pl-client\";\nimport { createProjectList, ProjectsField, ProjectsResourceType } from \"./project_list\";\nimport { createProject, duplicateProject, withProjectAuthored } from \"../mutator/project\";\nimport { ProjectMetaKey } from \"../model/project_model\";\nimport type { SynchronizedTreeState } from \"@milaboratories/pl-tree\";\nimport { BlockPackPreparer } from \"../mutator/block-pack/block_pack\";\nimport type { MiLogger, Signer } from \"@milaboratories/ts-helpers\";\nimport { BlockEventDispatcher } from \"@milaboratories/ts-helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { WatchableValue } from \"@milaboratories/computable\";\nimport { Project } from \"./project\";\nimport type { MiddleLayerOps, MiddleLayerOpsConstructor } from \"./ops\";\nimport { DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings } from \"./ops\";\nimport { randomUUID } from \"node:crypto\";\nimport type { ProjectListEntry } from \"../model\";\nimport type {\n AuthorMarker,\n ProjectMeta,\n BlockPlatform,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { BlockUpdateWatcher } from \"../block_registry/watcher\";\nimport type { QuickJSWASMModule } from \"quickjs-emscripten\";\nimport { getQuickJS } from \"quickjs-emscripten\";\nimport type { MiddleLayerDriverKit } from \"./driver_kit\";\nimport { initDriverKit } from \"./driver_kit\";\nimport type { BlockCodeFeatureFlags, DriverKit, SupportedRequirement } from \"@platforma-sdk/model\";\nimport { RuntimeCapabilities } from \"@platforma-sdk/model\";\nimport {\n type ModelServiceRegistry,\n registerServiceCapabilities,\n} from \"@milaboratories/pl-model-common\";\nimport { createModelServiceRegistry } from \"../service_factories\";\nimport type { DownloadUrlDriver } from \"@milaboratories/pl-drivers\";\nimport { V2RegistryProvider } from \"../block_registry\";\nimport type { Dispatcher } from \"undici\";\nimport { RetryAgent } from \"undici\";\nimport { getDebugFlags } from \"../debug\";\nimport { ProjectHelper } from \"../model/project_helper\";\n\nexport interface MiddleLayerEnvironment {\n dispose(): Promise<void>;\n readonly pl: PlClient;\n readonly runtimeCapabilities: RuntimeCapabilities;\n readonly logger: MiLogger;\n readonly blockEventDispatcher: BlockEventDispatcher;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n readonly serviceRegistry: ModelServiceRegistry;\n readonly projectHelper: ProjectHelper;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n public readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>,\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /**\n * Get the OS where backend is running.\n * For old backend versions returns undefined.\n */\n public get serverPlatform(): BlockPlatform | undefined {\n return this.pl.serverInfo.platform as BlockPlatform | undefined;\n }\n\n /** Adds a runtime capability to the middle layer. */\n public addRuntimeCapability(\n requirement: SupportedRequirement,\n value: number | boolean = true,\n ): void {\n this.env.runtimeCapabilities.addSupportedRequirement(requirement, value);\n }\n\n /** Checks if the given block feature flags are compatible with the runtime capabilities. */\n public checkBlockCompatibility(featureFlags: BlockCodeFeatureFlags | undefined): boolean {\n return this.env.runtimeCapabilities.checkCompatibility(featureFlags);\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n /** Returns the service registry for service introspection. */\n public get serviceRegistry(): ModelServiceRegistry {\n return this.env.serviceRegistry;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx(\"MLCreateProject\", async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), \"Dynamic\", prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker,\n ): Promise<void> {\n await withProjectAuthored(\n this.env.projectHelper,\n this.pl,\n rid,\n author,\n (prj) => {\n prj.setMeta(meta);\n },\n { name: \"setProjectMeta\" },\n );\n await this.projectListTree.refreshState();\n }\n\n /** Permanently deletes project from the project list, this will result in\n * destruction of all attached objects, like files, analysis results etc. */\n public async deleteProject(id: string): Promise<void> {\n await this.pl.withWriteTx(\"MLRemoveProject\", async (tx) => {\n tx.removeField(field(this.projectListResourceId, id));\n await tx.commit();\n });\n await this.projectListTree.refreshState();\n }\n\n /**\n * Duplicates an existing project and adds the copy to this user's project list.\n *\n * @param sourceRid - resource id of the project to duplicate\n * @param rename - optional function that receives the source label and all existing\n * project labels (read within the same transaction), and returns the label for the copy\n * @param id - optional id for the new project list entry (defaults to random UUID)\n */\n public async duplicateProject(\n sourceRid: ResourceId,\n rename?: (previousLabel: string, existingLabels: string[]) => string,\n id: string = randomUUID(),\n ): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx(\"MLDuplicateProject\", async (tx) => {\n // Read source project meta\n const sourceMeta = await tx.getKValueJson<ProjectMeta>(sourceRid, ProjectMetaKey);\n\n // Read all existing project labels from the project list (parallel reads)\n const projectListData = await tx.getResourceData(this.projectListResourceId, true);\n const projectRids = projectListData.fields.map((f) => f.value).filter(isNotNullResourceId);\n const existingLabels = (\n await Promise.all(\n projectRids.map((rid) => tx.getKValueJson<ProjectMeta>(rid, ProjectMetaKey)),\n )\n ).map((m) => m.label);\n\n // Compute new label\n const newLabel = rename ? rename(sourceMeta.label, existingLabels) : sourceMeta.label;\n\n // Create the duplicate\n const newPrj = await duplicateProject(tx, sourceRid, { label: newLabel });\n\n // Attach to project list\n tx.createField(field(this.projectListResourceId, id), \"Dynamic\", newPrj);\n await tx.commit();\n return await toGlobalResourceId(newPrj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n //\n // Projects\n //\n\n private readonly openedProjectsByRid = new Map<ResourceId, Project>();\n\n private async projectIdToResourceId(id: string): Promise<ResourceId> {\n return await this.pl.withReadTx(\"Project id to resource id\", async (tx) => {\n const rid = (await tx.getField(field(this.projectListResourceId, id))).value;\n if (isNullResourceId(rid)) throw new Error(\"Unexpected project list structure.\");\n return rid;\n });\n }\n\n private async ensureProjectRid(id: ResourceId | string): Promise<ResourceId> {\n if (typeof id === \"string\") return await this.projectIdToResourceId(id);\n else return id;\n }\n\n /** Opens a project, and starts corresponding project maintenance loop. */\n public async openProject(id: ResourceId | string) {\n const rid = await this.ensureProjectRid(id);\n if (this.openedProjectsByRid.has(rid)) throw new Error(`Project ${rid} already opened`);\n this.openedProjectsByRid.set(rid, await Project.init(this.env, rid));\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Closes the project, and deallocate all corresponding resources. */\n public async closeProject(rid: ResourceId): Promise<void> {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n this.openedProjectsByRid.delete(rid);\n await prj.destroy();\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Returns a project access object for opened project, for the given project\n * resource id. */\n public getOpenedProject(rid: ResourceId): Project {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n return prj;\n }\n\n /** Returns true if project with given resource id is currently opened. */\n public isProjectOpened(rid: ResourceId): boolean {\n return this.openedProjectsByRid.has(rid);\n }\n\n /**\n * Deallocates all runtime resources consumed by this object and awaits\n * actual termination of event loops and other processes associated with\n * them.\n */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.dispose();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Returns a block event dispatcher, which can be used to listen to block events. */\n public get blockEventDispatcher(): BlockEventDispatcher {\n return this.env.blockEventDispatcher;\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor,\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops,\n };\n\n // overriding debug options from environment variables\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n ops.debugOps.dumpInitialTreeState = getDebugFlags().dumpInitialTreeState;\n\n const projects = await pl.withWriteTx(\"MLInitialization\", async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, \"Dynamic\");\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops.frontendDownloadPath, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher);\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher,\n );\n\n const quickJs = await getQuickJS();\n\n const runtimeCapabilities = new RuntimeCapabilities();\n // add runtime capabilities of model here\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 1);\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 2);\n runtimeCapabilities.addSupportedRequirement(\"requiresCreatePTable\", 2);\n registerServiceCapabilities((flag, value) =>\n runtimeCapabilities.addSupportedRequirement(flag, value),\n );\n // runtime capabilities of the desktop are to be added by the desktop app / test framework\n\n const serviceRegistry = createModelServiceRegistry({ logger });\n\n const env: MiddleLayerEnvironment = {\n pl,\n blockEventDispatcher: new BlockEventDispatcher(),\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver: driverKit.frontendDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel,\n }),\n runtimeCapabilities,\n serviceRegistry,\n quickJs,\n projectHelper: new ProjectHelper(quickJs, logger),\n dispose: async () => {\n await serviceRegistry.dispose();\n await retryHttpDispatcher.destroy();\n await driverKit.dispose();\n },\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable,\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"middle_layer.js","names":[],"sources":["../../src/middle_layer/middle_layer.ts"],"sourcesContent":["import type { PlClient, ResourceId } from \"@milaboratories/pl-client\";\nimport {\n field,\n isNotNullResourceId,\n isNullResourceId,\n toGlobalResourceId,\n} from \"@milaboratories/pl-client\";\nimport { createProjectList, ProjectsField, ProjectsResourceType } from \"./project_list\";\nimport { createProject, duplicateProject, withProjectAuthored } from \"../mutator/project\";\nimport { ProjectMetaKey } from \"../model/project_model\";\nimport type { SynchronizedTreeState } from \"@milaboratories/pl-tree\";\nimport { BlockPackPreparer } from \"../mutator/block-pack/block_pack\";\nimport type { MiLogger, Signer } from \"@milaboratories/ts-helpers\";\nimport { BlockEventDispatcher } from \"@milaboratories/ts-helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { ComputableStableDefined } from \"@milaboratories/computable\";\nimport { WatchableValue } from \"@milaboratories/computable\";\nimport { Project } from \"./project\";\nimport type { MiddleLayerOps, MiddleLayerOpsConstructor } from \"./ops\";\nimport { DefaultMiddleLayerOpsPaths, DefaultMiddleLayerOpsSettings } from \"./ops\";\nimport { randomUUID } from \"node:crypto\";\nimport type { ProjectListEntry } from \"../model\";\nimport type {\n AuthorMarker,\n ProjectMeta,\n BlockPlatform,\n} from \"@milaboratories/pl-model-middle-layer\";\nimport { BlockUpdateWatcher } from \"../block_registry/watcher\";\nimport type { QuickJSWASMModule } from \"quickjs-emscripten\";\nimport { getQuickJS } from \"quickjs-emscripten\";\nimport type { MiddleLayerDriverKit } from \"./driver_kit\";\nimport { initDriverKit } from \"./driver_kit\";\nimport type { BlockCodeFeatureFlags, DriverKit, SupportedRequirement } from \"@platforma-sdk/model\";\nimport { RuntimeCapabilities } from \"@platforma-sdk/model\";\nimport {\n type ModelServiceRegistry,\n registerServiceCapabilities,\n} from \"@milaboratories/pl-model-common\";\nimport { createModelServiceRegistry } from \"../service_factories\";\nimport type { DownloadUrlDriver } from \"@milaboratories/pl-drivers\";\nimport { V2RegistryProvider } from \"../block_registry\";\nimport type { Dispatcher } from \"undici\";\nimport { RetryAgent } from \"undici\";\nimport { getDebugFlags } from \"../debug\";\nimport { ProjectHelper } from \"../model/project_helper\";\n\nexport interface MiddleLayerEnvironment {\n dispose(): Promise<void>;\n readonly pl: PlClient;\n readonly runtimeCapabilities: RuntimeCapabilities;\n readonly logger: MiLogger;\n readonly blockEventDispatcher: BlockEventDispatcher;\n readonly httpDispatcher: Dispatcher;\n readonly retryHttpDispatcher: Dispatcher;\n readonly signer: Signer;\n readonly ops: MiddleLayerOps;\n readonly bpPreparer: BlockPackPreparer;\n readonly frontendDownloadDriver: DownloadUrlDriver;\n readonly blockUpdateWatcher: BlockUpdateWatcher;\n readonly quickJs: QuickJSWASMModule;\n readonly driverKit: MiddleLayerDriverKit;\n readonly serviceRegistry: ModelServiceRegistry;\n readonly projectHelper: ProjectHelper;\n}\n\n/**\n * Main access object to work with pl from UI.\n *\n * It implements an abstraction layer of projects and blocks.\n *\n * As a main entry point inside the pl, this object uses a resource attached\n * via the {@link ProjectsField} to the pl client's root, this resource\n * contains project list.\n *\n * Read about alternative roots, if isolated project lists (working environments)\n * are required.\n * */\nexport class MiddleLayer {\n public readonly pl: PlClient;\n\n /** Contains a reactive list of projects along with their meta information. */\n public readonly projectList: ComputableStableDefined<ProjectListEntry[]>;\n\n private constructor(\n private readonly env: MiddleLayerEnvironment,\n public readonly driverKit: DriverKit,\n public readonly signer: Signer,\n private readonly projectListResourceId: ResourceId,\n private readonly openedProjectsList: WatchableValue<ResourceId[]>,\n private readonly projectListTree: SynchronizedTreeState,\n public readonly blockRegistryProvider: V2RegistryProvider,\n projectList: ComputableStableDefined<ProjectListEntry[]>,\n ) {\n this.projectList = projectList;\n this.pl = this.env.pl;\n }\n\n /**\n * Get the OS where backend is running.\n * For old backend versions returns undefined.\n */\n public get serverPlatform(): BlockPlatform | undefined {\n return this.pl.serverInfo.platform as BlockPlatform | undefined;\n }\n\n /** Adds a runtime capability to the middle layer. */\n public addRuntimeCapability(\n requirement: SupportedRequirement,\n value: number | boolean = true,\n ): void {\n this.env.runtimeCapabilities.addSupportedRequirement(requirement, value);\n }\n\n /** Checks if the given block feature flags are compatible with the runtime capabilities. */\n public checkBlockCompatibility(featureFlags: BlockCodeFeatureFlags | undefined): boolean {\n return this.env.runtimeCapabilities.checkCompatibility(featureFlags);\n }\n\n /** Returns extended API driver kit used internally by middle layer. */\n public get internalDriverKit(): MiddleLayerDriverKit {\n return this.env.driverKit;\n }\n\n /** Returns the service registry for service introspection. */\n public get serviceRegistry(): ModelServiceRegistry {\n return this.env.serviceRegistry;\n }\n\n //\n // Project List Manipulation\n //\n\n /** Creates a project with initial state and adds it to project list. */\n public async createProject(meta: ProjectMeta, id: string = randomUUID()): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx(\"MLCreateProject\", async (tx) => {\n const prj = await createProject(tx, meta);\n tx.createField(field(this.projectListResourceId, id), \"Dynamic\", prj);\n await tx.commit();\n return await toGlobalResourceId(prj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n /** Updates project metadata */\n public async setProjectMeta(\n rid: ResourceId,\n meta: ProjectMeta,\n author?: AuthorMarker,\n ): Promise<void> {\n await withProjectAuthored(\n this.env.projectHelper,\n this.pl,\n rid,\n author,\n (prj) => {\n prj.setMeta(meta);\n },\n { name: \"setProjectMeta\" },\n );\n await this.projectListTree.refreshState();\n }\n\n /** Permanently deletes project from the project list, this will result in\n * destruction of all attached objects, like files, analysis results etc. */\n public async deleteProject(id: string): Promise<void> {\n await this.pl.withWriteTx(\"MLRemoveProject\", async (tx) => {\n tx.removeField(field(this.projectListResourceId, id));\n await tx.commit();\n });\n await this.projectListTree.refreshState();\n }\n\n /**\n * Duplicates an existing project and adds the copy to this user's project list.\n *\n * @param sourceRid - resource id of the project to duplicate\n * @param rename - optional function that receives the source label and all existing\n * project labels (read within the same transaction), and returns the label for the copy\n * @param id - optional id for the new project list entry (defaults to random UUID)\n */\n public async duplicateProject(\n sourceRid: ResourceId,\n rename?: (previousLabel: string, existingLabels: string[]) => string,\n id: string = randomUUID(),\n ): Promise<ResourceId> {\n const resource = await this.pl.withWriteTx(\"MLDuplicateProject\", async (tx) => {\n // Read source project meta\n const sourceMeta = await tx.getKValueJson<ProjectMeta>(sourceRid, ProjectMetaKey);\n\n // Read all existing project labels from the project list (parallel reads)\n const projectListData = await tx.getResourceData(this.projectListResourceId, true);\n const projectRids = projectListData.fields.map((f) => f.value).filter(isNotNullResourceId);\n const existingLabels = (\n await Promise.all(\n projectRids.map((rid) => tx.getKValueJson<ProjectMeta>(rid, ProjectMetaKey)),\n )\n ).map((m) => m.label);\n\n // Compute new label\n const newLabel = rename ? rename(sourceMeta.label, existingLabels) : sourceMeta.label;\n\n // Create the duplicate\n const newPrj = await duplicateProject(tx, sourceRid, { label: newLabel });\n\n // Attach to project list\n tx.createField(field(this.projectListResourceId, id), \"Dynamic\", newPrj);\n await tx.commit();\n return await toGlobalResourceId(newPrj);\n });\n await this.projectListTree.refreshState();\n return resource;\n }\n\n //\n // Projects\n //\n\n private readonly openedProjectsByRid = new Map<ResourceId, Project>();\n\n private async projectIdToResourceId(id: string): Promise<ResourceId> {\n return await this.pl.withReadTx(\"Project id to resource id\", async (tx) => {\n const rid = (await tx.getField(field(this.projectListResourceId, id))).value;\n if (isNullResourceId(rid)) throw new Error(\"Unexpected project list structure.\");\n return rid;\n });\n }\n\n private async ensureProjectRid(id: ResourceId | string): Promise<ResourceId> {\n if (typeof id === \"string\") return await this.projectIdToResourceId(id);\n else return id;\n }\n\n /** Opens a project, and starts corresponding project maintenance loop. */\n public async openProject(id: ResourceId | string) {\n const rid = await this.ensureProjectRid(id);\n if (this.openedProjectsByRid.has(rid)) throw new Error(`Project ${rid} already opened`);\n this.openedProjectsByRid.set(rid, await Project.init(this.env, rid));\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Closes the project, and deallocate all corresponding resources. */\n public async closeProject(rid: ResourceId): Promise<void> {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n this.openedProjectsByRid.delete(rid);\n await prj.destroy();\n this.openedProjectsList.setValue([...this.openedProjectsByRid.keys()]);\n }\n\n /** Returns a project access object for opened project, for the given project\n * resource id. */\n public getOpenedProject(rid: ResourceId): Project {\n const prj = this.openedProjectsByRid.get(rid);\n if (prj === undefined) throw new Error(`Project ${rid} not found among opened projects`);\n return prj;\n }\n\n /** Returns true if project with given resource id is currently opened. */\n public isProjectOpened(rid: ResourceId): boolean {\n return this.openedProjectsByRid.has(rid);\n }\n\n /**\n * Deallocates all runtime resources consumed by this object and awaits\n * actual termination of event loops and other processes associated with\n * them.\n */\n public async close() {\n await Promise.all([...this.openedProjectsByRid.values()].map((prj) => prj.destroy()));\n // this.env.quickJs;\n await this.projectListTree.terminate();\n await this.env.dispose();\n await this.pl.close();\n }\n\n /** @deprecated */\n public async closeAndAwaitTermination() {\n await this.close();\n }\n\n /** Generates sufficiently random string to be used as local secret for the\n * middle layer */\n public static generateLocalSecret(): string {\n return HmacSha256Signer.generateSecret();\n }\n\n /** Returns a block event dispatcher, which can be used to listen to block events. */\n public get blockEventDispatcher(): BlockEventDispatcher {\n return this.env.blockEventDispatcher;\n }\n\n /** Initialize middle layer */\n public static async init(\n pl: PlClient,\n workdir: string,\n _ops: MiddleLayerOpsConstructor,\n ): Promise<MiddleLayer> {\n const ops: MiddleLayerOps = {\n ...DefaultMiddleLayerOpsSettings,\n ...DefaultMiddleLayerOpsPaths(workdir),\n ..._ops,\n };\n\n // overriding debug options from environment variables\n ops.defaultTreeOptions.logStat = getDebugFlags().logTreeStats;\n ops.debugOps.dumpInitialTreeState = getDebugFlags().dumpInitialTreeState;\n\n const projects = await pl.withWriteTx(\"MLInitialization\", async (tx) => {\n const projectsField = field(tx.clientRoot, ProjectsField);\n tx.createField(projectsField, \"Dynamic\");\n const projectsFieldData = await tx.getField(projectsField);\n if (isNullResourceId(projectsFieldData.value)) {\n const projects = tx.createEphemeral(ProjectsResourceType);\n tx.lock(projects);\n\n tx.setField(projectsField, projects);\n\n await tx.commit();\n\n return await projects.globalId;\n } else {\n return projectsFieldData.value;\n }\n });\n\n const logger = ops.logger;\n\n const driverKit = await initDriverKit(pl, workdir, ops.frontendDownloadPath, ops);\n\n // passed to components having no own retry logic\n const retryHttpDispatcher = new RetryAgent(pl.httpDispatcher);\n\n const v2RegistryProvider = new V2RegistryProvider(retryHttpDispatcher);\n\n const bpPreparer = new BlockPackPreparer(\n v2RegistryProvider,\n driverKit.signer,\n retryHttpDispatcher,\n );\n\n const quickJs = await getQuickJS();\n\n const runtimeCapabilities = new RuntimeCapabilities();\n // add runtime capabilities of model here\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 1);\n runtimeCapabilities.addSupportedRequirement(\"requiresModelAPIVersion\", 2);\n runtimeCapabilities.addSupportedRequirement(\"requiresCreatePTable\", 2);\n registerServiceCapabilities((flag, value) =>\n runtimeCapabilities.addSupportedRequirement(flag, value),\n );\n // runtime capabilities of the desktop are to be added by the desktop app / test framework\n\n const serviceRegistry = createModelServiceRegistry({ logger });\n\n const env: MiddleLayerEnvironment = {\n pl,\n blockEventDispatcher: new BlockEventDispatcher(),\n signer: driverKit.signer,\n logger,\n httpDispatcher: pl.httpDispatcher,\n retryHttpDispatcher,\n ops,\n bpPreparer,\n frontendDownloadDriver: driverKit.frontendDriver,\n driverKit,\n blockUpdateWatcher: new BlockUpdateWatcher(v2RegistryProvider, logger, {\n minDelay: ops.devBlockUpdateRecheckInterval,\n http: retryHttpDispatcher,\n preferredUpdateChannel: ops.preferredUpdateChannel,\n }),\n runtimeCapabilities,\n serviceRegistry,\n quickJs,\n projectHelper: new ProjectHelper(quickJs, logger),\n dispose: async () => {\n await serviceRegistry.dispose();\n await retryHttpDispatcher.destroy();\n await driverKit.dispose();\n },\n };\n\n const openedProjects = new WatchableValue<ResourceId[]>([]);\n const projectListTC = await createProjectList(pl, projects, openedProjects, env);\n\n return new MiddleLayer(\n env,\n driverKit,\n driverKit.signer,\n projects,\n openedProjects,\n projectListTC.tree,\n v2RegistryProvider,\n projectListTC.computable,\n );\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
- const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
1
+ require("../_virtual/_rolldown/runtime.cjs");
2
2
  let _platforma_sdk_model = require("@platforma-sdk/model");
3
3
  let _milaboratories_computable = require("@milaboratories/computable");
4
-
5
4
  //#region src/middle_layer/navigation_states.ts
6
5
  var NavigationStates = class {
7
6
  states = /* @__PURE__ */ new Map();
@@ -42,7 +41,7 @@ var NavigationStates = class {
42
41
  }
43
42
  }
44
43
  };
45
-
46
44
  //#endregion
47
45
  exports.NavigationStates = NavigationStates;
46
+
48
47
  //# sourceMappingURL=navigation_states.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"navigation_states.cjs","names":["ChangeSource","DefaultNavigationState","Computable"],"sources":["../../src/middle_layer/navigation_states.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport { ChangeSource, Computable } from \"@milaboratories/computable\";\nimport type { NavigationState } from \"@platforma-sdk/model\";\nimport { DefaultNavigationState } from \"@platforma-sdk/model\";\n\ntype NavigationStateEntry = {\n state: NavigationState;\n readonly change: ChangeSource;\n};\n\nexport class NavigationStates {\n private readonly states = new Map<string, NavigationStateEntry>();\n\n public setState(blockId: string, state: NavigationState) {\n const entry = this.states.get(blockId);\n if (entry === undefined) {\n this.states.set(blockId, { state, change: new ChangeSource() });\n return;\n }\n entry.state = { ...state };\n entry.change.markChanged(\"navigation state changed\");\n }\n\n private readState(ctx: ComputableCtx, blockId: string): NavigationState {\n let entry = this.states.get(blockId);\n if (entry === undefined) {\n entry = { state: { ...DefaultNavigationState }, change: new ChangeSource() };\n this.states.set(blockId, entry);\n }\n entry.change.attachWatcher(ctx.watcher);\n return entry.state;\n }\n\n public getState(blockId: string): Computable<NavigationState> {\n return Computable.make(\n (ctx) => {\n return this.readState(ctx, blockId);\n },\n { key: `navigationState#${blockId}` },\n );\n }\n\n public deleteBlock(blockId: string) {\n const entry = this.states.get(blockId);\n if (entry !== undefined) {\n this.states.delete(blockId);\n entry.change.markChanged(\"block deleted\");\n }\n }\n}\n"],"mappings":";;;;;AAUA,IAAa,mBAAb,MAA8B;CAC5B,AAAiB,yBAAS,IAAI,KAAmC;CAEjE,AAAO,SAAS,SAAiB,OAAwB;EACvD,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ;AACtC,MAAI,UAAU,QAAW;AACvB,QAAK,OAAO,IAAI,SAAS;IAAE;IAAO,QAAQ,IAAIA,yCAAc;IAAE,CAAC;AAC/D;;AAEF,QAAM,QAAQ,EAAE,GAAG,OAAO;AAC1B,QAAM,OAAO,YAAY,2BAA2B;;CAGtD,AAAQ,UAAU,KAAoB,SAAkC;EACtE,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ;AACpC,MAAI,UAAU,QAAW;AACvB,WAAQ;IAAE,OAAO,EAAE,GAAGC,6CAAwB;IAAE,QAAQ,IAAID,yCAAc;IAAE;AAC5E,QAAK,OAAO,IAAI,SAAS,MAAM;;AAEjC,QAAM,OAAO,cAAc,IAAI,QAAQ;AACvC,SAAO,MAAM;;CAGf,AAAO,SAAS,SAA8C;AAC5D,SAAOE,sCAAW,MACf,QAAQ;AACP,UAAO,KAAK,UAAU,KAAK,QAAQ;KAErC,EAAE,KAAK,mBAAmB,WAAW,CACtC;;CAGH,AAAO,YAAY,SAAiB;EAClC,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ;AACtC,MAAI,UAAU,QAAW;AACvB,QAAK,OAAO,OAAO,QAAQ;AAC3B,SAAM,OAAO,YAAY,gBAAgB"}
1
+ {"version":3,"file":"navigation_states.cjs","names":["ChangeSource","DefaultNavigationState","Computable"],"sources":["../../src/middle_layer/navigation_states.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport { ChangeSource, Computable } from \"@milaboratories/computable\";\nimport type { NavigationState } from \"@platforma-sdk/model\";\nimport { DefaultNavigationState } from \"@platforma-sdk/model\";\n\ntype NavigationStateEntry = {\n state: NavigationState;\n readonly change: ChangeSource;\n};\n\nexport class NavigationStates {\n private readonly states = new Map<string, NavigationStateEntry>();\n\n public setState(blockId: string, state: NavigationState) {\n const entry = this.states.get(blockId);\n if (entry === undefined) {\n this.states.set(blockId, { state, change: new ChangeSource() });\n return;\n }\n entry.state = { ...state };\n entry.change.markChanged(\"navigation state changed\");\n }\n\n private readState(ctx: ComputableCtx, blockId: string): NavigationState {\n let entry = this.states.get(blockId);\n if (entry === undefined) {\n entry = { state: { ...DefaultNavigationState }, change: new ChangeSource() };\n this.states.set(blockId, entry);\n }\n entry.change.attachWatcher(ctx.watcher);\n return entry.state;\n }\n\n public getState(blockId: string): Computable<NavigationState> {\n return Computable.make(\n (ctx) => {\n return this.readState(ctx, blockId);\n },\n { key: `navigationState#${blockId}` },\n );\n }\n\n public deleteBlock(blockId: string) {\n const entry = this.states.get(blockId);\n if (entry !== undefined) {\n this.states.delete(blockId);\n entry.change.markChanged(\"block deleted\");\n }\n }\n}\n"],"mappings":";;;;AAUA,IAAa,mBAAb,MAA8B;CAC5B,yBAA0B,IAAI,KAAmC;CAEjE,SAAgB,SAAiB,OAAwB;EACvD,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ;AACtC,MAAI,UAAU,KAAA,GAAW;AACvB,QAAK,OAAO,IAAI,SAAS;IAAE;IAAO,QAAQ,IAAIA,2BAAAA,cAAc;IAAE,CAAC;AAC/D;;AAEF,QAAM,QAAQ,EAAE,GAAG,OAAO;AAC1B,QAAM,OAAO,YAAY,2BAA2B;;CAGtD,UAAkB,KAAoB,SAAkC;EACtE,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ;AACpC,MAAI,UAAU,KAAA,GAAW;AACvB,WAAQ;IAAE,OAAO,EAAE,GAAGC,qBAAAA,wBAAwB;IAAE,QAAQ,IAAID,2BAAAA,cAAc;IAAE;AAC5E,QAAK,OAAO,IAAI,SAAS,MAAM;;AAEjC,QAAM,OAAO,cAAc,IAAI,QAAQ;AACvC,SAAO,MAAM;;CAGf,SAAgB,SAA8C;AAC5D,SAAOE,2BAAAA,WAAW,MACf,QAAQ;AACP,UAAO,KAAK,UAAU,KAAK,QAAQ;KAErC,EAAE,KAAK,mBAAmB,WAAW,CACtC;;CAGH,YAAmB,SAAiB;EAClC,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ;AACtC,MAAI,UAAU,KAAA,GAAW;AACvB,QAAK,OAAO,OAAO,QAAQ;AAC3B,SAAM,OAAO,YAAY,gBAAgB"}
@@ -1,6 +1,5 @@
1
1
  import { DefaultNavigationState } from "@platforma-sdk/model";
2
2
  import { ChangeSource, Computable } from "@milaboratories/computable";
3
-
4
3
  //#region src/middle_layer/navigation_states.ts
5
4
  var NavigationStates = class {
6
5
  states = /* @__PURE__ */ new Map();
@@ -41,7 +40,7 @@ var NavigationStates = class {
41
40
  }
42
41
  }
43
42
  };
44
-
45
43
  //#endregion
46
44
  export { NavigationStates };
45
+
47
46
  //# sourceMappingURL=navigation_states.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"navigation_states.js","names":[],"sources":["../../src/middle_layer/navigation_states.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport { ChangeSource, Computable } from \"@milaboratories/computable\";\nimport type { NavigationState } from \"@platforma-sdk/model\";\nimport { DefaultNavigationState } from \"@platforma-sdk/model\";\n\ntype NavigationStateEntry = {\n state: NavigationState;\n readonly change: ChangeSource;\n};\n\nexport class NavigationStates {\n private readonly states = new Map<string, NavigationStateEntry>();\n\n public setState(blockId: string, state: NavigationState) {\n const entry = this.states.get(blockId);\n if (entry === undefined) {\n this.states.set(blockId, { state, change: new ChangeSource() });\n return;\n }\n entry.state = { ...state };\n entry.change.markChanged(\"navigation state changed\");\n }\n\n private readState(ctx: ComputableCtx, blockId: string): NavigationState {\n let entry = this.states.get(blockId);\n if (entry === undefined) {\n entry = { state: { ...DefaultNavigationState }, change: new ChangeSource() };\n this.states.set(blockId, entry);\n }\n entry.change.attachWatcher(ctx.watcher);\n return entry.state;\n }\n\n public getState(blockId: string): Computable<NavigationState> {\n return Computable.make(\n (ctx) => {\n return this.readState(ctx, blockId);\n },\n { key: `navigationState#${blockId}` },\n );\n }\n\n public deleteBlock(blockId: string) {\n const entry = this.states.get(blockId);\n if (entry !== undefined) {\n this.states.delete(blockId);\n entry.change.markChanged(\"block deleted\");\n }\n }\n}\n"],"mappings":";;;;AAUA,IAAa,mBAAb,MAA8B;CAC5B,AAAiB,yBAAS,IAAI,KAAmC;CAEjE,AAAO,SAAS,SAAiB,OAAwB;EACvD,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ;AACtC,MAAI,UAAU,QAAW;AACvB,QAAK,OAAO,IAAI,SAAS;IAAE;IAAO,QAAQ,IAAI,cAAc;IAAE,CAAC;AAC/D;;AAEF,QAAM,QAAQ,EAAE,GAAG,OAAO;AAC1B,QAAM,OAAO,YAAY,2BAA2B;;CAGtD,AAAQ,UAAU,KAAoB,SAAkC;EACtE,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ;AACpC,MAAI,UAAU,QAAW;AACvB,WAAQ;IAAE,OAAO,EAAE,GAAG,wBAAwB;IAAE,QAAQ,IAAI,cAAc;IAAE;AAC5E,QAAK,OAAO,IAAI,SAAS,MAAM;;AAEjC,QAAM,OAAO,cAAc,IAAI,QAAQ;AACvC,SAAO,MAAM;;CAGf,AAAO,SAAS,SAA8C;AAC5D,SAAO,WAAW,MACf,QAAQ;AACP,UAAO,KAAK,UAAU,KAAK,QAAQ;KAErC,EAAE,KAAK,mBAAmB,WAAW,CACtC;;CAGH,AAAO,YAAY,SAAiB;EAClC,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ;AACtC,MAAI,UAAU,QAAW;AACvB,QAAK,OAAO,OAAO,QAAQ;AAC3B,SAAM,OAAO,YAAY,gBAAgB"}
1
+ {"version":3,"file":"navigation_states.js","names":[],"sources":["../../src/middle_layer/navigation_states.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport { ChangeSource, Computable } from \"@milaboratories/computable\";\nimport type { NavigationState } from \"@platforma-sdk/model\";\nimport { DefaultNavigationState } from \"@platforma-sdk/model\";\n\ntype NavigationStateEntry = {\n state: NavigationState;\n readonly change: ChangeSource;\n};\n\nexport class NavigationStates {\n private readonly states = new Map<string, NavigationStateEntry>();\n\n public setState(blockId: string, state: NavigationState) {\n const entry = this.states.get(blockId);\n if (entry === undefined) {\n this.states.set(blockId, { state, change: new ChangeSource() });\n return;\n }\n entry.state = { ...state };\n entry.change.markChanged(\"navigation state changed\");\n }\n\n private readState(ctx: ComputableCtx, blockId: string): NavigationState {\n let entry = this.states.get(blockId);\n if (entry === undefined) {\n entry = { state: { ...DefaultNavigationState }, change: new ChangeSource() };\n this.states.set(blockId, entry);\n }\n entry.change.attachWatcher(ctx.watcher);\n return entry.state;\n }\n\n public getState(blockId: string): Computable<NavigationState> {\n return Computable.make(\n (ctx) => {\n return this.readState(ctx, blockId);\n },\n { key: `navigationState#${blockId}` },\n );\n }\n\n public deleteBlock(blockId: string) {\n const entry = this.states.get(blockId);\n if (entry !== undefined) {\n this.states.delete(blockId);\n entry.change.markChanged(\"block deleted\");\n }\n }\n}\n"],"mappings":";;;AAUA,IAAa,mBAAb,MAA8B;CAC5B,yBAA0B,IAAI,KAAmC;CAEjE,SAAgB,SAAiB,OAAwB;EACvD,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ;AACtC,MAAI,UAAU,KAAA,GAAW;AACvB,QAAK,OAAO,IAAI,SAAS;IAAE;IAAO,QAAQ,IAAI,cAAc;IAAE,CAAC;AAC/D;;AAEF,QAAM,QAAQ,EAAE,GAAG,OAAO;AAC1B,QAAM,OAAO,YAAY,2BAA2B;;CAGtD,UAAkB,KAAoB,SAAkC;EACtE,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ;AACpC,MAAI,UAAU,KAAA,GAAW;AACvB,WAAQ;IAAE,OAAO,EAAE,GAAG,wBAAwB;IAAE,QAAQ,IAAI,cAAc;IAAE;AAC5E,QAAK,OAAO,IAAI,SAAS,MAAM;;AAEjC,QAAM,OAAO,cAAc,IAAI,QAAQ;AACvC,SAAO,MAAM;;CAGf,SAAgB,SAA8C;AAC5D,SAAO,WAAW,MACf,QAAQ;AACP,UAAO,KAAK,UAAU,KAAK,QAAQ;KAErC,EAAE,KAAK,mBAAmB,WAAW,CACtC;;CAGH,YAAmB,SAAiB;EAClC,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ;AACtC,MAAI,UAAU,KAAA,GAAW;AACvB,QAAK,OAAO,OAAO,QAAQ;AAC3B,SAAM,OAAO,YAAY,gBAAgB"}