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