@milaboratories/pl-middle-layer 1.74.10 → 1.74.12

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 (322) hide show
  1. package/dist/_virtual/{_@oxc-project_runtime@0.137.0 → _@oxc-project_runtime@0.155.0}/helpers/esm/usingCtx.cjs +1 -2
  2. package/dist/_virtual/{_@oxc-project_runtime@0.137.0 → _@oxc-project_runtime@0.155.0}/helpers/esm/usingCtx.js +1 -2
  3. package/dist/_virtual/_rolldown/runtime.cjs +2 -3
  4. package/dist/block_registry/location_provider.cjs +1 -2
  5. package/dist/block_registry/location_provider.cjs.map +1 -1
  6. package/dist/block_registry/location_provider.js +1 -2
  7. package/dist/block_registry/registry-v2-provider.cjs +1 -2
  8. package/dist/block_registry/registry-v2-provider.cjs.map +1 -1
  9. package/dist/block_registry/registry-v2-provider.d.ts +0 -2
  10. package/dist/block_registry/registry-v2-provider.d.ts.map +1 -1
  11. package/dist/block_registry/registry-v2-provider.js +1 -2
  12. package/dist/block_registry/registry.cjs +3 -3
  13. package/dist/block_registry/registry.cjs.map +1 -1
  14. package/dist/block_registry/registry.d.ts +0 -2
  15. package/dist/block_registry/registry.d.ts.map +1 -1
  16. package/dist/block_registry/registry.js +3 -3
  17. package/dist/block_registry/registry.js.map +1 -1
  18. package/dist/block_registry/template_provider.cjs +1 -2
  19. package/dist/block_registry/template_provider.cjs.map +1 -1
  20. package/dist/block_registry/template_provider.d.ts +0 -2
  21. package/dist/block_registry/template_provider.d.ts.map +1 -1
  22. package/dist/block_registry/template_provider.js +1 -2
  23. package/dist/block_registry/watcher.cjs +15 -14
  24. package/dist/block_registry/watcher.cjs.map +1 -1
  25. package/dist/block_registry/watcher.d.ts +0 -2
  26. package/dist/block_registry/watcher.d.ts.map +1 -1
  27. package/dist/block_registry/watcher.js +15 -14
  28. package/dist/block_registry/watcher.js.map +1 -1
  29. package/dist/block_registry/well_known_registries.cjs +1 -2
  30. package/dist/block_registry/well_known_registries.d.ts +0 -2
  31. package/dist/block_registry/well_known_registries.d.ts.map +1 -1
  32. package/dist/block_registry/well_known_registries.js +1 -2
  33. package/dist/cfg_render/executor.cjs +1 -2
  34. package/dist/cfg_render/executor.cjs.map +1 -1
  35. package/dist/cfg_render/executor.js +1 -2
  36. package/dist/cfg_render/renderer.cjs +1 -2
  37. package/dist/cfg_render/renderer.cjs.map +1 -1
  38. package/dist/cfg_render/renderer.js +1 -2
  39. package/dist/cfg_render/traverse.cjs +1 -2
  40. package/dist/cfg_render/traverse.js +1 -2
  41. package/dist/cfg_render/util.cjs +1 -2
  42. package/dist/cfg_render/util.js +1 -2
  43. package/dist/debug/index.cjs +1 -2
  44. package/dist/debug/index.js +1 -2
  45. package/dist/dev_env/index.cjs +1 -2
  46. package/dist/dev_env/index.cjs.map +1 -1
  47. package/dist/dev_env/index.js +1 -2
  48. package/dist/dev_env/util.cjs +1 -2
  49. package/dist/dev_env/util.js +1 -2
  50. package/dist/js_render/column_registry.cjs +1 -2
  51. package/dist/js_render/column_registry.cjs.map +1 -1
  52. package/dist/js_render/column_registry.js +1 -2
  53. package/dist/js_render/computable_context.cjs +4 -4
  54. package/dist/js_render/computable_context.cjs.map +1 -1
  55. package/dist/js_render/computable_context.js +4 -4
  56. package/dist/js_render/computable_context.js.map +1 -1
  57. package/dist/js_render/context.cjs +1 -2
  58. package/dist/js_render/context.cjs.map +1 -1
  59. package/dist/js_render/context.js +1 -2
  60. package/dist/js_render/index.cjs +12 -9
  61. package/dist/js_render/index.cjs.map +1 -1
  62. package/dist/js_render/index.js +12 -9
  63. package/dist/js_render/index.js.map +1 -1
  64. package/dist/js_render/service_injectors.cjs +2 -3
  65. package/dist/js_render/service_injectors.js +2 -3
  66. package/dist/js_render/spec_override_collapse.cjs +1 -2
  67. package/dist/js_render/spec_override_collapse.cjs.map +1 -1
  68. package/dist/js_render/spec_override_collapse.js +1 -2
  69. package/dist/middle_layer/active_cfg.cjs +1 -2
  70. package/dist/middle_layer/active_cfg.cjs.map +1 -1
  71. package/dist/middle_layer/active_cfg.js +1 -2
  72. package/dist/middle_layer/block.cjs +1 -2
  73. package/dist/middle_layer/block.cjs.map +1 -1
  74. package/dist/middle_layer/block.js +1 -2
  75. package/dist/middle_layer/block_ctx.cjs +3 -3
  76. package/dist/middle_layer/block_ctx.cjs.map +1 -1
  77. package/dist/middle_layer/block_ctx.js +3 -3
  78. package/dist/middle_layer/block_ctx.js.map +1 -1
  79. package/dist/middle_layer/block_ctx_unsafe.cjs +1 -2
  80. package/dist/middle_layer/block_ctx_unsafe.js +1 -2
  81. package/dist/middle_layer/build_stamp.cjs +2 -3
  82. package/dist/middle_layer/build_stamp.js +2 -3
  83. package/dist/middle_layer/driver_kit.cjs +6 -2
  84. package/dist/middle_layer/driver_kit.cjs.map +1 -1
  85. package/dist/middle_layer/driver_kit.d.ts +0 -2
  86. package/dist/middle_layer/driver_kit.d.ts.map +1 -1
  87. package/dist/middle_layer/driver_kit.js +7 -3
  88. package/dist/middle_layer/driver_kit.js.map +1 -1
  89. package/dist/middle_layer/finality_stop_rules.cjs +1 -2
  90. package/dist/middle_layer/finality_stop_rules.js +1 -2
  91. package/dist/middle_layer/folders.cjs +12 -8
  92. package/dist/middle_layer/folders.cjs.map +1 -1
  93. package/dist/middle_layer/folders.d.ts +0 -2
  94. package/dist/middle_layer/folders.d.ts.map +1 -1
  95. package/dist/middle_layer/folders.js +12 -8
  96. package/dist/middle_layer/folders.js.map +1 -1
  97. package/dist/middle_layer/frontend_path.cjs +1 -2
  98. package/dist/middle_layer/frontend_path.cjs.map +1 -1
  99. package/dist/middle_layer/frontend_path.js +1 -2
  100. package/dist/middle_layer/middle_layer.cjs +7 -6
  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 -1
  104. package/dist/middle_layer/middle_layer.js +7 -6
  105. package/dist/middle_layer/middle_layer.js.map +1 -1
  106. package/dist/middle_layer/navigation_states.cjs +1 -2
  107. package/dist/middle_layer/navigation_states.js +1 -2
  108. package/dist/middle_layer/ops.cjs +10 -11
  109. package/dist/middle_layer/ops.cjs.map +1 -1
  110. package/dist/middle_layer/ops.d.ts +0 -2
  111. package/dist/middle_layer/ops.d.ts.map +1 -1
  112. package/dist/middle_layer/ops.js +10 -11
  113. package/dist/middle_layer/ops.js.map +1 -1
  114. package/dist/middle_layer/project.cjs +3 -3
  115. package/dist/middle_layer/project.cjs.map +1 -1
  116. package/dist/middle_layer/project.d.ts +3 -5
  117. package/dist/middle_layer/project.d.ts.map +1 -1
  118. package/dist/middle_layer/project.js +3 -3
  119. package/dist/middle_layer/project.js.map +1 -1
  120. package/dist/middle_layer/project_list.cjs +1 -2
  121. package/dist/middle_layer/project_list.cjs.map +1 -1
  122. package/dist/middle_layer/project_list.d.ts +0 -2
  123. package/dist/middle_layer/project_list.d.ts.map +1 -1
  124. package/dist/middle_layer/project_list.js +1 -2
  125. package/dist/middle_layer/project_overview.cjs +8 -5
  126. package/dist/middle_layer/project_overview.cjs.map +1 -1
  127. package/dist/middle_layer/project_overview.js +8 -5
  128. package/dist/middle_layer/project_overview.js.map +1 -1
  129. package/dist/middle_layer/project_overview_light.cjs +4 -3
  130. package/dist/middle_layer/project_overview_light.cjs.map +1 -1
  131. package/dist/middle_layer/project_overview_light.js +4 -3
  132. package/dist/middle_layer/project_overview_light.js.map +1 -1
  133. package/dist/middle_layer/render.cjs +1 -2
  134. package/dist/middle_layer/render.cjs.map +1 -1
  135. package/dist/middle_layer/render.js +1 -2
  136. package/dist/middle_layer/sharing_list.cjs +1 -2
  137. package/dist/middle_layer/sharing_list.cjs.map +1 -1
  138. package/dist/middle_layer/sharing_list.d.ts +0 -2
  139. package/dist/middle_layer/sharing_list.d.ts.map +1 -1
  140. package/dist/middle_layer/sharing_list.js +1 -2
  141. package/dist/middle_layer/sharing_list.js.map +1 -1
  142. package/dist/middle_layer/template_list.cjs +1 -2
  143. package/dist/middle_layer/template_list.cjs.map +1 -1
  144. package/dist/middle_layer/template_list.d.ts +0 -2
  145. package/dist/middle_layer/template_list.d.ts.map +1 -1
  146. package/dist/middle_layer/template_list.js +1 -2
  147. package/dist/middle_layer/tree_snapshot_store.cjs +3 -3
  148. package/dist/middle_layer/tree_snapshot_store.cjs.map +1 -1
  149. package/dist/middle_layer/tree_snapshot_store.d.ts +0 -2
  150. package/dist/middle_layer/tree_snapshot_store.d.ts.map +1 -1
  151. package/dist/middle_layer/tree_snapshot_store.js +3 -3
  152. package/dist/middle_layer/tree_snapshot_store.js.map +1 -1
  153. package/dist/middle_layer/types.d.ts +0 -2
  154. package/dist/middle_layer/types.d.ts.map +1 -1
  155. package/dist/middle_layer/util.cjs +1 -2
  156. package/dist/middle_layer/util.cjs.map +1 -1
  157. package/dist/middle_layer/util.js +1 -2
  158. package/dist/model/args.cjs +1 -2
  159. package/dist/model/args.cjs.map +1 -1
  160. package/dist/model/args.js +1 -2
  161. package/dist/model/block_pack_spec.cjs +1 -2
  162. package/dist/model/block_pack_spec.d.ts +0 -2
  163. package/dist/model/block_pack_spec.d.ts.map +1 -1
  164. package/dist/model/block_pack_spec.js +1 -2
  165. package/dist/model/frontend.d.ts +0 -2
  166. package/dist/model/frontend.d.ts.map +1 -1
  167. package/dist/model/project_helper.cjs +1 -2
  168. package/dist/model/project_helper.cjs.map +1 -1
  169. package/dist/model/project_helper.d.ts +0 -2
  170. package/dist/model/project_helper.d.ts.map +1 -1
  171. package/dist/model/project_helper.js +1 -2
  172. package/dist/model/project_model.cjs +1 -2
  173. package/dist/model/project_model.d.ts +0 -2
  174. package/dist/model/project_model.d.ts.map +1 -1
  175. package/dist/model/project_model.js +1 -2
  176. package/dist/model/project_model_util.cjs +1 -2
  177. package/dist/model/project_model_util.js +1 -2
  178. package/dist/model/project_model_v1.cjs +1 -2
  179. package/dist/model/project_model_v1.js +1 -2
  180. package/dist/model/sharing_model.cjs +1 -2
  181. package/dist/model/sharing_model.cjs.map +1 -1
  182. package/dist/model/sharing_model.d.ts +0 -2
  183. package/dist/model/sharing_model.d.ts.map +1 -1
  184. package/dist/model/sharing_model.js +1 -2
  185. package/dist/model/template_apply.cjs +1 -2
  186. package/dist/model/template_apply.cjs.map +1 -1
  187. package/dist/model/template_apply.d.ts +0 -2
  188. package/dist/model/template_apply.d.ts.map +1 -1
  189. package/dist/model/template_apply.js +1 -2
  190. package/dist/model/template_export.cjs +1 -2
  191. package/dist/model/template_export.d.ts +0 -2
  192. package/dist/model/template_export.d.ts.map +1 -1
  193. package/dist/model/template_export.js +1 -2
  194. package/dist/model/template_parser.cjs +1 -2
  195. package/dist/model/template_parser.cjs.map +1 -1
  196. package/dist/model/template_parser.d.ts +0 -2
  197. package/dist/model/template_parser.d.ts.map +1 -1
  198. package/dist/model/template_parser.js +1 -2
  199. package/dist/model/template_resolve.cjs +1 -2
  200. package/dist/model/template_resolve.cjs.map +1 -1
  201. package/dist/model/template_resolve.d.ts +0 -2
  202. package/dist/model/template_resolve.d.ts.map +1 -1
  203. package/dist/model/template_resolve.js +1 -2
  204. package/dist/model/template_serializer.cjs +1 -2
  205. package/dist/model/template_serializer.cjs.map +1 -1
  206. package/dist/model/template_serializer.d.ts +0 -2
  207. package/dist/model/template_serializer.d.ts.map +1 -1
  208. package/dist/model/template_serializer.js +1 -2
  209. package/dist/model/template_spec.d.ts +0 -2
  210. package/dist/model/template_spec.d.ts.map +1 -1
  211. package/dist/mutator/block-pack/block_pack.cjs +7 -6
  212. package/dist/mutator/block-pack/block_pack.cjs.map +1 -1
  213. package/dist/mutator/block-pack/block_pack.d.ts +0 -2
  214. package/dist/mutator/block-pack/block_pack.d.ts.map +1 -1
  215. package/dist/mutator/block-pack/block_pack.js +7 -6
  216. package/dist/mutator/block-pack/block_pack.js.map +1 -1
  217. package/dist/mutator/block-pack/frontend.cjs +1 -2
  218. package/dist/mutator/block-pack/frontend.cjs.map +1 -1
  219. package/dist/mutator/block-pack/frontend.js +1 -2
  220. package/dist/mutator/block-pack/required_capabilities.cjs +1 -2
  221. package/dist/mutator/block-pack/required_capabilities.cjs.map +1 -1
  222. package/dist/mutator/block-pack/required_capabilities.js +1 -2
  223. package/dist/mutator/context_export.cjs +1 -2
  224. package/dist/mutator/context_export.cjs.map +1 -1
  225. package/dist/mutator/context_export.js +1 -2
  226. package/dist/mutator/list.cjs +1 -2
  227. package/dist/mutator/list.cjs.map +1 -1
  228. package/dist/mutator/list.js +1 -2
  229. package/dist/mutator/migration.cjs +1 -2
  230. package/dist/mutator/migration.cjs.map +1 -1
  231. package/dist/mutator/migration.js +1 -2
  232. package/dist/mutator/project.cjs +30 -22
  233. package/dist/mutator/project.cjs.map +1 -1
  234. package/dist/mutator/project.d.ts +0 -2
  235. package/dist/mutator/project.d.ts.map +1 -1
  236. package/dist/mutator/project.js +30 -22
  237. package/dist/mutator/project.js.map +1 -1
  238. package/dist/mutator/sharing.cjs +1 -2
  239. package/dist/mutator/sharing.cjs.map +1 -1
  240. package/dist/mutator/sharing.js +1 -2
  241. package/dist/mutator/template/direct_template_loader.cjs +1 -2
  242. package/dist/mutator/template/direct_template_loader.cjs.map +1 -1
  243. package/dist/mutator/template/direct_template_loader.js +1 -2
  244. package/dist/mutator/template/direct_template_loader_v3.cjs +1 -2
  245. package/dist/mutator/template/direct_template_loader_v3.cjs.map +1 -1
  246. package/dist/mutator/template/direct_template_loader_v3.js +1 -2
  247. package/dist/mutator/template/render_block.cjs +1 -2
  248. package/dist/mutator/template/render_block.cjs.map +1 -1
  249. package/dist/mutator/template/render_block.js +1 -2
  250. package/dist/mutator/template/render_template.cjs +1 -2
  251. package/dist/mutator/template/render_template.cjs.map +1 -1
  252. package/dist/mutator/template/render_template.d.ts +0 -2
  253. package/dist/mutator/template/render_template.d.ts.map +1 -1
  254. package/dist/mutator/template/render_template.js +1 -2
  255. package/dist/mutator/template/template_cache.cjs +6 -5
  256. package/dist/mutator/template/template_cache.cjs.map +1 -1
  257. package/dist/mutator/template/template_cache.d.ts +1 -2
  258. package/dist/mutator/template/template_cache.d.ts.map +1 -1
  259. package/dist/mutator/template/template_cache.js +6 -5
  260. package/dist/mutator/template/template_cache.js.map +1 -1
  261. package/dist/mutator/template/template_loading.cjs +1 -2
  262. package/dist/mutator/template/template_loading.cjs.map +1 -1
  263. package/dist/mutator/template/template_loading.d.ts +0 -2
  264. package/dist/mutator/template/template_loading.d.ts.map +1 -1
  265. package/dist/mutator/template/template_loading.js +1 -2
  266. package/dist/mutator/template.cjs +1 -2
  267. package/dist/mutator/template.cjs.map +1 -1
  268. package/dist/mutator/template.js +1 -2
  269. package/dist/mutator/template_construct.cjs +1 -2
  270. package/dist/mutator/template_construct.cjs.map +1 -1
  271. package/dist/mutator/template_construct.js +1 -2
  272. package/dist/network_check/network_check.cjs +2 -3
  273. package/dist/network_check/network_check.cjs.map +1 -1
  274. package/dist/network_check/network_check.d.ts +0 -2
  275. package/dist/network_check/network_check.d.ts.map +1 -1
  276. package/dist/network_check/network_check.js +2 -3
  277. package/dist/network_check/network_check.js.map +1 -1
  278. package/dist/network_check/pings.cjs +1 -2
  279. package/dist/network_check/pings.cjs.map +1 -1
  280. package/dist/network_check/pings.js +1 -2
  281. package/dist/network_check/template.cjs +5 -4
  282. package/dist/network_check/template.cjs.map +1 -1
  283. package/dist/network_check/template.js +5 -4
  284. package/dist/network_check/template.js.map +1 -1
  285. package/dist/pool/data.cjs +1 -2
  286. package/dist/pool/data.cjs.map +1 -1
  287. package/dist/pool/data.d.ts +0 -2
  288. package/dist/pool/data.d.ts.map +1 -1
  289. package/dist/pool/data.js +1 -2
  290. package/dist/pool/driver.cjs +5 -4
  291. package/dist/pool/driver.cjs.map +1 -1
  292. package/dist/pool/driver.d.ts +0 -2
  293. package/dist/pool/driver.d.ts.map +1 -1
  294. package/dist/pool/driver.js +5 -4
  295. package/dist/pool/driver.js.map +1 -1
  296. package/dist/pool/p_object_collection.cjs +9 -8
  297. package/dist/pool/p_object_collection.cjs.map +1 -1
  298. package/dist/pool/p_object_collection.d.ts +0 -2
  299. package/dist/pool/p_object_collection.d.ts.map +1 -1
  300. package/dist/pool/p_object_collection.js +9 -8
  301. package/dist/pool/p_object_collection.js.map +1 -1
  302. package/dist/pool/result_pool.cjs +8 -7
  303. package/dist/pool/result_pool.cjs.map +1 -1
  304. package/dist/pool/result_pool.js +8 -7
  305. package/dist/pool/result_pool.js.map +1 -1
  306. package/dist/pool/upstream_block_ctx.cjs +1 -2
  307. package/dist/pool/upstream_block_ctx.cjs.map +1 -1
  308. package/dist/pool/upstream_block_ctx.js +1 -2
  309. package/dist/service_factories.cjs +1 -2
  310. package/dist/service_factories.js +1 -2
  311. package/dist/worker/WorkerManager.cjs +1 -2
  312. package/dist/worker/WorkerManager.js +1 -2
  313. package/dist/worker/WorkerManager.js.map +1 -1
  314. package/dist/worker/worker.cjs +1 -2
  315. package/dist/worker/worker.js +1 -2
  316. package/dist/worker/workerApi.cjs +1 -2
  317. package/dist/worker/workerApi.cjs.map +1 -1
  318. package/dist/worker/workerApi.js +1 -2
  319. package/package.json +33 -33
  320. package/src/middle_layer/driver_kit.ts +16 -0
  321. package/src/middle_layer/middle_layer.ts +4 -6
  322. package/src/middle_layer/tree_snapshot_store.test.ts +4 -1
