@milaboratories/pl-middle-layer 1.74.11 → 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.
- package/dist/_virtual/{_@oxc-project_runtime@0.137.0 → _@oxc-project_runtime@0.155.0}/helpers/esm/usingCtx.cjs +1 -2
- package/dist/_virtual/{_@oxc-project_runtime@0.137.0 → _@oxc-project_runtime@0.155.0}/helpers/esm/usingCtx.js +1 -2
- package/dist/_virtual/_rolldown/runtime.cjs +2 -3
- package/dist/block_registry/location_provider.cjs +1 -2
- package/dist/block_registry/location_provider.cjs.map +1 -1
- package/dist/block_registry/location_provider.js +1 -2
- package/dist/block_registry/registry-v2-provider.cjs +1 -2
- package/dist/block_registry/registry-v2-provider.cjs.map +1 -1
- package/dist/block_registry/registry-v2-provider.d.ts +0 -2
- package/dist/block_registry/registry-v2-provider.d.ts.map +1 -1
- package/dist/block_registry/registry-v2-provider.js +1 -2
- package/dist/block_registry/registry.cjs +3 -3
- package/dist/block_registry/registry.cjs.map +1 -1
- package/dist/block_registry/registry.d.ts +0 -2
- package/dist/block_registry/registry.d.ts.map +1 -1
- package/dist/block_registry/registry.js +3 -3
- package/dist/block_registry/registry.js.map +1 -1
- package/dist/block_registry/template_provider.cjs +1 -2
- package/dist/block_registry/template_provider.cjs.map +1 -1
- package/dist/block_registry/template_provider.d.ts +0 -2
- package/dist/block_registry/template_provider.d.ts.map +1 -1
- package/dist/block_registry/template_provider.js +1 -2
- package/dist/block_registry/watcher.cjs +15 -14
- package/dist/block_registry/watcher.cjs.map +1 -1
- package/dist/block_registry/watcher.d.ts +0 -2
- package/dist/block_registry/watcher.d.ts.map +1 -1
- package/dist/block_registry/watcher.js +15 -14
- package/dist/block_registry/watcher.js.map +1 -1
- package/dist/block_registry/well_known_registries.cjs +1 -2
- package/dist/block_registry/well_known_registries.d.ts +0 -2
- package/dist/block_registry/well_known_registries.d.ts.map +1 -1
- package/dist/block_registry/well_known_registries.js +1 -2
- package/dist/cfg_render/executor.cjs +1 -2
- package/dist/cfg_render/executor.cjs.map +1 -1
- package/dist/cfg_render/executor.js +1 -2
- package/dist/cfg_render/renderer.cjs +1 -2
- package/dist/cfg_render/renderer.cjs.map +1 -1
- package/dist/cfg_render/renderer.js +1 -2
- package/dist/cfg_render/traverse.cjs +1 -2
- package/dist/cfg_render/traverse.js +1 -2
- package/dist/cfg_render/util.cjs +1 -2
- package/dist/cfg_render/util.js +1 -2
- package/dist/debug/index.cjs +1 -2
- package/dist/debug/index.js +1 -2
- package/dist/dev_env/index.cjs +1 -2
- package/dist/dev_env/index.cjs.map +1 -1
- package/dist/dev_env/index.js +1 -2
- package/dist/dev_env/util.cjs +1 -2
- package/dist/dev_env/util.js +1 -2
- package/dist/js_render/column_registry.cjs +1 -2
- package/dist/js_render/column_registry.cjs.map +1 -1
- package/dist/js_render/column_registry.js +1 -2
- package/dist/js_render/computable_context.cjs +4 -4
- package/dist/js_render/computable_context.cjs.map +1 -1
- package/dist/js_render/computable_context.js +4 -4
- package/dist/js_render/computable_context.js.map +1 -1
- package/dist/js_render/context.cjs +1 -2
- package/dist/js_render/context.cjs.map +1 -1
- package/dist/js_render/context.js +1 -2
- package/dist/js_render/index.cjs +12 -9
- package/dist/js_render/index.cjs.map +1 -1
- package/dist/js_render/index.js +12 -9
- package/dist/js_render/index.js.map +1 -1
- package/dist/js_render/service_injectors.cjs +2 -3
- package/dist/js_render/service_injectors.js +2 -3
- package/dist/js_render/spec_override_collapse.cjs +1 -2
- package/dist/js_render/spec_override_collapse.cjs.map +1 -1
- package/dist/js_render/spec_override_collapse.js +1 -2
- package/dist/middle_layer/active_cfg.cjs +1 -2
- package/dist/middle_layer/active_cfg.cjs.map +1 -1
- package/dist/middle_layer/active_cfg.js +1 -2
- package/dist/middle_layer/block.cjs +1 -2
- package/dist/middle_layer/block.cjs.map +1 -1
- package/dist/middle_layer/block.js +1 -2
- package/dist/middle_layer/block_ctx.cjs +3 -3
- package/dist/middle_layer/block_ctx.cjs.map +1 -1
- package/dist/middle_layer/block_ctx.js +3 -3
- package/dist/middle_layer/block_ctx.js.map +1 -1
- package/dist/middle_layer/block_ctx_unsafe.cjs +1 -2
- package/dist/middle_layer/block_ctx_unsafe.js +1 -2
- package/dist/middle_layer/build_stamp.cjs +2 -3
- package/dist/middle_layer/build_stamp.js +2 -3
- package/dist/middle_layer/driver_kit.cjs +1 -2
- package/dist/middle_layer/driver_kit.cjs.map +1 -1
- package/dist/middle_layer/driver_kit.d.ts +0 -2
- package/dist/middle_layer/driver_kit.d.ts.map +1 -1
- package/dist/middle_layer/driver_kit.js +1 -2
- package/dist/middle_layer/finality_stop_rules.cjs +1 -2
- package/dist/middle_layer/finality_stop_rules.js +1 -2
- package/dist/middle_layer/folders.cjs +12 -8
- package/dist/middle_layer/folders.cjs.map +1 -1
- package/dist/middle_layer/folders.d.ts +0 -2
- package/dist/middle_layer/folders.d.ts.map +1 -1
- package/dist/middle_layer/folders.js +12 -8
- package/dist/middle_layer/folders.js.map +1 -1
- package/dist/middle_layer/frontend_path.cjs +1 -2
- package/dist/middle_layer/frontend_path.cjs.map +1 -1
- package/dist/middle_layer/frontend_path.js +1 -2
- package/dist/middle_layer/middle_layer.cjs +7 -6
- package/dist/middle_layer/middle_layer.cjs.map +1 -1
- package/dist/middle_layer/middle_layer.d.ts +0 -2
- package/dist/middle_layer/middle_layer.d.ts.map +1 -1
- package/dist/middle_layer/middle_layer.js +7 -6
- package/dist/middle_layer/middle_layer.js.map +1 -1
- package/dist/middle_layer/navigation_states.cjs +1 -2
- package/dist/middle_layer/navigation_states.js +1 -2
- package/dist/middle_layer/ops.cjs +10 -11
- package/dist/middle_layer/ops.cjs.map +1 -1
- package/dist/middle_layer/ops.d.ts +0 -2
- package/dist/middle_layer/ops.d.ts.map +1 -1
- package/dist/middle_layer/ops.js +10 -11
- package/dist/middle_layer/ops.js.map +1 -1
- package/dist/middle_layer/project.cjs +3 -3
- package/dist/middle_layer/project.cjs.map +1 -1
- package/dist/middle_layer/project.d.ts +3 -5
- package/dist/middle_layer/project.d.ts.map +1 -1
- package/dist/middle_layer/project.js +3 -3
- package/dist/middle_layer/project.js.map +1 -1
- package/dist/middle_layer/project_list.cjs +1 -2
- package/dist/middle_layer/project_list.cjs.map +1 -1
- package/dist/middle_layer/project_list.d.ts +0 -2
- package/dist/middle_layer/project_list.d.ts.map +1 -1
- package/dist/middle_layer/project_list.js +1 -2
- package/dist/middle_layer/project_overview.cjs +8 -5
- package/dist/middle_layer/project_overview.cjs.map +1 -1
- package/dist/middle_layer/project_overview.js +8 -5
- package/dist/middle_layer/project_overview.js.map +1 -1
- package/dist/middle_layer/project_overview_light.cjs +4 -3
- package/dist/middle_layer/project_overview_light.cjs.map +1 -1
- package/dist/middle_layer/project_overview_light.js +4 -3
- package/dist/middle_layer/project_overview_light.js.map +1 -1
- package/dist/middle_layer/render.cjs +1 -2
- package/dist/middle_layer/render.cjs.map +1 -1
- package/dist/middle_layer/render.js +1 -2
- package/dist/middle_layer/sharing_list.cjs +1 -2
- package/dist/middle_layer/sharing_list.cjs.map +1 -1
- package/dist/middle_layer/sharing_list.d.ts +0 -2
- package/dist/middle_layer/sharing_list.d.ts.map +1 -1
- package/dist/middle_layer/sharing_list.js +1 -2
- package/dist/middle_layer/sharing_list.js.map +1 -1
- package/dist/middle_layer/template_list.cjs +1 -2
- package/dist/middle_layer/template_list.cjs.map +1 -1
- package/dist/middle_layer/template_list.d.ts +0 -2
- package/dist/middle_layer/template_list.d.ts.map +1 -1
- package/dist/middle_layer/template_list.js +1 -2
- package/dist/middle_layer/tree_snapshot_store.cjs +3 -3
- package/dist/middle_layer/tree_snapshot_store.cjs.map +1 -1
- package/dist/middle_layer/tree_snapshot_store.d.ts +0 -2
- package/dist/middle_layer/tree_snapshot_store.d.ts.map +1 -1
- package/dist/middle_layer/tree_snapshot_store.js +3 -3
- package/dist/middle_layer/tree_snapshot_store.js.map +1 -1
- package/dist/middle_layer/types.d.ts +0 -2
- package/dist/middle_layer/types.d.ts.map +1 -1
- package/dist/middle_layer/util.cjs +1 -2
- package/dist/middle_layer/util.cjs.map +1 -1
- package/dist/middle_layer/util.js +1 -2
- package/dist/model/args.cjs +1 -2
- package/dist/model/args.cjs.map +1 -1
- package/dist/model/args.js +1 -2
- package/dist/model/block_pack_spec.cjs +1 -2
- package/dist/model/block_pack_spec.d.ts +0 -2
- package/dist/model/block_pack_spec.d.ts.map +1 -1
- package/dist/model/block_pack_spec.js +1 -2
- package/dist/model/frontend.d.ts +0 -2
- package/dist/model/frontend.d.ts.map +1 -1
- package/dist/model/project_helper.cjs +1 -2
- package/dist/model/project_helper.cjs.map +1 -1
- package/dist/model/project_helper.d.ts +0 -2
- package/dist/model/project_helper.d.ts.map +1 -1
- package/dist/model/project_helper.js +1 -2
- package/dist/model/project_model.cjs +1 -2
- package/dist/model/project_model.d.ts +0 -2
- package/dist/model/project_model.d.ts.map +1 -1
- package/dist/model/project_model.js +1 -2
- package/dist/model/project_model_util.cjs +1 -2
- package/dist/model/project_model_util.js +1 -2
- package/dist/model/project_model_v1.cjs +1 -2
- package/dist/model/project_model_v1.js +1 -2
- package/dist/model/sharing_model.cjs +1 -2
- package/dist/model/sharing_model.cjs.map +1 -1
- package/dist/model/sharing_model.d.ts +0 -2
- package/dist/model/sharing_model.d.ts.map +1 -1
- package/dist/model/sharing_model.js +1 -2
- package/dist/model/template_apply.cjs +1 -2
- package/dist/model/template_apply.cjs.map +1 -1
- package/dist/model/template_apply.d.ts +0 -2
- package/dist/model/template_apply.d.ts.map +1 -1
- package/dist/model/template_apply.js +1 -2
- package/dist/model/template_export.cjs +1 -2
- package/dist/model/template_export.d.ts +0 -2
- package/dist/model/template_export.d.ts.map +1 -1
- package/dist/model/template_export.js +1 -2
- package/dist/model/template_parser.cjs +1 -2
- package/dist/model/template_parser.cjs.map +1 -1
- package/dist/model/template_parser.d.ts +0 -2
- package/dist/model/template_parser.d.ts.map +1 -1
- package/dist/model/template_parser.js +1 -2
- package/dist/model/template_resolve.cjs +1 -2
- package/dist/model/template_resolve.cjs.map +1 -1
- package/dist/model/template_resolve.d.ts +0 -2
- package/dist/model/template_resolve.d.ts.map +1 -1
- package/dist/model/template_resolve.js +1 -2
- package/dist/model/template_serializer.cjs +1 -2
- package/dist/model/template_serializer.cjs.map +1 -1
- package/dist/model/template_serializer.d.ts +0 -2
- package/dist/model/template_serializer.d.ts.map +1 -1
- package/dist/model/template_serializer.js +1 -2
- package/dist/model/template_spec.d.ts +0 -2
- package/dist/model/template_spec.d.ts.map +1 -1
- package/dist/mutator/block-pack/block_pack.cjs +7 -6
- package/dist/mutator/block-pack/block_pack.cjs.map +1 -1
- package/dist/mutator/block-pack/block_pack.d.ts +0 -2
- package/dist/mutator/block-pack/block_pack.d.ts.map +1 -1
- package/dist/mutator/block-pack/block_pack.js +7 -6
- package/dist/mutator/block-pack/block_pack.js.map +1 -1
- package/dist/mutator/block-pack/frontend.cjs +1 -2
- package/dist/mutator/block-pack/frontend.cjs.map +1 -1
- package/dist/mutator/block-pack/frontend.js +1 -2
- package/dist/mutator/block-pack/required_capabilities.cjs +1 -2
- package/dist/mutator/block-pack/required_capabilities.cjs.map +1 -1
- package/dist/mutator/block-pack/required_capabilities.js +1 -2
- package/dist/mutator/context_export.cjs +1 -2
- package/dist/mutator/context_export.cjs.map +1 -1
- package/dist/mutator/context_export.js +1 -2
- package/dist/mutator/list.cjs +1 -2
- package/dist/mutator/list.cjs.map +1 -1
- package/dist/mutator/list.js +1 -2
- package/dist/mutator/migration.cjs +1 -2
- package/dist/mutator/migration.cjs.map +1 -1
- package/dist/mutator/migration.js +1 -2
- package/dist/mutator/project.cjs +30 -22
- package/dist/mutator/project.cjs.map +1 -1
- package/dist/mutator/project.d.ts +0 -2
- package/dist/mutator/project.d.ts.map +1 -1
- package/dist/mutator/project.js +30 -22
- package/dist/mutator/project.js.map +1 -1
- package/dist/mutator/sharing.cjs +1 -2
- package/dist/mutator/sharing.cjs.map +1 -1
- package/dist/mutator/sharing.js +1 -2
- package/dist/mutator/template/direct_template_loader.cjs +1 -2
- package/dist/mutator/template/direct_template_loader.cjs.map +1 -1
- package/dist/mutator/template/direct_template_loader.js +1 -2
- package/dist/mutator/template/direct_template_loader_v3.cjs +1 -2
- package/dist/mutator/template/direct_template_loader_v3.cjs.map +1 -1
- package/dist/mutator/template/direct_template_loader_v3.js +1 -2
- package/dist/mutator/template/render_block.cjs +1 -2
- package/dist/mutator/template/render_block.cjs.map +1 -1
- package/dist/mutator/template/render_block.js +1 -2
- package/dist/mutator/template/render_template.cjs +1 -2
- package/dist/mutator/template/render_template.cjs.map +1 -1
- package/dist/mutator/template/render_template.d.ts +0 -2
- package/dist/mutator/template/render_template.d.ts.map +1 -1
- package/dist/mutator/template/render_template.js +1 -2
- package/dist/mutator/template/template_cache.cjs +6 -5
- package/dist/mutator/template/template_cache.cjs.map +1 -1
- package/dist/mutator/template/template_cache.d.ts +1 -2
- package/dist/mutator/template/template_cache.d.ts.map +1 -1
- package/dist/mutator/template/template_cache.js +6 -5
- package/dist/mutator/template/template_cache.js.map +1 -1
- package/dist/mutator/template/template_loading.cjs +1 -2
- package/dist/mutator/template/template_loading.cjs.map +1 -1
- package/dist/mutator/template/template_loading.d.ts +0 -2
- package/dist/mutator/template/template_loading.d.ts.map +1 -1
- package/dist/mutator/template/template_loading.js +1 -2
- package/dist/mutator/template.cjs +1 -2
- package/dist/mutator/template.cjs.map +1 -1
- package/dist/mutator/template.js +1 -2
- package/dist/mutator/template_construct.cjs +1 -2
- package/dist/mutator/template_construct.cjs.map +1 -1
- package/dist/mutator/template_construct.js +1 -2
- package/dist/network_check/network_check.cjs +2 -3
- package/dist/network_check/network_check.cjs.map +1 -1
- package/dist/network_check/network_check.d.ts +0 -2
- package/dist/network_check/network_check.d.ts.map +1 -1
- package/dist/network_check/network_check.js +2 -3
- package/dist/network_check/network_check.js.map +1 -1
- package/dist/network_check/pings.cjs +1 -2
- package/dist/network_check/pings.cjs.map +1 -1
- package/dist/network_check/pings.js +1 -2
- package/dist/network_check/template.cjs +5 -4
- package/dist/network_check/template.cjs.map +1 -1
- package/dist/network_check/template.js +5 -4
- package/dist/network_check/template.js.map +1 -1
- package/dist/pool/data.cjs +1 -2
- package/dist/pool/data.cjs.map +1 -1
- package/dist/pool/data.d.ts +0 -2
- package/dist/pool/data.d.ts.map +1 -1
- package/dist/pool/data.js +1 -2
- package/dist/pool/driver.cjs +5 -4
- package/dist/pool/driver.cjs.map +1 -1
- package/dist/pool/driver.d.ts +0 -2
- package/dist/pool/driver.d.ts.map +1 -1
- package/dist/pool/driver.js +5 -4
- package/dist/pool/driver.js.map +1 -1
- package/dist/pool/p_object_collection.cjs +9 -8
- package/dist/pool/p_object_collection.cjs.map +1 -1
- package/dist/pool/p_object_collection.d.ts +0 -2
- package/dist/pool/p_object_collection.d.ts.map +1 -1
- package/dist/pool/p_object_collection.js +9 -8
- package/dist/pool/p_object_collection.js.map +1 -1
- package/dist/pool/result_pool.cjs +8 -7
- package/dist/pool/result_pool.cjs.map +1 -1
- package/dist/pool/result_pool.js +8 -7
- package/dist/pool/result_pool.js.map +1 -1
- package/dist/pool/upstream_block_ctx.cjs +1 -2
- package/dist/pool/upstream_block_ctx.cjs.map +1 -1
- package/dist/pool/upstream_block_ctx.js +1 -2
- package/dist/service_factories.cjs +1 -2
- package/dist/service_factories.js +1 -2
- package/dist/worker/WorkerManager.cjs +1 -2
- package/dist/worker/WorkerManager.js +1 -2
- package/dist/worker/WorkerManager.js.map +1 -1
- package/dist/worker/worker.cjs +1 -2
- package/dist/worker/worker.js +1 -2
- package/dist/worker/workerApi.cjs +1 -2
- package/dist/worker/workerApi.cjs.map +1 -1
- package/dist/worker/workerApi.js +1 -2
- package/package.json +33 -33
- package/src/middle_layer/middle_layer.ts +4 -6
- package/src/middle_layer/tree_snapshot_store.test.ts +4 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"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.js","names":[],"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,6 +1,6 @@
|
|
|
1
|
-
const require_usingCtx = require("../_virtual/_@oxc-project_runtime@0.
|
|
1
|
+
const require_usingCtx = require("../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/usingCtx.cjs");
|
|
2
2
|
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
3
|
-
|
|
3
|
+
// src/js_render/service_injectors.ts
|
|
4
4
|
function getServiceInjectors() {
|
|
5
5
|
return {
|
|
6
6
|
PFrameSpec: ({ host, vm }) => {
|
|
@@ -86,7 +86,6 @@ function getServiceInjectors() {
|
|
|
86
86
|
}
|
|
87
87
|
};
|
|
88
88
|
}
|
|
89
|
-
//#endregion
|
|
90
89
|
exports.getServiceInjectors = getServiceInjectors;
|
|
91
90
|
|
|
92
91
|
//# sourceMappingURL=service_injectors.cjs.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import _usingCtx from "../_virtual/_@oxc-project_runtime@0.
|
|
1
|
+
import _usingCtx from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/usingCtx.js";
|
|
2
2
|
import { PoolEntryGuard, ServiceNotRegisteredError, Services } from "@milaboratories/pl-model-common";
|
|
3
|
-
|
|
3
|
+
// src/js_render/service_injectors.ts
|
|
4
4
|
function getServiceInjectors() {
|
|
5
5
|
return {
|
|
6
6
|
PFrameSpec: ({ host, vm }) => {
|
|
@@ -86,7 +86,6 @@ function getServiceInjectors() {
|
|
|
86
86
|
}
|
|
87
87
|
};
|
|
88
88
|
}
|
|
89
|
-
//#endregion
|
|
90
89
|
export { getServiceInjectors };
|
|
91
90
|
|
|
92
91
|
//# sourceMappingURL=service_injectors.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
2
|
-
|
|
2
|
+
// src/js_render/spec_override_collapse.ts
|
|
3
3
|
/**
|
|
4
4
|
* Collapse the client-side `specOverride` query node at the host boundary —
|
|
5
5
|
* pframe-engine never sees it. The override is pushed down through the
|
|
@@ -102,7 +102,6 @@ function effectiveAxesSpec(node) {
|
|
|
102
102
|
default: return;
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
|
-
//#endregion
|
|
106
105
|
exports.collapseSpecOverrideNode = collapseSpecOverrideNode;
|
|
107
106
|
|
|
108
107
|
//# sourceMappingURL=spec_override_collapse.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec_override_collapse.cjs","names":[],"sources":["../../src/js_render/spec_override_collapse.ts"],"sourcesContent":["import type { PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type { DataInfo, PColumn, PColumnValues } from \"@platforma-sdk/model\";\nimport { applySpecOverrides, matchAxis } from \"@milaboratories/pl-model-common\";\nimport type {\n AxesSpec,\n AxisPatches,\n SpecOverrides,\n SpecQuery,\n} from \"@milaboratories/pl-model-common\";\n\ntype Leaf = PColumn<PlTreeNodeAccessor | PColumnValues | DataInfo<PlTreeNodeAccessor>>;\ntype Node = SpecQuery<Leaf>;\n\n/**\n * Collapse the client-side `specOverride` query node at the host boundary —\n * pframe-engine never sees it. The override is pushed down through the\n * subtree until it lands on `column`-leaf nodes, where it is folded into\n * the leaf's spec via {@link applySpecOverrides}. Intermediate join nodes\n * are left untouched — pframe-engine will recompute their result spec\n * from the patched leaves.\n *\n * Designed to run as the `node` visitor in `mapPTableDefV2` (post-order),\n * so by the time we see a `specOverride` its inner subtree is already\n * mapped to {@link PColumn} leaves.\n *\n * Currently only `column` and `linkerJoin` are walked. Other node shapes\n * under `specOverride` throw — pframe-engine support for them is still\n * in progress. Extend the switch in {@link pushSpecOverrideDown} as more\n * shapes become needed.\n */\nexport function collapseSpecOverrideNode(node: Node): Node {\n if (node.type !== \"specOverride\") return node;\n return pushSpecOverrideDown(node.input, node.override);\n}\n\nfunction pushSpecOverrideDown(node: Node, overrides: SpecOverrides): Node {\n switch (node.type) {\n case \"column\":\n return {\n type: \"column\",\n column: { ...node.column, spec: applySpecOverrides(node.column.spec, overrides) },\n };\n\n case \"linkerJoin\": {\n // `axesSpec` patches are positional against the linkerJoin's OUTPUT axes,\n // which equal the secondary side's axes (ColumnDiscoveredRecipe emits the\n // hit on the many-side of the linker). Route axesSpec only into secondary;\n // applying the same positional indices to the linker would silently\n // mis-target the linker's own axes.\n //\n // Non-axesSpec patches (domain / contextDomain / annotations) are\n // column-level and not positional — keep the existing both-sides walk.\n const { axesSpec: _axesSpec, ...nonAxesOverrides } = overrides;\n const hasNonAxes =\n nonAxesOverrides.domain !== undefined ||\n nonAxesOverrides.contextDomain !== undefined ||\n nonAxesOverrides.annotations !== undefined;\n return {\n ...node,\n linker: hasNonAxes ? pushSpecOverrideDown(node.linker, nonAxesOverrides) : node.linker,\n secondary: node.secondary.map((e) => ({\n ...e,\n entry: pushSpecOverrideDown(e.entry, overrides),\n })),\n };\n }\n\n // case \"outerJoin\":\n // return {\n // ...node,\n // primary: {\n // ...node.primary,\n // entry: pushSpecOverrideDown(node.primary.entry, overrides),\n // },\n // secondary: node.secondary.map((e) => ({\n // ...e,\n // entry: pushSpecOverrideDown(e.entry, overrides),\n // })),\n // };\n\n // case \"innerJoin\":\n // case \"fullJoin\":\n // case \"symmetricJoin\":\n // return {\n // ...node,\n // entries: node.entries.map((e) => ({\n // ...e,\n // entry: pushSpecOverrideDown(e.entry, overrides),\n // })),\n // };\n\n case \"sliceAxes\": {\n // axesSpec patches are positional against the slice OUTPUT axes (the\n // recipe-layer spec the consumer sees), but the inner input still\n // carries the full pre-slice axes list. Translate outer indices to\n // inner indices before pushing the override down.\n //\n // Non-axesSpec overrides (domain / contextDomain / annotations) are\n // column-level and pass through transparently.\n if (overrides.axesSpec === undefined || Object.keys(overrides.axesSpec).length === 0) {\n return { ...node, input: pushSpecOverrideDown(node.input, overrides) };\n }\n\n const innerAxes = effectiveAxesSpec(node.input);\n if (innerAxes === undefined) {\n throw new Error(\n `specOverride over sliceAxes: cannot translate axesSpec — ` +\n `inner shape unknown for input type \"${node.input.type}\"`,\n );\n }\n\n const filteredInnerIdxs = new Set<number>();\n for (const filter of node.axisFilters) {\n const idx = innerAxes.findIndex((a) => matchAxis(filter.axisSelector, a));\n if (idx < 0) {\n throw new Error(\n `specOverride over sliceAxes: filter selector ` +\n `${JSON.stringify(filter.axisSelector)} not found in inner axes`,\n );\n }\n filteredInnerIdxs.add(idx);\n }\n\n // outer index j (post-slice) ↔ inner index = j-th surviving position.\n const outerToInner: number[] = [];\n for (let i = 0; i < innerAxes.length; i++) {\n if (!filteredInnerIdxs.has(i)) outerToInner.push(i);\n }\n\n const translated: AxisPatches = {};\n for (const [outerKey, patch] of Object.entries(overrides.axesSpec)) {\n const outerIdx = Number(outerKey);\n const innerIdx = outerToInner[outerIdx];\n if (innerIdx === undefined) {\n throw new Error(\n `specOverride over sliceAxes: outer axesSpec index ${outerIdx} ` +\n `out of range (slice output has ${outerToInner.length} axes)`,\n );\n }\n translated[innerIdx] = patch;\n }\n\n const translatedOverrides: SpecOverrides = { ...overrides, axesSpec: translated };\n return { ...node, input: pushSpecOverrideDown(node.input, translatedOverrides) };\n }\n\n // // Transparent transforms — passthrough.\n // case \"sort\":\n // case \"filter\":\n // case \"transformColumns\":\n // return { ...node, input: pushSpecOverrideDown(node.input, overrides) };\n\n // // Synthetic leaves — patch the spec carrier they expose, or\n // // throw if the node has no natural place to absorb overrides.\n // case \"inlineColumn\":\n // return {\n // ...node,\n // column: { ...node.column, spec: applySpecOverrides(node.column.spec, overrides) },\n // };\n\n // case \"sparseToDenseColumn\":\n // // Same idea: patch the new dense column's spec carrier.\n // return {\n // ...node,\n // newSpec: applySpecOverrides(node.newSpec, overrides),\n // };\n\n default:\n throw new Error(\n `specOverride: inner node \"${node.type}\" is not supported yet — ` +\n \"only column / linkerJoin can carry an override \" +\n \"(pframe-engine support for the rest is in progress)\",\n );\n }\n}\n\n/**\n * Effective post-traversal {@link AxesSpec} of a {@link Node} — used to\n * translate positional axesSpec patches across structural nodes whose\n * indexing differs from their input (currently only `sliceAxes`).\n *\n * Returns `undefined` when the node shape is not introspectable here.\n * Callers must then refuse axesSpec translation and surface a clear error,\n * rather than silently mis-targeting indices.\n */\nfunction effectiveAxesSpec(node: Node): AxesSpec | undefined {\n switch (node.type) {\n case \"column\":\n return node.column.spec.axesSpec;\n\n case \"linkerJoin\":\n // Output axes equal the secondary side's axes (linker side drops out).\n // All secondary entries share the same axis identity post-join — read\n // the first one.\n return node.secondary.length === 0 ? undefined : effectiveAxesSpec(node.secondary[0].entry);\n\n case \"sliceAxes\": {\n const inner = effectiveAxesSpec(node.input);\n if (inner === undefined) return undefined;\n const filtered = new Set<number>();\n for (const f of node.axisFilters) {\n const i = inner.findIndex((a) => matchAxis(f.axisSelector, a));\n if (i >= 0) filtered.add(i);\n }\n return inner.filter((_, i) => !filtered.has(i));\n }\n\n default:\n return undefined;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"spec_override_collapse.cjs","names":["applySpecOverrides","matchAxis"],"sources":["../../src/js_render/spec_override_collapse.ts"],"sourcesContent":["import type { PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type { DataInfo, PColumn, PColumnValues } from \"@platforma-sdk/model\";\nimport { applySpecOverrides, matchAxis } from \"@milaboratories/pl-model-common\";\nimport type {\n AxesSpec,\n AxisPatches,\n SpecOverrides,\n SpecQuery,\n} from \"@milaboratories/pl-model-common\";\n\ntype Leaf = PColumn<PlTreeNodeAccessor | PColumnValues | DataInfo<PlTreeNodeAccessor>>;\ntype Node = SpecQuery<Leaf>;\n\n/**\n * Collapse the client-side `specOverride` query node at the host boundary —\n * pframe-engine never sees it. The override is pushed down through the\n * subtree until it lands on `column`-leaf nodes, where it is folded into\n * the leaf's spec via {@link applySpecOverrides}. Intermediate join nodes\n * are left untouched — pframe-engine will recompute their result spec\n * from the patched leaves.\n *\n * Designed to run as the `node` visitor in `mapPTableDefV2` (post-order),\n * so by the time we see a `specOverride` its inner subtree is already\n * mapped to {@link PColumn} leaves.\n *\n * Currently only `column` and `linkerJoin` are walked. Other node shapes\n * under `specOverride` throw — pframe-engine support for them is still\n * in progress. Extend the switch in {@link pushSpecOverrideDown} as more\n * shapes become needed.\n */\nexport function collapseSpecOverrideNode(node: Node): Node {\n if (node.type !== \"specOverride\") return node;\n return pushSpecOverrideDown(node.input, node.override);\n}\n\nfunction pushSpecOverrideDown(node: Node, overrides: SpecOverrides): Node {\n switch (node.type) {\n case \"column\":\n return {\n type: \"column\",\n column: { ...node.column, spec: applySpecOverrides(node.column.spec, overrides) },\n };\n\n case \"linkerJoin\": {\n // `axesSpec` patches are positional against the linkerJoin's OUTPUT axes,\n // which equal the secondary side's axes (ColumnDiscoveredRecipe emits the\n // hit on the many-side of the linker). Route axesSpec only into secondary;\n // applying the same positional indices to the linker would silently\n // mis-target the linker's own axes.\n //\n // Non-axesSpec patches (domain / contextDomain / annotations) are\n // column-level and not positional — keep the existing both-sides walk.\n const { axesSpec: _axesSpec, ...nonAxesOverrides } = overrides;\n const hasNonAxes =\n nonAxesOverrides.domain !== undefined ||\n nonAxesOverrides.contextDomain !== undefined ||\n nonAxesOverrides.annotations !== undefined;\n return {\n ...node,\n linker: hasNonAxes ? pushSpecOverrideDown(node.linker, nonAxesOverrides) : node.linker,\n secondary: node.secondary.map((e) => ({\n ...e,\n entry: pushSpecOverrideDown(e.entry, overrides),\n })),\n };\n }\n\n // case \"outerJoin\":\n // return {\n // ...node,\n // primary: {\n // ...node.primary,\n // entry: pushSpecOverrideDown(node.primary.entry, overrides),\n // },\n // secondary: node.secondary.map((e) => ({\n // ...e,\n // entry: pushSpecOverrideDown(e.entry, overrides),\n // })),\n // };\n\n // case \"innerJoin\":\n // case \"fullJoin\":\n // case \"symmetricJoin\":\n // return {\n // ...node,\n // entries: node.entries.map((e) => ({\n // ...e,\n // entry: pushSpecOverrideDown(e.entry, overrides),\n // })),\n // };\n\n case \"sliceAxes\": {\n // axesSpec patches are positional against the slice OUTPUT axes (the\n // recipe-layer spec the consumer sees), but the inner input still\n // carries the full pre-slice axes list. Translate outer indices to\n // inner indices before pushing the override down.\n //\n // Non-axesSpec overrides (domain / contextDomain / annotations) are\n // column-level and pass through transparently.\n if (overrides.axesSpec === undefined || Object.keys(overrides.axesSpec).length === 0) {\n return { ...node, input: pushSpecOverrideDown(node.input, overrides) };\n }\n\n const innerAxes = effectiveAxesSpec(node.input);\n if (innerAxes === undefined) {\n throw new Error(\n `specOverride over sliceAxes: cannot translate axesSpec — ` +\n `inner shape unknown for input type \"${node.input.type}\"`,\n );\n }\n\n const filteredInnerIdxs = new Set<number>();\n for (const filter of node.axisFilters) {\n const idx = innerAxes.findIndex((a) => matchAxis(filter.axisSelector, a));\n if (idx < 0) {\n throw new Error(\n `specOverride over sliceAxes: filter selector ` +\n `${JSON.stringify(filter.axisSelector)} not found in inner axes`,\n );\n }\n filteredInnerIdxs.add(idx);\n }\n\n // outer index j (post-slice) ↔ inner index = j-th surviving position.\n const outerToInner: number[] = [];\n for (let i = 0; i < innerAxes.length; i++) {\n if (!filteredInnerIdxs.has(i)) outerToInner.push(i);\n }\n\n const translated: AxisPatches = {};\n for (const [outerKey, patch] of Object.entries(overrides.axesSpec)) {\n const outerIdx = Number(outerKey);\n const innerIdx = outerToInner[outerIdx];\n if (innerIdx === undefined) {\n throw new Error(\n `specOverride over sliceAxes: outer axesSpec index ${outerIdx} ` +\n `out of range (slice output has ${outerToInner.length} axes)`,\n );\n }\n translated[innerIdx] = patch;\n }\n\n const translatedOverrides: SpecOverrides = { ...overrides, axesSpec: translated };\n return { ...node, input: pushSpecOverrideDown(node.input, translatedOverrides) };\n }\n\n // // Transparent transforms — passthrough.\n // case \"sort\":\n // case \"filter\":\n // case \"transformColumns\":\n // return { ...node, input: pushSpecOverrideDown(node.input, overrides) };\n\n // // Synthetic leaves — patch the spec carrier they expose, or\n // // throw if the node has no natural place to absorb overrides.\n // case \"inlineColumn\":\n // return {\n // ...node,\n // column: { ...node.column, spec: applySpecOverrides(node.column.spec, overrides) },\n // };\n\n // case \"sparseToDenseColumn\":\n // // Same idea: patch the new dense column's spec carrier.\n // return {\n // ...node,\n // newSpec: applySpecOverrides(node.newSpec, overrides),\n // };\n\n default:\n throw new Error(\n `specOverride: inner node \"${node.type}\" is not supported yet — ` +\n \"only column / linkerJoin can carry an override \" +\n \"(pframe-engine support for the rest is in progress)\",\n );\n }\n}\n\n/**\n * Effective post-traversal {@link AxesSpec} of a {@link Node} — used to\n * translate positional axesSpec patches across structural nodes whose\n * indexing differs from their input (currently only `sliceAxes`).\n *\n * Returns `undefined` when the node shape is not introspectable here.\n * Callers must then refuse axesSpec translation and surface a clear error,\n * rather than silently mis-targeting indices.\n */\nfunction effectiveAxesSpec(node: Node): AxesSpec | undefined {\n switch (node.type) {\n case \"column\":\n return node.column.spec.axesSpec;\n\n case \"linkerJoin\":\n // Output axes equal the secondary side's axes (linker side drops out).\n // All secondary entries share the same axis identity post-join — read\n // the first one.\n return node.secondary.length === 0 ? undefined : effectiveAxesSpec(node.secondary[0].entry);\n\n case \"sliceAxes\": {\n const inner = effectiveAxesSpec(node.input);\n if (inner === undefined) return undefined;\n const filtered = new Set<number>();\n for (const f of node.axisFilters) {\n const i = inner.findIndex((a) => matchAxis(f.axisSelector, a));\n if (i >= 0) filtered.add(i);\n }\n return inner.filter((_, i) => !filtered.has(i));\n }\n\n default:\n return undefined;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { applySpecOverrides, matchAxis } from "@milaboratories/pl-model-common";
|
|
2
|
-
|
|
2
|
+
// src/js_render/spec_override_collapse.ts
|
|
3
3
|
/**
|
|
4
4
|
* Collapse the client-side `specOverride` query node at the host boundary —
|
|
5
5
|
* pframe-engine never sees it. The override is pushed down through the
|
|
@@ -102,7 +102,6 @@ function effectiveAxesSpec(node) {
|
|
|
102
102
|
default: return;
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
|
-
//#endregion
|
|
106
105
|
export { collapseSpecOverrideNode };
|
|
107
106
|
|
|
108
107
|
//# sourceMappingURL=spec_override_collapse.js.map
|
|
@@ -6,7 +6,7 @@ const require_util = require("./util.cjs");
|
|
|
6
6
|
let _platforma_sdk_model = require("@platforma-sdk/model");
|
|
7
7
|
let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
|
|
8
8
|
let _milaboratories_computable = require("@milaboratories/computable");
|
|
9
|
-
|
|
9
|
+
// src/middle_layer/active_cfg.ts
|
|
10
10
|
/** Returns derived general project state form the project resource */
|
|
11
11
|
function activeConfigs(prjEntry, env) {
|
|
12
12
|
return _milaboratories_computable.Computable.make((ctx) => {
|
|
@@ -26,7 +26,6 @@ function activeConfigs(prjEntry, env) {
|
|
|
26
26
|
return ret;
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
|
-
//#endregion
|
|
30
29
|
exports.activeConfigs = activeConfigs;
|
|
31
30
|
|
|
32
31
|
//# sourceMappingURL=active_cfg.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active_cfg.cjs","names":["Computable","ProjectStructureKey","allBlocks","getBlockPackInfo","isActive","constructBlockContext","computableFromCfgOrRF"],"sources":["../../src/middle_layer/active_cfg.ts"],"sourcesContent":["import { notEmpty } from \"@milaboratories/ts-helpers\";\nimport type { PlTreeEntry } from \"@milaboratories/pl-tree\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport { Computable } from \"@milaboratories/computable\";\nimport type { ProjectStructure } from \"../model/project_model\";\nimport { ProjectStructureKey } from \"../model/project_model\";\nimport { allBlocks } from \"../model/project_model_util\";\nimport { constructBlockContext } from \"./block_ctx\";\nimport { computableFromCfgOrRF, isActive } from \"./render\";\nimport { getBlockPackInfo } from \"./util\";\nimport { extractCodeWithInfo, wrapCallback } from \"@platforma-sdk/model\";\n\n/** Returns derived general project state form the project resource */\nexport function activeConfigs(\n prjEntry: PlTreeEntry,\n env: MiddleLayerEnvironment,\n): Computable<unknown[]> {\n return Computable.make((ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const ret: Computable<unknown>[] = [];\n for (const { id } of allBlocks(structure)) {\n const bp = getBlockPackInfo(prj, id);\n if (bp === undefined) continue;\n\n const codeWithInfoOrError = wrapCallback(() => extractCodeWithInfo(bp.cfg));\n if (codeWithInfoOrError.error) continue;\n\n const activeOutputConfigs = Object.entries(bp.cfg.outputs)\n .map(([, cfg]) => cfg)\n .filter((cfg) => isActive(cfg))\n .map((cfg) => cfg);\n\n if (activeOutputConfigs.length === 0) continue;\n\n const blockCtx = constructBlockContext(prj.persist(), id);\n\n for (const cfg of activeOutputConfigs) {\n ret.push(\n Computable.wrapError(\n computableFromCfgOrRF(\n env,\n blockCtx,\n cfg,\n codeWithInfoOrError.value,\n bp.bpId,\n {},\n bp.info.source,\n ),\n ),\n );\n }\n }\n\n return ret;\n });\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAgB,cACd,UACA,KACuB;CACvB,OAAOA,2BAAAA,WAAW,MAAM,QAAQ;EAC9B,MAAM,MAAM,IAAI,SAAS,QAAQ,CAAC,CAAC,KAAK;EAExC,MAAM,aAAA,
|
|
1
|
+
{"version":3,"file":"active_cfg.cjs","names":["Computable","notEmpty","ProjectStructureKey","allBlocks","getBlockPackInfo","wrapCallback","extractCodeWithInfo","isActive","constructBlockContext","computableFromCfgOrRF"],"sources":["../../src/middle_layer/active_cfg.ts"],"sourcesContent":["import { notEmpty } from \"@milaboratories/ts-helpers\";\nimport type { PlTreeEntry } from \"@milaboratories/pl-tree\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport { Computable } from \"@milaboratories/computable\";\nimport type { ProjectStructure } from \"../model/project_model\";\nimport { ProjectStructureKey } from \"../model/project_model\";\nimport { allBlocks } from \"../model/project_model_util\";\nimport { constructBlockContext } from \"./block_ctx\";\nimport { computableFromCfgOrRF, isActive } from \"./render\";\nimport { getBlockPackInfo } from \"./util\";\nimport { extractCodeWithInfo, wrapCallback } from \"@platforma-sdk/model\";\n\n/** Returns derived general project state form the project resource */\nexport function activeConfigs(\n prjEntry: PlTreeEntry,\n env: MiddleLayerEnvironment,\n): Computable<unknown[]> {\n return Computable.make((ctx) => {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const ret: Computable<unknown>[] = [];\n for (const { id } of allBlocks(structure)) {\n const bp = getBlockPackInfo(prj, id);\n if (bp === undefined) continue;\n\n const codeWithInfoOrError = wrapCallback(() => extractCodeWithInfo(bp.cfg));\n if (codeWithInfoOrError.error) continue;\n\n const activeOutputConfigs = Object.entries(bp.cfg.outputs)\n .map(([, cfg]) => cfg)\n .filter((cfg) => isActive(cfg))\n .map((cfg) => cfg);\n\n if (activeOutputConfigs.length === 0) continue;\n\n const blockCtx = constructBlockContext(prj.persist(), id);\n\n for (const cfg of activeOutputConfigs) {\n ret.push(\n Computable.wrapError(\n computableFromCfgOrRF(\n env,\n blockCtx,\n cfg,\n codeWithInfoOrError.value,\n bp.bpId,\n {},\n bp.info.source,\n ),\n ),\n );\n }\n }\n\n return ret;\n });\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAgB,cACd,UACA,KACuB;CACvB,OAAOA,2BAAAA,WAAW,MAAM,QAAQ;EAC9B,MAAM,MAAM,IAAI,SAAS,QAAQ,CAAC,CAAC,KAAK;EAExC,MAAM,aAAA,GAAYC,2BAAAA,SAAAA,CAAS,IAAI,kBAAoCC,sBAAAA,mBAAmB,CAAC;EACvF,MAAM,MAA6B,CAAC;EACpC,KAAK,MAAM,EAAE,QAAQC,2BAAAA,UAAU,SAAS,GAAG;GACzC,MAAM,KAAKC,aAAAA,iBAAiB,KAAK,EAAE;GACnC,IAAI,OAAO,KAAA,GAAW;GAEtB,MAAM,uBAAA,GAAsBC,qBAAAA,aAAAA,QAAAA,GAAmBC,qBAAAA,oBAAAA,CAAoB,GAAG,GAAG,CAAC;GAC1E,IAAI,oBAAoB,OAAO;GAE/B,MAAM,sBAAsB,OAAO,QAAQ,GAAG,IAAI,OAAO,CAAC,CACvD,KAAK,GAAG,SAAS,GAAG,CAAC,CACrB,QAAQ,QAAQC,eAAAA,SAAS,GAAG,CAAC,CAAC,CAC9B,KAAK,QAAQ,GAAG;GAEnB,IAAI,oBAAoB,WAAW,GAAG;GAEtC,MAAM,WAAWC,kBAAAA,sBAAsB,IAAI,QAAQ,GAAG,EAAE;GAExD,KAAK,MAAM,OAAO,qBAChB,IAAI,KACFR,2BAAAA,WAAW,UACTS,eAAAA,sBACE,KACA,UACA,KACA,oBAAoB,OACpB,GAAG,MACH,CAAC,GACD,GAAG,KAAK,MACV,CACF,CACF;EAEJ;EAEA,OAAO;CACT,CAAC;AACH"}
|
|
@@ -6,7 +6,7 @@ import { getBlockPackInfo } from "./util.js";
|
|
|
6
6
|
import { extractCodeWithInfo, wrapCallback } from "@platforma-sdk/model";
|
|
7
7
|
import { notEmpty } from "@milaboratories/ts-helpers";
|
|
8
8
|
import { Computable } from "@milaboratories/computable";
|
|
9
|
-
|
|
9
|
+
// src/middle_layer/active_cfg.ts
|
|
10
10
|
/** Returns derived general project state form the project resource */
|
|
11
11
|
function activeConfigs(prjEntry, env) {
|
|
12
12
|
return Computable.make((ctx) => {
|
|
@@ -26,7 +26,6 @@ function activeConfigs(prjEntry, env) {
|
|
|
26
26
|
return ret;
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
|
-
//#endregion
|
|
30
29
|
export { activeConfigs };
|
|
31
30
|
|
|
32
31
|
//# sourceMappingURL=active_cfg.js.map
|
|
@@ -8,7 +8,7 @@ let _platforma_sdk_model = require("@platforma-sdk/model");
|
|
|
8
8
|
let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
|
|
9
9
|
let _milaboratories_pl_client = require("@milaboratories/pl-client");
|
|
10
10
|
let _milaboratories_computable = require("@milaboratories/computable");
|
|
11
|
-
|
|
11
|
+
// src/middle_layer/block.ts
|
|
12
12
|
function getBlockParameters(projectEntry, blockId, cCtx) {
|
|
13
13
|
if (cCtx === void 0) return _milaboratories_computable.Computable.make((c) => getBlockParameters(projectEntry, blockId, c), { key: `inputs#${(0, _milaboratories_pl_client.resourceIdToString)(projectEntry.rid)}#${blockId}` });
|
|
14
14
|
const prj = cCtx.accessor(projectEntry).node();
|
|
@@ -35,7 +35,6 @@ function blockOutputs(projectEntry, blockId, env) {
|
|
|
35
35
|
});
|
|
36
36
|
}, { key }).withStableType();
|
|
37
37
|
}
|
|
38
|
-
//#endregion
|
|
39
38
|
exports.blockOutputs = blockOutputs;
|
|
40
39
|
exports.getBlockParameters = getBlockParameters;
|
|
41
40
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block.cjs","names":["Computable","constructBlockContextArgsOnly","blockArgsAuthorKey","getDebugFlags","constructBlockContext","ifNotUndef","getBlockPackInfo","computableFromCfgOrRF"],"sources":["../../src/middle_layer/block.ts"],"sourcesContent":["import type { PlTreeEntry } from \"@milaboratories/pl-tree\";\nimport type {\n ComputableCtx,\n ComputableStableDefined,\n ComputableValueOrErrors,\n} from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport { constructBlockContext, constructBlockContextArgsOnly } from \"./block_ctx\";\nimport { blockArgsAuthorKey } from \"../model/project_model\";\nimport { ifNotUndef } from \"../cfg_render/util\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport { getBlockPackInfo } from \"./util\";\nimport type { AuthorMarker, BlockStateInternalV3 } from \"@milaboratories/pl-model-middle-layer\";\nimport { computableFromCfgOrRF } from \"./render\";\nimport { resourceIdToString } from \"@milaboratories/pl-client\";\nimport { deepFreeze } from \"@milaboratories/ts-helpers\";\nimport { extractCodeWithInfo } from \"@platforma-sdk/model\";\nimport { getDebugFlags } from \"../debug\";\n\nexport type BlockParameters = Omit<BlockStateInternalV3, \"outputs\" | \"navigationState\">;\n\nexport function getBlockParameters(\n projectEntry: PlTreeEntry,\n blockId: string,\n): Computable<BlockParameters>;\nexport function getBlockParameters(\n projectEntry: PlTreeEntry,\n blockId: string,\n cCtx: ComputableCtx,\n): BlockParameters;\nexport function getBlockParameters(\n projectEntry: PlTreeEntry,\n blockId: string,\n cCtx?: ComputableCtx,\n): BlockParameters | Computable<BlockParameters> {\n if (cCtx === undefined)\n return Computable.make((c) => getBlockParameters(projectEntry, blockId, c), {\n key: `inputs#${resourceIdToString(projectEntry.rid)}#${blockId}`,\n });\n\n const prj = cCtx.accessor(projectEntry).node();\n const ctx = constructBlockContextArgsOnly(projectEntry, blockId);\n const blockStorageJson = ctx.blockStorage(cCtx);\n // Parse raw storage JSON - UI will derive data using sdk/model\n const blockStorage =\n blockStorageJson !== undefined ? deepFreeze(JSON.parse(blockStorageJson)) : undefined;\n return {\n author: prj.getKeyValueAsJson<AuthorMarker>(blockArgsAuthorKey(blockId)),\n blockStorage,\n };\n}\n\nexport function blockOutputs(\n projectEntry: PlTreeEntry,\n blockId: string,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<Record<string, ComputableValueOrErrors<unknown>>> {\n const key = \"outputs#\" + resourceIdToString(projectEntry.rid) + \"#\" + blockId;\n return Computable.make(\n (c) => {\n if (getDebugFlags().logOutputRecalculations) {\n console.log(\n `blockOutput recalculation : ${key} (${c.changeSourceMarker}; ${c.bodyInvocations} invocations)`,\n );\n }\n\n const prj = c.accessor(projectEntry).node();\n const ctx = constructBlockContext(projectEntry, blockId);\n\n return ifNotUndef(getBlockPackInfo(prj, blockId), ({ cfg, bpId, info }) => {\n const outputs: Record<string, Computable<any>> = {};\n for (const [cellId, cellCfg] of Object.entries(cfg.outputs)) {\n const computableOutput = computableFromCfgOrRF(\n env,\n ctx,\n cellCfg,\n extractCodeWithInfo(cfg),\n bpId,\n {},\n info.source,\n );\n outputs[cellId] = Computable.wrapError(computableOutput, 1);\n }\n return outputs;\n });\n },\n { key },\n ).withStableType();\n}\n"],"mappings":";;;;;;;;;;;AA8BA,SAAgB,mBACd,cACA,SACA,MAC+C;CAC/C,IAAI,SAAS,KAAA,GACX,OAAOA,2BAAAA,WAAW,MAAM,MAAM,mBAAmB,cAAc,SAAS,CAAC,GAAG,EAC1E,KAAK,WAAA,
|
|
1
|
+
{"version":3,"file":"block.cjs","names":["Computable","resourceIdToString","constructBlockContextArgsOnly","deepFreeze","blockArgsAuthorKey","getDebugFlags","constructBlockContext","ifNotUndef","getBlockPackInfo","computableFromCfgOrRF","extractCodeWithInfo"],"sources":["../../src/middle_layer/block.ts"],"sourcesContent":["import type { PlTreeEntry } from \"@milaboratories/pl-tree\";\nimport type {\n ComputableCtx,\n ComputableStableDefined,\n ComputableValueOrErrors,\n} from \"@milaboratories/computable\";\nimport { Computable } from \"@milaboratories/computable\";\nimport { constructBlockContext, constructBlockContextArgsOnly } from \"./block_ctx\";\nimport { blockArgsAuthorKey } from \"../model/project_model\";\nimport { ifNotUndef } from \"../cfg_render/util\";\nimport type { MiddleLayerEnvironment } from \"./middle_layer\";\nimport { getBlockPackInfo } from \"./util\";\nimport type { AuthorMarker, BlockStateInternalV3 } from \"@milaboratories/pl-model-middle-layer\";\nimport { computableFromCfgOrRF } from \"./render\";\nimport { resourceIdToString } from \"@milaboratories/pl-client\";\nimport { deepFreeze } from \"@milaboratories/ts-helpers\";\nimport { extractCodeWithInfo } from \"@platforma-sdk/model\";\nimport { getDebugFlags } from \"../debug\";\n\nexport type BlockParameters = Omit<BlockStateInternalV3, \"outputs\" | \"navigationState\">;\n\nexport function getBlockParameters(\n projectEntry: PlTreeEntry,\n blockId: string,\n): Computable<BlockParameters>;\nexport function getBlockParameters(\n projectEntry: PlTreeEntry,\n blockId: string,\n cCtx: ComputableCtx,\n): BlockParameters;\nexport function getBlockParameters(\n projectEntry: PlTreeEntry,\n blockId: string,\n cCtx?: ComputableCtx,\n): BlockParameters | Computable<BlockParameters> {\n if (cCtx === undefined)\n return Computable.make((c) => getBlockParameters(projectEntry, blockId, c), {\n key: `inputs#${resourceIdToString(projectEntry.rid)}#${blockId}`,\n });\n\n const prj = cCtx.accessor(projectEntry).node();\n const ctx = constructBlockContextArgsOnly(projectEntry, blockId);\n const blockStorageJson = ctx.blockStorage(cCtx);\n // Parse raw storage JSON - UI will derive data using sdk/model\n const blockStorage =\n blockStorageJson !== undefined ? deepFreeze(JSON.parse(blockStorageJson)) : undefined;\n return {\n author: prj.getKeyValueAsJson<AuthorMarker>(blockArgsAuthorKey(blockId)),\n blockStorage,\n };\n}\n\nexport function blockOutputs(\n projectEntry: PlTreeEntry,\n blockId: string,\n env: MiddleLayerEnvironment,\n): ComputableStableDefined<Record<string, ComputableValueOrErrors<unknown>>> {\n const key = \"outputs#\" + resourceIdToString(projectEntry.rid) + \"#\" + blockId;\n return Computable.make(\n (c) => {\n if (getDebugFlags().logOutputRecalculations) {\n console.log(\n `blockOutput recalculation : ${key} (${c.changeSourceMarker}; ${c.bodyInvocations} invocations)`,\n );\n }\n\n const prj = c.accessor(projectEntry).node();\n const ctx = constructBlockContext(projectEntry, blockId);\n\n return ifNotUndef(getBlockPackInfo(prj, blockId), ({ cfg, bpId, info }) => {\n const outputs: Record<string, Computable<any>> = {};\n for (const [cellId, cellCfg] of Object.entries(cfg.outputs)) {\n const computableOutput = computableFromCfgOrRF(\n env,\n ctx,\n cellCfg,\n extractCodeWithInfo(cfg),\n bpId,\n {},\n info.source,\n );\n outputs[cellId] = Computable.wrapError(computableOutput, 1);\n }\n return outputs;\n });\n },\n { key },\n ).withStableType();\n}\n"],"mappings":";;;;;;;;;;;AA8BA,SAAgB,mBACd,cACA,SACA,MAC+C;CAC/C,IAAI,SAAS,KAAA,GACX,OAAOA,2BAAAA,WAAW,MAAM,MAAM,mBAAmB,cAAc,SAAS,CAAC,GAAG,EAC1E,KAAK,WAAA,GAAUC,0BAAAA,mBAAAA,CAAmB,aAAa,GAAG,EAAE,GAAG,UACzD,CAAC;CAEH,MAAM,MAAM,KAAK,SAAS,YAAY,CAAC,CAAC,KAAK;CAE7C,MAAM,mBADMC,kBAAAA,8BAA8B,cAAc,OAC7B,CAAC,CAAC,aAAa,IAAI;CAE9C,MAAM,eACJ,qBAAqB,KAAA,KAAA,GAAYC,2BAAAA,WAAAA,CAAW,KAAK,MAAM,gBAAgB,CAAC,IAAI,KAAA;CAC9E,OAAO;EACL,QAAQ,IAAI,kBAAgCC,sBAAAA,mBAAmB,OAAO,CAAC;EACvE;CACF;AACF;AAEA,SAAgB,aACd,cACA,SACA,KAC2E;CAC3E,MAAM,MAAM,cAAA,GAAaH,0BAAAA,mBAAAA,CAAmB,aAAa,GAAG,IAAI,MAAM;CACtE,OAAOD,2BAAAA,WAAW,MACf,MAAM;EACL,IAAIK,cAAAA,cAAc,CAAC,CAAC,yBAClB,QAAQ,IACN,+BAA+B,IAAI,IAAI,EAAE,mBAAmB,IAAI,EAAE,gBAAgB,cACpF;EAGF,MAAM,MAAM,EAAE,SAAS,YAAY,CAAC,CAAC,KAAK;EAC1C,MAAM,MAAMC,kBAAAA,sBAAsB,cAAc,OAAO;EAEvD,OAAOC,aAAAA,WAAWC,eAAAA,iBAAiB,KAAK,OAAO,IAAI,EAAE,KAAK,MAAM,WAAW;GACzE,MAAM,UAA2C,CAAC;GAClD,KAAK,MAAM,CAAC,QAAQ,YAAY,OAAO,QAAQ,IAAI,OAAO,GAAG;IAC3D,MAAM,mBAAmBC,eAAAA,sBACvB,KACA,KACA,UAAA,GACAC,qBAAAA,oBAAAA,CAAoB,GAAG,GACvB,MACA,CAAC,GACD,KAAK,MACP;IACA,QAAQ,UAAUV,2BAAAA,WAAW,UAAU,kBAAkB,CAAC;GAC5D;GACA,OAAO;EACT,CAAC;CACH,GACA,EAAE,IAAI,CACR,CAAC,CAAC,eAAe;AACnB"}
|
|
@@ -8,7 +8,7 @@ import { extractCodeWithInfo } from "@platforma-sdk/model";
|
|
|
8
8
|
import { deepFreeze } from "@milaboratories/ts-helpers";
|
|
9
9
|
import { resourceIdToString } from "@milaboratories/pl-client";
|
|
10
10
|
import { Computable } from "@milaboratories/computable";
|
|
11
|
-
|
|
11
|
+
// src/middle_layer/block.ts
|
|
12
12
|
function getBlockParameters(projectEntry, blockId, cCtx) {
|
|
13
13
|
if (cCtx === void 0) return Computable.make((c) => getBlockParameters(projectEntry, blockId, c), { key: `inputs#${resourceIdToString(projectEntry.rid)}#${blockId}` });
|
|
14
14
|
const prj = cCtx.accessor(projectEntry).node();
|
|
@@ -35,7 +35,6 @@ function blockOutputs(projectEntry, blockId, env) {
|
|
|
35
35
|
});
|
|
36
36
|
}, { key }).withStableType();
|
|
37
37
|
}
|
|
38
|
-
//#endregion
|
|
39
38
|
export { blockOutputs, getBlockParameters };
|
|
40
39
|
|
|
41
40
|
//# sourceMappingURL=block.js.map
|
|
@@ -3,7 +3,7 @@ const require_project_model_util = require("../model/project_model_util.cjs");
|
|
|
3
3
|
const require_result_pool = require("../pool/result_pool.cjs");
|
|
4
4
|
let _platforma_sdk_model = require("@platforma-sdk/model");
|
|
5
5
|
let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
|
|
6
|
-
|
|
6
|
+
// src/middle_layer/block_ctx.ts
|
|
7
7
|
function constructBlockContextArgsOnly(projectEntry, blockId) {
|
|
8
8
|
const args = (cCtx) => {
|
|
9
9
|
const data = cCtx.accessor(projectEntry).node().traverse({
|
|
@@ -58,7 +58,8 @@ function constructBlockContextArgsOnly(projectEntry, blockId) {
|
|
|
58
58
|
blockStorage,
|
|
59
59
|
prerunArgs,
|
|
60
60
|
blockMeta: (cCtx) => {
|
|
61
|
-
const
|
|
61
|
+
const prj = cCtx.accessor(projectEntry).node();
|
|
62
|
+
const structure = (0, _milaboratories_ts_helpers.notEmpty)(prj.getKeyValueAsJson(require_project_model.ProjectStructureKey));
|
|
62
63
|
const result = /* @__PURE__ */ new Map();
|
|
63
64
|
for (const block of require_project_model_util.allBlocks(structure)) result.set(block.id, block);
|
|
64
65
|
return result;
|
|
@@ -91,7 +92,6 @@ function constructBlockContext(projectEntry, blockId) {
|
|
|
91
92
|
projectEntry
|
|
92
93
|
};
|
|
93
94
|
}
|
|
94
|
-
//#endregion
|
|
95
95
|
exports.constructBlockContext = constructBlockContext;
|
|
96
96
|
exports.constructBlockContextArgsOnly = constructBlockContextArgsOnly;
|
|
97
97
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_ctx.cjs","names":["projectFieldName","ProjectStructureKey","allBlocks","ResultPool"],"sources":["../../src/middle_layer/block_ctx.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport type { PlTreeEntry } from \"@milaboratories/pl-tree\";\nimport { cachedDecode, notEmpty } from \"@milaboratories/ts-helpers\";\nimport type { Optional } from \"utility-types\";\nimport type { Block, ProjectStructure } from \"../model/project_model\";\nimport { ProjectStructureKey, projectFieldName } from \"../model/project_model\";\nimport { allBlocks } from \"../model/project_model_util\";\nimport { ResultPool } from \"../pool/result_pool\";\nimport { deriveDataFromStorage } from \"@platforma-sdk/model\";\n\nexport type BlockContextArgsOnly = {\n readonly blockId: string;\n readonly args: (cCtx: ComputableCtx) => string | undefined;\n readonly activeArgs: (cCtx: ComputableCtx) => string | undefined;\n readonly blockMeta: (cCtx: ComputableCtx) => Map<string, Block>;\n readonly data: (cCtx: ComputableCtx) => string | undefined;\n readonly blockStorage: (cCtx: ComputableCtx) => string | undefined;\n readonly prerunArgs: (cCtx: ComputableCtx) => string | undefined;\n};\n\nexport type BlockContextFull = BlockContextArgsOnly & {\n readonly prod: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly staging: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly getResultsPool: (cCtx: ComputableCtx) => ResultPool;\n readonly projectEntry: PlTreeEntry;\n};\n\nexport type BlockContextAny = Optional<\n BlockContextFull,\n \"prod\" | \"staging\" | \"getResultsPool\" | \"projectEntry\"\n>;\n\nexport function constructBlockContextArgsOnly(\n projectEntry: PlTreeEntry,\n blockId: string,\n): BlockContextArgsOnly {\n const args = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"currentArgs\"),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n const activeArgs = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"prodArgs\"),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n const data = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"blockStorage\"),\n stableIfNotFound: true,\n })\n ?.getData();\n if (!data) return undefined;\n\n const rawJson = cachedDecode(data);\n if (!rawJson) return undefined;\n\n // Parse to check if it's BlockStorage format\n try {\n const parsed = JSON.parse(rawJson);\n return JSON.stringify(deriveDataFromStorage(parsed));\n } catch (err) {\n console.error(\"Error deriving data from storage\", err);\n return undefined;\n }\n };\n // Returns raw blockStorage JSON - UI derives data using sdk/model\n const blockStorage = (cCtx: ComputableCtx) => {\n const storageData = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"blockStorage\"),\n stableIfNotFound: true,\n })\n ?.getData();\n if (!storageData) return undefined;\n return cachedDecode(storageData);\n };\n const prerunArgs = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"currentPrerunArgs\"),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n return {\n blockId,\n args,\n activeArgs,\n data,\n blockStorage,\n prerunArgs,\n blockMeta: (cCtx: ComputableCtx) => {\n const prj = cCtx.accessor(projectEntry).node();\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const result = new Map<string, Block>();\n for (const block of allBlocks(structure)) result.set(block.id, block);\n return result;\n },\n };\n}\n\nexport function constructBlockContext(\n projectEntry: PlTreeEntry,\n blockId: string,\n): BlockContextFull {\n return {\n ...constructBlockContextArgsOnly(projectEntry, blockId),\n prod: (cCtx: ComputableCtx) => {\n return cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, \"prodOutput\"),\n stableIfNotFound: true,\n ignoreError: true,\n })\n ?.persist();\n },\n staging: (cCtx: ComputableCtx) => {\n // Check if staging is expected (currentPrerunArgs is set)\n // For blocks with failed args derivation, staging will never be rendered\n const hasPrerunArgs =\n cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, \"currentPrerunArgs\"),\n stableIfNotFound: true,\n ignoreError: true,\n }) !== undefined;\n\n const result = cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, \"stagingOutput\"),\n // Only mark stable if staging is NOT expected (no prerunArgs)\n stableIfNotFound: !hasPrerunArgs,\n ignoreError: true,\n })\n ?.persist();\n return result;\n },\n getResultsPool: (cCtx: ComputableCtx) => ResultPool.create(cCtx, projectEntry, blockId),\n projectEntry,\n };\n}\n"],"mappings":";;;;;;AAgCA,SAAgB,8BACd,cACA,SACsB;CACtB,MAAM,QAAQ,SAAwB;EACpC,MAAM,OAAO,KACV,SAAS,YAAY,CAAC,CACtB,KAAK,CAAC,CACN,SAAS;GACR,OAAOA,sBAAAA,iBAAiB,SAAS,aAAa;GAC9C,kBAAkB;EACpB,CAAC,CAAC,EACA,QAAQ;EACZ,OAAO,QAAA,
|
|
1
|
+
{"version":3,"file":"block_ctx.cjs","names":["projectFieldName","cachedDecode","deriveDataFromStorage","notEmpty","ProjectStructureKey","allBlocks","ResultPool"],"sources":["../../src/middle_layer/block_ctx.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport type { PlTreeEntry } from \"@milaboratories/pl-tree\";\nimport { cachedDecode, notEmpty } from \"@milaboratories/ts-helpers\";\nimport type { Optional } from \"utility-types\";\nimport type { Block, ProjectStructure } from \"../model/project_model\";\nimport { ProjectStructureKey, projectFieldName } from \"../model/project_model\";\nimport { allBlocks } from \"../model/project_model_util\";\nimport { ResultPool } from \"../pool/result_pool\";\nimport { deriveDataFromStorage } from \"@platforma-sdk/model\";\n\nexport type BlockContextArgsOnly = {\n readonly blockId: string;\n readonly args: (cCtx: ComputableCtx) => string | undefined;\n readonly activeArgs: (cCtx: ComputableCtx) => string | undefined;\n readonly blockMeta: (cCtx: ComputableCtx) => Map<string, Block>;\n readonly data: (cCtx: ComputableCtx) => string | undefined;\n readonly blockStorage: (cCtx: ComputableCtx) => string | undefined;\n readonly prerunArgs: (cCtx: ComputableCtx) => string | undefined;\n};\n\nexport type BlockContextFull = BlockContextArgsOnly & {\n readonly prod: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly staging: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly getResultsPool: (cCtx: ComputableCtx) => ResultPool;\n readonly projectEntry: PlTreeEntry;\n};\n\nexport type BlockContextAny = Optional<\n BlockContextFull,\n \"prod\" | \"staging\" | \"getResultsPool\" | \"projectEntry\"\n>;\n\nexport function constructBlockContextArgsOnly(\n projectEntry: PlTreeEntry,\n blockId: string,\n): BlockContextArgsOnly {\n const args = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"currentArgs\"),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n const activeArgs = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"prodArgs\"),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n const data = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"blockStorage\"),\n stableIfNotFound: true,\n })\n ?.getData();\n if (!data) return undefined;\n\n const rawJson = cachedDecode(data);\n if (!rawJson) return undefined;\n\n // Parse to check if it's BlockStorage format\n try {\n const parsed = JSON.parse(rawJson);\n return JSON.stringify(deriveDataFromStorage(parsed));\n } catch (err) {\n console.error(\"Error deriving data from storage\", err);\n return undefined;\n }\n };\n // Returns raw blockStorage JSON - UI derives data using sdk/model\n const blockStorage = (cCtx: ComputableCtx) => {\n const storageData = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"blockStorage\"),\n stableIfNotFound: true,\n })\n ?.getData();\n if (!storageData) return undefined;\n return cachedDecode(storageData);\n };\n const prerunArgs = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"currentPrerunArgs\"),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n return {\n blockId,\n args,\n activeArgs,\n data,\n blockStorage,\n prerunArgs,\n blockMeta: (cCtx: ComputableCtx) => {\n const prj = cCtx.accessor(projectEntry).node();\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const result = new Map<string, Block>();\n for (const block of allBlocks(structure)) result.set(block.id, block);\n return result;\n },\n };\n}\n\nexport function constructBlockContext(\n projectEntry: PlTreeEntry,\n blockId: string,\n): BlockContextFull {\n return {\n ...constructBlockContextArgsOnly(projectEntry, blockId),\n prod: (cCtx: ComputableCtx) => {\n return cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, \"prodOutput\"),\n stableIfNotFound: true,\n ignoreError: true,\n })\n ?.persist();\n },\n staging: (cCtx: ComputableCtx) => {\n // Check if staging is expected (currentPrerunArgs is set)\n // For blocks with failed args derivation, staging will never be rendered\n const hasPrerunArgs =\n cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, \"currentPrerunArgs\"),\n stableIfNotFound: true,\n ignoreError: true,\n }) !== undefined;\n\n const result = cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, \"stagingOutput\"),\n // Only mark stable if staging is NOT expected (no prerunArgs)\n stableIfNotFound: !hasPrerunArgs,\n ignoreError: true,\n })\n ?.persist();\n return result;\n },\n getResultsPool: (cCtx: ComputableCtx) => ResultPool.create(cCtx, projectEntry, blockId),\n projectEntry,\n };\n}\n"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { allBlocks } from "../model/project_model_util.js";
|
|
|
3
3
|
import { ResultPool } from "../pool/result_pool.js";
|
|
4
4
|
import { deriveDataFromStorage } from "@platforma-sdk/model";
|
|
5
5
|
import { cachedDecode, notEmpty } from "@milaboratories/ts-helpers";
|
|
6
|
-
|
|
6
|
+
// src/middle_layer/block_ctx.ts
|
|
7
7
|
function constructBlockContextArgsOnly(projectEntry, blockId) {
|
|
8
8
|
const args = (cCtx) => {
|
|
9
9
|
const data = cCtx.accessor(projectEntry).node().traverse({
|
|
@@ -58,7 +58,8 @@ function constructBlockContextArgsOnly(projectEntry, blockId) {
|
|
|
58
58
|
blockStorage,
|
|
59
59
|
prerunArgs,
|
|
60
60
|
blockMeta: (cCtx) => {
|
|
61
|
-
const
|
|
61
|
+
const prj = cCtx.accessor(projectEntry).node();
|
|
62
|
+
const structure = notEmpty(prj.getKeyValueAsJson(ProjectStructureKey));
|
|
62
63
|
const result = /* @__PURE__ */ new Map();
|
|
63
64
|
for (const block of allBlocks(structure)) result.set(block.id, block);
|
|
64
65
|
return result;
|
|
@@ -91,7 +92,6 @@ function constructBlockContext(projectEntry, blockId) {
|
|
|
91
92
|
projectEntry
|
|
92
93
|
};
|
|
93
94
|
}
|
|
94
|
-
//#endregion
|
|
95
95
|
export { constructBlockContext, constructBlockContextArgsOnly };
|
|
96
96
|
|
|
97
97
|
//# sourceMappingURL=block_ctx.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_ctx.js","names":[],"sources":["../../src/middle_layer/block_ctx.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport type { PlTreeEntry } from \"@milaboratories/pl-tree\";\nimport { cachedDecode, notEmpty } from \"@milaboratories/ts-helpers\";\nimport type { Optional } from \"utility-types\";\nimport type { Block, ProjectStructure } from \"../model/project_model\";\nimport { ProjectStructureKey, projectFieldName } from \"../model/project_model\";\nimport { allBlocks } from \"../model/project_model_util\";\nimport { ResultPool } from \"../pool/result_pool\";\nimport { deriveDataFromStorage } from \"@platforma-sdk/model\";\n\nexport type BlockContextArgsOnly = {\n readonly blockId: string;\n readonly args: (cCtx: ComputableCtx) => string | undefined;\n readonly activeArgs: (cCtx: ComputableCtx) => string | undefined;\n readonly blockMeta: (cCtx: ComputableCtx) => Map<string, Block>;\n readonly data: (cCtx: ComputableCtx) => string | undefined;\n readonly blockStorage: (cCtx: ComputableCtx) => string | undefined;\n readonly prerunArgs: (cCtx: ComputableCtx) => string | undefined;\n};\n\nexport type BlockContextFull = BlockContextArgsOnly & {\n readonly prod: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly staging: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly getResultsPool: (cCtx: ComputableCtx) => ResultPool;\n readonly projectEntry: PlTreeEntry;\n};\n\nexport type BlockContextAny = Optional<\n BlockContextFull,\n \"prod\" | \"staging\" | \"getResultsPool\" | \"projectEntry\"\n>;\n\nexport function constructBlockContextArgsOnly(\n projectEntry: PlTreeEntry,\n blockId: string,\n): BlockContextArgsOnly {\n const args = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"currentArgs\"),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n const activeArgs = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"prodArgs\"),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n const data = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"blockStorage\"),\n stableIfNotFound: true,\n })\n ?.getData();\n if (!data) return undefined;\n\n const rawJson = cachedDecode(data);\n if (!rawJson) return undefined;\n\n // Parse to check if it's BlockStorage format\n try {\n const parsed = JSON.parse(rawJson);\n return JSON.stringify(deriveDataFromStorage(parsed));\n } catch (err) {\n console.error(\"Error deriving data from storage\", err);\n return undefined;\n }\n };\n // Returns raw blockStorage JSON - UI derives data using sdk/model\n const blockStorage = (cCtx: ComputableCtx) => {\n const storageData = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"blockStorage\"),\n stableIfNotFound: true,\n })\n ?.getData();\n if (!storageData) return undefined;\n return cachedDecode(storageData);\n };\n const prerunArgs = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"currentPrerunArgs\"),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n return {\n blockId,\n args,\n activeArgs,\n data,\n blockStorage,\n prerunArgs,\n blockMeta: (cCtx: ComputableCtx) => {\n const prj = cCtx.accessor(projectEntry).node();\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const result = new Map<string, Block>();\n for (const block of allBlocks(structure)) result.set(block.id, block);\n return result;\n },\n };\n}\n\nexport function constructBlockContext(\n projectEntry: PlTreeEntry,\n blockId: string,\n): BlockContextFull {\n return {\n ...constructBlockContextArgsOnly(projectEntry, blockId),\n prod: (cCtx: ComputableCtx) => {\n return cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, \"prodOutput\"),\n stableIfNotFound: true,\n ignoreError: true,\n })\n ?.persist();\n },\n staging: (cCtx: ComputableCtx) => {\n // Check if staging is expected (currentPrerunArgs is set)\n // For blocks with failed args derivation, staging will never be rendered\n const hasPrerunArgs =\n cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, \"currentPrerunArgs\"),\n stableIfNotFound: true,\n ignoreError: true,\n }) !== undefined;\n\n const result = cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, \"stagingOutput\"),\n // Only mark stable if staging is NOT expected (no prerunArgs)\n stableIfNotFound: !hasPrerunArgs,\n ignoreError: true,\n })\n ?.persist();\n return result;\n },\n getResultsPool: (cCtx: ComputableCtx) => ResultPool.create(cCtx, projectEntry, blockId),\n projectEntry,\n };\n}\n"],"mappings":";;;;;;AAgCA,SAAgB,8BACd,cACA,SACsB;CACtB,MAAM,QAAQ,SAAwB;EACpC,MAAM,OAAO,KACV,SAAS,YAAY,CAAC,CACtB,KAAK,CAAC,CACN,SAAS;GACR,OAAO,iBAAiB,SAAS,aAAa;GAC9C,kBAAkB;EACpB,CAAC,CAAC,EACA,QAAQ;EACZ,OAAO,OAAO,aAAa,IAAI,IAAI,KAAA;CACrC;CACA,MAAM,cAAc,SAAwB;EAC1C,MAAM,OAAO,KACV,SAAS,YAAY,CAAC,CACtB,KAAK,CAAC,CACN,SAAS;GACR,OAAO,iBAAiB,SAAS,UAAU;GAC3C,kBAAkB;EACpB,CAAC,CAAC,EACA,QAAQ;EACZ,OAAO,OAAO,aAAa,IAAI,IAAI,KAAA;CACrC;CACA,MAAM,QAAQ,SAAwB;EACpC,MAAM,OAAO,KACV,SAAS,YAAY,CAAC,CACtB,KAAK,CAAC,CACN,SAAS;GACR,OAAO,iBAAiB,SAAS,cAAc;GAC/C,kBAAkB;EACpB,CAAC,CAAC,EACA,QAAQ;EACZ,IAAI,CAAC,MAAM,OAAO,KAAA;EAElB,MAAM,UAAU,aAAa,IAAI;EACjC,IAAI,CAAC,SAAS,OAAO,KAAA;EAGrB,IAAI;GACF,MAAM,SAAS,KAAK,MAAM,OAAO;GACjC,OAAO,KAAK,UAAU,sBAAsB,MAAM,CAAC;EACrD,SAAS,KAAK;GACZ,QAAQ,MAAM,oCAAoC,GAAG;GACrD;EACF;CACF;CAEA,MAAM,gBAAgB,SAAwB;EAC5C,MAAM,cAAc,KACjB,SAAS,YAAY,CAAC,CACtB,KAAK,CAAC,CACN,SAAS;GACR,OAAO,iBAAiB,SAAS,cAAc;GAC/C,kBAAkB;EACpB,CAAC,CAAC,EACA,QAAQ;EACZ,IAAI,CAAC,aAAa,OAAO,KAAA;EACzB,OAAO,aAAa,WAAW;CACjC;CACA,MAAM,cAAc,SAAwB;EAC1C,MAAM,OAAO,KACV,SAAS,YAAY,CAAC,CACtB,KAAK,CAAC,CACN,SAAS;GACR,OAAO,iBAAiB,SAAS,mBAAmB;GACpD,kBAAkB;EACpB,CAAC,CAAC,EACA,QAAQ;EACZ,OAAO,OAAO,aAAa,IAAI,IAAI,KAAA;CACrC;CACA,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,YAAY,SAAwB;
|
|
1
|
+
{"version":3,"file":"block_ctx.js","names":[],"sources":["../../src/middle_layer/block_ctx.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport type { PlTreeEntry } from \"@milaboratories/pl-tree\";\nimport { cachedDecode, notEmpty } from \"@milaboratories/ts-helpers\";\nimport type { Optional } from \"utility-types\";\nimport type { Block, ProjectStructure } from \"../model/project_model\";\nimport { ProjectStructureKey, projectFieldName } from \"../model/project_model\";\nimport { allBlocks } from \"../model/project_model_util\";\nimport { ResultPool } from \"../pool/result_pool\";\nimport { deriveDataFromStorage } from \"@platforma-sdk/model\";\n\nexport type BlockContextArgsOnly = {\n readonly blockId: string;\n readonly args: (cCtx: ComputableCtx) => string | undefined;\n readonly activeArgs: (cCtx: ComputableCtx) => string | undefined;\n readonly blockMeta: (cCtx: ComputableCtx) => Map<string, Block>;\n readonly data: (cCtx: ComputableCtx) => string | undefined;\n readonly blockStorage: (cCtx: ComputableCtx) => string | undefined;\n readonly prerunArgs: (cCtx: ComputableCtx) => string | undefined;\n};\n\nexport type BlockContextFull = BlockContextArgsOnly & {\n readonly prod: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly staging: (cCtx: ComputableCtx) => PlTreeEntry | undefined;\n readonly getResultsPool: (cCtx: ComputableCtx) => ResultPool;\n readonly projectEntry: PlTreeEntry;\n};\n\nexport type BlockContextAny = Optional<\n BlockContextFull,\n \"prod\" | \"staging\" | \"getResultsPool\" | \"projectEntry\"\n>;\n\nexport function constructBlockContextArgsOnly(\n projectEntry: PlTreeEntry,\n blockId: string,\n): BlockContextArgsOnly {\n const args = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"currentArgs\"),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n const activeArgs = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"prodArgs\"),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n const data = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"blockStorage\"),\n stableIfNotFound: true,\n })\n ?.getData();\n if (!data) return undefined;\n\n const rawJson = cachedDecode(data);\n if (!rawJson) return undefined;\n\n // Parse to check if it's BlockStorage format\n try {\n const parsed = JSON.parse(rawJson);\n return JSON.stringify(deriveDataFromStorage(parsed));\n } catch (err) {\n console.error(\"Error deriving data from storage\", err);\n return undefined;\n }\n };\n // Returns raw blockStorage JSON - UI derives data using sdk/model\n const blockStorage = (cCtx: ComputableCtx) => {\n const storageData = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"blockStorage\"),\n stableIfNotFound: true,\n })\n ?.getData();\n if (!storageData) return undefined;\n return cachedDecode(storageData);\n };\n const prerunArgs = (cCtx: ComputableCtx) => {\n const data = cCtx\n .accessor(projectEntry)\n .node()\n .traverse({\n field: projectFieldName(blockId, \"currentPrerunArgs\"),\n stableIfNotFound: true,\n })\n ?.getData();\n return data ? cachedDecode(data) : undefined;\n };\n return {\n blockId,\n args,\n activeArgs,\n data,\n blockStorage,\n prerunArgs,\n blockMeta: (cCtx: ComputableCtx) => {\n const prj = cCtx.accessor(projectEntry).node();\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const result = new Map<string, Block>();\n for (const block of allBlocks(structure)) result.set(block.id, block);\n return result;\n },\n };\n}\n\nexport function constructBlockContext(\n projectEntry: PlTreeEntry,\n blockId: string,\n): BlockContextFull {\n return {\n ...constructBlockContextArgsOnly(projectEntry, blockId),\n prod: (cCtx: ComputableCtx) => {\n return cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, \"prodOutput\"),\n stableIfNotFound: true,\n ignoreError: true,\n })\n ?.persist();\n },\n staging: (cCtx: ComputableCtx) => {\n // Check if staging is expected (currentPrerunArgs is set)\n // For blocks with failed args derivation, staging will never be rendered\n const hasPrerunArgs =\n cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, \"currentPrerunArgs\"),\n stableIfNotFound: true,\n ignoreError: true,\n }) !== undefined;\n\n const result = cCtx\n .accessor(projectEntry)\n .node({ ignoreError: true })\n .traverse({\n field: projectFieldName(blockId, \"stagingOutput\"),\n // Only mark stable if staging is NOT expected (no prerunArgs)\n stableIfNotFound: !hasPrerunArgs,\n ignoreError: true,\n })\n ?.persist();\n return result;\n },\n getResultsPool: (cCtx: ComputableCtx) => ResultPool.create(cCtx, projectEntry, blockId),\n projectEntry,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/middle_layer/block_ctx_unsafe.ts
|
|
2
2
|
const NonKeyCtxFields = ["$prod", "$staging"];
|
|
3
3
|
function toCfgContext(ctx) {
|
|
4
4
|
return {
|
|
@@ -19,7 +19,6 @@ function toCfgContext(ctx) {
|
|
|
19
19
|
$staging: ctx.staging
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
|
-
//#endregion
|
|
23
22
|
exports.NonKeyCtxFields = NonKeyCtxFields;
|
|
24
23
|
exports.toCfgContext = toCfgContext;
|
|
25
24
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/middle_layer/block_ctx_unsafe.ts
|
|
2
2
|
const NonKeyCtxFields = ["$prod", "$staging"];
|
|
3
3
|
function toCfgContext(ctx) {
|
|
4
4
|
return {
|
|
@@ -19,7 +19,6 @@ function toCfgContext(ctx) {
|
|
|
19
19
|
$staging: ctx.staging
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
|
-
//#endregion
|
|
23
22
|
export { NonKeyCtxFields, toCfgContext };
|
|
24
23
|
|
|
25
24
|
//# sourceMappingURL=block_ctx_unsafe.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
// src/middle_layer/build_stamp.ts
|
|
2
2
|
function injectedStamp() {
|
|
3
3
|
try {
|
|
4
|
-
return "
|
|
4
|
+
return "817d77011079-dirty-1793282485582";
|
|
5
5
|
} catch {
|
|
6
6
|
return;
|
|
7
7
|
}
|
|
@@ -28,7 +28,6 @@ function injectedStamp() {
|
|
|
28
28
|
* already accepts, and `treeSnapshots: false` or deleting the directory clears it.
|
|
29
29
|
*/
|
|
30
30
|
const ML_BUILD_STAMP = injectedStamp() ?? "sources";
|
|
31
|
-
//#endregion
|
|
32
31
|
exports.ML_BUILD_STAMP = ML_BUILD_STAMP;
|
|
33
32
|
|
|
34
33
|
//# sourceMappingURL=build_stamp.cjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
// src/middle_layer/build_stamp.ts
|
|
2
2
|
function injectedStamp() {
|
|
3
3
|
try {
|
|
4
|
-
return "
|
|
4
|
+
return "817d77011079-dirty-1793282485556";
|
|
5
5
|
} catch {
|
|
6
6
|
return;
|
|
7
7
|
}
|
|
@@ -28,7 +28,6 @@ function injectedStamp() {
|
|
|
28
28
|
* already accepts, and `treeSnapshots: false` or deleting the directory clears it.
|
|
29
29
|
*/
|
|
30
30
|
const ML_BUILD_STAMP = injectedStamp() ?? "sources";
|
|
31
|
-
//#endregion
|
|
32
31
|
export { ML_BUILD_STAMP };
|
|
33
32
|
|
|
34
33
|
//# sourceMappingURL=build_stamp.js.map
|
|
@@ -5,7 +5,7 @@ let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
|
|
|
5
5
|
let _milaboratories_pl_drivers = require("@milaboratories/pl-drivers");
|
|
6
6
|
let _milaboratories_pl_crash_recorder = require("@milaboratories/pl-crash-recorder");
|
|
7
7
|
let _milaboratories_helpers = require("@milaboratories/helpers");
|
|
8
|
-
|
|
8
|
+
// src/middle_layer/driver_kit.ts
|
|
9
9
|
async function initDriverKit(pl, workdir, frontendDownloadPath, _ops) {
|
|
10
10
|
const ops = {
|
|
11
11
|
...require_ops.DefaultDriverKitOpsSettings,
|
|
@@ -59,7 +59,6 @@ async function initDriverKit(pl, workdir, frontendDownloadPath, _ops) {
|
|
|
59
59
|
[Symbol.asyncDispose]: dispose
|
|
60
60
|
};
|
|
61
61
|
}
|
|
62
|
-
//#endregion
|
|
63
62
|
exports.initDriverKit = initDriverKit;
|
|
64
63
|
|
|
65
64
|
//# sourceMappingURL=driver_kit.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver_kit.cjs","names":["DefaultDriverKitOpsSettings","DefaultDriverKitOpsPaths","HmacSha256Signer","DownloadDriver","DownloadBlobToURLDriver","UploadDriver","LogsStreamDriver","LogsDriver","LsDriver","createPFrameDriver","DownloadUrlDriver"],"sources":["../../src/middle_layer/driver_kit.ts"],"sourcesContent":["import type { PlClient } from \"@milaboratories/pl-client\";\nimport type { InternalLsDriver } from \"@milaboratories/pl-drivers\";\nimport {\n createDownloadClient,\n createLogsClient,\n createUploadBlobClient,\n createUploadProgressClient,\n DownloadDriver,\n DownloadBlobToURLDriver,\n LogsDriver,\n LogsStreamDriver,\n LsDriver,\n UploadDriver,\n DownloadUrlDriver,\n trimCacheDir,\n} from \"@milaboratories/pl-drivers\";\nimport type * as Sdk from \"@milaboratories/pl-model-common\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport { isAsyncDisposable } from \"@milaboratories/helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { InternalPFrameDriver } from \"../pool\";\nimport { createPFrameDriver } from \"../pool\";\nimport type { Recorder } from \"@milaboratories/pl-crash-recorder\";\nimport {\n openRecordingSession,\n wrapDataDriver,\n wrapModelDriver,\n} from \"@milaboratories/pl-crash-recorder\";\nimport type { DriverKitOps, DriverKitOpsConstructor } from \"./ops\";\nimport { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings } from \"./ops\";\n\n/**\n * Drivers offered by the middle-layer for internal consumers,\n * like configuration rendering routines.\n *\n * This intertface is basically a version of the DriverKit from\n * UI SDK with extended API.\n * */\nexport interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {\n /** Dispose the driver kit and all its resources. */\n dispose(): Promise<void>;\n\n // override with wider interface\n readonly blobDriver: DownloadDriver;\n // override with wider interface\n readonly blobToURLDriver: DownloadBlobToURLDriver;\n // override with wider interface\n readonly logDriver: LogsDriver;\n // override with wider interface\n readonly lsDriver: InternalLsDriver;\n // override with wider interface\n readonly pFrameDriver: InternalPFrameDriver;\n // override with wider interface\n readonly frontendDriver: DownloadUrlDriver;\n\n /**\n * Diagnostics log for the model layer, present only when crash recording is\n * switched on. Render spans are written through it so that a join recorded by\n * the instrumented pFrame driver can be attributed to the block that built it.\n * */\n readonly crashRecorder?: Recorder;\n\n /**\n * Signer is initialized from local secret in drivers initialization routine,\n * so constitutes a part of the driver kit\n * */\n readonly signer: Signer;\n\n /**\n * Used to retrieve upload progress, and initiate upload porecesses driven by\n * upload requests from block outputs.\n * */\n readonly uploadDriver: UploadDriver;\n}\n\nexport async function initDriverKit(\n pl: PlClient,\n workdir: string,\n frontendDownloadPath: string,\n _ops: DriverKitOpsConstructor,\n): Promise<MiddleLayerDriverKit> {\n const ops: DriverKitOps = {\n ...DefaultDriverKitOpsSettings,\n ...DefaultDriverKitOpsPaths(workdir),\n ..._ops,\n };\n\n const signer = new HmacSha256Signer(ops.localSecret);\n\n // These drivers only count files they download in this session; trim leftovers from earlier ones first.\n await Promise.all([\n trimCacheDir(ops.logger, ops.blobDownloadPath, ops.blobDriverOps.cacheSoftSizeBytes),\n trimCacheDir(\n ops.logger,\n ops.downloadBlobToURLPath,\n ops.downloadBlobToURLDriverOps.cacheSoftSizeBytes,\n ),\n trimCacheDir(\n ops.logger,\n frontendDownloadPath,\n ops.frontendDownloadDriverOps.cacheSoftSizeBytes,\n ),\n ]);\n\n const downloadClient = createDownloadClient(ops.logger, pl, ops.localProjections);\n const logsClient = createLogsClient(pl, ops.logger);\n const uploadBlobClient = createUploadBlobClient(pl, ops.logger);\n const uploadProgressClient = createUploadProgressClient(pl, ops.logger);\n\n const blobDriver = await DownloadDriver.init(\n ops.logger,\n downloadClient,\n logsClient,\n ops.blobDownloadPath,\n ops.blobDownloadRangesCachePath,\n signer,\n ops.blobDriverOps,\n );\n\n const blobToURLDriver = new DownloadBlobToURLDriver(\n ops.logger,\n signer,\n downloadClient,\n ops.downloadBlobToURLPath,\n ops.downloadBlobToURLDriverOps,\n );\n\n const uploadDriver = new UploadDriver(\n ops.logger,\n signer,\n uploadBlobClient,\n uploadProgressClient,\n ops.uploadDriverOps,\n );\n const logsStreamDriver = new LogsStreamDriver(ops.logger, logsClient, ops.logStreamDriverOps);\n const logDriver = new LogsDriver(ops.logger, logsStreamDriver, blobDriver);\n const lsDriver = await LsDriver.init(\n ops.logger,\n pl,\n signer,\n ops.localProjections,\n ops.openFileDialogCallback,\n ops.virtualLocalStoragesOverride,\n );\n\n const rawPFrameDriver = await createPFrameDriver({\n blobDriver,\n logger: ops.logger,\n spillPath: ops.pframesSpillPath,\n cachePath: ops.parquetCachePath,\n options: ops.pFrameDriverOps,\n cacheOps: ops.parquetCacheOps,\n });\n\n // Every join a block model builds and every row it reads back passes through\n // this one driver, so instrumenting it here covers the whole model layer\n // without touching the call sites. The session is undefined unless recording\n // is switched on, in which case the driver is used exactly as before.\n const recordingSession = openRecordingSession({ role: \"middle-layer\" });\n const pFrameDriver: InternalPFrameDriver = recordingSession\n ? wrapDataDriver(\n wrapModelDriver(rawPFrameDriver, recordingSession.recorder, recordingSession.registry),\n recordingSession.recorder,\n recordingSession.registry,\n )\n : rawPFrameDriver;\n\n const frontendDownloadDriver = new DownloadUrlDriver(\n ops.logger,\n pl.httpDispatcher,\n frontendDownloadPath,\n signer,\n ops.frontendDownloadDriverOps,\n );\n\n const driverKit = {\n blobDriver,\n blobToURLDriver: blobToURLDriver,\n logDriver,\n lsDriver,\n signer,\n uploadDriver,\n pFrameDriver,\n frontendDriver: frontendDownloadDriver,\n crashRecorder: recordingSession?.recorder,\n };\n\n const dispose = async () => {\n const disposePromises = Object.values(driverKit).flatMap((driver) =>\n isAsyncDisposable(driver) ? [driver[Symbol.asyncDispose]()] : [],\n );\n await Promise.all(disposePromises);\n recordingSession?.close(\"driver-kit-disposed\");\n };\n\n return {\n ...driverKit,\n dispose,\n [Symbol.asyncDispose]: dispose,\n };\n}\n"],"mappings":";;;;;;;;AA2EA,eAAsB,cACpB,IACA,SACA,sBACA,MAC+B;CAC/B,MAAM,MAAoB;EACxB,GAAGA,YAAAA;EACH,GAAGC,YAAAA,yBAAyB,OAAO;EACnC,GAAG;CACL;CAEA,MAAM,SAAS,IAAIC,2BAAAA,iBAAiB,IAAI,WAAW;CAGnD,MAAM,QAAQ,IAAI
|
|
1
|
+
{"version":3,"file":"driver_kit.cjs","names":["DefaultDriverKitOpsSettings","DefaultDriverKitOpsPaths","HmacSha256Signer","trimCacheDir","createDownloadClient","createLogsClient","createUploadBlobClient","createUploadProgressClient","DownloadDriver","DownloadBlobToURLDriver","UploadDriver","LogsStreamDriver","LogsDriver","LsDriver","createPFrameDriver","openRecordingSession","wrapDataDriver","wrapModelDriver","DownloadUrlDriver","isAsyncDisposable"],"sources":["../../src/middle_layer/driver_kit.ts"],"sourcesContent":["import type { PlClient } from \"@milaboratories/pl-client\";\nimport type { InternalLsDriver } from \"@milaboratories/pl-drivers\";\nimport {\n createDownloadClient,\n createLogsClient,\n createUploadBlobClient,\n createUploadProgressClient,\n DownloadDriver,\n DownloadBlobToURLDriver,\n LogsDriver,\n LogsStreamDriver,\n LsDriver,\n UploadDriver,\n DownloadUrlDriver,\n trimCacheDir,\n} from \"@milaboratories/pl-drivers\";\nimport type * as Sdk from \"@milaboratories/pl-model-common\";\nimport type { Signer } from \"@milaboratories/ts-helpers\";\nimport { isAsyncDisposable } from \"@milaboratories/helpers\";\nimport { HmacSha256Signer } from \"@milaboratories/ts-helpers\";\nimport type { InternalPFrameDriver } from \"../pool\";\nimport { createPFrameDriver } from \"../pool\";\nimport type { Recorder } from \"@milaboratories/pl-crash-recorder\";\nimport {\n openRecordingSession,\n wrapDataDriver,\n wrapModelDriver,\n} from \"@milaboratories/pl-crash-recorder\";\nimport type { DriverKitOps, DriverKitOpsConstructor } from \"./ops\";\nimport { DefaultDriverKitOpsPaths, DefaultDriverKitOpsSettings } from \"./ops\";\n\n/**\n * Drivers offered by the middle-layer for internal consumers,\n * like configuration rendering routines.\n *\n * This intertface is basically a version of the DriverKit from\n * UI SDK with extended API.\n * */\nexport interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {\n /** Dispose the driver kit and all its resources. */\n dispose(): Promise<void>;\n\n // override with wider interface\n readonly blobDriver: DownloadDriver;\n // override with wider interface\n readonly blobToURLDriver: DownloadBlobToURLDriver;\n // override with wider interface\n readonly logDriver: LogsDriver;\n // override with wider interface\n readonly lsDriver: InternalLsDriver;\n // override with wider interface\n readonly pFrameDriver: InternalPFrameDriver;\n // override with wider interface\n readonly frontendDriver: DownloadUrlDriver;\n\n /**\n * Diagnostics log for the model layer, present only when crash recording is\n * switched on. Render spans are written through it so that a join recorded by\n * the instrumented pFrame driver can be attributed to the block that built it.\n * */\n readonly crashRecorder?: Recorder;\n\n /**\n * Signer is initialized from local secret in drivers initialization routine,\n * so constitutes a part of the driver kit\n * */\n readonly signer: Signer;\n\n /**\n * Used to retrieve upload progress, and initiate upload porecesses driven by\n * upload requests from block outputs.\n * */\n readonly uploadDriver: UploadDriver;\n}\n\nexport async function initDriverKit(\n pl: PlClient,\n workdir: string,\n frontendDownloadPath: string,\n _ops: DriverKitOpsConstructor,\n): Promise<MiddleLayerDriverKit> {\n const ops: DriverKitOps = {\n ...DefaultDriverKitOpsSettings,\n ...DefaultDriverKitOpsPaths(workdir),\n ..._ops,\n };\n\n const signer = new HmacSha256Signer(ops.localSecret);\n\n // These drivers only count files they download in this session; trim leftovers from earlier ones first.\n await Promise.all([\n trimCacheDir(ops.logger, ops.blobDownloadPath, ops.blobDriverOps.cacheSoftSizeBytes),\n trimCacheDir(\n ops.logger,\n ops.downloadBlobToURLPath,\n ops.downloadBlobToURLDriverOps.cacheSoftSizeBytes,\n ),\n trimCacheDir(\n ops.logger,\n frontendDownloadPath,\n ops.frontendDownloadDriverOps.cacheSoftSizeBytes,\n ),\n ]);\n\n const downloadClient = createDownloadClient(ops.logger, pl, ops.localProjections);\n const logsClient = createLogsClient(pl, ops.logger);\n const uploadBlobClient = createUploadBlobClient(pl, ops.logger);\n const uploadProgressClient = createUploadProgressClient(pl, ops.logger);\n\n const blobDriver = await DownloadDriver.init(\n ops.logger,\n downloadClient,\n logsClient,\n ops.blobDownloadPath,\n ops.blobDownloadRangesCachePath,\n signer,\n ops.blobDriverOps,\n );\n\n const blobToURLDriver = new DownloadBlobToURLDriver(\n ops.logger,\n signer,\n downloadClient,\n ops.downloadBlobToURLPath,\n ops.downloadBlobToURLDriverOps,\n );\n\n const uploadDriver = new UploadDriver(\n ops.logger,\n signer,\n uploadBlobClient,\n uploadProgressClient,\n ops.uploadDriverOps,\n );\n const logsStreamDriver = new LogsStreamDriver(ops.logger, logsClient, ops.logStreamDriverOps);\n const logDriver = new LogsDriver(ops.logger, logsStreamDriver, blobDriver);\n const lsDriver = await LsDriver.init(\n ops.logger,\n pl,\n signer,\n ops.localProjections,\n ops.openFileDialogCallback,\n ops.virtualLocalStoragesOverride,\n );\n\n const rawPFrameDriver = await createPFrameDriver({\n blobDriver,\n logger: ops.logger,\n spillPath: ops.pframesSpillPath,\n cachePath: ops.parquetCachePath,\n options: ops.pFrameDriverOps,\n cacheOps: ops.parquetCacheOps,\n });\n\n // Every join a block model builds and every row it reads back passes through\n // this one driver, so instrumenting it here covers the whole model layer\n // without touching the call sites. The session is undefined unless recording\n // is switched on, in which case the driver is used exactly as before.\n const recordingSession = openRecordingSession({ role: \"middle-layer\" });\n const pFrameDriver: InternalPFrameDriver = recordingSession\n ? wrapDataDriver(\n wrapModelDriver(rawPFrameDriver, recordingSession.recorder, recordingSession.registry),\n recordingSession.recorder,\n recordingSession.registry,\n )\n : rawPFrameDriver;\n\n const frontendDownloadDriver = new DownloadUrlDriver(\n ops.logger,\n pl.httpDispatcher,\n frontendDownloadPath,\n signer,\n ops.frontendDownloadDriverOps,\n );\n\n const driverKit = {\n blobDriver,\n blobToURLDriver: blobToURLDriver,\n logDriver,\n lsDriver,\n signer,\n uploadDriver,\n pFrameDriver,\n frontendDriver: frontendDownloadDriver,\n crashRecorder: recordingSession?.recorder,\n };\n\n const dispose = async () => {\n const disposePromises = Object.values(driverKit).flatMap((driver) =>\n isAsyncDisposable(driver) ? [driver[Symbol.asyncDispose]()] : [],\n );\n await Promise.all(disposePromises);\n recordingSession?.close(\"driver-kit-disposed\");\n };\n\n return {\n ...driverKit,\n dispose,\n [Symbol.asyncDispose]: dispose,\n };\n}\n"],"mappings":";;;;;;;;AA2EA,eAAsB,cACpB,IACA,SACA,sBACA,MAC+B;CAC/B,MAAM,MAAoB;EACxB,GAAGA,YAAAA;EACH,GAAGC,YAAAA,yBAAyB,OAAO;EACnC,GAAG;CACL;CAEA,MAAM,SAAS,IAAIC,2BAAAA,iBAAiB,IAAI,WAAW;CAGnD,MAAM,QAAQ,IAAI;GAChBC,GAAAA,2BAAAA,aAAAA,CAAa,IAAI,QAAQ,IAAI,kBAAkB,IAAI,cAAc,kBAAkB;GACnFA,GAAAA,2BAAAA,aAAAA,CACE,IAAI,QACJ,IAAI,uBACJ,IAAI,2BAA2B,kBACjC;GACAA,GAAAA,2BAAAA,aAAAA,CACE,IAAI,QACJ,sBACA,IAAI,0BAA0B,kBAChC;CACF,CAAC;CAED,MAAM,kBAAA,GAAiBC,2BAAAA,qBAAAA,CAAqB,IAAI,QAAQ,IAAI,IAAI,gBAAgB;CAChF,MAAM,cAAA,GAAaC,2BAAAA,iBAAAA,CAAiB,IAAI,IAAI,MAAM;CAClD,MAAM,oBAAA,GAAmBC,2BAAAA,uBAAAA,CAAuB,IAAI,IAAI,MAAM;CAC9D,MAAM,wBAAA,GAAuBC,2BAAAA,2BAAAA,CAA2B,IAAI,IAAI,MAAM;CAEtE,MAAM,aAAa,MAAMC,2BAAAA,eAAe,KACtC,IAAI,QACJ,gBACA,YACA,IAAI,kBACJ,IAAI,6BACJ,QACA,IAAI,aACN;CAEA,MAAM,kBAAkB,IAAIC,2BAAAA,wBAC1B,IAAI,QACJ,QACA,gBACA,IAAI,uBACJ,IAAI,0BACN;CAEA,MAAM,eAAe,IAAIC,2BAAAA,aACvB,IAAI,QACJ,QACA,kBACA,sBACA,IAAI,eACN;CACA,MAAM,mBAAmB,IAAIC,2BAAAA,iBAAiB,IAAI,QAAQ,YAAY,IAAI,kBAAkB;CAC5F,MAAM,YAAY,IAAIC,2BAAAA,WAAW,IAAI,QAAQ,kBAAkB,UAAU;CACzE,MAAM,WAAW,MAAMC,2BAAAA,SAAS,KAC9B,IAAI,QACJ,IACA,QACA,IAAI,kBACJ,IAAI,wBACJ,IAAI,4BACN;CAEA,MAAM,kBAAkB,MAAMC,eAAAA,mBAAmB;EAC/C;EACA,QAAQ,IAAI;EACZ,WAAW,IAAI;EACf,WAAW,IAAI;EACf,SAAS,IAAI;EACb,UAAU,IAAI;CAChB,CAAC;CAMD,MAAM,oBAAA,GAAmBC,kCAAAA,qBAAAA,CAAqB,EAAE,MAAM,eAAe,CAAC;CAiBtE,MAAM,YAAY;EAChB;EACiB;EACjB;EACA;EACA;EACA;EACA,cAvByC,oBAAA,GACvCC,kCAAAA,eAAAA,EAAAA,GACEC,kCAAAA,gBAAAA,CAAgB,iBAAiB,iBAAiB,UAAU,iBAAiB,QAAQ,GACrF,iBAAiB,UACjB,iBAAiB,QACnB,IACA;EAkBF,gBAAgB,IAhBiBC,2BAAAA,kBACjC,IAAI,QACJ,GAAG,gBACH,sBACA,QACA,IAAI,yBAWiC;EACrC,eAAe,kBAAkB;CACnC;CAEA,MAAM,UAAU,YAAY;EAC1B,MAAM,kBAAkB,OAAO,OAAO,SAAS,CAAC,CAAC,SAAS,YAAA,GACxDC,wBAAAA,kBAAAA,CAAkB,MAAM,IAAI,CAAC,OAAO,OAAO,aAAa,CAAC,CAAC,IAAI,CAAC,CACjE;EACA,MAAM,QAAQ,IAAI,eAAe;EACjC,kBAAkB,MAAM,qBAAqB;CAC/C;CAEA,OAAO;EACL,GAAG;EACH;GACC,OAAO,eAAe;CACzB;AACF"}
|
|
@@ -6,7 +6,6 @@ import * as Sdk from "@milaboratories/pl-model-common";
|
|
|
6
6
|
import { PlClient } from "@milaboratories/pl-client";
|
|
7
7
|
import { DownloadBlobToURLDriver, DownloadDriver, DownloadUrlDriver, InternalLsDriver, LogsDriver, UploadDriver } from "@milaboratories/pl-drivers";
|
|
8
8
|
import { Recorder } from "@milaboratories/pl-crash-recorder";
|
|
9
|
-
//#region src/middle_layer/driver_kit.d.ts
|
|
10
9
|
/**
|
|
11
10
|
* Drivers offered by the middle-layer for internal consumers,
|
|
12
11
|
* like configuration rendering routines.
|
|
@@ -41,5 +40,4 @@ export interface MiddleLayerDriverKit extends Sdk.DriverKit, AsyncDisposable {
|
|
|
41
40
|
readonly uploadDriver: UploadDriver;
|
|
42
41
|
}
|
|
43
42
|
export declare function initDriverKit(pl: PlClient, workdir: string, frontendDownloadPath: string, _ops: DriverKitOpsConstructor): Promise<MiddleLayerDriverKit>;
|
|
44
|
-
//#endregion
|
|
45
43
|
//# sourceMappingURL=driver_kit.d.ts.map
|