@@ -1 +1 @@
1
- {"version":3,"file":"computable_context.js","names":[],"sources":["../../src/js_render/computable_context.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport type { PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport { checkBlockFlag } from \"@platforma-sdk/model\";\nimport type {\n ArchiveFormat,\n CommonFieldTraverseOps as CommonFieldTraverseOpsFromSDK,\n DataInfo,\n FieldTraversalStep as FieldTraversalStepFromSDK,\n PColumn,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n PTableDef,\n PTableDefV2,\n PTableHandle,\n ResourceType as ResourceTypeFromSDK,\n ResultCollection,\n ValueOrError,\n RangeBytes,\n BlockCodeKnownFeatureFlags,\n JsRenderInternal,\n} from \"@platforma-sdk/model\";\nimport {\n isDataInfo,\n mapDataInfo,\n mapPObjectData,\n mapPTableDef,\n mapPTableDefV2,\n mapValueInVOE,\n} from \"@platforma-sdk/model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { PoolEntryGuard } from \"@milaboratories/pl-model-common\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Optional } from \"utility-types\";\nimport type { BlockContextAny } from \"../middle_layer/block_ctx\";\nimport type { MiddleLayerEnvironment } from \"../middle_layer/middle_layer\";\nimport type { Block } from \"../model/project_model\";\nimport { parseFinalPObjectCollection } from \"../pool/p_object_collection\";\nimport type { ResultPool } from \"../pool/result_pool\";\nimport { collectUpstreamBlockCtx, type UpstreamBlockCtx } from \"../pool/upstream_block_ctx\";\nimport type { JsExecutionContext } from \"./context\";\nimport type { VmFunctionImplementation } from \"quickjs-emscripten\";\nimport { Scope, type QuickJSHandle } from \"quickjs-emscripten\";\nimport {\n resolveRequiredServices,\n serviceFnKey,\n Services,\n ModelServiceRegistry,\n ServiceInjectionError,\n ServiceMethodNotFoundError,\n} from \"@milaboratories/pl-model-common\";\nimport { getServiceInjectors } from \"./service_injectors\";\nimport { MainAccessorName, StagingAccessorName } from \"@platforma-sdk/model\";\nimport { buildColumnRegistry, resolvePColumnById } from \"./column_registry\";\nimport type { ColumnRegistry, PObjectId } from \"@milaboratories/pl-model-common\";\nimport { collapseSpecOverrideNode } from \"./spec_override_collapse\";\n\nexport class ComputableContextHelper implements JsRenderInternal.GlobalCfgRenderCtxMethods<\n string,\n string\n> {\n public readonly computablesToResolve: Record<string, Computable<unknown>> = {};\n\n private computableCtx: ComputableCtx | undefined;\n private readonly accessors = new Map<string, PlTreeNodeAccessor | undefined>();\n private _meta: Map<string, Block> | undefined;\n private get meta(): Map<string, Block> {\n if (this._meta === undefined) {\n this._meta = this.blockCtx.blockMeta(this.requireComputableCtx);\n }\n return this._meta;\n }\n\n public get serviceRegistry(): ModelServiceRegistry {\n return this.env.serviceRegistry;\n }\n\n constructor(\n private readonly parent: JsExecutionContext,\n private readonly blockCtx: BlockContextAny,\n private readonly env: MiddleLayerEnvironment,\n private readonly featureFlags: BlockCodeKnownFeatureFlags | undefined,\n computableCtx: ComputableCtx,\n ) {\n this.computableCtx = computableCtx;\n }\n\n public resetComputableCtx() {\n this.computableCtx = undefined;\n this.accessors.clear();\n this._resultPool = undefined;\n this._upstreamBlockCtx = undefined;\n this._rawUpstreamBlockCtx = undefined;\n this._columnRegistry = undefined;\n }\n\n private get requireComputableCtx(): ComputableCtx {\n if (this.computableCtx === undefined)\n throw new Error(\"computableCtx not available (called from future mapper?)\");\n return this.computableCtx;\n }\n\n public addOnDestroy(callback: () => void): void {\n this.requireComputableCtx.addOnDestroy(callback);\n }\n\n //\n // Methods for injected ctx object\n //\n\n getAccessorHandleByName(name: string): string | undefined {\n const cCtx = this.requireComputableCtx;\n const wellKnownAccessor = (name: string, ctxKey: \"staging\" | \"prod\"): string | undefined => {\n if (!this.accessors.has(name)) {\n const lambda = this.blockCtx[ctxKey];\n if (lambda === undefined) throw new Error(\"Staging context not available\");\n const entry = lambda(cCtx);\n if (!entry) this.accessors.set(name, undefined);\n else this.accessors.set(name, cCtx.accessor(entry).node({ ignoreError: true }));\n }\n return this.accessors.get(name) ? name : undefined;\n };\n if (name === \"staging\") return wellKnownAccessor(\"staging\", \"staging\");\n else if (name === \"main\") return wellKnownAccessor(\"main\", \"prod\");\n return undefined;\n }\n\n //\n // Accessors\n //\n\n resolveWithCommon(\n handle: string,\n commonOptions: CommonFieldTraverseOpsFromSDK,\n ...steps: (FieldTraversalStepFromSDK | string)[]\n ): string | undefined {\n return this.wrapAccessor(this.getAccessor(handle).traverseWithCommon(commonOptions, ...steps));\n }\n\n getResourceType(handle: string): ResourceTypeFromSDK {\n return this.getAccessor(handle).resourceType;\n }\n\n getInputsLocked(handle: string): boolean {\n return this.getAccessor(handle).getInputsLocked();\n }\n\n getOutputsLocked(handle: string): boolean {\n return this.getAccessor(handle).getOutputsLocked();\n }\n\n getIsReadyOrError(handle: string): boolean {\n return this.getAccessor(handle).getIsReadyOrError();\n }\n\n hasData(handle: string): boolean {\n return this.getAccessor(handle).hasData();\n }\n\n getIsFinal(handle: string): boolean {\n return this.getAccessor(handle).getIsFinal();\n }\n\n getError(handle: string): string | undefined {\n return this.wrapAccessor(this.getAccessor(handle).getError());\n }\n\n listInputFields(handle: string): string[] {\n return this.getAccessor(handle).listInputFields();\n }\n\n listOutputFields(handle: string): string[] {\n return this.getAccessor(handle).listOutputFields();\n }\n\n listDynamicFields(handle: string): string[] {\n return this.getAccessor(handle).listDynamicFields();\n }\n\n getKeyValueBase64(handle: string, key: string): string | undefined {\n return bytesToBase64(this.getAccessor(handle).getKeyValue(key));\n }\n\n getKeyValueAsString(handle: string, key: string): string | undefined {\n return this.getAccessor(handle).getKeyValueAsString(key);\n }\n\n getDataBase64(handle: string): string | undefined {\n return bytesToBase64(this.getAccessor(handle).getData());\n }\n\n getDataAsString(handle: string): string | undefined {\n return this.getAccessor(handle).getDataAsString();\n }\n\n //\n // Accessor helpers\n //\n\n parsePObjectCollection(\n handle: string,\n errorOnUnknownField: boolean,\n prefix: string,\n ...resolveSteps: string[]\n ): Record<string, PObject<string>> | undefined {\n const acc = this.getAccessor(handle);\n if (!acc.getIsReadyOrError()) return undefined;\n const accResult = parseFinalPObjectCollection(acc, errorOnUnknownField, prefix, resolveSteps);\n const result: Record<string, PObject<string>> = {};\n for (const [key, obj] of Object.entries(accResult)) {\n result[key] = mapPObjectData(obj, (d) => this.wrapAccessor(d));\n }\n return result;\n }\n\n //\n // Blobs\n //\n\n private registerComputable(hPrefix: string, computable: Computable<unknown>): string {\n const fHandle = `${hPrefix}_${randomUUID()}`;\n this.computablesToResolve[fHandle] = computable;\n return fHandle;\n }\n\n public getBlobContentAsString(handle: string, range?: RangeBytes): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n \"getBlobContentAsString\",\n Computable.make((ctx) => this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo, ctx), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return Buffer.from(\n await this.env.driverKit.blobDriver.getContent(value.handle, range),\n ).toString(\"utf-8\");\n },\n }),\n );\n }\n\n public getBlobContentAsBase64(handle: string, range?: RangeBytes): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n \"getBlobContentAsBase64\",\n Computable.make((ctx) => this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo, ctx), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return Buffer.from(\n await this.env.driverKit.blobDriver.getContent(value.handle, range),\n ).toString(\"base64\");\n },\n }),\n );\n }\n\n public getDownloadedBlobContentHandle(handle: string): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n \"getDownloadedBlobContentHandle\",\n this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo),\n );\n }\n\n public getOnDemandBlobContentHandle(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n \"getOnDemandBlobContentHandle\",\n this.env.driverKit.blobDriver.getOnDemandBlob(resource),\n );\n }\n\n //\n // Blobs to URLs\n //\n\n public extractArchiveAndGetURL(handle: string, format: ArchiveFormat): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n \"extractArchiveAndGetURL\",\n this.env.driverKit.blobToURLDriver.extractArchiveAndGetURL(resource, format),\n );\n }\n\n //\n // Import progress\n //\n\n getImportProgress(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n \"getImportProgress\",\n this.env.driverKit.uploadDriver.getProgressId(resource),\n );\n }\n\n //\n // Logs\n //\n\n getLastLogs(handle: string, nLines: number): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n \"getLastLogs\",\n this.env.driverKit.logDriver.getLastLogs(resource, nLines),\n );\n }\n\n getProgressLog(handle: string, patternToSearch: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n \"getProgressLog\",\n this.env.driverKit.logDriver.getProgressLog(resource, patternToSearch),\n );\n }\n\n getProgressLogWithInfo(handle: string, patternToSearch: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n \"getProgressLogWithInfo\",\n this.env.driverKit.logDriver.getProgressLogWithInfo(resource, patternToSearch),\n );\n }\n\n getLogHandle(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n \"getLogHandle\",\n this.env.driverKit.logDriver.getLogHandle(resource),\n );\n }\n\n //\n // Blocks\n //\n\n public getBlockLabel(blockId: string): string {\n const b = this.meta.get(blockId);\n if (b === undefined) throw new Error(`Block ${blockId} not found.`);\n return b.label;\n }\n\n //\n // Result Pool\n //\n\n private _resultPool: ResultPool | undefined = undefined;\n private get resultPool(): ResultPool {\n if (this._resultPool === undefined) {\n this._resultPool = notEmpty(\n this.blockCtx.getResultsPool,\n \"getResultsPool\",\n )(this.requireComputableCtx);\n }\n return this._resultPool;\n }\n\n public getDataFromResultPool(): ResultCollection<PObject<string>> {\n const collection = this.resultPool.getData();\n if (collection.instabilityMarker !== undefined)\n this.requireComputableCtx.markUnstable(\n `incomplete_result_pool:${collection.instabilityMarker}`,\n );\n return {\n isComplete: collection.isComplete,\n entries: collection.entries.map((e) => ({\n ref: e.ref,\n obj: mapPObjectData(e.obj, (d) => this.wrapAccessor(d)),\n })),\n };\n }\n\n public getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<string, Error>>, \"id\">\n > {\n const collection = this.resultPool.getDataWithErrors();\n if (collection.instabilityMarker !== undefined)\n this.requireComputableCtx.markUnstable(\n `incomplete_result_pool:${collection.instabilityMarker}`,\n );\n return {\n isComplete: collection.isComplete,\n entries: collection.entries.map((e) => ({\n ref: e.ref,\n obj: {\n id: e.obj.id,\n spec: e.obj.spec,\n data: mapValueInVOE(e.obj.data, (d) => this.wrapAccessor(d)),\n },\n })),\n };\n }\n\n public getSpecsFromResultPool(): ResultCollection<PObjectSpec> {\n const specs = this.resultPool.getSpecs();\n if (specs.instabilityMarker !== undefined)\n this.requireComputableCtx.markUnstable(\n `specs_from_pool_incomplete:${specs.instabilityMarker}`,\n );\n return specs;\n }\n\n getSpecFromResultPoolByRef(blockId: string, exportName: string): PObjectSpec | undefined {\n return this.resultPool.getSpecByRef(blockId, exportName);\n }\n\n getDataFromResultPoolByRef(blockId: string, exportName: string): PObject<string> | undefined {\n return mapPObjectData(this.resultPool.getDataByRef(blockId, exportName), (acc) =>\n this.wrapAccessor(acc),\n );\n }\n\n /**\n * Single source-of-truth cache of upstream-block ctx pairs as raw\n * `PlTreeNodeAccessor`s. Both the sandbox-facing `getUpstreamBlockCtx()`\n * (string-handle view) and the host column registry are derived from this.\n */\n private _rawUpstreamBlockCtx: UpstreamBlockCtx<PlTreeNodeAccessor>[] | undefined = undefined;\n /**\n * Raw upstream-block ctx accessors for the current render. Public so the\n * `ColumnsCollection` service injector (`service_injectors.ts`) can build\n * `ColumnsCollectionDriverHost.getUpstreamBlockCtxes` bindings without\n * round-tripping through the handle-shape view.\n */\n public getRawUpstreamBlockCtx(): UpstreamBlockCtx<PlTreeNodeAccessor>[] {\n if (this._rawUpstreamBlockCtx === undefined) {\n const prjEntry = notEmpty(this.blockCtx.projectEntry, \"projectEntry\");\n this._rawUpstreamBlockCtx = collectUpstreamBlockCtx(\n this.requireComputableCtx,\n prjEntry,\n this.blockCtx.blockId,\n );\n }\n return this._rawUpstreamBlockCtx;\n }\n\n private _upstreamBlockCtx: UpstreamBlockCtx<string>[] | undefined = undefined;\n public getUpstreamBlockCtx(): UpstreamBlockCtx<string>[] {\n if (this._upstreamBlockCtx === undefined) {\n this._upstreamBlockCtx = this.getRawUpstreamBlockCtx().map((b) => ({\n blockId: b.blockId,\n prodCtx: this.wrapAccessor(b.prodCtx),\n stagingCtx: this.wrapAccessor(b.stagingCtx),\n prodIncomplete: b.prodIncomplete,\n stagingIncomplete: b.stagingIncomplete,\n }));\n }\n return this._upstreamBlockCtx;\n }\n\n //\n // Host-side column registry — id → LeafEntry index over outputs/prerun/raw pool.\n // Mirrors the sandbox `ColumnRegistry` so `createPFrame` / `createPTable` can\n // accept `PObjectId` in addition to materialised `PColumn`s.\n //\n private _columnRegistry: ColumnRegistry<PlTreeNodeAccessor> | undefined = undefined;\n public getColumnRegistry(): ColumnRegistry<PlTreeNodeAccessor> {\n if (this._columnRegistry !== undefined) return this._columnRegistry;\n return (this._columnRegistry = buildColumnRegistry({\n outputs: this.accessors.get(MainAccessorName) ?? undefined,\n prerun: this.accessors.get(StagingAccessorName) ?? undefined,\n upstreamBlockCtxes: this.getRawUpstreamBlockCtx(),\n }));\n }\n\n //\n // PFrames / PTables\n //\n\n public createPFrame(\n def: PFrameDef<PObjectId | PColumn<string | PColumnValues | DataInfo<string>>>,\n ): PFrameHandle {\n using guard = new PoolEntryGuard(\n this.env.driverKit.pFrameDriver.createPFrame(def.map((c) => this.resolvePColumn(c))),\n );\n this.requireComputableCtx.addOnDestroy(guard.entry.unref);\n return guard.keep().key;\n }\n\n public createPTable(\n def: PTableDef<PObjectId | PColumn<string | PColumnValues | DataInfo<string>>>,\n ): PTableHandle {\n using guard = new PoolEntryGuard(\n this.env.driverKit.pFrameDriver.createPTable(\n mapPTableDef(def, (c) => this.resolvePColumn(c)),\n ),\n );\n this.requireComputableCtx.addOnDestroy(guard.entry.unref);\n return guard.keep().key;\n }\n\n public createPTableV2(\n def: PTableDefV2<PObjectId | PColumn<string | PColumnValues | DataInfo<string>>>,\n ): PTableHandle {\n using guard = new PoolEntryGuard(\n this.env.driverKit.pFrameDriver.createPTableV2(\n mapPTableDefV2(def, {\n column: (c) => this.resolvePColumn(c),\n node: collapseSpecOverrideNode,\n }),\n ),\n );\n this.requireComputableCtx.addOnDestroy(guard.entry.unref);\n return guard.keep().key;\n }\n\n /**\n * Normalise a def element: pass-through for materialised columns (after\n * mapping their `data` payload via {@link transformInputPData}), or resolve\n * a bare id through the host column registry. `resolvePColumnById` extracts\n * the underlying {@link PObjectId} from any id encoding\n * ({@link ColumnOverriddenId}, etc.).\n */\n private resolvePColumn(\n item: PObjectId | PColumn<string | PColumnValues | DataInfo<string>>,\n ): PColumn<PlTreeNodeAccessor | PColumnValues | DataInfo<PlTreeNodeAccessor>> {\n return typeof item === \"string\"\n ? resolvePColumnById(this.getColumnRegistry(), item)\n : mapPObjectData(item, (d) => this.transformInputPData(d));\n }\n\n /**\n * Transforms input data for PFrame/PTable creation\n * - Converts string handles to accessors\n * - Maps accessors in DataInfo objects\n * - Passes through other values\n */\n private transformInputPData(\n d: string | PColumnValues | DataInfo<string>,\n ): PlTreeNodeAccessor | PColumnValues | DataInfo<PlTreeNodeAccessor> {\n if (typeof d === \"string\") {\n return this.getAccessor(d);\n } else if (isDataInfo(d)) {\n return mapDataInfo(d, (a) => this.getAccessor(a));\n } else {\n return d;\n }\n }\n\n //\n // Computable\n //\n\n public getCurrentUnstableMarker(): string | undefined {\n return this.computableCtx?.unstableMarker;\n }\n\n //\n // Logging\n //\n\n public logInfo(message: string): void {\n this.env.blockEventDispatcher.logInfo(this.blockCtx.blockId, message);\n }\n\n public logWarn(message: string): void {\n this.env.blockEventDispatcher.logWarn(this.blockCtx.blockId, message);\n }\n\n public logError(message: string): void {\n this.env.blockEventDispatcher.logError(this.blockCtx.blockId, message);\n }\n\n //\n // Helpers\n //\n\n /**\n * Resolve a sandbox-side `AccessorHandle` string back to its concrete\n * host accessor. Used internally by every `traverse`/`getX(handle)`\n * method and externally by the `ColumnsCollection` service injector\n * for `SerializedColumnsSource` of kind `\"accessor\"`.\n */\n public getAccessor(handle: string): PlTreeNodeAccessor {\n const accessor = this.accessors.get(handle);\n if (accessor === undefined) throw new Error(\"No such accessor\");\n return accessor;\n }\n\n private wrapAccessor(accessor: PlTreeNodeAccessor): string;\n private wrapAccessor(accessor: PlTreeNodeAccessor | undefined): string | undefined;\n private wrapAccessor(accessor: PlTreeNodeAccessor | undefined): string | undefined {\n if (accessor === undefined) return undefined;\n else {\n const nextHandle = randomUUID();\n this.accessors.set(nextHandle, accessor);\n return nextHandle;\n }\n }\n\n public injectCtx(configCtx: QuickJSHandle): void {\n const parent = this.parent;\n const vm = parent.vm;\n\n Scope.withScope((localScope) => {\n // Exporting methods\n\n const exportCtxFunction = (\n name: string,\n fn: VmFunctionImplementation<QuickJSHandle>,\n ): void => {\n const withCachedError: VmFunctionImplementation<QuickJSHandle> = (...args) => {\n // QuickJS strips all fields from errors apart from 'name' and 'message'.\n // That's why here we need to store them, and rethrow them when we exit\n // from QuickJS code.\n const t0 = performance.now();\n try {\n return (fn as any)(...args);\n } catch (e: unknown) {\n const newErr = parent.errorRepo.setAndRecreateForQuickJS(e);\n throw vm.newError(newErr);\n } finally {\n parent.stats.ctxMethodCalls++;\n parent.stats.ctxMethodMs += performance.now() - t0;\n }\n };\n\n vm.newFunction(name, withCachedError).consume((fnh) => vm.setProp(configCtx, name, fnh));\n vm.newFunction(name, fn).consume((fnh) =>\n vm.setProp(configCtx, name + \"__internal__\", fnh),\n );\n };\n\n // Check if this is a v1/v2 block (requiresModelAPIVersion !== 2)\n // For v1/v2 blocks, state is {args, uiState} and we need to inject uiState separately\n const isLegacyBlock = !checkBlockFlag(this.featureFlags, \"requiresModelAPIVersion\", 2);\n\n // Helper to extract uiState from legacy state format {args, uiState}\n const extractUiState = (stateJson: string | undefined): string => {\n if (!stateJson) return \"{}\";\n try {\n const parsed = JSON.parse(stateJson);\n return JSON.stringify(parsed?.uiState ?? {});\n } catch {\n return \"{}\";\n }\n };\n\n if (checkBlockFlag(this.featureFlags, \"supportsLazyState\")) {\n // injecting lazy state functions\n exportCtxFunction(\"args\", () => {\n const cCtx = this.requireComputableCtx;\n const args = this.blockCtx.args(cCtx);\n return args === undefined ? vm.undefined : vm.newString(args);\n });\n exportCtxFunction(\"blockStorage\", () => {\n return vm.newString(this.blockCtx.blockStorage(this.requireComputableCtx) ?? \"{}\");\n });\n exportCtxFunction(\"data\", () => {\n return vm.newString(this.blockCtx.data(this.requireComputableCtx) ?? \"{}\");\n });\n exportCtxFunction(\"activeArgs\", () => {\n const cCtx = this.requireComputableCtx;\n const res = this.blockCtx.activeArgs(cCtx);\n return res === undefined ? vm.undefined : vm.newString(res);\n });\n // For v1/v2 blocks, also inject uiState (extracted from state.uiState)\n if (isLegacyBlock) {\n exportCtxFunction(\"uiState\", () => {\n return vm.newString(extractUiState(this.blockCtx.data(this.requireComputableCtx)));\n });\n }\n } else {\n const cCtx = this.requireComputableCtx;\n const args = this.blockCtx.args(cCtx);\n const activeArgs = this.blockCtx.activeArgs(cCtx);\n const data = this.blockCtx.data(cCtx);\n if (args !== undefined) {\n vm.setProp(configCtx, \"args\", localScope.manage(vm.newString(args)));\n }\n vm.setProp(configCtx, \"data\", localScope.manage(vm.newString(data ?? \"{}\")));\n if (activeArgs !== undefined)\n vm.setProp(configCtx, \"activeArgs\", localScope.manage(vm.newString(activeArgs)));\n // For v1/v2 blocks, also inject uiState (extracted from state.uiState)\n if (isLegacyBlock) {\n vm.setProp(configCtx, \"uiState\", localScope.manage(vm.newString(extractUiState(data))));\n }\n }\n\n //\n // Methods for injected ctx object\n //\n\n exportCtxFunction(\"getAccessorHandleByName\", (name) => {\n return parent.exportSingleValue(\n this.getAccessorHandleByName(vm.getString(name)),\n undefined,\n );\n });\n\n //\n // Accessors\n //\n\n exportCtxFunction(\"resolveWithCommon\", (handle, commonOptions, ...steps) => {\n return parent.exportSingleValue(\n this.resolveWithCommon(\n vm.getString(handle),\n parent.importObjectViaJson(commonOptions) as CommonFieldTraverseOpsFromSDK,\n ...steps.map(\n (step) => parent.importObjectViaJson(step) as FieldTraversalStepFromSDK | string,\n ),\n ),\n undefined,\n );\n });\n\n exportCtxFunction(\"getResourceType\", (handle) => {\n return parent.exportObjectViaJson(this.getResourceType(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"getInputsLocked\", (handle) => {\n return parent.exportSingleValue(this.getInputsLocked(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"getOutputsLocked\", (handle) => {\n return parent.exportSingleValue(this.getOutputsLocked(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"getIsReadyOrError\", (handle) => {\n return parent.exportSingleValue(this.getIsReadyOrError(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"getIsFinal\", (handle) => {\n return parent.exportSingleValue(this.getIsFinal(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"hasData\", (handle) => {\n return parent.exportSingleValue(this.hasData(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"getError\", (handle) => {\n return parent.exportSingleValue(this.getError(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"listInputFields\", (handle) => {\n return parent.exportObjectViaJson(this.listInputFields(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"listOutputFields\", (handle) => {\n return parent.exportObjectViaJson(this.listOutputFields(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"listDynamicFields\", (handle) => {\n return parent.exportObjectViaJson(this.listDynamicFields(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"getKeyValueBase64\", (handle, key) => {\n return parent.exportSingleValue(\n this.getKeyValueBase64(vm.getString(handle), vm.getString(key)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getKeyValueAsString\", (handle, key) => {\n return parent.exportSingleValue(\n this.getKeyValueAsString(vm.getString(handle), vm.getString(key)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getDataBase64\", (handle) => {\n return parent.exportSingleValue(this.getDataBase64(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"getDataAsString\", (handle) => {\n return parent.exportSingleValue(this.getDataAsString(vm.getString(handle)), undefined);\n });\n\n //\n // Accessor helpers\n //\n\n exportCtxFunction(\n \"parsePObjectCollection\",\n (handle, errorOnUnknownField, prefix, ...resolveSteps) => {\n return parent.exportObjectUniversal(\n this.parsePObjectCollection(\n vm.getString(handle),\n vm.dump(errorOnUnknownField) as boolean,\n vm.getString(prefix),\n ...resolveSteps.map((stepHandle) => vm.getString(stepHandle)),\n ),\n undefined,\n );\n },\n );\n\n //\n // Blobs\n //\n\n exportCtxFunction(\"getBlobContentAsBase64\", (handle, range) => {\n return parent.exportSingleValue(\n this.getBlobContentAsBase64(\n vm.getString(handle),\n parent.importObjectUniversal(range) as RangeBytes | undefined,\n ),\n undefined,\n );\n });\n\n exportCtxFunction(\"getBlobContentAsString\", (handle, range) => {\n return parent.exportSingleValue(\n this.getBlobContentAsString(\n vm.getString(handle),\n parent.importObjectUniversal(range) as RangeBytes | undefined,\n ),\n undefined,\n );\n });\n\n exportCtxFunction(\"getDownloadedBlobContentHandle\", (handle) => {\n return parent.exportSingleValue(\n this.getDownloadedBlobContentHandle(vm.getString(handle)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getOnDemandBlobContentHandle\", (handle) => {\n return parent.exportSingleValue(\n this.getOnDemandBlobContentHandle(vm.getString(handle)),\n undefined,\n );\n });\n\n //\n // Blobs to URLs\n //\n\n exportCtxFunction(\"extractArchiveAndGetURL\", (handle, format) => {\n return parent.exportSingleValue(\n this.extractArchiveAndGetURL(vm.getString(handle), vm.getString(format) as ArchiveFormat),\n undefined,\n );\n });\n\n //\n // ImportProgress\n //\n\n exportCtxFunction(\"getImportProgress\", (handle) => {\n return parent.exportSingleValue(this.getImportProgress(vm.getString(handle)), undefined);\n });\n\n //\n // Logs\n //\n\n exportCtxFunction(\"getLastLogs\", (handle, nLines) => {\n return parent.exportSingleValue(\n this.getLastLogs(vm.getString(handle), vm.getNumber(nLines)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getProgressLog\", (handle, patternToSearch) => {\n return parent.exportSingleValue(\n this.getProgressLog(vm.getString(handle), vm.getString(patternToSearch)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getProgressLogWithInfo\", (handle, patternToSearch) => {\n return parent.exportSingleValue(\n this.getProgressLogWithInfo(vm.getString(handle), vm.getString(patternToSearch)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getLogHandle\", (handle) => {\n return parent.exportSingleValue(this.getLogHandle(vm.getString(handle)), undefined);\n });\n\n //\n // Blocks\n //\n\n exportCtxFunction(\"getBlockLabel\", (blockId) => {\n return parent.exportSingleValue(this.getBlockLabel(vm.getString(blockId)), undefined);\n });\n\n //\n // Result pool\n //\n\n exportCtxFunction(\"getDataFromResultPool\", () => {\n return parent.exportObjectUniversal(this.getDataFromResultPool(), undefined);\n });\n\n exportCtxFunction(\"getDataWithErrorsFromResultPool\", () => {\n return parent.exportObjectUniversal(this.getDataWithErrorsFromResultPool(), undefined);\n });\n\n exportCtxFunction(\"getSpecsFromResultPool\", () => {\n return parent.exportObjectUniversal(this.getSpecsFromResultPool(), undefined);\n });\n\n exportCtxFunction(\"getSpecFromResultPoolByRef\", (blockId, exportName) => {\n return parent.exportObjectUniversal(\n this.getSpecFromResultPoolByRef(vm.getString(blockId), vm.getString(exportName)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getDataFromResultPoolByRef\", (blockId, exportName) => {\n return parent.exportObjectUniversal(\n this.getDataFromResultPoolByRef(vm.getString(blockId), vm.getString(exportName)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getUpstreamBlockCtx\", () => {\n return parent.exportObjectUniversal(this.getUpstreamBlockCtx(), undefined);\n });\n\n exportCtxFunction(\"createPFrame\", (def) => {\n return parent.exportSingleValue(\n this.createPFrame(\n parent.importObjectViaJson(def) as PFrameDef<PColumn<string | PColumnValues>>,\n ),\n undefined,\n );\n });\n\n exportCtxFunction(\"createPTable\", (def) => {\n return parent.exportSingleValue(\n this.createPTable(\n parent.importObjectViaJson(def) as PTableDef<PColumn<string | PColumnValues>>,\n ),\n undefined,\n );\n });\n\n exportCtxFunction(\"createPTableV2\", (def) => {\n return parent.exportSingleValue(\n this.createPTableV2(\n parent.importObjectViaJson(def) as PTableDefV2<PColumn<string | PColumnValues>>,\n ),\n undefined,\n );\n });\n\n //\n // Services\n //\n\n const requiredServiceNames = new Set(resolveRequiredServices(this.featureFlags) as string[]);\n const serviceFunctions = new Map<string, VmFunctionImplementation<QuickJSHandle>>();\n const injectors = getServiceInjectors();\n\n for (const [key, serviceId] of Object.entries(Services)) {\n if (!requiredServiceNames.has(serviceId)) continue;\n const injector = injectors[key as keyof typeof injectors];\n try {\n const methods = injector({ host: this, vm: parent });\n for (const [method, fn] of Object.entries(methods)) {\n serviceFunctions.set(serviceFnKey(serviceId, method), fn);\n }\n } catch (e) {\n throw new ServiceInjectionError(`Failed to inject service \"${serviceId}\"`, { cause: e });\n }\n }\n\n exportCtxFunction(\"getServiceNames\", () => {\n return parent.exportObjectViaJson([...requiredServiceNames]);\n });\n\n exportCtxFunction(\"getServiceMethods\", (serviceIdHandle) => {\n const serviceId = vm.getString(serviceIdHandle);\n const pfx = serviceFnKey(serviceId);\n const methods = [...serviceFunctions.keys()]\n .filter((k) => k.startsWith(pfx))\n .map((k) => k.slice(pfx.length));\n return parent.exportObjectViaJson(methods, undefined);\n });\n\n exportCtxFunction(\n \"callServiceMethod\",\n function (this: QuickJSHandle, serviceIdHandle, methodHandle, ...argHandles) {\n const serviceId = vm.getString(serviceIdHandle);\n const method = vm.getString(methodHandle);\n const fn = serviceFunctions.get(serviceFnKey(serviceId, method));\n if (!fn)\n throw new ServiceMethodNotFoundError(\n `Method \"${method}\" not found on service \"${serviceId}\"`,\n );\n return fn.call(this, ...argHandles);\n },\n );\n\n //\n // Computable\n //\n\n exportCtxFunction(\"getCurrentUnstableMarker\", () => {\n return parent.exportSingleValue(this.getCurrentUnstableMarker(), undefined);\n });\n\n //\n // Logging\n //\n\n exportCtxFunction(\"logInfo\", (message) => {\n this.logInfo(vm.getString(message));\n });\n\n exportCtxFunction(\"logWarn\", (message) => {\n this.logWarn(vm.getString(message));\n });\n\n exportCtxFunction(\"logError\", (message) => {\n this.logError(vm.getString(message));\n });\n });\n }\n}\n\nfunction bytesToBase64(data: Uint8Array | undefined): string | undefined {\n return data !== undefined ? Buffer.from(data).toString(\"base64\") : undefined;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"computable_context.js","names":[],"sources":["../../src/js_render/computable_context.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport type { PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport { checkBlockFlag } from \"@platforma-sdk/model\";\nimport type {\n ArchiveFormat,\n CommonFieldTraverseOps as CommonFieldTraverseOpsFromSDK,\n DataInfo,\n FieldTraversalStep as FieldTraversalStepFromSDK,\n PColumn,\n PColumnValues,\n PFrameDef,\n PFrameHandle,\n PObject,\n PObjectSpec,\n PTableDef,\n PTableDefV2,\n PTableHandle,\n ResourceType as ResourceTypeFromSDK,\n ResultCollection,\n ValueOrError,\n RangeBytes,\n BlockCodeKnownFeatureFlags,\n JsRenderInternal,\n} from \"@platforma-sdk/model\";\nimport {\n isDataInfo,\n mapDataInfo,\n mapPObjectData,\n mapPTableDef,\n mapPTableDefV2,\n mapValueInVOE,\n} from \"@platforma-sdk/model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { PoolEntryGuard } from \"@milaboratories/pl-model-common\";\nimport { randomUUID } from \"node:crypto\";\nimport type { Optional } from \"utility-types\";\nimport type { BlockContextAny } from \"../middle_layer/block_ctx\";\nimport type { MiddleLayerEnvironment } from \"../middle_layer/middle_layer\";\nimport type { Block } from \"../model/project_model\";\nimport { parseFinalPObjectCollection } from \"../pool/p_object_collection\";\nimport type { ResultPool } from \"../pool/result_pool\";\nimport { collectUpstreamBlockCtx, type UpstreamBlockCtx } from \"../pool/upstream_block_ctx\";\nimport type { JsExecutionContext } from \"./context\";\nimport type { VmFunctionImplementation } from \"quickjs-emscripten\";\nimport { Scope, type QuickJSHandle } from \"quickjs-emscripten\";\nimport {\n resolveRequiredServices,\n serviceFnKey,\n Services,\n ModelServiceRegistry,\n ServiceInjectionError,\n ServiceMethodNotFoundError,\n} from \"@milaboratories/pl-model-common\";\nimport { getServiceInjectors } from \"./service_injectors\";\nimport { MainAccessorName, StagingAccessorName } from \"@platforma-sdk/model\";\nimport { buildColumnRegistry, resolvePColumnById } from \"./column_registry\";\nimport type { ColumnRegistry, PObjectId } from \"@milaboratories/pl-model-common\";\nimport { collapseSpecOverrideNode } from \"./spec_override_collapse\";\n\nexport class ComputableContextHelper implements JsRenderInternal.GlobalCfgRenderCtxMethods<\n string,\n string\n> {\n public readonly computablesToResolve: Record<string, Computable<unknown>> = {};\n\n private computableCtx: ComputableCtx | undefined;\n private readonly accessors = new Map<string, PlTreeNodeAccessor | undefined>();\n private _meta: Map<string, Block> | undefined;\n private get meta(): Map<string, Block> {\n if (this._meta === undefined) {\n this._meta = this.blockCtx.blockMeta(this.requireComputableCtx);\n }\n return this._meta;\n }\n\n public get serviceRegistry(): ModelServiceRegistry {\n return this.env.serviceRegistry;\n }\n\n constructor(\n private readonly parent: JsExecutionContext,\n private readonly blockCtx: BlockContextAny,\n private readonly env: MiddleLayerEnvironment,\n private readonly featureFlags: BlockCodeKnownFeatureFlags | undefined,\n computableCtx: ComputableCtx,\n ) {\n this.computableCtx = computableCtx;\n }\n\n public resetComputableCtx() {\n this.computableCtx = undefined;\n this.accessors.clear();\n this._resultPool = undefined;\n this._upstreamBlockCtx = undefined;\n this._rawUpstreamBlockCtx = undefined;\n this._columnRegistry = undefined;\n }\n\n private get requireComputableCtx(): ComputableCtx {\n if (this.computableCtx === undefined)\n throw new Error(\"computableCtx not available (called from future mapper?)\");\n return this.computableCtx;\n }\n\n public addOnDestroy(callback: () => void): void {\n this.requireComputableCtx.addOnDestroy(callback);\n }\n\n //\n // Methods for injected ctx object\n //\n\n getAccessorHandleByName(name: string): string | undefined {\n const cCtx = this.requireComputableCtx;\n const wellKnownAccessor = (name: string, ctxKey: \"staging\" | \"prod\"): string | undefined => {\n if (!this.accessors.has(name)) {\n const lambda = this.blockCtx[ctxKey];\n if (lambda === undefined) throw new Error(\"Staging context not available\");\n const entry = lambda(cCtx);\n if (!entry) this.accessors.set(name, undefined);\n else this.accessors.set(name, cCtx.accessor(entry).node({ ignoreError: true }));\n }\n return this.accessors.get(name) ? name : undefined;\n };\n if (name === \"staging\") return wellKnownAccessor(\"staging\", \"staging\");\n else if (name === \"main\") return wellKnownAccessor(\"main\", \"prod\");\n return undefined;\n }\n\n //\n // Accessors\n //\n\n resolveWithCommon(\n handle: string,\n commonOptions: CommonFieldTraverseOpsFromSDK,\n ...steps: (FieldTraversalStepFromSDK | string)[]\n ): string | undefined {\n return this.wrapAccessor(this.getAccessor(handle).traverseWithCommon(commonOptions, ...steps));\n }\n\n getResourceType(handle: string): ResourceTypeFromSDK {\n return this.getAccessor(handle).resourceType;\n }\n\n getInputsLocked(handle: string): boolean {\n return this.getAccessor(handle).getInputsLocked();\n }\n\n getOutputsLocked(handle: string): boolean {\n return this.getAccessor(handle).getOutputsLocked();\n }\n\n getIsReadyOrError(handle: string): boolean {\n return this.getAccessor(handle).getIsReadyOrError();\n }\n\n hasData(handle: string): boolean {\n return this.getAccessor(handle).hasData();\n }\n\n getIsFinal(handle: string): boolean {\n return this.getAccessor(handle).getIsFinal();\n }\n\n getError(handle: string): string | undefined {\n return this.wrapAccessor(this.getAccessor(handle).getError());\n }\n\n listInputFields(handle: string): string[] {\n return this.getAccessor(handle).listInputFields();\n }\n\n listOutputFields(handle: string): string[] {\n return this.getAccessor(handle).listOutputFields();\n }\n\n listDynamicFields(handle: string): string[] {\n return this.getAccessor(handle).listDynamicFields();\n }\n\n getKeyValueBase64(handle: string, key: string): string | undefined {\n return bytesToBase64(this.getAccessor(handle).getKeyValue(key));\n }\n\n getKeyValueAsString(handle: string, key: string): string | undefined {\n return this.getAccessor(handle).getKeyValueAsString(key);\n }\n\n getDataBase64(handle: string): string | undefined {\n return bytesToBase64(this.getAccessor(handle).getData());\n }\n\n getDataAsString(handle: string): string | undefined {\n return this.getAccessor(handle).getDataAsString();\n }\n\n //\n // Accessor helpers\n //\n\n parsePObjectCollection(\n handle: string,\n errorOnUnknownField: boolean,\n prefix: string,\n ...resolveSteps: string[]\n ): Record<string, PObject<string>> | undefined {\n const acc = this.getAccessor(handle);\n if (!acc.getIsReadyOrError()) return undefined;\n const accResult = parseFinalPObjectCollection(acc, errorOnUnknownField, prefix, resolveSteps);\n const result: Record<string, PObject<string>> = {};\n for (const [key, obj] of Object.entries(accResult)) {\n result[key] = mapPObjectData(obj, (d) => this.wrapAccessor(d));\n }\n return result;\n }\n\n //\n // Blobs\n //\n\n private registerComputable(hPrefix: string, computable: Computable<unknown>): string {\n const fHandle = `${hPrefix}_${randomUUID()}`;\n this.computablesToResolve[fHandle] = computable;\n return fHandle;\n }\n\n public getBlobContentAsString(handle: string, range?: RangeBytes): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n \"getBlobContentAsString\",\n Computable.make((ctx) => this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo, ctx), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return Buffer.from(\n await this.env.driverKit.blobDriver.getContent(value.handle, range),\n ).toString(\"utf-8\");\n },\n }),\n );\n }\n\n public getBlobContentAsBase64(handle: string, range?: RangeBytes): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n \"getBlobContentAsBase64\",\n Computable.make((ctx) => this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo, ctx), {\n postprocessValue: async (value) => {\n if (value === undefined) return undefined;\n return Buffer.from(\n await this.env.driverKit.blobDriver.getContent(value.handle, range),\n ).toString(\"base64\");\n },\n }),\n );\n }\n\n public getDownloadedBlobContentHandle(handle: string): string {\n const resourceInfo = this.getAccessor(handle).resourceInfo;\n return this.registerComputable(\n \"getDownloadedBlobContentHandle\",\n this.env.driverKit.blobDriver.getDownloadedBlob(resourceInfo),\n );\n }\n\n public getOnDemandBlobContentHandle(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n \"getOnDemandBlobContentHandle\",\n this.env.driverKit.blobDriver.getOnDemandBlob(resource),\n );\n }\n\n //\n // Blobs to URLs\n //\n\n public extractArchiveAndGetURL(handle: string, format: ArchiveFormat): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n \"extractArchiveAndGetURL\",\n this.env.driverKit.blobToURLDriver.extractArchiveAndGetURL(resource, format),\n );\n }\n\n //\n // Import progress\n //\n\n getImportProgress(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n \"getImportProgress\",\n this.env.driverKit.uploadDriver.getProgressId(resource),\n );\n }\n\n //\n // Logs\n //\n\n getLastLogs(handle: string, nLines: number): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n \"getLastLogs\",\n this.env.driverKit.logDriver.getLastLogs(resource, nLines),\n );\n }\n\n getProgressLog(handle: string, patternToSearch: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n \"getProgressLog\",\n this.env.driverKit.logDriver.getProgressLog(resource, patternToSearch),\n );\n }\n\n getProgressLogWithInfo(handle: string, patternToSearch: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n \"getProgressLogWithInfo\",\n this.env.driverKit.logDriver.getProgressLogWithInfo(resource, patternToSearch),\n );\n }\n\n getLogHandle(handle: string): string {\n const resource = this.getAccessor(handle).persist();\n return this.registerComputable(\n \"getLogHandle\",\n this.env.driverKit.logDriver.getLogHandle(resource),\n );\n }\n\n //\n // Blocks\n //\n\n public getBlockLabel(blockId: string): string {\n const b = this.meta.get(blockId);\n if (b === undefined) throw new Error(`Block ${blockId} not found.`);\n return b.label;\n }\n\n //\n // Result Pool\n //\n\n private _resultPool: ResultPool | undefined = undefined;\n private get resultPool(): ResultPool {\n if (this._resultPool === undefined) {\n this._resultPool = notEmpty(\n this.blockCtx.getResultsPool,\n \"getResultsPool\",\n )(this.requireComputableCtx);\n }\n return this._resultPool;\n }\n\n public getDataFromResultPool(): ResultCollection<PObject<string>> {\n const collection = this.resultPool.getData();\n if (collection.instabilityMarker !== undefined)\n this.requireComputableCtx.markUnstable(\n `incomplete_result_pool:${collection.instabilityMarker}`,\n );\n return {\n isComplete: collection.isComplete,\n entries: collection.entries.map((e) => ({\n ref: e.ref,\n obj: mapPObjectData(e.obj, (d) => this.wrapAccessor(d)),\n })),\n };\n }\n\n public getDataWithErrorsFromResultPool(): ResultCollection<\n Optional<PObject<ValueOrError<string, Error>>, \"id\">\n > {\n const collection = this.resultPool.getDataWithErrors();\n if (collection.instabilityMarker !== undefined)\n this.requireComputableCtx.markUnstable(\n `incomplete_result_pool:${collection.instabilityMarker}`,\n );\n return {\n isComplete: collection.isComplete,\n entries: collection.entries.map((e) => ({\n ref: e.ref,\n obj: {\n id: e.obj.id,\n spec: e.obj.spec,\n data: mapValueInVOE(e.obj.data, (d) => this.wrapAccessor(d)),\n },\n })),\n };\n }\n\n public getSpecsFromResultPool(): ResultCollection<PObjectSpec> {\n const specs = this.resultPool.getSpecs();\n if (specs.instabilityMarker !== undefined)\n this.requireComputableCtx.markUnstable(\n `specs_from_pool_incomplete:${specs.instabilityMarker}`,\n );\n return specs;\n }\n\n getSpecFromResultPoolByRef(blockId: string, exportName: string): PObjectSpec | undefined {\n return this.resultPool.getSpecByRef(blockId, exportName);\n }\n\n getDataFromResultPoolByRef(blockId: string, exportName: string): PObject<string> | undefined {\n return mapPObjectData(this.resultPool.getDataByRef(blockId, exportName), (acc) =>\n this.wrapAccessor(acc),\n );\n }\n\n /**\n * Single source-of-truth cache of upstream-block ctx pairs as raw\n * `PlTreeNodeAccessor`s. Both the sandbox-facing `getUpstreamBlockCtx()`\n * (string-handle view) and the host column registry are derived from this.\n */\n private _rawUpstreamBlockCtx: UpstreamBlockCtx<PlTreeNodeAccessor>[] | undefined = undefined;\n /**\n * Raw upstream-block ctx accessors for the current render. Public so the\n * `ColumnsCollection` service injector (`service_injectors.ts`) can build\n * `ColumnsCollectionDriverHost.getUpstreamBlockCtxes` bindings without\n * round-tripping through the handle-shape view.\n */\n public getRawUpstreamBlockCtx(): UpstreamBlockCtx<PlTreeNodeAccessor>[] {\n if (this._rawUpstreamBlockCtx === undefined) {\n const prjEntry = notEmpty(this.blockCtx.projectEntry, \"projectEntry\");\n this._rawUpstreamBlockCtx = collectUpstreamBlockCtx(\n this.requireComputableCtx,\n prjEntry,\n this.blockCtx.blockId,\n );\n }\n return this._rawUpstreamBlockCtx;\n }\n\n private _upstreamBlockCtx: UpstreamBlockCtx<string>[] | undefined = undefined;\n public getUpstreamBlockCtx(): UpstreamBlockCtx<string>[] {\n if (this._upstreamBlockCtx === undefined) {\n this._upstreamBlockCtx = this.getRawUpstreamBlockCtx().map((b) => ({\n blockId: b.blockId,\n prodCtx: this.wrapAccessor(b.prodCtx),\n stagingCtx: this.wrapAccessor(b.stagingCtx),\n prodIncomplete: b.prodIncomplete,\n stagingIncomplete: b.stagingIncomplete,\n }));\n }\n return this._upstreamBlockCtx;\n }\n\n //\n // Host-side column registry — id → LeafEntry index over outputs/prerun/raw pool.\n // Mirrors the sandbox `ColumnRegistry` so `createPFrame` / `createPTable` can\n // accept `PObjectId` in addition to materialised `PColumn`s.\n //\n private _columnRegistry: ColumnRegistry<PlTreeNodeAccessor> | undefined = undefined;\n public getColumnRegistry(): ColumnRegistry<PlTreeNodeAccessor> {\n if (this._columnRegistry !== undefined) return this._columnRegistry;\n return (this._columnRegistry = buildColumnRegistry({\n outputs: this.accessors.get(MainAccessorName) ?? undefined,\n prerun: this.accessors.get(StagingAccessorName) ?? undefined,\n upstreamBlockCtxes: this.getRawUpstreamBlockCtx(),\n }));\n }\n\n //\n // PFrames / PTables\n //\n\n public createPFrame(\n def: PFrameDef<PObjectId | PColumn<string | PColumnValues | DataInfo<string>>>,\n ): PFrameHandle {\n using guard = new PoolEntryGuard(\n this.env.driverKit.pFrameDriver.createPFrame(def.map((c) => this.resolvePColumn(c))),\n );\n this.requireComputableCtx.addOnDestroy(guard.entry.unref);\n return guard.keep().key;\n }\n\n public createPTable(\n def: PTableDef<PObjectId | PColumn<string | PColumnValues | DataInfo<string>>>,\n ): PTableHandle {\n using guard = new PoolEntryGuard(\n this.env.driverKit.pFrameDriver.createPTable(\n mapPTableDef(def, (c) => this.resolvePColumn(c)),\n ),\n );\n this.requireComputableCtx.addOnDestroy(guard.entry.unref);\n return guard.keep().key;\n }\n\n public createPTableV2(\n def: PTableDefV2<PObjectId | PColumn<string | PColumnValues | DataInfo<string>>>,\n ): PTableHandle {\n using guard = new PoolEntryGuard(\n this.env.driverKit.pFrameDriver.createPTableV2(\n mapPTableDefV2(def, {\n column: (c) => this.resolvePColumn(c),\n node: collapseSpecOverrideNode,\n }),\n ),\n );\n this.requireComputableCtx.addOnDestroy(guard.entry.unref);\n return guard.keep().key;\n }\n\n /**\n * Normalise a def element: pass-through for materialised columns (after\n * mapping their `data` payload via {@link transformInputPData}), or resolve\n * a bare id through the host column registry. `resolvePColumnById` extracts\n * the underlying {@link PObjectId} from any id encoding\n * ({@link ColumnOverriddenId}, etc.).\n */\n private resolvePColumn(\n item: PObjectId | PColumn<string | PColumnValues | DataInfo<string>>,\n ): PColumn<PlTreeNodeAccessor | PColumnValues | DataInfo<PlTreeNodeAccessor>> {\n return typeof item === \"string\"\n ? resolvePColumnById(this.getColumnRegistry(), item)\n : mapPObjectData(item, (d) => this.transformInputPData(d));\n }\n\n /**\n * Transforms input data for PFrame/PTable creation\n * - Converts string handles to accessors\n * - Maps accessors in DataInfo objects\n * - Passes through other values\n */\n private transformInputPData(\n d: string | PColumnValues | DataInfo<string>,\n ): PlTreeNodeAccessor | PColumnValues | DataInfo<PlTreeNodeAccessor> {\n if (typeof d === \"string\") {\n return this.getAccessor(d);\n } else if (isDataInfo(d)) {\n return mapDataInfo(d, (a) => this.getAccessor(a));\n } else {\n return d;\n }\n }\n\n //\n // Computable\n //\n\n public getCurrentUnstableMarker(): string | undefined {\n return this.computableCtx?.unstableMarker;\n }\n\n //\n // Logging\n //\n\n public logInfo(message: string): void {\n this.env.blockEventDispatcher.logInfo(this.blockCtx.blockId, message);\n }\n\n public logWarn(message: string): void {\n this.env.blockEventDispatcher.logWarn(this.blockCtx.blockId, message);\n }\n\n public logError(message: string): void {\n this.env.blockEventDispatcher.logError(this.blockCtx.blockId, message);\n }\n\n //\n // Helpers\n //\n\n /**\n * Resolve a sandbox-side `AccessorHandle` string back to its concrete\n * host accessor. Used internally by every `traverse`/`getX(handle)`\n * method and externally by the `ColumnsCollection` service injector\n * for `SerializedColumnsSource` of kind `\"accessor\"`.\n */\n public getAccessor(handle: string): PlTreeNodeAccessor {\n const accessor = this.accessors.get(handle);\n if (accessor === undefined) throw new Error(\"No such accessor\");\n return accessor;\n }\n\n private wrapAccessor(accessor: PlTreeNodeAccessor): string;\n private wrapAccessor(accessor: PlTreeNodeAccessor | undefined): string | undefined;\n private wrapAccessor(accessor: PlTreeNodeAccessor | undefined): string | undefined {\n if (accessor === undefined) return undefined;\n else {\n const nextHandle = randomUUID();\n this.accessors.set(nextHandle, accessor);\n return nextHandle;\n }\n }\n\n public injectCtx(configCtx: QuickJSHandle): void {\n const parent = this.parent;\n const vm = parent.vm;\n\n Scope.withScope((localScope) => {\n // Exporting methods\n\n const exportCtxFunction = (\n name: string,\n fn: VmFunctionImplementation<QuickJSHandle>,\n ): void => {\n const withCachedError: VmFunctionImplementation<QuickJSHandle> = (...args) => {\n // QuickJS strips all fields from errors apart from 'name' and 'message'.\n // That's why here we need to store them, and rethrow them when we exit\n // from QuickJS code.\n const t0 = performance.now();\n try {\n return (fn as any)(...args);\n } catch (e: unknown) {\n const newErr = parent.errorRepo.setAndRecreateForQuickJS(e);\n throw vm.newError(newErr);\n } finally {\n parent.stats.ctxMethodCalls++;\n parent.stats.ctxMethodMs += performance.now() - t0;\n }\n };\n\n vm.newFunction(name, withCachedError).consume((fnh) => vm.setProp(configCtx, name, fnh));\n vm.newFunction(name, fn).consume((fnh) =>\n vm.setProp(configCtx, name + \"__internal__\", fnh),\n );\n };\n\n // Check if this is a v1/v2 block (requiresModelAPIVersion !== 2)\n // For v1/v2 blocks, state is {args, uiState} and we need to inject uiState separately\n const isLegacyBlock = !checkBlockFlag(this.featureFlags, \"requiresModelAPIVersion\", 2);\n\n // Helper to extract uiState from legacy state format {args, uiState}\n const extractUiState = (stateJson: string | undefined): string => {\n if (!stateJson) return \"{}\";\n try {\n const parsed = JSON.parse(stateJson);\n return JSON.stringify(parsed?.uiState ?? {});\n } catch {\n return \"{}\";\n }\n };\n\n if (checkBlockFlag(this.featureFlags, \"supportsLazyState\")) {\n // injecting lazy state functions\n exportCtxFunction(\"args\", () => {\n const cCtx = this.requireComputableCtx;\n const args = this.blockCtx.args(cCtx);\n return args === undefined ? vm.undefined : vm.newString(args);\n });\n exportCtxFunction(\"blockStorage\", () => {\n return vm.newString(this.blockCtx.blockStorage(this.requireComputableCtx) ?? \"{}\");\n });\n exportCtxFunction(\"data\", () => {\n return vm.newString(this.blockCtx.data(this.requireComputableCtx) ?? \"{}\");\n });\n exportCtxFunction(\"activeArgs\", () => {\n const cCtx = this.requireComputableCtx;\n const res = this.blockCtx.activeArgs(cCtx);\n return res === undefined ? vm.undefined : vm.newString(res);\n });\n // For v1/v2 blocks, also inject uiState (extracted from state.uiState)\n if (isLegacyBlock) {\n exportCtxFunction(\"uiState\", () => {\n return vm.newString(extractUiState(this.blockCtx.data(this.requireComputableCtx)));\n });\n }\n } else {\n const cCtx = this.requireComputableCtx;\n const args = this.blockCtx.args(cCtx);\n const activeArgs = this.blockCtx.activeArgs(cCtx);\n const data = this.blockCtx.data(cCtx);\n if (args !== undefined) {\n vm.setProp(configCtx, \"args\", localScope.manage(vm.newString(args)));\n }\n vm.setProp(configCtx, \"data\", localScope.manage(vm.newString(data ?? \"{}\")));\n if (activeArgs !== undefined)\n vm.setProp(configCtx, \"activeArgs\", localScope.manage(vm.newString(activeArgs)));\n // For v1/v2 blocks, also inject uiState (extracted from state.uiState)\n if (isLegacyBlock) {\n vm.setProp(configCtx, \"uiState\", localScope.manage(vm.newString(extractUiState(data))));\n }\n }\n\n //\n // Methods for injected ctx object\n //\n\n exportCtxFunction(\"getAccessorHandleByName\", (name) => {\n return parent.exportSingleValue(\n this.getAccessorHandleByName(vm.getString(name)),\n undefined,\n );\n });\n\n //\n // Accessors\n //\n\n exportCtxFunction(\"resolveWithCommon\", (handle, commonOptions, ...steps) => {\n return parent.exportSingleValue(\n this.resolveWithCommon(\n vm.getString(handle),\n parent.importObjectViaJson(commonOptions) as CommonFieldTraverseOpsFromSDK,\n ...steps.map(\n (step) => parent.importObjectViaJson(step) as FieldTraversalStepFromSDK | string,\n ),\n ),\n undefined,\n );\n });\n\n exportCtxFunction(\"getResourceType\", (handle) => {\n return parent.exportObjectViaJson(this.getResourceType(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"getInputsLocked\", (handle) => {\n return parent.exportSingleValue(this.getInputsLocked(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"getOutputsLocked\", (handle) => {\n return parent.exportSingleValue(this.getOutputsLocked(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"getIsReadyOrError\", (handle) => {\n return parent.exportSingleValue(this.getIsReadyOrError(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"getIsFinal\", (handle) => {\n return parent.exportSingleValue(this.getIsFinal(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"hasData\", (handle) => {\n return parent.exportSingleValue(this.hasData(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"getError\", (handle) => {\n return parent.exportSingleValue(this.getError(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"listInputFields\", (handle) => {\n return parent.exportObjectViaJson(this.listInputFields(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"listOutputFields\", (handle) => {\n return parent.exportObjectViaJson(this.listOutputFields(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"listDynamicFields\", (handle) => {\n return parent.exportObjectViaJson(this.listDynamicFields(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"getKeyValueBase64\", (handle, key) => {\n return parent.exportSingleValue(\n this.getKeyValueBase64(vm.getString(handle), vm.getString(key)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getKeyValueAsString\", (handle, key) => {\n return parent.exportSingleValue(\n this.getKeyValueAsString(vm.getString(handle), vm.getString(key)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getDataBase64\", (handle) => {\n return parent.exportSingleValue(this.getDataBase64(vm.getString(handle)), undefined);\n });\n\n exportCtxFunction(\"getDataAsString\", (handle) => {\n return parent.exportSingleValue(this.getDataAsString(vm.getString(handle)), undefined);\n });\n\n //\n // Accessor helpers\n //\n\n exportCtxFunction(\n \"parsePObjectCollection\",\n (handle, errorOnUnknownField, prefix, ...resolveSteps) => {\n return parent.exportObjectUniversal(\n this.parsePObjectCollection(\n vm.getString(handle),\n vm.dump(errorOnUnknownField) as boolean,\n vm.getString(prefix),\n ...resolveSteps.map((stepHandle) => vm.getString(stepHandle)),\n ),\n undefined,\n );\n },\n );\n\n //\n // Blobs\n //\n\n exportCtxFunction(\"getBlobContentAsBase64\", (handle, range) => {\n return parent.exportSingleValue(\n this.getBlobContentAsBase64(\n vm.getString(handle),\n parent.importObjectUniversal(range) as RangeBytes | undefined,\n ),\n undefined,\n );\n });\n\n exportCtxFunction(\"getBlobContentAsString\", (handle, range) => {\n return parent.exportSingleValue(\n this.getBlobContentAsString(\n vm.getString(handle),\n parent.importObjectUniversal(range) as RangeBytes | undefined,\n ),\n undefined,\n );\n });\n\n exportCtxFunction(\"getDownloadedBlobContentHandle\", (handle) => {\n return parent.exportSingleValue(\n this.getDownloadedBlobContentHandle(vm.getString(handle)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getOnDemandBlobContentHandle\", (handle) => {\n return parent.exportSingleValue(\n this.getOnDemandBlobContentHandle(vm.getString(handle)),\n undefined,\n );\n });\n\n //\n // Blobs to URLs\n //\n\n exportCtxFunction(\"extractArchiveAndGetURL\", (handle, format) => {\n return parent.exportSingleValue(\n this.extractArchiveAndGetURL(vm.getString(handle), vm.getString(format) as ArchiveFormat),\n undefined,\n );\n });\n\n //\n // ImportProgress\n //\n\n exportCtxFunction(\"getImportProgress\", (handle) => {\n return parent.exportSingleValue(this.getImportProgress(vm.getString(handle)), undefined);\n });\n\n //\n // Logs\n //\n\n exportCtxFunction(\"getLastLogs\", (handle, nLines) => {\n return parent.exportSingleValue(\n this.getLastLogs(vm.getString(handle), vm.getNumber(nLines)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getProgressLog\", (handle, patternToSearch) => {\n return parent.exportSingleValue(\n this.getProgressLog(vm.getString(handle), vm.getString(patternToSearch)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getProgressLogWithInfo\", (handle, patternToSearch) => {\n return parent.exportSingleValue(\n this.getProgressLogWithInfo(vm.getString(handle), vm.getString(patternToSearch)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getLogHandle\", (handle) => {\n return parent.exportSingleValue(this.getLogHandle(vm.getString(handle)), undefined);\n });\n\n //\n // Blocks\n //\n\n exportCtxFunction(\"getBlockLabel\", (blockId) => {\n return parent.exportSingleValue(this.getBlockLabel(vm.getString(blockId)), undefined);\n });\n\n //\n // Result pool\n //\n\n exportCtxFunction(\"getDataFromResultPool\", () => {\n return parent.exportObjectUniversal(this.getDataFromResultPool(), undefined);\n });\n\n exportCtxFunction(\"getDataWithErrorsFromResultPool\", () => {\n return parent.exportObjectUniversal(this.getDataWithErrorsFromResultPool(), undefined);\n });\n\n exportCtxFunction(\"getSpecsFromResultPool\", () => {\n return parent.exportObjectUniversal(this.getSpecsFromResultPool(), undefined);\n });\n\n exportCtxFunction(\"getSpecFromResultPoolByRef\", (blockId, exportName) => {\n return parent.exportObjectUniversal(\n this.getSpecFromResultPoolByRef(vm.getString(blockId), vm.getString(exportName)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getDataFromResultPoolByRef\", (blockId, exportName) => {\n return parent.exportObjectUniversal(\n this.getDataFromResultPoolByRef(vm.getString(blockId), vm.getString(exportName)),\n undefined,\n );\n });\n\n exportCtxFunction(\"getUpstreamBlockCtx\", () => {\n return parent.exportObjectUniversal(this.getUpstreamBlockCtx(), undefined);\n });\n\n exportCtxFunction(\"createPFrame\", (def) => {\n return parent.exportSingleValue(\n this.createPFrame(\n parent.importObjectViaJson(def) as PFrameDef<PColumn<string | PColumnValues>>,\n ),\n undefined,\n );\n });\n\n exportCtxFunction(\"createPTable\", (def) => {\n return parent.exportSingleValue(\n this.createPTable(\n parent.importObjectViaJson(def) as PTableDef<PColumn<string | PColumnValues>>,\n ),\n undefined,\n );\n });\n\n exportCtxFunction(\"createPTableV2\", (def) => {\n return parent.exportSingleValue(\n this.createPTableV2(\n parent.importObjectViaJson(def) as PTableDefV2<PColumn<string | PColumnValues>>,\n ),\n undefined,\n );\n });\n\n //\n // Services\n //\n\n const requiredServiceNames = new Set(resolveRequiredServices(this.featureFlags) as string[]);\n const serviceFunctions = new Map<string, VmFunctionImplementation<QuickJSHandle>>();\n const injectors = getServiceInjectors();\n\n for (const [key, serviceId] of Object.entries(Services)) {\n if (!requiredServiceNames.has(serviceId)) continue;\n const injector = injectors[key as keyof typeof injectors];\n try {\n const methods = injector({ host: this, vm: parent });\n for (const [method, fn] of Object.entries(methods)) {\n serviceFunctions.set(serviceFnKey(serviceId, method), fn);\n }\n } catch (e) {\n throw new ServiceInjectionError(`Failed to inject service \"${serviceId}\"`, { cause: e });\n }\n }\n\n exportCtxFunction(\"getServiceNames\", () => {\n return parent.exportObjectViaJson([...requiredServiceNames]);\n });\n\n exportCtxFunction(\"getServiceMethods\", (serviceIdHandle) => {\n const serviceId = vm.getString(serviceIdHandle);\n const pfx = serviceFnKey(serviceId);\n const methods = [...serviceFunctions.keys()]\n .filter((k) => k.startsWith(pfx))\n .map((k) => k.slice(pfx.length));\n return parent.exportObjectViaJson(methods, undefined);\n });\n\n exportCtxFunction(\n \"callServiceMethod\",\n function (this: QuickJSHandle, serviceIdHandle, methodHandle, ...argHandles) {\n const serviceId = vm.getString(serviceIdHandle);\n const method = vm.getString(methodHandle);\n const fn = serviceFunctions.get(serviceFnKey(serviceId, method));\n if (!fn)\n throw new ServiceMethodNotFoundError(\n `Method \"${method}\" not found on service \"${serviceId}\"`,\n );\n return fn.call(this, ...argHandles);\n },\n );\n\n //\n // Computable\n //\n\n exportCtxFunction(\"getCurrentUnstableMarker\", () => {\n return parent.exportSingleValue(this.getCurrentUnstableMarker(), undefined);\n });\n\n //\n // Logging\n //\n\n exportCtxFunction(\"logInfo\", (message) => {\n this.logInfo(vm.getString(message));\n });\n\n exportCtxFunction(\"logWarn\", (message) => {\n this.logWarn(vm.getString(message));\n });\n\n exportCtxFunction(\"logError\", (message) => {\n this.logError(vm.getString(message));\n });\n });\n }\n}\n\nfunction bytesToBase64(data: Uint8Array | undefined): string | undefined {\n return data !== undefined ? Buffer.from(data).toString(\"base64\") : undefined;\n}\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ let _milaboratories_pl_client = require("@milaboratories/pl-client");
5
5
  let node_crypto = require("node:crypto");
6
6
  let _milaboratories_pl_errors = require("@milaboratories/pl-errors");
7
7
  let quickjs_emscripten = require("quickjs-emscripten");
8
- //#region src/js_render/context.ts
8
+ // src/js_render/context.ts
9
9
  function isArrayBufferOrView(obj) {
10
10
  return obj instanceof ArrayBuffer || ArrayBuffer.isView(obj);
11
11
  }
@@ -223,7 +223,6 @@ var ErrorRepository = class {
223
223
  return new _milaboratories_pl_errors.PlQuickJSError(quickJSError, error);
224
224
  }
225
225
  };
226
- //#endregion
227
226
  exports.ErrorRepository = ErrorRepository;
228
227
  exports.JsExecutionContext = JsExecutionContext;
229
228
 
@@ -1 +1 @@
1
- {"version":3,"file":"context.cjs","names":["ComputableContextHelper","Scope","JsRenderInternal","errors","PlQuickJSError"],"sources":["../../src/js_render/context.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport type { BlockCodeKnownFeatureFlags } from \"@platforma-sdk/model\";\nimport { JsRenderInternal } from \"@platforma-sdk/model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { randomUUID } from \"node:crypto\";\nimport type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport { Scope, errors } from \"quickjs-emscripten\";\nimport type { BlockContextAny } from \"../middle_layer/block_ctx\";\nimport type { MiddleLayerEnvironment } from \"../middle_layer/middle_layer\";\nimport { stringifyWithResourceId } from \"@milaboratories/pl-client\";\nimport { PlQuickJSError } from \"@milaboratories/pl-errors\";\nimport { ComputableContextHelper } from \"./computable_context\";\n\nexport type DeadlineSettings = {\n currentExecutionTarget: string;\n deadline: number;\n};\n\n/**\n * Communicates a deadline to the quickjs runtime, that if passed, will interrupt the execution.\n * Undefined can be used to reset the deadline.\n * */\nexport type DeadlineSetter = (settings: DeadlineSettings | undefined) => void;\n\nfunction isArrayBufferOrView(obj: unknown): obj is ArrayBufferLike {\n return obj instanceof ArrayBuffer || ArrayBuffer.isView(obj);\n}\n\n/**\n * Contains references to objects needed to execute lambda within computable,\n * providing access to:\n * - block context\n * - computable context\n * - middle layer environment\n * */\nexport type ComputableEnv = {\n readonly blockCtx: BlockContextAny;\n readonly mlEnv: MiddleLayerEnvironment;\n computableCtx: ComputableCtx;\n};\n\n/** Execution stats accumulated during the lifetime of a JsExecutionContext. */\nexport type JsExecStats = {\n bundleEvalMs: number;\n bundleBytes: number;\n\n callbackMs: number;\n callbackCount: number;\n\n serInMs: number;\n serInBytes: number;\n serInCalls: number;\n\n serOutMs: number;\n serOutBytes: number;\n serOutCalls: number;\n\n ctxMethodCalls: number;\n ctxMethodMs: number;\n};\n\nexport class JsExecutionContext {\n private readonly callbackRegistry: QuickJSHandle;\n private readonly fnJSONStringify: QuickJSHandle;\n private readonly fnJSONParse: QuickJSHandle;\n\n public readonly errorRepo = new ErrorRepository();\n\n public readonly computableHelper: ComputableContextHelper | undefined;\n\n public readonly stats: JsExecStats = {\n bundleEvalMs: 0,\n bundleBytes: 0,\n callbackMs: 0,\n callbackCount: 0,\n serInMs: 0,\n serInBytes: 0,\n serInCalls: 0,\n serOutMs: 0,\n serOutBytes: 0,\n serOutCalls: 0,\n ctxMethodCalls: 0,\n ctxMethodMs: 0,\n };\n\n /**\n * Creates a new JS execution context.\n *\n * @param scope - QuickJS scope for memory management\n * @param vm - QuickJS VM context\n * @param deadlineSetter - Function to set execution deadline\n * @param featureFlags - Block feature flags\n * @param computableEnv - Optional reactive computable environment (for outputs, inputsValid, etc.)\n */\n constructor(\n public readonly scope: Scope,\n public readonly vm: QuickJSContext,\n private readonly deadlineSetter: DeadlineSetter,\n featureFlags: BlockCodeKnownFeatureFlags | undefined,\n computableEnv?: ComputableEnv,\n ) {\n this.callbackRegistry = this.scope.manage(this.vm.newObject());\n\n this.fnJSONStringify = scope.manage(\n vm.getProp(vm.global, \"JSON\").consume((json) => vm.getProp(json, \"stringify\")),\n );\n if (vm.typeof(this.fnJSONStringify) !== \"function\")\n throw new Error(`JSON.stringify() not found.`);\n\n this.fnJSONParse = scope.manage(\n vm.getProp(vm.global, \"JSON\").consume((json) => vm.getProp(json, \"parse\")),\n );\n if (vm.typeof(this.fnJSONParse) !== \"function\") throw new Error(`JSON.parse() not found.`);\n\n if (computableEnv !== undefined)\n this.computableHelper = new ComputableContextHelper(\n this,\n computableEnv.blockCtx,\n computableEnv.mlEnv,\n featureFlags,\n computableEnv.computableCtx,\n );\n\n this.injectCtx();\n }\n\n public resetComputableCtx() {\n notEmpty(\n this.computableHelper,\n \"Computable context helper is not initialized\",\n ).resetComputableCtx();\n }\n\n private static cleanErrorContext(error: unknown): void {\n if (typeof error === \"object\" && error !== null && \"context\" in error) delete error[\"context\"];\n }\n\n // private static cleanError(error: unknown): unknown {\n // if (error instanceof errors.QuickJSUnwrapError) {\n // const { cause, context: _, name, message, stack, ...rest } = error;\n // const clean = new errors.QuickJSUnwrapError(cause);\n // Object.assign(clean, { ...rest, name, message, stack });\n // return clean;\n // }\n // return error;\n // }\n\n public evaluateBundle(code: string) {\n const t0 = performance.now();\n try {\n this.deadlineSetter({\n currentExecutionTarget: \"evaluateBundle\",\n deadline: Date.now() + 10000,\n });\n this.vm.unwrapResult(this.vm.evalCode(code, \"bundle.js\", { type: \"global\" })).dispose();\n } catch (err: unknown) {\n JsExecutionContext.cleanErrorContext(err);\n throw err;\n } finally {\n this.deadlineSetter(undefined);\n this.stats.bundleEvalMs += performance.now() - t0;\n this.stats.bundleBytes += code.length;\n }\n }\n\n public runCallback(cbName: string, ...args: unknown[]): QuickJSHandle {\n const t0 = performance.now();\n try {\n this.deadlineSetter({ currentExecutionTarget: cbName, deadline: Date.now() + 10000 });\n return Scope.withScope((localScope) => {\n const targetCallback = localScope.manage(this.vm.getProp(this.callbackRegistry, cbName));\n\n if (this.vm.typeof(targetCallback) !== \"function\")\n throw new Error(`No such callback: ${cbName}`);\n\n return this.scope.manage(\n this.vm.unwrapResult(\n this.vm.callFunction(\n targetCallback,\n this.vm.undefined,\n ...args.map((arg) => this.exportObjectUniversal(arg, localScope)),\n ),\n ),\n );\n });\n } catch (err: unknown) {\n JsExecutionContext.cleanErrorContext(err);\n const original = this.errorRepo.getOriginal(err);\n throw original;\n } finally {\n this.deadlineSetter(undefined);\n this.stats.callbackMs += performance.now() - t0;\n this.stats.callbackCount++;\n }\n }\n\n //\n // QuickJS Helpers\n //\n\n public exportSingleValue(\n obj: boolean | number | string | null | ArrayBuffer | undefined,\n scope?: Scope,\n ): QuickJSHandle {\n const result = this.tryExportSingleValue(obj, scope);\n if (result === undefined) {\n throw new Error(\n `Can't export value: ${obj === undefined ? \"undefined\" : JSON.stringify(obj)}`,\n );\n }\n return result;\n }\n\n public tryExportSingleValue(obj: unknown, scope?: Scope): QuickJSHandle | undefined {\n let handle: QuickJSHandle;\n let manage = false;\n switch (typeof obj) {\n case \"string\":\n handle = this.vm.newString(obj);\n manage = true;\n break;\n case \"number\":\n handle = this.vm.newNumber(obj);\n manage = true;\n break;\n case \"undefined\":\n handle = this.vm.undefined;\n break;\n case \"boolean\":\n handle = obj ? this.vm.true : this.vm.false;\n break;\n default:\n if (obj === null) {\n handle = this.vm.null;\n break;\n }\n if (isArrayBufferOrView(obj)) {\n handle = this.vm.newArrayBuffer(obj);\n manage = true;\n break;\n }\n return undefined;\n }\n return manage && scope != undefined ? scope.manage(handle) : handle;\n }\n\n public exportObjectUniversal(obj: unknown, scope?: Scope): QuickJSHandle {\n const simpleHandle = this.tryExportSingleValue(obj, scope);\n if (simpleHandle !== undefined) return simpleHandle;\n return this.exportObjectViaJson(obj, scope);\n }\n\n public exportObjectViaJson(obj: unknown, scope?: Scope): QuickJSHandle {\n const t0 = performance.now();\n const json = JSON.stringify(obj);\n this.stats.serInBytes += json.length;\n this.stats.serInCalls++;\n const result = this.vm\n .newString(json)\n .consume((jsonHandle) =>\n this.vm.unwrapResult(this.vm.callFunction(this.fnJSONParse, this.vm.undefined, jsonHandle)),\n );\n this.stats.serInMs += performance.now() - t0;\n return scope !== undefined ? scope.manage(result) : result;\n }\n\n public importObjectUniversal(handle: QuickJSHandle | undefined): unknown {\n if (handle === undefined) return undefined;\n switch (this.vm.typeof(handle)) {\n case \"undefined\":\n return undefined;\n case \"boolean\":\n case \"number\":\n case \"string\":\n return this.vm.dump(handle);\n default:\n return this.importObjectViaJson(handle);\n }\n }\n\n public importObjectViaJson(handle: QuickJSHandle): unknown {\n const t0 = performance.now();\n const text = this.vm\n .unwrapResult(this.vm.callFunction(this.fnJSONStringify, this.vm.undefined, handle))\n .consume((strHandle) => this.vm.getString(strHandle));\n this.stats.serOutBytes += text.length;\n this.stats.serOutCalls++;\n if (text === \"undefined\") {\n // special case with futures\n this.stats.serOutMs += performance.now() - t0;\n return undefined;\n }\n const result = JSON.parse(text);\n this.stats.serOutMs += performance.now() - t0;\n return result;\n }\n\n private injectCtx() {\n Scope.withScope((localScope) => {\n const configCtx = localScope.manage(this.vm.newObject());\n\n //\n // Core props\n //\n\n this.vm.setProp(configCtx, \"callbackRegistry\", this.callbackRegistry);\n this.vm.setProp(\n configCtx,\n \"featureFlags\",\n this.exportObjectUniversal(JsRenderInternal.GlobalCfgRenderCtxFeatureFlags, localScope),\n );\n\n // Inject context values from computableHelper (reactive context for outputs, inputsValid, etc.)\n if (this.computableHelper !== undefined) {\n this.computableHelper.injectCtx(configCtx);\n }\n\n //\n // Creating global variable inside the vm\n //\n\n this.vm.setProp(this.vm.global, \"cfgRenderCtx\", configCtx);\n });\n }\n}\n\n/** Holds errors that happened in the host code (like in middle-layer's drivers)\n * and then throws it where the error from quick JS is needed.\n * QuickJS couldn't throw custom errors, so we store them here, and rethrow them when we exit QuickJS side. */\nexport class ErrorRepository {\n private readonly errorIdToError = new Map<string, unknown>();\n\n /** Sets the error to the repository and returns a mimicrated error that also has uuid key of the original error. */\n public setAndRecreateForQuickJS(error: unknown): {\n name: string;\n message: string;\n } {\n const errorId = randomUUID();\n this.errorIdToError.set(errorId, error);\n\n if (error instanceof Error) {\n return {\n name: `${error.name}/uuid:${errorId}`,\n message: error.message,\n };\n }\n\n return {\n name: `UnknownErrorQuickJS/uuid:${errorId}`,\n message: `${error as any}`,\n };\n }\n\n /** Returns the original error that was stored by parsing uuid of mimicrated error. */\n public getOriginal(quickJSError: unknown): unknown {\n if (!(quickJSError instanceof errors.QuickJSUnwrapError)) {\n console.warn(\n \"ErrorRepo: quickJSError is not a QuickJSUnwrapError\",\n stringifyWithResourceId(quickJSError),\n );\n return quickJSError;\n }\n\n const cause = quickJSError.cause;\n if (\n !(\n typeof cause === \"object\" &&\n cause !== null &&\n \"name\" in cause &&\n typeof cause.name === \"string\"\n )\n ) {\n console.warn(\n \"ErrorRepo: quickJSError.cause is not an Error (can be stack limit exceeded)\",\n stringifyWithResourceId(quickJSError),\n );\n return quickJSError;\n }\n\n const causeName = cause.name;\n const uuidIdx = causeName.indexOf(\"/uuid:\");\n if (uuidIdx === -1) {\n const causeMsg = \"message\" in cause && typeof cause.message === \"string\" ? cause.message : \"\";\n throw new Error(\n `QuickJS native error: ${causeName}: ${causeMsg}, ${stringifyWithResourceId(quickJSError)}`,\n { cause: quickJSError },\n );\n }\n const errorId = causeName.slice(uuidIdx + \"/uuid:\".length);\n if (!errorId) {\n throw new Error(\n `ErrorRepo: quickJSError.cause.name does not contain errorId: ${causeName}, ${stringifyWithResourceId(quickJSError)}`,\n );\n }\n\n const error = this.errorIdToError.get(errorId);\n if (error === undefined) {\n throw new Error(\n `ErrorRepo: errorId not found: ${errorId}, ${stringifyWithResourceId(quickJSError)}`,\n );\n }\n\n return new PlQuickJSError(quickJSError, error as Error);\n }\n}\n"],"mappings":";;;;;;;;AAwBA,SAAS,oBAAoB,KAAsC;CACjE,OAAO,eAAe,eAAe,YAAY,OAAO,GAAG;AAC7D;AAmCA,IAAa,qBAAb,MAAa,mBAAmB;CAkCZ;CACA;CACC;CAnCnB;CACA;CACA;CAEA,YAA4B,IAAI,gBAAgB;CAEhD;CAEA,QAAqC;EACnC,cAAc;EACd,aAAa;EACb,YAAY;EACZ,eAAe;EACf,SAAS;EACT,YAAY;EACZ,YAAY;EACZ,UAAU;EACV,aAAa;EACb,aAAa;EACb,gBAAgB;EAChB,aAAa;CACf;;;;;;;;;;CAWA,YACE,OACA,IACA,gBACA,cACA,eACA;EALgB,KAAA,QAAA;EACA,KAAA,KAAA;EACC,KAAA,iBAAA;EAIjB,KAAK,mBAAmB,KAAK,MAAM,OAAO,KAAK,GAAG,UAAU,CAAC;EAE7D,KAAK,kBAAkB,MAAM,OAC3B,GAAG,QAAQ,GAAG,QAAQ,MAAM,CAAC,CAAC,SAAS,SAAS,GAAG,QAAQ,MAAM,WAAW,CAAC,CAC/E;EACA,IAAI,GAAG,OAAO,KAAK,eAAe,MAAM,YACtC,MAAM,IAAI,MAAM,6BAA6B;EAE/C,KAAK,cAAc,MAAM,OACvB,GAAG,QAAQ,GAAG,QAAQ,MAAM,CAAC,CAAC,SAAS,SAAS,GAAG,QAAQ,MAAM,OAAO,CAAC,CAC3E;EACA,IAAI,GAAG,OAAO,KAAK,WAAW,MAAM,YAAY,MAAM,IAAI,MAAM,yBAAyB;EAEzF,IAAI,kBAAkB,KAAA,GACpB,KAAK,mBAAmB,IAAIA,2BAAAA,wBAC1B,MACA,cAAc,UACd,cAAc,OACd,cACA,cAAc,aAChB;EAEF,KAAK,UAAU;CACjB;CAEA,qBAA4B;EAC1B,CAAA,GAAA,2BAAA,SAAA,CACE,KAAK,kBACL,8CACF,CAAC,CAAC,mBAAmB;CACvB;CAEA,OAAe,kBAAkB,OAAsB;EACrD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,aAAa,OAAO,OAAO,MAAM;CACtF;CAYA,eAAsB,MAAc;EAClC,MAAM,KAAK,YAAY,IAAI;EAC3B,IAAI;GACF,KAAK,eAAe;IAClB,wBAAwB;IACxB,UAAU,KAAK,IAAI,IAAI;GACzB,CAAC;GACD,KAAK,GAAG,aAAa,KAAK,GAAG,SAAS,MAAM,aAAa,EAAE,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ;EACxF,SAAS,KAAc;GACrB,mBAAmB,kBAAkB,GAAG;GACxC,MAAM;EACR,UAAU;GACR,KAAK,eAAe,KAAA,CAAS;GAC7B,KAAK,MAAM,gBAAgB,YAAY,IAAI,IAAI;GAC/C,KAAK,MAAM,eAAe,KAAK;EACjC;CACF;CAEA,YAAmB,QAAgB,GAAG,MAAgC;EACpE,MAAM,KAAK,YAAY,IAAI;EAC3B,IAAI;GACF,KAAK,eAAe;IAAE,wBAAwB;IAAQ,UAAU,KAAK,IAAI,IAAI;GAAM,CAAC;GACpF,OAAOC,mBAAAA,MAAM,WAAW,eAAe;IACrC,MAAM,iBAAiB,WAAW,OAAO,KAAK,GAAG,QAAQ,KAAK,kBAAkB,MAAM,CAAC;IAEvF,IAAI,KAAK,GAAG,OAAO,cAAc,MAAM,YACrC,MAAM,IAAI,MAAM,qBAAqB,QAAQ;IAE/C,OAAO,KAAK,MAAM,OAChB,KAAK,GAAG,aACN,KAAK,GAAG,aACN,gBACA,KAAK,GAAG,WACR,GAAG,KAAK,KAAK,QAAQ,KAAK,sBAAsB,KAAK,UAAU,CAAC,CAClE,CACF,CACF;GACF,CAAC;EACH,SAAS,KAAc;GACrB,mBAAmB,kBAAkB,GAAG;GAExC,MADiB,KAAK,UAAU,YAAY,GAC/B;EACf,UAAU;GACR,KAAK,eAAe,KAAA,CAAS;GAC7B,KAAK,MAAM,cAAc,YAAY,IAAI,IAAI;GAC7C,KAAK,MAAM;EACb;CACF;CAMA,kBACE,KACA,OACe;EACf,MAAM,SAAS,KAAK,qBAAqB,KAAK,KAAK;EACnD,IAAI,WAAW,KAAA,GACb,MAAM,IAAI,MACR,uBAAuB,QAAQ,KAAA,IAAY,cAAc,KAAK,UAAU,GAAG,GAC7E;EAEF,OAAO;CACT;CAEA,qBAA4B,KAAc,OAA0C;EAClF,IAAI;EACJ,IAAI,SAAS;EACb,QAAQ,OAAO,KAAf;GACE,KAAK;IACH,SAAS,KAAK,GAAG,UAAU,GAAG;IAC9B,SAAS;IACT;GACF,KAAK;IACH,SAAS,KAAK,GAAG,UAAU,GAAG;IAC9B,SAAS;IACT;GACF,KAAK;IACH,SAAS,KAAK,GAAG;IACjB;GACF,KAAK;IACH,SAAS,MAAM,KAAK,GAAG,OAAO,KAAK,GAAG;IACtC;GACF;IACE,IAAI,QAAQ,MAAM;KAChB,SAAS,KAAK,GAAG;KACjB;IACF;IACA,IAAI,oBAAoB,GAAG,GAAG;KAC5B,SAAS,KAAK,GAAG,eAAe,GAAG;KACnC,SAAS;KACT;IACF;IACA;EACJ;EACA,OAAO,UAAU,SAAS,KAAA,IAAY,MAAM,OAAO,MAAM,IAAI;CAC/D;CAEA,sBAA6B,KAAc,OAA8B;EACvE,MAAM,eAAe,KAAK,qBAAqB,KAAK,KAAK;EACzD,IAAI,iBAAiB,KAAA,GAAW,OAAO;EACvC,OAAO,KAAK,oBAAoB,KAAK,KAAK;CAC5C;CAEA,oBAA2B,KAAc,OAA8B;EACrE,MAAM,KAAK,YAAY,IAAI;EAC3B,MAAM,OAAO,KAAK,UAAU,GAAG;EAC/B,KAAK,MAAM,cAAc,KAAK;EAC9B,KAAK,MAAM;EACX,MAAM,SAAS,KAAK,GACjB,UAAU,IAAI,CAAC,CACf,SAAS,eACR,KAAK,GAAG,aAAa,KAAK,GAAG,aAAa,KAAK,aAAa,KAAK,GAAG,WAAW,UAAU,CAAC,CAC5F;EACF,KAAK,MAAM,WAAW,YAAY,IAAI,IAAI;EAC1C,OAAO,UAAU,KAAA,IAAY,MAAM,OAAO,MAAM,IAAI;CACtD;CAEA,sBAA6B,QAA4C;EACvE,IAAI,WAAW,KAAA,GAAW,OAAO,KAAA;EACjC,QAAQ,KAAK,GAAG,OAAO,MAAM,GAA7B;GACE,KAAK,aACH;GACF,KAAK;GACL,KAAK;GACL,KAAK,UACH,OAAO,KAAK,GAAG,KAAK,MAAM;GAC5B,SACE,OAAO,KAAK,oBAAoB,MAAM;EAC1C;CACF;CAEA,oBAA2B,QAAgC;EACzD,MAAM,KAAK,YAAY,IAAI;EAC3B,MAAM,OAAO,KAAK,GACf,aAAa,KAAK,GAAG,aAAa,KAAK,iBAAiB,KAAK,GAAG,WAAW,MAAM,CAAC,CAAC,CACnF,SAAS,cAAc,KAAK,GAAG,UAAU,SAAS,CAAC;EACtD,KAAK,MAAM,eAAe,KAAK;EAC/B,KAAK,MAAM;EACX,IAAI,SAAS,aAAa;GAExB,KAAK,MAAM,YAAY,YAAY,IAAI,IAAI;GAC3C;EACF;EACA,MAAM,SAAS,KAAK,MAAM,IAAI;EAC9B,KAAK,MAAM,YAAY,YAAY,IAAI,IAAI;EAC3C,OAAO;CACT;CAEA,YAAoB;EAClB,mBAAA,MAAM,WAAW,eAAe;GAC9B,MAAM,YAAY,WAAW,OAAO,KAAK,GAAG,UAAU,CAAC;GAMvD,KAAK,GAAG,QAAQ,WAAW,oBAAoB,KAAK,gBAAgB;GACpE,KAAK,GAAG,QACN,WACA,gBACA,KAAK,sBAAsBC,qBAAAA,iBAAiB,gCAAgC,UAAU,CACxF;GAGA,IAAI,KAAK,qBAAqB,KAAA,GAC5B,KAAK,iBAAiB,UAAU,SAAS;GAO3C,KAAK,GAAG,QAAQ,KAAK,GAAG,QAAQ,gBAAgB,SAAS;EAC3D,CAAC;CACH;AACF;;;;AAKA,IAAa,kBAAb,MAA6B;CAC3B,iCAAkC,IAAI,IAAqB;;CAG3D,yBAAgC,OAG9B;EACA,MAAM,WAAA,GAAA,YAAA,WAAA,CAAqB;EAC3B,KAAK,eAAe,IAAI,SAAS,KAAK;EAEtC,IAAI,iBAAiB,OACnB,OAAO;GACL,MAAM,GAAG,MAAM,KAAK,QAAQ;GAC5B,SAAS,MAAM;EACjB;EAGF,OAAO;GACL,MAAM,4BAA4B;GAClC,SAAS,GAAG;EACd;CACF;;CAGA,YAAmB,cAAgC;EACjD,IAAI,EAAE,wBAAwBC,mBAAAA,OAAO,qBAAqB;GACxD,QAAQ,KACN,wDAAA,GAAA,0BAAA,wBAAA,CACwB,YAAY,CACtC;GACA,OAAO;EACT;EAEA,MAAM,QAAQ,aAAa;EAC3B,IACE,EACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,OAAO,MAAM,SAAS,WAExB;GACA,QAAQ,KACN,gFAAA,GAAA,0BAAA,wBAAA,CACwB,YAAY,CACtC;GACA,OAAO;EACT;EAEA,MAAM,YAAY,MAAM;EACxB,MAAM,UAAU,UAAU,QAAQ,QAAQ;EAC1C,IAAI,YAAY,IAAI;GAClB,MAAM,WAAW,aAAa,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;GAC3F,MAAM,IAAI,MACR,yBAAyB,UAAU,IAAI,SAAS,KAAA,GAAA,0BAAA,wBAAA,CAA4B,YAAY,KACxF,EAAE,OAAO,aAAa,CACxB;EACF;EACA,MAAM,UAAU,UAAU,MAAM,UAAU,CAAe;EACzD,IAAI,CAAC,SACH,MAAM,IAAI,MACR,gEAAgE,UAAU,KAAA,GAAA,0BAAA,wBAAA,CAA4B,YAAY,GACpH;EAGF,MAAM,QAAQ,KAAK,eAAe,IAAI,OAAO;EAC7C,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,MACR,iCAAiC,QAAQ,KAAA,GAAA,0BAAA,wBAAA,CAA4B,YAAY,GACnF;EAGF,OAAO,IAAIC,0BAAAA,eAAe,cAAc,KAAc;CACxD;AACF"}
1
+ {"version":3,"file":"context.cjs","names":["ComputableContextHelper","Scope","JsRenderInternal","randomUUID","errors","stringifyWithResourceId","PlQuickJSError"],"sources":["../../src/js_render/context.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport type { BlockCodeKnownFeatureFlags } from \"@platforma-sdk/model\";\nimport { JsRenderInternal } from \"@platforma-sdk/model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { randomUUID } from \"node:crypto\";\nimport type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport { Scope, errors } from \"quickjs-emscripten\";\nimport type { BlockContextAny } from \"../middle_layer/block_ctx\";\nimport type { MiddleLayerEnvironment } from \"../middle_layer/middle_layer\";\nimport { stringifyWithResourceId } from \"@milaboratories/pl-client\";\nimport { PlQuickJSError } from \"@milaboratories/pl-errors\";\nimport { ComputableContextHelper } from \"./computable_context\";\n\nexport type DeadlineSettings = {\n currentExecutionTarget: string;\n deadline: number;\n};\n\n/**\n * Communicates a deadline to the quickjs runtime, that if passed, will interrupt the execution.\n * Undefined can be used to reset the deadline.\n * */\nexport type DeadlineSetter = (settings: DeadlineSettings | undefined) => void;\n\nfunction isArrayBufferOrView(obj: unknown): obj is ArrayBufferLike {\n return obj instanceof ArrayBuffer || ArrayBuffer.isView(obj);\n}\n\n/**\n * Contains references to objects needed to execute lambda within computable,\n * providing access to:\n * - block context\n * - computable context\n * - middle layer environment\n * */\nexport type ComputableEnv = {\n readonly blockCtx: BlockContextAny;\n readonly mlEnv: MiddleLayerEnvironment;\n computableCtx: ComputableCtx;\n};\n\n/** Execution stats accumulated during the lifetime of a JsExecutionContext. */\nexport type JsExecStats = {\n bundleEvalMs: number;\n bundleBytes: number;\n\n callbackMs: number;\n callbackCount: number;\n\n serInMs: number;\n serInBytes: number;\n serInCalls: number;\n\n serOutMs: number;\n serOutBytes: number;\n serOutCalls: number;\n\n ctxMethodCalls: number;\n ctxMethodMs: number;\n};\n\nexport class JsExecutionContext {\n private readonly callbackRegistry: QuickJSHandle;\n private readonly fnJSONStringify: QuickJSHandle;\n private readonly fnJSONParse: QuickJSHandle;\n\n public readonly errorRepo = new ErrorRepository();\n\n public readonly computableHelper: ComputableContextHelper | undefined;\n\n public readonly stats: JsExecStats = {\n bundleEvalMs: 0,\n bundleBytes: 0,\n callbackMs: 0,\n callbackCount: 0,\n serInMs: 0,\n serInBytes: 0,\n serInCalls: 0,\n serOutMs: 0,\n serOutBytes: 0,\n serOutCalls: 0,\n ctxMethodCalls: 0,\n ctxMethodMs: 0,\n };\n\n /**\n * Creates a new JS execution context.\n *\n * @param scope - QuickJS scope for memory management\n * @param vm - QuickJS VM context\n * @param deadlineSetter - Function to set execution deadline\n * @param featureFlags - Block feature flags\n * @param computableEnv - Optional reactive computable environment (for outputs, inputsValid, etc.)\n */\n constructor(\n public readonly scope: Scope,\n public readonly vm: QuickJSContext,\n private readonly deadlineSetter: DeadlineSetter,\n featureFlags: BlockCodeKnownFeatureFlags | undefined,\n computableEnv?: ComputableEnv,\n ) {\n this.callbackRegistry = this.scope.manage(this.vm.newObject());\n\n this.fnJSONStringify = scope.manage(\n vm.getProp(vm.global, \"JSON\").consume((json) => vm.getProp(json, \"stringify\")),\n );\n if (vm.typeof(this.fnJSONStringify) !== \"function\")\n throw new Error(`JSON.stringify() not found.`);\n\n this.fnJSONParse = scope.manage(\n vm.getProp(vm.global, \"JSON\").consume((json) => vm.getProp(json, \"parse\")),\n );\n if (vm.typeof(this.fnJSONParse) !== \"function\") throw new Error(`JSON.parse() not found.`);\n\n if (computableEnv !== undefined)\n this.computableHelper = new ComputableContextHelper(\n this,\n computableEnv.blockCtx,\n computableEnv.mlEnv,\n featureFlags,\n computableEnv.computableCtx,\n );\n\n this.injectCtx();\n }\n\n public resetComputableCtx() {\n notEmpty(\n this.computableHelper,\n \"Computable context helper is not initialized\",\n ).resetComputableCtx();\n }\n\n private static cleanErrorContext(error: unknown): void {\n if (typeof error === \"object\" && error !== null && \"context\" in error) delete error[\"context\"];\n }\n\n // private static cleanError(error: unknown): unknown {\n // if (error instanceof errors.QuickJSUnwrapError) {\n // const { cause, context: _, name, message, stack, ...rest } = error;\n // const clean = new errors.QuickJSUnwrapError(cause);\n // Object.assign(clean, { ...rest, name, message, stack });\n // return clean;\n // }\n // return error;\n // }\n\n public evaluateBundle(code: string) {\n const t0 = performance.now();\n try {\n this.deadlineSetter({\n currentExecutionTarget: \"evaluateBundle\",\n deadline: Date.now() + 10000,\n });\n this.vm.unwrapResult(this.vm.evalCode(code, \"bundle.js\", { type: \"global\" })).dispose();\n } catch (err: unknown) {\n JsExecutionContext.cleanErrorContext(err);\n throw err;\n } finally {\n this.deadlineSetter(undefined);\n this.stats.bundleEvalMs += performance.now() - t0;\n this.stats.bundleBytes += code.length;\n }\n }\n\n public runCallback(cbName: string, ...args: unknown[]): QuickJSHandle {\n const t0 = performance.now();\n try {\n this.deadlineSetter({ currentExecutionTarget: cbName, deadline: Date.now() + 10000 });\n return Scope.withScope((localScope) => {\n const targetCallback = localScope.manage(this.vm.getProp(this.callbackRegistry, cbName));\n\n if (this.vm.typeof(targetCallback) !== \"function\")\n throw new Error(`No such callback: ${cbName}`);\n\n return this.scope.manage(\n this.vm.unwrapResult(\n this.vm.callFunction(\n targetCallback,\n this.vm.undefined,\n ...args.map((arg) => this.exportObjectUniversal(arg, localScope)),\n ),\n ),\n );\n });\n } catch (err: unknown) {\n JsExecutionContext.cleanErrorContext(err);\n const original = this.errorRepo.getOriginal(err);\n throw original;\n } finally {\n this.deadlineSetter(undefined);\n this.stats.callbackMs += performance.now() - t0;\n this.stats.callbackCount++;\n }\n }\n\n //\n // QuickJS Helpers\n //\n\n public exportSingleValue(\n obj: boolean | number | string | null | ArrayBuffer | undefined,\n scope?: Scope,\n ): QuickJSHandle {\n const result = this.tryExportSingleValue(obj, scope);\n if (result === undefined) {\n throw new Error(\n `Can't export value: ${obj === undefined ? \"undefined\" : JSON.stringify(obj)}`,\n );\n }\n return result;\n }\n\n public tryExportSingleValue(obj: unknown, scope?: Scope): QuickJSHandle | undefined {\n let handle: QuickJSHandle;\n let manage = false;\n switch (typeof obj) {\n case \"string\":\n handle = this.vm.newString(obj);\n manage = true;\n break;\n case \"number\":\n handle = this.vm.newNumber(obj);\n manage = true;\n break;\n case \"undefined\":\n handle = this.vm.undefined;\n break;\n case \"boolean\":\n handle = obj ? this.vm.true : this.vm.false;\n break;\n default:\n if (obj === null) {\n handle = this.vm.null;\n break;\n }\n if (isArrayBufferOrView(obj)) {\n handle = this.vm.newArrayBuffer(obj);\n manage = true;\n break;\n }\n return undefined;\n }\n return manage && scope != undefined ? scope.manage(handle) : handle;\n }\n\n public exportObjectUniversal(obj: unknown, scope?: Scope): QuickJSHandle {\n const simpleHandle = this.tryExportSingleValue(obj, scope);\n if (simpleHandle !== undefined) return simpleHandle;\n return this.exportObjectViaJson(obj, scope);\n }\n\n public exportObjectViaJson(obj: unknown, scope?: Scope): QuickJSHandle {\n const t0 = performance.now();\n const json = JSON.stringify(obj);\n this.stats.serInBytes += json.length;\n this.stats.serInCalls++;\n const result = this.vm\n .newString(json)\n .consume((jsonHandle) =>\n this.vm.unwrapResult(this.vm.callFunction(this.fnJSONParse, this.vm.undefined, jsonHandle)),\n );\n this.stats.serInMs += performance.now() - t0;\n return scope !== undefined ? scope.manage(result) : result;\n }\n\n public importObjectUniversal(handle: QuickJSHandle | undefined): unknown {\n if (handle === undefined) return undefined;\n switch (this.vm.typeof(handle)) {\n case \"undefined\":\n return undefined;\n case \"boolean\":\n case \"number\":\n case \"string\":\n return this.vm.dump(handle);\n default:\n return this.importObjectViaJson(handle);\n }\n }\n\n public importObjectViaJson(handle: QuickJSHandle): unknown {\n const t0 = performance.now();\n const text = this.vm\n .unwrapResult(this.vm.callFunction(this.fnJSONStringify, this.vm.undefined, handle))\n .consume((strHandle) => this.vm.getString(strHandle));\n this.stats.serOutBytes += text.length;\n this.stats.serOutCalls++;\n if (text === \"undefined\") {\n // special case with futures\n this.stats.serOutMs += performance.now() - t0;\n return undefined;\n }\n const result = JSON.parse(text);\n this.stats.serOutMs += performance.now() - t0;\n return result;\n }\n\n private injectCtx() {\n Scope.withScope((localScope) => {\n const configCtx = localScope.manage(this.vm.newObject());\n\n //\n // Core props\n //\n\n this.vm.setProp(configCtx, \"callbackRegistry\", this.callbackRegistry);\n this.vm.setProp(\n configCtx,\n \"featureFlags\",\n this.exportObjectUniversal(JsRenderInternal.GlobalCfgRenderCtxFeatureFlags, localScope),\n );\n\n // Inject context values from computableHelper (reactive context for outputs, inputsValid, etc.)\n if (this.computableHelper !== undefined) {\n this.computableHelper.injectCtx(configCtx);\n }\n\n //\n // Creating global variable inside the vm\n //\n\n this.vm.setProp(this.vm.global, \"cfgRenderCtx\", configCtx);\n });\n }\n}\n\n/** Holds errors that happened in the host code (like in middle-layer's drivers)\n * and then throws it where the error from quick JS is needed.\n * QuickJS couldn't throw custom errors, so we store them here, and rethrow them when we exit QuickJS side. */\nexport class ErrorRepository {\n private readonly errorIdToError = new Map<string, unknown>();\n\n /** Sets the error to the repository and returns a mimicrated error that also has uuid key of the original error. */\n public setAndRecreateForQuickJS(error: unknown): {\n name: string;\n message: string;\n } {\n const errorId = randomUUID();\n this.errorIdToError.set(errorId, error);\n\n if (error instanceof Error) {\n return {\n name: `${error.name}/uuid:${errorId}`,\n message: error.message,\n };\n }\n\n return {\n name: `UnknownErrorQuickJS/uuid:${errorId}`,\n message: `${error as any}`,\n };\n }\n\n /** Returns the original error that was stored by parsing uuid of mimicrated error. */\n public getOriginal(quickJSError: unknown): unknown {\n if (!(quickJSError instanceof errors.QuickJSUnwrapError)) {\n console.warn(\n \"ErrorRepo: quickJSError is not a QuickJSUnwrapError\",\n stringifyWithResourceId(quickJSError),\n );\n return quickJSError;\n }\n\n const cause = quickJSError.cause;\n if (\n !(\n typeof cause === \"object\" &&\n cause !== null &&\n \"name\" in cause &&\n typeof cause.name === \"string\"\n )\n ) {\n console.warn(\n \"ErrorRepo: quickJSError.cause is not an Error (can be stack limit exceeded)\",\n stringifyWithResourceId(quickJSError),\n );\n return quickJSError;\n }\n\n const causeName = cause.name;\n const uuidIdx = causeName.indexOf(\"/uuid:\");\n if (uuidIdx === -1) {\n const causeMsg = \"message\" in cause && typeof cause.message === \"string\" ? cause.message : \"\";\n throw new Error(\n `QuickJS native error: ${causeName}: ${causeMsg}, ${stringifyWithResourceId(quickJSError)}`,\n { cause: quickJSError },\n );\n }\n const errorId = causeName.slice(uuidIdx + \"/uuid:\".length);\n if (!errorId) {\n throw new Error(\n `ErrorRepo: quickJSError.cause.name does not contain errorId: ${causeName}, ${stringifyWithResourceId(quickJSError)}`,\n );\n }\n\n const error = this.errorIdToError.get(errorId);\n if (error === undefined) {\n throw new Error(\n `ErrorRepo: errorId not found: ${errorId}, ${stringifyWithResourceId(quickJSError)}`,\n );\n }\n\n return new PlQuickJSError(quickJSError, error as Error);\n }\n}\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { stringifyWithResourceId } from "@milaboratories/pl-client";
5
5
  import { randomUUID } from "node:crypto";
6
6
  import { PlQuickJSError } from "@milaboratories/pl-errors";
7
7
  import { Scope, errors } from "quickjs-emscripten";
8
- //#region src/js_render/context.ts
8
+ // src/js_render/context.ts
9
9
  function isArrayBufferOrView(obj) {
10
10
  return obj instanceof ArrayBuffer || ArrayBuffer.isView(obj);
11
11
  }
@@ -223,7 +223,6 @@ var ErrorRepository = class {
223
223
  return new PlQuickJSError(quickJSError, error);
224
224
  }
225
225
  };
226
- //#endregion
227
226
  export { ErrorRepository, JsExecutionContext };
228
227
 
229
228
  //# sourceMappingURL=context.js.map
@@ -3,12 +3,14 @@ const require_context = require("./context.cjs");
3
3
  let _milaboratories_computable = require("@milaboratories/computable");
4
4
  let quickjs_emscripten = require("quickjs-emscripten");
5
5
  let _milaboratories_pl_crash_recorder = require("@milaboratories/pl-crash-recorder");
6
- //#region src/js_render/index.ts
6
+ // src/js_render/index.ts
7
7
  /** Memory ceiling applied to every QuickJS runtime that evaluates model code. */
8
- const QUICK_JS_MEMORY_LIMIT = 1024 * 1024 * 8;
8
+ const QUICK_JS_MEMORY_LIMIT = 8388608;
9
9
  function logOutputStatus(handle, renderedResult, stable, recalculationCounter, unstableMarker) {
10
- if (require_index.getDebugFlags().logOutputStatus && (require_index.getDebugFlags().logOutputStatus === "any" || !stable)) if (stable) console.log(`Stable output ${handle} calculated ${renderedResult !== void 0 ? "defined" : "undefined"}; (#${recalculationCounter})`);
11
- else console.log(`Unstable output ${handle}; marker = ${unstableMarker}; ${renderedResult !== void 0 ? "defined" : "undefined"} (#${recalculationCounter})`);
10
+ if (require_index.getDebugFlags().logOutputStatus && (require_index.getDebugFlags().logOutputStatus === "any" || !stable)) {
11
+ if (stable) console.log(`Stable output ${handle} calculated ${renderedResult !== void 0 ? "defined" : "undefined"}; (#${recalculationCounter})`);
12
+ else console.log(`Unstable output ${handle}; marker = ${unstableMarker}; ${renderedResult !== void 0 ? "defined" : "undefined"} (#${recalculationCounter})`);
13
+ }
12
14
  }
13
15
  /**
14
16
  * Creates a Computable that executes a render function (`fh`) from a block's code in a QuickJS virtual machine.
@@ -76,14 +78,15 @@ function computableFromRF(env, ctx, fh, codeWithInfo, configKey, ops = {}, block
76
78
  try {
77
79
  const runtime = scope.manage(env.quickJs.newRuntime());
78
80
  runtime.setMemoryLimit(QUICK_JS_MEMORY_LIMIT);
79
- runtime.setMaxStackSize(1024 * 320);
81
+ runtime.setMaxStackSize(327680);
80
82
  let deadlineSettings;
81
83
  runtime.setInterruptHandler(() => {
82
84
  if (deadlineSettings === void 0) return false;
83
85
  if (Date.now() > deadlineSettings.deadline) return true;
84
86
  return false;
85
87
  });
86
- const rCtx = new require_context.JsExecutionContext(scope, scope.manage(runtime.newContext()), (s) => {
88
+ const vm = scope.manage(runtime.newContext());
89
+ const rCtx = new require_context.JsExecutionContext(scope, vm, (s) => {
87
90
  deadlineSettings = s;
88
91
  }, featureFlags, {
89
92
  computableCtx: cCtx,
@@ -145,14 +148,15 @@ function executeSingleLambda(quickJs, fh, codeWithInfo, ...args) {
145
148
  try {
146
149
  const runtime = scope.manage(quickJs.newRuntime());
147
150
  runtime.setMemoryLimit(QUICK_JS_MEMORY_LIMIT);
148
- runtime.setMaxStackSize(1024 * 320);
151
+ runtime.setMaxStackSize(327680);
149
152
  let deadlineSettings;
150
153
  runtime.setInterruptHandler(() => {
151
154
  if (deadlineSettings === void 0) return false;
152
155
  if (Date.now() > deadlineSettings.deadline) return true;
153
156
  return false;
154
157
  });
155
- const rCtx = new require_context.JsExecutionContext(scope, scope.manage(runtime.newContext()), (s) => {
158
+ const vm = scope.manage(runtime.newContext());
159
+ const rCtx = new require_context.JsExecutionContext(scope, vm, (s) => {
156
160
  deadlineSettings = s;
157
161
  }, featureFlags);
158
162
  rCtx.evaluateBundle(code.content);
@@ -184,7 +188,6 @@ function describeBlockPack(spec) {
184
188
  blockSource: spec.type
185
189
  };
186
190
  }
187
- //#endregion
188
191
  exports.computableFromRF = computableFromRF;
189
192
  exports.executeSingleLambda = executeSingleLambda;
190
193
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["getDebugFlags","Computable","Scope","JsExecutionContext"],"sources":["../../src/js_render/index.ts"],"sourcesContent":["import type { MiddleLayerEnvironment } from \"../middle_layer/middle_layer\";\nimport type { BlockCodeWithInfo, ConfigRenderLambda } from \"@platforma-sdk/model\";\nimport type { BlockPackSpec } from \"@milaboratories/pl-model-middle-layer\";\nimport type { ComputableRenderingOps } from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport type { QuickJSWASMModule } from \"quickjs-emscripten\";\nimport { Scope } from \"quickjs-emscripten\";\nimport type { DeadlineSettings } from \"./context\";\nimport { JsExecutionContext } from \"./context\";\nimport type { BlockContextAny } from \"../middle_layer/block_ctx\";\nimport { getDebugFlags } from \"../debug\";\nimport { recordModelRenderSync } from \"@milaboratories/pl-crash-recorder\";\n\n/** Memory ceiling applied to every QuickJS runtime that evaluates model code. */\nconst QUICK_JS_MEMORY_LIMIT = 1024 * 1024 * 8;\n\nfunction logOutputStatus(\n handle: string,\n renderedResult: unknown,\n stable: boolean,\n recalculationCounter: number,\n unstableMarker?: string,\n) {\n if (getDebugFlags().logOutputStatus && (getDebugFlags().logOutputStatus === \"any\" || !stable)) {\n if (stable)\n console.log(\n `Stable output ${handle} calculated ${renderedResult !== undefined ? \"defined\" : \"undefined\"}; (#${recalculationCounter})`,\n );\n else\n console.log(\n `Unstable output ${handle}; marker = ${unstableMarker}; ${renderedResult !== undefined ? \"defined\" : \"undefined\"} (#${recalculationCounter})`,\n );\n }\n}\n\n/**\n * Creates a Computable that executes a render function (`fh`) from a block's code in a QuickJS virtual machine.\n * This function handles both synchronous and asynchronous execution patterns of the sandboxed JS code.\n *\n * The overall data flow is as follows:\n * 1. A QuickJS VM is initialized.\n * 2. A `JsExecutionContext` is created to bridge the host (TypeScript) and guest (QuickJS) environments. It injects a\n * context object (`cfgRenderCtx`) into the VM, providing helper methods for the sandboxed code to interact with the\n * platform (e.g., to request data).\n * 3. The block's Javascript bundle is evaluated in the VM.\n * 4. The specified render function (`fh.handle`) is executed.\n *\n * Two execution paths are possible depending on the behavior of the render function:\n *\n * ### Synchronous Path\n * If the render function computes its result without requesting any external data requiring asynchronous calculations,\n * it executes synchronously.\n * - The `computablesToResolve` map in `JsExecutionContext` remains empty.\n * - The function returns an object with an `ir` field holding the result (`{ ir: importedResult }`).\n * Since `postprocessValue` is not specified, `ir` is treated as the final resolved value of the Computable.\n * - The QuickJS VM is disposed of immediately as it's no longer needed.\n *\n * ### Asynchronous Path (with `postprocessValue`)\n * If the render function needs external data requiring asynchronous calculations (e.g., fetching a file), it calls\n * one of the injected helper methods. These methods don't return data directly. Instead, they:\n * a. Create a new `Computable` for the data request (e.g., to fetch a blob).\n * b. Register this new `Computable` in the `computablesToResolve` map.\n * c. Return a handle (string) to the sandboxed code.\n *\n * In this case:\n * - The initial execution of the render function returns a scaffold of the final result, which depends on the pending\n * computables.\n * - The `computablesToResolve` map is passed as the `ir` (initial result) to `Computable.makeRaw`.\n * - The `postprocessValue` function is provided to handle the results once the computables are resolved.\n * - The QuickJS VM is kept alive (`keepVmAlive = true`) because its state is needed in `postprocessValue`.\n * - Once the `computable` framework resolves all dependencies, it calls `postprocessValue` with the resolved data.\n * - `postprocessValue` feeds the resolved data back into the VM, allowing the sandboxed code to compute the final\n * result.\n * - The VM is eventually disposed of when the host Computable is destroyed.\n *\n * @param env The middle layer environment.\n * @param ctx The block context.\n * @param fh The config render lambda to execute.\n * @param codeWithInfo The block's code and feature flags.\n * @param configKey A key for the configuration, used for cache busting.\n * @param ops Options for the computable.\n * @returns A `Computable` that will resolve to the result of the lambda execution.\n */\nexport function computableFromRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n fh: ConfigRenderLambda,\n codeWithInfo: BlockCodeWithInfo,\n configKey: string,\n ops: Partial<ComputableRenderingOps> = {},\n blockPack?: BlockPackSpec,\n): Computable<unknown> {\n // adding configKey to reload all outputs on block-pack update\n const key = `${ctx.blockId}#lambda#${configKey}#${fh.handle}`;\n ops = { ...ops, key };\n if (ops.mode === undefined && fh.retentive === true) ops.mode = \"StableOnlyRetentive\";\n return Computable.makeRaw((cCtx) => {\n const { code, featureFlags } = codeWithInfo;\n\n if (getDebugFlags().logOutputRecalculations)\n console.log(\n `Block lambda recalculation : ${key} (${cCtx.changeSourceMarker}; ${cCtx.bodyInvocations} invocations)`,\n );\n\n const scope = new Scope();\n let keepVmAlive = false;\n cCtx.addOnDestroy(() => {\n // If keepVmAlive is false, the scope will be disposed by the finally block,\n // no need to dispose it here.\n if (keepVmAlive) scope.dispose();\n });\n\n try {\n const runtime = scope.manage(env.quickJs.newRuntime());\n runtime.setMemoryLimit(QUICK_JS_MEMORY_LIMIT);\n runtime.setMaxStackSize(1024 * 320);\n\n let deadlineSettings: DeadlineSettings | undefined;\n runtime.setInterruptHandler(() => {\n if (deadlineSettings === undefined) return false;\n if (Date.now() > deadlineSettings.deadline) return true;\n return false;\n });\n const vm = scope.manage(runtime.newContext());\n const rCtx = new JsExecutionContext(\n scope,\n vm,\n (s) => {\n deadlineSettings = s;\n },\n featureFlags,\n { computableCtx: cCtx, blockCtx: ctx, mlEnv: env },\n );\n\n const crashRecorder = env.driverKit.crashRecorder;\n const renderInfo = {\n blockId: ctx.blockId,\n // A block id is unique to one project; these say which code it is, so a\n // log can be read against the right version without the project.\n ...describeBlockPack(blockPack),\n sdkVersion: codeWithInfo.sdkVersion,\n key,\n lambda: fh.handle,\n // The sandbox has its own 8 MB ceiling, so the model's own objects can\n // never exhaust the host heap. What can is the volume crossing out of\n // it, which `stats` counts.\n sandboxMemoryLimit: QUICK_JS_MEMORY_LIMIT,\n getStats: () => ({ ...rCtx.stats }),\n };\n\n return recordModelRenderSync(crashRecorder, renderInfo, () => {\n rCtx.evaluateBundle(code.content);\n const result = rCtx.runCallback(fh.handle);\n\n rCtx.resetComputableCtx();\n\n const toBeResolved = rCtx.computableHelper!.computablesToResolve;\n\n if (Object.keys(toBeResolved).length === 0) {\n const importedResult = rCtx.importObjectUniversal(result);\n if (getDebugFlags().logJsExecStat)\n console.log(`[jsExec] ${key}: ${JSON.stringify(rCtx.stats)}`);\n logOutputStatus(\n fh.handle,\n importedResult,\n cCtx.unstableMarker === undefined,\n -1,\n cCtx.unstableMarker,\n );\n return { ir: importedResult };\n }\n\n let recalculationCounter = 0;\n if (getDebugFlags().logOutputStatus)\n console.log(\n `Output ${fh.handle} scaffold calculated (not all computables resolved yet).`,\n );\n keepVmAlive = true;\n\n return {\n ir: toBeResolved,\n postprocessValue: (resolved: Record<string, unknown>, { unstableMarker, stable }) => {\n recalculationCounter++;\n // A deferred render resumes here, potentially many times, and each\n // resumption can build joins of its own, so each gets its own span.\n return recordModelRenderSync(\n crashRecorder,\n { ...renderInfo, recalculation: recalculationCounter },\n () => {\n // resolving futures\n for (const [handle, value] of Object.entries(resolved))\n rCtx.runCallback(handle, value);\n\n // rendering result\n const renderedResult = rCtx.importObjectUniversal(result);\n\n // logging\n if (getDebugFlags().logJsExecStat)\n console.log(\n `[jsExec] ${key} #${recalculationCounter}: ${JSON.stringify(rCtx.stats)}`,\n );\n logOutputStatus(\n fh.handle,\n renderedResult,\n stable,\n recalculationCounter,\n unstableMarker,\n );\n\n return renderedResult;\n },\n );\n },\n };\n });\n } catch (e) {\n keepVmAlive = false;\n throw e;\n } finally {\n if (!keepVmAlive) scope.dispose();\n }\n }, ops);\n}\n\nexport function executeSingleLambda(\n quickJs: QuickJSWASMModule,\n fh: ConfigRenderLambda,\n codeWithInfo: BlockCodeWithInfo,\n ...args: unknown[]\n): unknown {\n const { code, featureFlags } = codeWithInfo;\n const scope = new Scope();\n try {\n const runtime = scope.manage(quickJs.newRuntime());\n runtime.setMemoryLimit(QUICK_JS_MEMORY_LIMIT);\n runtime.setMaxStackSize(1024 * 320);\n\n let deadlineSettings: DeadlineSettings | undefined;\n runtime.setInterruptHandler(() => {\n if (deadlineSettings === undefined) return false;\n if (Date.now() > deadlineSettings.deadline) return true;\n return false;\n });\n const vm = scope.manage(runtime.newContext());\n const rCtx = new JsExecutionContext(\n scope,\n vm,\n (s) => {\n deadlineSettings = s;\n },\n featureFlags,\n );\n\n // Initializing the model\n rCtx.evaluateBundle(code.content);\n\n // Running the lambda with arguments (e.g., state for args(), args for enrichmentTargets())\n const importedResult = rCtx.importObjectUniversal(rCtx.runCallback(fh.handle, ...args));\n if (getDebugFlags().logJsExecStat)\n console.log(`[jsExec] ${fh.handle}: ${JSON.stringify(rCtx.stats)}`);\n return importedResult;\n } finally {\n scope.dispose();\n }\n}\n\n/**\n * The part of a block pack that names the code, and nothing else.\n *\n * Registry packs carry an organization, name and version, which is what a reader\n * needs to open the right source. Local and development packs carry a filesystem\n * path instead; the path is deliberately not recorded — it identifies the\n * machine rather than the code, and its `type` already says that no published\n * version exists to look up.\n */\nfunction describeBlockPack(spec: BlockPackSpec | undefined): {\n block?: string;\n blockVersion?: string;\n blockSource?: string;\n} {\n if (spec === undefined) return {};\n if (spec.type === \"from-registry-v1\" || spec.type === \"from-registry-v2\") {\n return {\n block: `${spec.id.organization}:${spec.id.name}`,\n blockVersion: spec.id.version,\n blockSource: spec.type,\n };\n }\n return { block: \"(unpublished)\", blockSource: spec.type };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["getDebugFlags","Computable","Scope","JsExecutionContext","recordModelRenderSync"],"sources":["../../src/js_render/index.ts"],"sourcesContent":["import type { MiddleLayerEnvironment } from \"../middle_layer/middle_layer\";\nimport type { BlockCodeWithInfo, ConfigRenderLambda } from \"@platforma-sdk/model\";\nimport type { BlockPackSpec } from \"@milaboratories/pl-model-middle-layer\";\nimport type { ComputableRenderingOps } from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport type { QuickJSWASMModule } from \"quickjs-emscripten\";\nimport { Scope } from \"quickjs-emscripten\";\nimport type { DeadlineSettings } from \"./context\";\nimport { JsExecutionContext } from \"./context\";\nimport type { BlockContextAny } from \"../middle_layer/block_ctx\";\nimport { getDebugFlags } from \"../debug\";\nimport { recordModelRenderSync } from \"@milaboratories/pl-crash-recorder\";\n\n/** Memory ceiling applied to every QuickJS runtime that evaluates model code. */\nconst QUICK_JS_MEMORY_LIMIT = 1024 * 1024 * 8;\n\nfunction logOutputStatus(\n handle: string,\n renderedResult: unknown,\n stable: boolean,\n recalculationCounter: number,\n unstableMarker?: string,\n) {\n if (getDebugFlags().logOutputStatus && (getDebugFlags().logOutputStatus === \"any\" || !stable)) {\n if (stable)\n console.log(\n `Stable output ${handle} calculated ${renderedResult !== undefined ? \"defined\" : \"undefined\"}; (#${recalculationCounter})`,\n );\n else\n console.log(\n `Unstable output ${handle}; marker = ${unstableMarker}; ${renderedResult !== undefined ? \"defined\" : \"undefined\"} (#${recalculationCounter})`,\n );\n }\n}\n\n/**\n * Creates a Computable that executes a render function (`fh`) from a block's code in a QuickJS virtual machine.\n * This function handles both synchronous and asynchronous execution patterns of the sandboxed JS code.\n *\n * The overall data flow is as follows:\n * 1. A QuickJS VM is initialized.\n * 2. A `JsExecutionContext` is created to bridge the host (TypeScript) and guest (QuickJS) environments. It injects a\n * context object (`cfgRenderCtx`) into the VM, providing helper methods for the sandboxed code to interact with the\n * platform (e.g., to request data).\n * 3. The block's Javascript bundle is evaluated in the VM.\n * 4. The specified render function (`fh.handle`) is executed.\n *\n * Two execution paths are possible depending on the behavior of the render function:\n *\n * ### Synchronous Path\n * If the render function computes its result without requesting any external data requiring asynchronous calculations,\n * it executes synchronously.\n * - The `computablesToResolve` map in `JsExecutionContext` remains empty.\n * - The function returns an object with an `ir` field holding the result (`{ ir: importedResult }`).\n * Since `postprocessValue` is not specified, `ir` is treated as the final resolved value of the Computable.\n * - The QuickJS VM is disposed of immediately as it's no longer needed.\n *\n * ### Asynchronous Path (with `postprocessValue`)\n * If the render function needs external data requiring asynchronous calculations (e.g., fetching a file), it calls\n * one of the injected helper methods. These methods don't return data directly. Instead, they:\n * a. Create a new `Computable` for the data request (e.g., to fetch a blob).\n * b. Register this new `Computable` in the `computablesToResolve` map.\n * c. Return a handle (string) to the sandboxed code.\n *\n * In this case:\n * - The initial execution of the render function returns a scaffold of the final result, which depends on the pending\n * computables.\n * - The `computablesToResolve` map is passed as the `ir` (initial result) to `Computable.makeRaw`.\n * - The `postprocessValue` function is provided to handle the results once the computables are resolved.\n * - The QuickJS VM is kept alive (`keepVmAlive = true`) because its state is needed in `postprocessValue`.\n * - Once the `computable` framework resolves all dependencies, it calls `postprocessValue` with the resolved data.\n * - `postprocessValue` feeds the resolved data back into the VM, allowing the sandboxed code to compute the final\n * result.\n * - The VM is eventually disposed of when the host Computable is destroyed.\n *\n * @param env The middle layer environment.\n * @param ctx The block context.\n * @param fh The config render lambda to execute.\n * @param codeWithInfo The block's code and feature flags.\n * @param configKey A key for the configuration, used for cache busting.\n * @param ops Options for the computable.\n * @returns A `Computable` that will resolve to the result of the lambda execution.\n */\nexport function computableFromRF(\n env: MiddleLayerEnvironment,\n ctx: BlockContextAny,\n fh: ConfigRenderLambda,\n codeWithInfo: BlockCodeWithInfo,\n configKey: string,\n ops: Partial<ComputableRenderingOps> = {},\n blockPack?: BlockPackSpec,\n): Computable<unknown> {\n // adding configKey to reload all outputs on block-pack update\n const key = `${ctx.blockId}#lambda#${configKey}#${fh.handle}`;\n ops = { ...ops, key };\n if (ops.mode === undefined && fh.retentive === true) ops.mode = \"StableOnlyRetentive\";\n return Computable.makeRaw((cCtx) => {\n const { code, featureFlags } = codeWithInfo;\n\n if (getDebugFlags().logOutputRecalculations)\n console.log(\n `Block lambda recalculation : ${key} (${cCtx.changeSourceMarker}; ${cCtx.bodyInvocations} invocations)`,\n );\n\n const scope = new Scope();\n let keepVmAlive = false;\n cCtx.addOnDestroy(() => {\n // If keepVmAlive is false, the scope will be disposed by the finally block,\n // no need to dispose it here.\n if (keepVmAlive) scope.dispose();\n });\n\n try {\n const runtime = scope.manage(env.quickJs.newRuntime());\n runtime.setMemoryLimit(QUICK_JS_MEMORY_LIMIT);\n runtime.setMaxStackSize(1024 * 320);\n\n let deadlineSettings: DeadlineSettings | undefined;\n runtime.setInterruptHandler(() => {\n if (deadlineSettings === undefined) return false;\n if (Date.now() > deadlineSettings.deadline) return true;\n return false;\n });\n const vm = scope.manage(runtime.newContext());\n const rCtx = new JsExecutionContext(\n scope,\n vm,\n (s) => {\n deadlineSettings = s;\n },\n featureFlags,\n { computableCtx: cCtx, blockCtx: ctx, mlEnv: env },\n );\n\n const crashRecorder = env.driverKit.crashRecorder;\n const renderInfo = {\n blockId: ctx.blockId,\n // A block id is unique to one project; these say which code it is, so a\n // log can be read against the right version without the project.\n ...describeBlockPack(blockPack),\n sdkVersion: codeWithInfo.sdkVersion,\n key,\n lambda: fh.handle,\n // The sandbox has its own 8 MB ceiling, so the model's own objects can\n // never exhaust the host heap. What can is the volume crossing out of\n // it, which `stats` counts.\n sandboxMemoryLimit: QUICK_JS_MEMORY_LIMIT,\n getStats: () => ({ ...rCtx.stats }),\n };\n\n return recordModelRenderSync(crashRecorder, renderInfo, () => {\n rCtx.evaluateBundle(code.content);\n const result = rCtx.runCallback(fh.handle);\n\n rCtx.resetComputableCtx();\n\n const toBeResolved = rCtx.computableHelper!.computablesToResolve;\n\n if (Object.keys(toBeResolved).length === 0) {\n const importedResult = rCtx.importObjectUniversal(result);\n if (getDebugFlags().logJsExecStat)\n console.log(`[jsExec] ${key}: ${JSON.stringify(rCtx.stats)}`);\n logOutputStatus(\n fh.handle,\n importedResult,\n cCtx.unstableMarker === undefined,\n -1,\n cCtx.unstableMarker,\n );\n return { ir: importedResult };\n }\n\n let recalculationCounter = 0;\n if (getDebugFlags().logOutputStatus)\n console.log(\n `Output ${fh.handle} scaffold calculated (not all computables resolved yet).`,\n );\n keepVmAlive = true;\n\n return {\n ir: toBeResolved,\n postprocessValue: (resolved: Record<string, unknown>, { unstableMarker, stable }) => {\n recalculationCounter++;\n // A deferred render resumes here, potentially many times, and each\n // resumption can build joins of its own, so each gets its own span.\n return recordModelRenderSync(\n crashRecorder,\n { ...renderInfo, recalculation: recalculationCounter },\n () => {\n // resolving futures\n for (const [handle, value] of Object.entries(resolved))\n rCtx.runCallback(handle, value);\n\n // rendering result\n const renderedResult = rCtx.importObjectUniversal(result);\n\n // logging\n if (getDebugFlags().logJsExecStat)\n console.log(\n `[jsExec] ${key} #${recalculationCounter}: ${JSON.stringify(rCtx.stats)}`,\n );\n logOutputStatus(\n fh.handle,\n renderedResult,\n stable,\n recalculationCounter,\n unstableMarker,\n );\n\n return renderedResult;\n },\n );\n },\n };\n });\n } catch (e) {\n keepVmAlive = false;\n throw e;\n } finally {\n if (!keepVmAlive) scope.dispose();\n }\n }, ops);\n}\n\nexport function executeSingleLambda(\n quickJs: QuickJSWASMModule,\n fh: ConfigRenderLambda,\n codeWithInfo: BlockCodeWithInfo,\n ...args: unknown[]\n): unknown {\n const { code, featureFlags } = codeWithInfo;\n const scope = new Scope();\n try {\n const runtime = scope.manage(quickJs.newRuntime());\n runtime.setMemoryLimit(QUICK_JS_MEMORY_LIMIT);\n runtime.setMaxStackSize(1024 * 320);\n\n let deadlineSettings: DeadlineSettings | undefined;\n runtime.setInterruptHandler(() => {\n if (deadlineSettings === undefined) return false;\n if (Date.now() > deadlineSettings.deadline) return true;\n return false;\n });\n const vm = scope.manage(runtime.newContext());\n const rCtx = new JsExecutionContext(\n scope,\n vm,\n (s) => {\n deadlineSettings = s;\n },\n featureFlags,\n );\n\n // Initializing the model\n rCtx.evaluateBundle(code.content);\n\n // Running the lambda with arguments (e.g., state for args(), args for enrichmentTargets())\n const importedResult = rCtx.importObjectUniversal(rCtx.runCallback(fh.handle, ...args));\n if (getDebugFlags().logJsExecStat)\n console.log(`[jsExec] ${fh.handle}: ${JSON.stringify(rCtx.stats)}`);\n return importedResult;\n } finally {\n scope.dispose();\n }\n}\n\n/**\n * The part of a block pack that names the code, and nothing else.\n *\n * Registry packs carry an organization, name and version, which is what a reader\n * needs to open the right source. Local and development packs carry a filesystem\n * path instead; the path is deliberately not recorded — it identifies the\n * machine rather than the code, and its `type` already says that no published\n * version exists to look up.\n */\nfunction describeBlockPack(spec: BlockPackSpec | undefined): {\n block?: string;\n blockVersion?: string;\n blockSource?: string;\n} {\n if (spec === undefined) return {};\n if (spec.type === \"from-registry-v1\" || spec.type === \"from-registry-v2\") {\n return {\n block: `${spec.id.organization}:${spec.id.name}`,\n blockVersion: spec.id.version,\n blockSource: spec.type,\n };\n }\n return { block: \"(unpublished)\", blockSource: spec.type };\n}\n"],"mappings":";;;;;;;AAcA,MAAM,wBAAwB;AAE9B,SAAS,gBACP,QACA,gBACA,QACA,sBACA,gBACA;CACA,IAAIA,cAAAA,cAAc,CAAC,CAAC,oBAAoBA,cAAAA,cAAc,CAAC,CAAC,oBAAoB,SAAS,CAAC,SAAS;EAC7F,IAAI,QACF,QAAQ,IACN,iBAAiB,OAAO,cAAc,mBAAmB,KAAA,IAAY,YAAY,YAAY,MAAM,qBAAqB,EAC1H;OAEA,QAAQ,IACN,mBAAmB,OAAO,aAAa,eAAe,IAAI,mBAAmB,KAAA,IAAY,YAAY,YAAY,KAAK,qBAAqB,EAC7I;CACJ;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDA,SAAgB,iBACd,KACA,KACA,IACA,cACA,WACA,MAAuC,CAAC,GACxC,WACqB;CAErB,MAAM,MAAM,GAAG,IAAI,QAAQ,UAAU,UAAU,GAAG,GAAG;CACrD,MAAM;EAAE,GAAG;EAAK;CAAI;CACpB,IAAI,IAAI,SAAS,KAAA,KAAa,GAAG,cAAc,MAAM,IAAI,OAAO;CAChE,OAAOC,2BAAAA,WAAW,SAAS,SAAS;EAClC,MAAM,EAAE,MAAM,iBAAiB;EAE/B,IAAID,cAAAA,cAAc,CAAC,CAAC,yBAClB,QAAQ,IACN,gCAAgC,IAAI,IAAI,KAAK,mBAAmB,IAAI,KAAK,gBAAgB,cAC3F;EAEF,MAAM,QAAQ,IAAIE,mBAAAA,MAAM;EACxB,IAAI,cAAc;EAClB,KAAK,mBAAmB;GAGtB,IAAI,aAAa,MAAM,QAAQ;EACjC,CAAC;EAED,IAAI;GACF,MAAM,UAAU,MAAM,OAAO,IAAI,QAAQ,WAAW,CAAC;GACrD,QAAQ,eAAe,qBAAqB;GAC5C,QAAQ,gBAAgB,MAAU;GAElC,IAAI;GACJ,QAAQ,0BAA0B;IAChC,IAAI,qBAAqB,KAAA,GAAW,OAAO;IAC3C,IAAI,KAAK,IAAI,IAAI,iBAAiB,UAAU,OAAO;IACnD,OAAO;GACT,CAAC;GACD,MAAM,KAAK,MAAM,OAAO,QAAQ,WAAW,CAAC;GAC5C,MAAM,OAAO,IAAIC,gBAAAA,mBACf,OACA,KACC,MAAM;IACL,mBAAmB;GACrB,GACA,cACA;IAAE,eAAe;IAAM,UAAU;IAAK,OAAO;GAAI,CACnD;GAEA,MAAM,gBAAgB,IAAI,UAAU;GACpC,MAAM,aAAa;IACjB,SAAS,IAAI;IAGb,GAAG,kBAAkB,SAAS;IAC9B,YAAY,aAAa;IACzB;IACA,QAAQ,GAAG;IAIX,oBAAoB;IACpB,iBAAiB,EAAE,GAAG,KAAK,MAAM;GACnC;GAEA,QAAA,GAAOC,kCAAAA,sBAAAA,CAAsB,eAAe,kBAAkB;IAC5D,KAAK,eAAe,KAAK,OAAO;IAChC,MAAM,SAAS,KAAK,YAAY,GAAG,MAAM;IAEzC,KAAK,mBAAmB;IAExB,MAAM,eAAe,KAAK,iBAAkB;IAE5C,IAAI,OAAO,KAAK,YAAY,CAAC,CAAC,WAAW,GAAG;KAC1C,MAAM,iBAAiB,KAAK,sBAAsB,MAAM;KACxD,IAAIJ,cAAAA,cAAc,CAAC,CAAC,eAClB,QAAQ,IAAI,YAAY,IAAI,IAAI,KAAK,UAAU,KAAK,KAAK,GAAG;KAC9D,gBACE,GAAG,QACH,gBACA,KAAK,mBAAmB,KAAA,GACxB,IACA,KAAK,cACP;KACA,OAAO,EAAE,IAAI,eAAe;IAC9B;IAEA,IAAI,uBAAuB;IAC3B,IAAIA,cAAAA,cAAc,CAAC,CAAC,iBAClB,QAAQ,IACN,UAAU,GAAG,OAAO,yDACtB;IACF,cAAc;IAEd,OAAO;KACL,IAAI;KACJ,mBAAmB,UAAmC,EAAE,gBAAgB,aAAa;MACnF;MAGA,QAAA,GAAOI,kCAAAA,sBAAAA,CACL,eACA;OAAE,GAAG;OAAY,eAAe;MAAqB,SAC/C;OAEJ,KAAK,MAAM,CAAC,QAAQ,UAAU,OAAO,QAAQ,QAAQ,GACnD,KAAK,YAAY,QAAQ,KAAK;OAGhC,MAAM,iBAAiB,KAAK,sBAAsB,MAAM;OAGxD,IAAIJ,cAAAA,cAAc,CAAC,CAAC,eAClB,QAAQ,IACN,YAAY,IAAI,IAAI,qBAAqB,IAAI,KAAK,UAAU,KAAK,KAAK,GACxE;OACF,gBACE,GAAG,QACH,gBACA,QACA,sBACA,cACF;OAEA,OAAO;MACT,CACF;KACF;IACF;GACF,CAAC;EACH,SAAS,GAAG;GACV,cAAc;GACd,MAAM;EACR,UAAU;GACR,IAAI,CAAC,aAAa,MAAM,QAAQ;EAClC;CACF,GAAG,GAAG;AACR;AAEA,SAAgB,oBACd,SACA,IACA,cACA,GAAG,MACM;CACT,MAAM,EAAE,MAAM,iBAAiB;CAC/B,MAAM,QAAQ,IAAIE,mBAAAA,MAAM;CACxB,IAAI;EACF,MAAM,UAAU,MAAM,OAAO,QAAQ,WAAW,CAAC;EACjD,QAAQ,eAAe,qBAAqB;EAC5C,QAAQ,gBAAgB,MAAU;EAElC,IAAI;EACJ,QAAQ,0BAA0B;GAChC,IAAI,qBAAqB,KAAA,GAAW,OAAO;GAC3C,IAAI,KAAK,IAAI,IAAI,iBAAiB,UAAU,OAAO;GACnD,OAAO;EACT,CAAC;EACD,MAAM,KAAK,MAAM,OAAO,QAAQ,WAAW,CAAC;EAC5C,MAAM,OAAO,IAAIC,gBAAAA,mBACf,OACA,KACC,MAAM;GACL,mBAAmB;EACrB,GACA,YACF;EAGA,KAAK,eAAe,KAAK,OAAO;EAGhC,MAAM,iBAAiB,KAAK,sBAAsB,KAAK,YAAY,GAAG,QAAQ,GAAG,IAAI,CAAC;EACtF,IAAIH,cAAAA,cAAc,CAAC,CAAC,eAClB,QAAQ,IAAI,YAAY,GAAG,OAAO,IAAI,KAAK,UAAU,KAAK,KAAK,GAAG;EACpE,OAAO;CACT,UAAU;EACR,MAAM,QAAQ;CAChB;AACF;;;;;;;;;;AAWA,SAAS,kBAAkB,MAIzB;CACA,IAAI,SAAS,KAAA,GAAW,OAAO,CAAC;CAChC,IAAI,KAAK,SAAS,sBAAsB,KAAK,SAAS,oBACpD,OAAO;EACL,OAAO,GAAG,KAAK,GAAG,aAAa,GAAG,KAAK,GAAG;EAC1C,cAAc,KAAK,GAAG;EACtB,aAAa,KAAK;CACpB;CAEF,OAAO;EAAE,OAAO;EAAiB,aAAa,KAAK;CAAK;AAC1D"}
@@ -3,12 +3,14 @@ import { JsExecutionContext } from "./context.js";
3
3
  import { Computable } from "@milaboratories/computable";
4
4
  import { Scope } from "quickjs-emscripten";
5
5
  import { recordModelRenderSync } from "@milaboratories/pl-crash-recorder";
6
- //#region src/js_render/index.ts
6
+ // src/js_render/index.ts
7
7
  /** Memory ceiling applied to every QuickJS runtime that evaluates model code. */
8
- const QUICK_JS_MEMORY_LIMIT = 1024 * 1024 * 8;
8
+ const QUICK_JS_MEMORY_LIMIT = 8388608;
9
9
  function logOutputStatus(handle, renderedResult, stable, recalculationCounter, unstableMarker) {
10
- if (getDebugFlags().logOutputStatus && (getDebugFlags().logOutputStatus === "any" || !stable)) if (stable) console.log(`Stable output ${handle} calculated ${renderedResult !== void 0 ? "defined" : "undefined"}; (#${recalculationCounter})`);
11
- else console.log(`Unstable output ${handle}; marker = ${unstableMarker}; ${renderedResult !== void 0 ? "defined" : "undefined"} (#${recalculationCounter})`);
10
+ if (getDebugFlags().logOutputStatus && (getDebugFlags().logOutputStatus === "any" || !stable)) {
11
+ if (stable) console.log(`Stable output ${handle} calculated ${renderedResult !== void 0 ? "defined" : "undefined"}; (#${recalculationCounter})`);
12
+ else console.log(`Unstable output ${handle}; marker = ${unstableMarker}; ${renderedResult !== void 0 ? "defined" : "undefined"} (#${recalculationCounter})`);
13
+ }
12
14
  }
13
15
  /**
14
16
  * Creates a Computable that executes a render function (`fh`) from a block's code in a QuickJS virtual machine.
@@ -76,14 +78,15 @@ function computableFromRF(env, ctx, fh, codeWithInfo, configKey, ops = {}, block
76
78
  try {
77
79
  const runtime = scope.manage(env.quickJs.newRuntime());
78
80
  runtime.setMemoryLimit(QUICK_JS_MEMORY_LIMIT);
79
- runtime.setMaxStackSize(1024 * 320);
81
+ runtime.setMaxStackSize(327680);
80
82
  let deadlineSettings;
81
83
  runtime.setInterruptHandler(() => {
82
84
  if (deadlineSettings === void 0) return false;
83
85
  if (Date.now() > deadlineSettings.deadline) return true;
84
86
  return false;
85
87
  });
86
- const rCtx = new JsExecutionContext(scope, scope.manage(runtime.newContext()), (s) => {
88
+ const vm = scope.manage(runtime.newContext());
89
+ const rCtx = new JsExecutionContext(scope, vm, (s) => {
87
90
  deadlineSettings = s;
88
91
  }, featureFlags, {
89
92
  computableCtx: cCtx,
@@ -145,14 +148,15 @@ function executeSingleLambda(quickJs, fh, codeWithInfo, ...args) {
145
148
  try {
146
149
  const runtime = scope.manage(quickJs.newRuntime());
147
150
  runtime.setMemoryLimit(QUICK_JS_MEMORY_LIMIT);
148
- runtime.setMaxStackSize(1024 * 320);
151
+ runtime.setMaxStackSize(327680);
149
152
  let deadlineSettings;
150
153
  runtime.setInterruptHandler(() => {
151
154
  if (deadlineSettings === void 0) return false;
152
155
  if (Date.now() > deadlineSettings.deadline) return true;
153
156
  return false;
154
157
  });
155
- const rCtx = new JsExecutionContext(scope, scope.manage(runtime.newContext()), (s) => {
158
+ const vm = scope.manage(runtime.newContext());
159
+ const rCtx = new JsExecutionContext(scope, vm, (s) => {
156
160
  deadlineSettings = s;
157
161
  }, featureFlags);
158
162
  rCtx.evaluateBundle(code.content);
@@ -184,7 +188,6 @@ function describeBlockPack(spec) {
184
188
  blockSource: spec.type
185
189
  };
186
190
  }
187
- //#endregion
188
191
  export { computableFromRF, executeSingleLambda };
189
192
 
190
193
  //# sourceMappingURL=index.js.map