@milaboratories/pl-middle-layer 1.64.36 → 1.64.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/dist/_virtual/{_@oxc-project_runtime@0.123.0/helpers → _@oxc-project_runtime@0.137.0/helpers/esm}/usingCtx.cjs +2 -2
  2. package/dist/_virtual/{_@oxc-project_runtime@0.123.0/helpers → _@oxc-project_runtime@0.137.0/helpers/esm}/usingCtx.js +2 -2
  3. package/dist/block_registry/index.cjs +11 -3
  4. package/dist/block_registry/index.d.ts +3 -2
  5. package/dist/block_registry/index.js +4 -3
  6. package/dist/block_registry/registry-v2-provider.cjs +1 -1
  7. package/dist/block_registry/registry-v2-provider.cjs.map +1 -1
  8. package/dist/block_registry/registry-v2-provider.d.ts.map +1 -1
  9. package/dist/block_registry/registry-v2-provider.js +1 -0
  10. package/dist/block_registry/registry-v2-provider.js.map +1 -1
  11. package/dist/block_registry/registry.cjs +20 -3
  12. package/dist/block_registry/registry.cjs.map +1 -1
  13. package/dist/block_registry/registry.d.ts +7 -1
  14. package/dist/block_registry/registry.d.ts.map +1 -1
  15. package/dist/block_registry/registry.js +17 -1
  16. package/dist/block_registry/registry.js.map +1 -1
  17. package/dist/block_registry/watcher.cjs +21 -2
  18. package/dist/block_registry/watcher.cjs.map +1 -1
  19. package/dist/block_registry/watcher.d.ts +1 -1
  20. package/dist/block_registry/watcher.d.ts.map +1 -1
  21. package/dist/block_registry/watcher.js +21 -3
  22. package/dist/block_registry/watcher.js.map +1 -1
  23. package/dist/block_registry/well_known_registries.cjs.map +1 -1
  24. package/dist/block_registry/well_known_registries.d.ts.map +1 -1
  25. package/dist/block_registry/well_known_registries.js.map +1 -1
  26. package/dist/cfg_render/executor.cjs +2 -2
  27. package/dist/cfg_render/executor.cjs.map +1 -1
  28. package/dist/cfg_render/executor.js.map +1 -1
  29. package/dist/cfg_render/renderer.cjs +0 -1
  30. package/dist/cfg_render/renderer.cjs.map +1 -1
  31. package/dist/cfg_render/renderer.js.map +1 -1
  32. package/dist/cfg_render/traverse.cjs +0 -1
  33. package/dist/cfg_render/traverse.cjs.map +1 -1
  34. package/dist/cfg_render/traverse.js.map +1 -1
  35. package/dist/cfg_render/util.cjs.map +1 -1
  36. package/dist/cfg_render/util.js.map +1 -1
  37. package/dist/debug/index.cjs +1 -0
  38. package/dist/debug/index.cjs.map +1 -1
  39. package/dist/debug/index.js +1 -1
  40. package/dist/debug/index.js.map +1 -1
  41. package/dist/dev_env/index.cjs +9 -1
  42. package/dist/dev_env/index.cjs.map +1 -1
  43. package/dist/dev_env/index.js +1 -1
  44. package/dist/dev_env/index.js.map +1 -1
  45. package/dist/dev_env/util.cjs +1 -1
  46. package/dist/dev_env/util.cjs.map +1 -1
  47. package/dist/dev_env/util.js.map +1 -1
  48. package/dist/index.cjs +2 -0
  49. package/dist/index.d.ts +3 -3
  50. package/dist/index.js +3 -3
  51. package/dist/js_render/computable_context.cjs +8 -5
  52. package/dist/js_render/computable_context.cjs.map +1 -1
  53. package/dist/js_render/computable_context.js +5 -1
  54. package/dist/js_render/computable_context.js.map +1 -1
  55. package/dist/js_render/context.cjs +4 -1
  56. package/dist/js_render/context.cjs.map +1 -1
  57. package/dist/js_render/context.js +4 -1
  58. package/dist/js_render/context.js.map +1 -1
  59. package/dist/js_render/index.cjs +0 -1
  60. package/dist/js_render/index.cjs.map +1 -1
  61. package/dist/js_render/index.js.map +1 -1
  62. package/dist/js_render/service_injectors.cjs +2 -3
  63. package/dist/js_render/service_injectors.cjs.map +1 -1
  64. package/dist/js_render/service_injectors.js +1 -1
  65. package/dist/js_render/service_injectors.js.map +1 -1
  66. package/dist/middle_layer/active_cfg.cjs +0 -1
  67. package/dist/middle_layer/active_cfg.cjs.map +1 -1
  68. package/dist/middle_layer/active_cfg.js.map +1 -1
  69. package/dist/middle_layer/block.cjs +0 -1
  70. package/dist/middle_layer/block.cjs.map +1 -1
  71. package/dist/middle_layer/block.js.map +1 -1
  72. package/dist/middle_layer/block_ctx.cjs +0 -1
  73. package/dist/middle_layer/block_ctx.cjs.map +1 -1
  74. package/dist/middle_layer/block_ctx.js.map +1 -1
  75. package/dist/middle_layer/block_ctx_unsafe.cjs.map +1 -1
  76. package/dist/middle_layer/block_ctx_unsafe.js.map +1 -1
  77. package/dist/middle_layer/driver_kit.cjs +0 -1
  78. package/dist/middle_layer/driver_kit.cjs.map +1 -1
  79. package/dist/middle_layer/driver_kit.js.map +1 -1
  80. package/dist/middle_layer/frontend_path.cjs +5 -1
  81. package/dist/middle_layer/frontend_path.cjs.map +1 -1
  82. package/dist/middle_layer/frontend_path.js +6 -1
  83. package/dist/middle_layer/frontend_path.js.map +1 -1
  84. package/dist/middle_layer/index.cjs +13 -5
  85. package/dist/middle_layer/index.d.ts +2 -1
  86. package/dist/middle_layer/index.js +6 -5
  87. package/dist/middle_layer/middle_layer.cjs +7 -1
  88. package/dist/middle_layer/middle_layer.cjs.map +1 -1
  89. package/dist/middle_layer/middle_layer.d.ts.map +1 -1
  90. package/dist/middle_layer/middle_layer.js +7 -0
  91. package/dist/middle_layer/middle_layer.js.map +1 -1
  92. package/dist/middle_layer/navigation_states.cjs +0 -1
  93. package/dist/middle_layer/navigation_states.cjs.map +1 -1
  94. package/dist/middle_layer/navigation_states.js.map +1 -1
  95. package/dist/middle_layer/ops.cjs +1 -1
  96. package/dist/middle_layer/ops.cjs.map +1 -1
  97. package/dist/middle_layer/ops.d.ts.map +1 -1
  98. package/dist/middle_layer/ops.js.map +1 -1
  99. package/dist/middle_layer/project.cjs +9 -2
  100. package/dist/middle_layer/project.cjs.map +1 -1
  101. package/dist/middle_layer/project.d.ts.map +1 -1
  102. package/dist/middle_layer/project.js +5 -1
  103. package/dist/middle_layer/project.js.map +1 -1
  104. package/dist/middle_layer/project_list.cjs +2 -1
  105. package/dist/middle_layer/project_list.cjs.map +1 -1
  106. package/dist/middle_layer/project_list.js +1 -1
  107. package/dist/middle_layer/project_list.js.map +1 -1
  108. package/dist/middle_layer/project_overview.cjs +0 -1
  109. package/dist/middle_layer/project_overview.cjs.map +1 -1
  110. package/dist/middle_layer/project_overview.js.map +1 -1
  111. package/dist/middle_layer/project_overview_light.cjs +0 -1
  112. package/dist/middle_layer/project_overview_light.cjs.map +1 -1
  113. package/dist/middle_layer/project_overview_light.js.map +1 -1
  114. package/dist/middle_layer/render.cjs +0 -1
  115. package/dist/middle_layer/render.cjs.map +1 -1
  116. package/dist/middle_layer/render.js.map +1 -1
  117. package/dist/middle_layer/types.d.ts.map +1 -1
  118. package/dist/middle_layer/util.cjs +0 -1
  119. package/dist/middle_layer/util.cjs.map +1 -1
  120. package/dist/middle_layer/util.js.map +1 -1
  121. package/dist/model/args.cjs +1 -1
  122. package/dist/model/args.cjs.map +1 -1
  123. package/dist/model/args.js +1 -1
  124. package/dist/model/args.js.map +1 -1
  125. package/dist/model/block_pack_spec.cjs +5 -0
  126. package/dist/model/block_pack_spec.cjs.map +1 -1
  127. package/dist/model/block_pack_spec.d.ts +19 -2
  128. package/dist/model/block_pack_spec.d.ts.map +1 -1
  129. package/dist/model/block_pack_spec.js +5 -1
  130. package/dist/model/block_pack_spec.js.map +1 -1
  131. package/dist/model/frontend.d.ts.map +1 -1
  132. package/dist/model/index.d.ts +2 -1
  133. package/dist/model/project_helper.cjs +2 -1
  134. package/dist/model/project_helper.cjs.map +1 -1
  135. package/dist/model/project_helper.d.ts +1 -1
  136. package/dist/model/project_helper.d.ts.map +1 -1
  137. package/dist/model/project_helper.js +2 -0
  138. package/dist/model/project_helper.js.map +1 -1
  139. package/dist/model/project_model.cjs +2 -1
  140. package/dist/model/project_model.cjs.map +1 -1
  141. package/dist/model/project_model.d.ts.map +1 -1
  142. package/dist/model/project_model.js +2 -2
  143. package/dist/model/project_model.js.map +1 -1
  144. package/dist/model/project_model_util.cjs +4 -3
  145. package/dist/model/project_model_util.cjs.map +1 -1
  146. package/dist/model/project_model_util.js +4 -4
  147. package/dist/model/project_model_util.js.map +1 -1
  148. package/dist/model/template_spec.d.ts.map +1 -1
  149. package/dist/mutator/block-pack/block_pack.cjs +41 -4
  150. package/dist/mutator/block-pack/block_pack.cjs.map +1 -1
  151. package/dist/mutator/block-pack/block_pack.d.ts.map +1 -1
  152. package/dist/mutator/block-pack/block_pack.js +40 -4
  153. package/dist/mutator/block-pack/block_pack.js.map +1 -1
  154. package/dist/mutator/block-pack/frontend.cjs +5 -1
  155. package/dist/mutator/block-pack/frontend.cjs.map +1 -1
  156. package/dist/mutator/block-pack/frontend.js +6 -1
  157. package/dist/mutator/block-pack/frontend.js.map +1 -1
  158. package/dist/mutator/block-pack/required_capabilities.cjs +0 -1
  159. package/dist/mutator/block-pack/required_capabilities.cjs.map +1 -1
  160. package/dist/mutator/block-pack/required_capabilities.js.map +1 -1
  161. package/dist/mutator/context_export.cjs +0 -1
  162. package/dist/mutator/context_export.cjs.map +1 -1
  163. package/dist/mutator/context_export.js.map +1 -1
  164. package/dist/mutator/migration.cjs +0 -1
  165. package/dist/mutator/migration.cjs.map +1 -1
  166. package/dist/mutator/migration.js.map +1 -1
  167. package/dist/mutator/project.cjs +22 -4
  168. package/dist/mutator/project.cjs.map +1 -1
  169. package/dist/mutator/project.js +21 -4
  170. package/dist/mutator/project.js.map +1 -1
  171. package/dist/mutator/template/direct_template_loader.cjs +0 -1
  172. package/dist/mutator/template/direct_template_loader.cjs.map +1 -1
  173. package/dist/mutator/template/direct_template_loader.js.map +1 -1
  174. package/dist/mutator/template/direct_template_loader_v3.cjs +0 -1
  175. package/dist/mutator/template/direct_template_loader_v3.cjs.map +1 -1
  176. package/dist/mutator/template/direct_template_loader_v3.js.map +1 -1
  177. package/dist/mutator/template/render_block.cjs +4 -1
  178. package/dist/mutator/template/render_block.cjs.map +1 -1
  179. package/dist/mutator/template/render_block.js +1 -1
  180. package/dist/mutator/template/render_block.js.map +1 -1
  181. package/dist/mutator/template/render_template.cjs +0 -1
  182. package/dist/mutator/template/render_template.cjs.map +1 -1
  183. package/dist/mutator/template/render_template.d.ts.map +1 -1
  184. package/dist/mutator/template/render_template.js.map +1 -1
  185. package/dist/mutator/template/template_cache.cjs +6 -3
  186. package/dist/mutator/template/template_cache.cjs.map +1 -1
  187. package/dist/mutator/template/template_cache.d.ts +1 -2
  188. package/dist/mutator/template/template_cache.d.ts.map +1 -1
  189. package/dist/mutator/template/template_cache.js +6 -2
  190. package/dist/mutator/template/template_cache.js.map +1 -1
  191. package/dist/mutator/template/template_loading.cjs +1 -1
  192. package/dist/mutator/template/template_loading.cjs.map +1 -1
  193. package/dist/mutator/template/template_loading.d.ts.map +1 -1
  194. package/dist/mutator/template/template_loading.js.map +1 -1
  195. package/dist/network_check/network_check.cjs +0 -1
  196. package/dist/network_check/network_check.cjs.map +1 -1
  197. package/dist/network_check/network_check.d.ts.map +1 -1
  198. package/dist/network_check/network_check.js.map +1 -1
  199. package/dist/network_check/pings.cjs +3 -1
  200. package/dist/network_check/pings.cjs.map +1 -1
  201. package/dist/network_check/pings.js +1 -1
  202. package/dist/network_check/pings.js.map +1 -1
  203. package/dist/network_check/template.cjs +10 -3
  204. package/dist/network_check/template.cjs.map +1 -1
  205. package/dist/network_check/template.js +1 -1
  206. package/dist/network_check/template.js.map +1 -1
  207. package/dist/pool/data.cjs +12 -1
  208. package/dist/pool/data.cjs.map +1 -1
  209. package/dist/pool/data.d.ts.map +1 -1
  210. package/dist/pool/data.js +3 -1
  211. package/dist/pool/data.js.map +1 -1
  212. package/dist/pool/driver.cjs +8 -1
  213. package/dist/pool/driver.cjs.map +1 -1
  214. package/dist/pool/driver.d.ts.map +1 -1
  215. package/dist/pool/driver.js +7 -0
  216. package/dist/pool/driver.js.map +1 -1
  217. package/dist/pool/index.cjs +5 -2
  218. package/dist/pool/index.d.ts +2 -1
  219. package/dist/pool/index.js +3 -2
  220. package/dist/pool/p_object_collection.cjs +1 -1
  221. package/dist/pool/p_object_collection.cjs.map +1 -1
  222. package/dist/pool/p_object_collection.js.map +1 -1
  223. package/dist/pool/result_pool.cjs +2 -1
  224. package/dist/pool/result_pool.cjs.map +1 -1
  225. package/dist/pool/result_pool.js +2 -0
  226. package/dist/pool/result_pool.js.map +1 -1
  227. package/dist/service_factories.cjs +0 -1
  228. package/dist/service_factories.cjs.map +1 -1
  229. package/dist/service_factories.js.map +1 -1
  230. package/dist/worker/WorkerManager.cjs +3 -2
  231. package/dist/worker/WorkerManager.cjs.map +1 -1
  232. package/dist/worker/WorkerManager.js +2 -1
  233. package/dist/worker/WorkerManager.js.map +1 -1
  234. package/dist/worker/worker.cjs +0 -1
  235. package/dist/worker/worker.cjs.map +1 -1
  236. package/dist/worker/worker.js.map +1 -1
  237. package/dist/worker/workerApi.cjs +0 -1
  238. package/dist/worker/workerApi.cjs.map +1 -1
  239. package/dist/worker/workerApi.js.map +1 -1
  240. package/package.json +10 -10
  241. package/src/block_registry/registry.ts +19 -0
  242. package/src/block_registry/watcher.ts +25 -2
  243. package/src/middle_layer/frontend_path.ts +22 -2
  244. package/src/model/block_pack_spec.ts +24 -1
  245. package/src/mutator/block-pack/block_pack.ts +61 -2
  246. package/src/mutator/block-pack/frontend.ts +20 -2
  247. package/src/mutator/template/template_cache.ts +10 -2
@@ -3,7 +3,7 @@ const require_data = require("./data.cjs");
3
3
  let _platforma_sdk_model = require("@platforma-sdk/model");
4
4
  let _milaboratories_pl_model_middle_layer = require("@milaboratories/pl-model-middle-layer");
5
5
  let node_path = require("node:path");
6
- node_path = require_runtime.__toESM(node_path);
6
+ node_path = require_runtime.__toESM(node_path, 1);
7
7
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
8
8
  let _milaboratories_pl_client = require("@milaboratories/pl-client");
9
9
  let _milaboratories_pl_tree = require("@milaboratories/pl-tree");
@@ -18,6 +18,8 @@ function makeBlobId(res) {
18
18
  return String(globalId);
19
19
  }
20
20
  var LocalBlobProviderImpl = class extends _milaboratories_helpers.RefCountPoolBase {
21
+ blobDriver;
22
+ logger;
21
23
  constructor(blobDriver, logger) {
22
24
  super();
23
25
  this.blobDriver = blobDriver;
@@ -51,6 +53,8 @@ var LocalBlobProviderImpl = class extends _milaboratories_helpers.RefCountPoolBa
51
53
  }
52
54
  };
53
55
  var RemoteBlobPool = class extends _milaboratories_helpers.RefCountPoolBase {
56
+ blobDriver;
57
+ logger;
54
58
  constructor(blobDriver, logger) {
55
59
  super();
56
60
  this.blobDriver = blobDriver;
@@ -136,6 +140,9 @@ var BlobStore = class extends _milaboratories_pl_model_middle_layer.PFrameIntern
136
140
  }
137
141
  };
138
142
  var RemoteBlobProviderImpl = class RemoteBlobProviderImpl {
143
+ pool;
144
+ server;
145
+ cache;
139
146
  constructor(pool, server, cache) {
140
147
  this.pool = pool;
141
148
  this.server = server;
@@ -1 +1 @@
1
- {"version":3,"file":"driver.cjs","names":["RefCountPoolBase","PFrameDriverError","PFrameInternal","Readable","HttpHelpers","AbstractPFrameDriverOpsDefaults","path","parseDataInfoResource","traverseParquetChunkResource","makeLocalBlobRef","AbstractPFrameDriver"],"sources":["../../src/pool/driver.ts"],"sourcesContent":["import {\n mapDataInfo,\n isDataInfo,\n ensureError,\n PFrameDriverError,\n isAbortError,\n type LocalBlobHandleAndSize,\n type RemoteBlobHandleAndSize,\n type RemoteBlobHandle,\n type ContentHandler,\n type PColumnSpec,\n type PColumnDataUniversal,\n} from \"@platforma-sdk/model\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { emptyDir } from \"@milaboratories/ts-helpers\";\nimport { RefCountPoolBase, type PoolEntry, type MiLogger } from \"@milaboratories/helpers\";\nimport type { DownloadDriver } from \"@milaboratories/pl-drivers\";\nimport { isPlTreeNodeAccessor, type PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type { Computable, ComputableStableDefined } from \"@milaboratories/computable\";\nimport {\n makeJsonDataInfo,\n AbstractPFrameDriver,\n AbstractPFrameDriverOpsDefaults,\n type AbstractInternalPFrameDriver,\n type AbstractPFrameDriverOps,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"@milaboratories/pf-driver\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport {\n BlobResourceRef,\n makeLocalBlobRef,\n parseDataInfoResource,\n traverseParquetChunkResource,\n} from \"./data\";\nimport { isDownloadNetworkError400 } from \"@milaboratories/pl-drivers\";\nimport { parseSignedResourceId } from \"@milaboratories/pl-client\";\n\nfunction makeBlobId(res: BlobResourceRef): PFrameInternal.PFrameBlobId {\n const { globalId } = parseSignedResourceId(res.resourceInfo.id);\n return String(globalId) as PFrameInternal.PFrameBlobId;\n}\n\ntype LocalBlob = ComputableStableDefined<LocalBlobHandleAndSize>;\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<BlobResourceRef, PFrameInternal.PFrameBlobId, LocalBlob>\n implements LocalBlobProvider<BlobResourceRef>\n{\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: PFrameInternal.Logger,\n ) {\n super();\n }\n\n protected calculateParamsKey(params: BlobResourceRef): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(\n params: BlobResourceRef,\n _key: PFrameInternal.PFrameBlobId,\n ): LocalBlob {\n return this.blobDriver.getDownloadedBlob(params.resourceInfo);\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): LocalBlob {\n const resource = super.tryGetByKey(blobId);\n if (!resource) throw new PFrameDriverError(`Local blob with id ${blobId} not found.`);\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (blobIds: PFrameInternal.PFrameBlobId[]) => {\n try {\n await Promise.all(\n blobIds.map((blobId) => this.getByKey(blobId).awaitStableFullValue(signal)),\n );\n } catch (err: unknown) {\n if (!isAbortError(err)) throw err;\n }\n },\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const computable = this.getByKey(blobId);\n const blob = await computable.awaitStableValue(signal);\n return await this.blobDriver.getContentDirect(blob.handle, { signal });\n },\n };\n }\n}\n\ntype RemoteBlob = Computable<RemoteBlobHandleAndSize>;\nclass RemoteBlobPool extends RefCountPoolBase<\n BlobResourceRef,\n PFrameInternal.PFrameBlobId,\n RemoteBlob\n> {\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: PFrameInternal.Logger,\n ) {\n super();\n }\n\n protected calculateParamsKey(params: BlobResourceRef): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(\n params: BlobResourceRef,\n _key: PFrameInternal.PFrameBlobId,\n ): RemoteBlob {\n if (params.onDemandSnapshot === undefined) {\n throw new PFrameDriverError(\n `BlobResourceRef for rid ${params.toJSON()} is missing the on-demand snapshot; ` +\n `remote (parquet) blobs must be captured via makeRemoteBlobRef.`,\n );\n }\n return this.blobDriver.getOnDemandBlob(params.onDemandSnapshot);\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): RemoteBlob {\n const resource = super.tryGetByKey(blobId);\n if (!resource) throw new PFrameDriverError(`Remote blob with id ${blobId} not found.`);\n return resource;\n }\n\n public async withContent<T>(\n handle: RemoteBlobHandle,\n options: {\n range: PFrameInternal.FileRange;\n signal: AbortSignal;\n handler: ContentHandler<T>;\n },\n ): Promise<T> {\n return await this.blobDriver.withContent(handle, {\n range: {\n from: options.range.start,\n to: options.range.end + 1,\n },\n signal: options.signal,\n handler: options.handler,\n });\n }\n}\n\ninterface BlobStoreOptions extends PFrameInternal.ObjectStoreOptions {\n remoteBlobProvider: RemoteBlobPool;\n}\n\nclass BlobStore extends PFrameInternal.BaseObjectStore {\n private readonly remoteBlobProvider: RemoteBlobPool;\n\n constructor(options: BlobStoreOptions) {\n super(options);\n this.remoteBlobProvider = options.remoteBlobProvider;\n }\n\n public override async request(\n filename: PFrameInternal.ParquetFileName,\n params: {\n method: PFrameInternal.HttpMethod;\n range?: PFrameInternal.HttpRange;\n signal: AbortSignal;\n callback: (response: PFrameInternal.ObjectStoreResponse) => Promise<void>;\n },\n ): Promise<void> {\n const blobId = filename.slice(\n 0,\n -PFrameInternal.ParquetExtension.length,\n ) as PFrameInternal.PFrameBlobId;\n const respond = async (response: PFrameInternal.ObjectStoreResponse): Promise<void> => {\n try {\n await params.callback(response);\n } catch (error: unknown) {\n this.logger(\n \"warn\",\n `PFrames blob store received unhandled rejection from HTTP handler: ${ensureError(error)}`,\n );\n }\n };\n\n try {\n const computable = this.remoteBlobProvider.tryGetByKey(blobId);\n if (!computable) return await respond({ type: \"NotFound\" });\n\n let blob: RemoteBlobHandleAndSize;\n try {\n blob = await computable.getValue();\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `PFrames blob store failed to get blob from computable: ${ensureError(error)}`,\n );\n return await respond({ type: \"InternalError\" });\n }\n params.signal.throwIfAborted();\n\n const translatedRange = this.translate(blob.size, params.range);\n if (!translatedRange) {\n return await respond({\n type: \"RangeNotSatisfiable\",\n size: blob.size,\n });\n }\n\n if (params.method === \"HEAD\") {\n return await respond({\n type: \"Ok\",\n size: blob.size,\n range: translatedRange,\n });\n }\n\n this.logger(\n \"info\",\n `PFrames blob store requesting content for ${blobId}, ` +\n `range [${translatedRange.start}..=${translatedRange.end}]`,\n );\n return await this.remoteBlobProvider.withContent(blob.handle, {\n range: translatedRange,\n signal: params.signal,\n handler: async (data) => {\n return await respond({\n type: \"Ok\",\n size: blob.size,\n range: translatedRange,\n data: Readable.fromWeb(data),\n });\n },\n });\n } catch (error: unknown) {\n if (!isAbortError(error)) {\n if (isDownloadNetworkError400(error) && error.statusCode === 404) {\n this.logger(\"info\", `PFrames blob store known race error: ${ensureError(error)}`);\n } else {\n this.logger(\"warn\", `PFrames blob store unhandled error: ${ensureError(error)}`);\n }\n }\n return await respond({ type: \"InternalError\" });\n }\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<BlobResourceRef> {\n constructor(\n private readonly pool: RemoteBlobPool,\n private readonly server: PFrameInternal.HttpServer,\n private readonly cache: PFrameInternal.CachingObjectStore,\n ) {}\n\n public static async init(\n blobDriver: DownloadDriver,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n cacheConfig: PFrameInternal.CacheConfig,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new RemoteBlobPool(blobDriver, logger);\n const store = new BlobStore({ remoteBlobProvider: pool, logger });\n const cachingStore = (await HttpHelpers.createCachingObjectStore({\n upstream: store,\n config: cacheConfig,\n logger,\n })) as PFrameInternal.CachingObjectStore; // TODO: remove cast after next PFrames release\n\n const handler = HttpHelpers.createRequestHandler({ store: cachingStore });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n logger(\"info\", `PFrames HTTP server started on ${server.info.url}`);\n\n return new RemoteBlobProviderImpl(pool, server, cachingStore);\n }\n\n public acquire(params: BlobResourceRef): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return this.cache.getMetrics();\n }\n\n public async resetCache(): Promise<void> {\n await this.cache.reset();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n await this.cache[Symbol.asyncDispose]();\n await this.pool[Symbol.asyncDispose]();\n }\n}\n\nexport interface InternalPFrameDriver extends AbstractInternalPFrameDriver<\n PColumnDataUniversal<PlTreeNodeAccessor>\n> {}\n\nexport type PFrameDriverOps = AbstractPFrameDriverOps & {\n /** Port to run parquet HTTP server on. */\n parquetServerPort: number;\n};\n\nexport const PFrameDriverOpsDefaults: PFrameDriverOps = {\n ...AbstractPFrameDriverOpsDefaults,\n parquetServerPort: 0, // 0 means that some unused port will be assigned by the OS\n};\n\n/**\n * Tuning for the persistent parquet blob cache, minus its filesystem path (which\n * is supplied separately - see {@link createPFrameDriver}'s `cachePath`). Carries\n * only the size/eviction knobs of {@link PFrameInternal.CacheConfig}.\n */\nexport type ParquetCacheOps = Omit<PFrameInternal.CacheConfig, \"cachePath\">;\n\nexport async function createPFrameDriver(params: {\n blobDriver: DownloadDriver;\n logger: MiLogger;\n spillPath: string;\n cachePath: string;\n options: PFrameDriverOps;\n cacheOps: ParquetCacheOps;\n}): Promise<InternalPFrameDriver> {\n const resolvedSpillPath = path.resolve(params.spillPath);\n await emptyDir(resolvedSpillPath);\n\n const logger: PFrameInternal.Logger = (level, message) => params.logger[level](message);\n const localBlobProvider = new LocalBlobProviderImpl(params.blobDriver, logger);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(\n params.blobDriver,\n logger,\n { port: params.options.parquetServerPort },\n { cachePath: path.resolve(params.cachePath), ...params.cacheOps },\n );\n\n const resolveDataInfo = (spec: PColumnSpec, data: PColumnDataUniversal<PlTreeNodeAccessor>) => {\n if (isPlTreeNodeAccessor(data)) {\n return parseDataInfoResource(data) ?? makeJsonDataInfo(spec, []);\n }\n\n return isDataInfo(data)\n ? data.type === \"ParquetPartitioned\"\n ? mapDataInfo(data, (a) => traverseParquetChunkResource(a))\n : mapDataInfo(data, (a) => makeLocalBlobRef(a))\n : makeJsonDataInfo(spec, data);\n };\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n spillPath: resolvedSpillPath,\n options: params.options,\n resolveDataInfo,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"driver.cjs","names":["RefCountPoolBase","PFrameDriverError","PFrameInternal","Readable","HttpHelpers","AbstractPFrameDriverOpsDefaults","path","parseDataInfoResource","traverseParquetChunkResource","makeLocalBlobRef","AbstractPFrameDriver"],"sources":["../../src/pool/driver.ts"],"sourcesContent":["import {\n mapDataInfo,\n isDataInfo,\n ensureError,\n PFrameDriverError,\n isAbortError,\n type LocalBlobHandleAndSize,\n type RemoteBlobHandleAndSize,\n type RemoteBlobHandle,\n type ContentHandler,\n type PColumnSpec,\n type PColumnDataUniversal,\n} from \"@platforma-sdk/model\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { emptyDir } from \"@milaboratories/ts-helpers\";\nimport { RefCountPoolBase, type PoolEntry, type MiLogger } from \"@milaboratories/helpers\";\nimport type { DownloadDriver } from \"@milaboratories/pl-drivers\";\nimport { isPlTreeNodeAccessor, type PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type { Computable, ComputableStableDefined } from \"@milaboratories/computable\";\nimport {\n makeJsonDataInfo,\n AbstractPFrameDriver,\n AbstractPFrameDriverOpsDefaults,\n type AbstractInternalPFrameDriver,\n type AbstractPFrameDriverOps,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"@milaboratories/pf-driver\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport {\n BlobResourceRef,\n makeLocalBlobRef,\n parseDataInfoResource,\n traverseParquetChunkResource,\n} from \"./data\";\nimport { isDownloadNetworkError400 } from \"@milaboratories/pl-drivers\";\nimport { parseSignedResourceId } from \"@milaboratories/pl-client\";\n\nfunction makeBlobId(res: BlobResourceRef): PFrameInternal.PFrameBlobId {\n const { globalId } = parseSignedResourceId(res.resourceInfo.id);\n return String(globalId) as PFrameInternal.PFrameBlobId;\n}\n\ntype LocalBlob = ComputableStableDefined<LocalBlobHandleAndSize>;\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<BlobResourceRef, PFrameInternal.PFrameBlobId, LocalBlob>\n implements LocalBlobProvider<BlobResourceRef>\n{\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: PFrameInternal.Logger,\n ) {\n super();\n }\n\n protected calculateParamsKey(params: BlobResourceRef): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(\n params: BlobResourceRef,\n _key: PFrameInternal.PFrameBlobId,\n ): LocalBlob {\n return this.blobDriver.getDownloadedBlob(params.resourceInfo);\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): LocalBlob {\n const resource = super.tryGetByKey(blobId);\n if (!resource) throw new PFrameDriverError(`Local blob with id ${blobId} not found.`);\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (blobIds: PFrameInternal.PFrameBlobId[]) => {\n try {\n await Promise.all(\n blobIds.map((blobId) => this.getByKey(blobId).awaitStableFullValue(signal)),\n );\n } catch (err: unknown) {\n if (!isAbortError(err)) throw err;\n }\n },\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const computable = this.getByKey(blobId);\n const blob = await computable.awaitStableValue(signal);\n return await this.blobDriver.getContentDirect(blob.handle, { signal });\n },\n };\n }\n}\n\ntype RemoteBlob = Computable<RemoteBlobHandleAndSize>;\nclass RemoteBlobPool extends RefCountPoolBase<\n BlobResourceRef,\n PFrameInternal.PFrameBlobId,\n RemoteBlob\n> {\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: PFrameInternal.Logger,\n ) {\n super();\n }\n\n protected calculateParamsKey(params: BlobResourceRef): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(\n params: BlobResourceRef,\n _key: PFrameInternal.PFrameBlobId,\n ): RemoteBlob {\n if (params.onDemandSnapshot === undefined) {\n throw new PFrameDriverError(\n `BlobResourceRef for rid ${params.toJSON()} is missing the on-demand snapshot; ` +\n `remote (parquet) blobs must be captured via makeRemoteBlobRef.`,\n );\n }\n return this.blobDriver.getOnDemandBlob(params.onDemandSnapshot);\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): RemoteBlob {\n const resource = super.tryGetByKey(blobId);\n if (!resource) throw new PFrameDriverError(`Remote blob with id ${blobId} not found.`);\n return resource;\n }\n\n public async withContent<T>(\n handle: RemoteBlobHandle,\n options: {\n range: PFrameInternal.FileRange;\n signal: AbortSignal;\n handler: ContentHandler<T>;\n },\n ): Promise<T> {\n return await this.blobDriver.withContent(handle, {\n range: {\n from: options.range.start,\n to: options.range.end + 1,\n },\n signal: options.signal,\n handler: options.handler,\n });\n }\n}\n\ninterface BlobStoreOptions extends PFrameInternal.ObjectStoreOptions {\n remoteBlobProvider: RemoteBlobPool;\n}\n\nclass BlobStore extends PFrameInternal.BaseObjectStore {\n private readonly remoteBlobProvider: RemoteBlobPool;\n\n constructor(options: BlobStoreOptions) {\n super(options);\n this.remoteBlobProvider = options.remoteBlobProvider;\n }\n\n public override async request(\n filename: PFrameInternal.ParquetFileName,\n params: {\n method: PFrameInternal.HttpMethod;\n range?: PFrameInternal.HttpRange;\n signal: AbortSignal;\n callback: (response: PFrameInternal.ObjectStoreResponse) => Promise<void>;\n },\n ): Promise<void> {\n const blobId = filename.slice(\n 0,\n -PFrameInternal.ParquetExtension.length,\n ) as PFrameInternal.PFrameBlobId;\n const respond = async (response: PFrameInternal.ObjectStoreResponse): Promise<void> => {\n try {\n await params.callback(response);\n } catch (error: unknown) {\n this.logger(\n \"warn\",\n `PFrames blob store received unhandled rejection from HTTP handler: ${ensureError(error)}`,\n );\n }\n };\n\n try {\n const computable = this.remoteBlobProvider.tryGetByKey(blobId);\n if (!computable) return await respond({ type: \"NotFound\" });\n\n let blob: RemoteBlobHandleAndSize;\n try {\n blob = await computable.getValue();\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `PFrames blob store failed to get blob from computable: ${ensureError(error)}`,\n );\n return await respond({ type: \"InternalError\" });\n }\n params.signal.throwIfAborted();\n\n const translatedRange = this.translate(blob.size, params.range);\n if (!translatedRange) {\n return await respond({\n type: \"RangeNotSatisfiable\",\n size: blob.size,\n });\n }\n\n if (params.method === \"HEAD\") {\n return await respond({\n type: \"Ok\",\n size: blob.size,\n range: translatedRange,\n });\n }\n\n this.logger(\n \"info\",\n `PFrames blob store requesting content for ${blobId}, ` +\n `range [${translatedRange.start}..=${translatedRange.end}]`,\n );\n return await this.remoteBlobProvider.withContent(blob.handle, {\n range: translatedRange,\n signal: params.signal,\n handler: async (data) => {\n return await respond({\n type: \"Ok\",\n size: blob.size,\n range: translatedRange,\n data: Readable.fromWeb(data),\n });\n },\n });\n } catch (error: unknown) {\n if (!isAbortError(error)) {\n if (isDownloadNetworkError400(error) && error.statusCode === 404) {\n this.logger(\"info\", `PFrames blob store known race error: ${ensureError(error)}`);\n } else {\n this.logger(\"warn\", `PFrames blob store unhandled error: ${ensureError(error)}`);\n }\n }\n return await respond({ type: \"InternalError\" });\n }\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<BlobResourceRef> {\n constructor(\n private readonly pool: RemoteBlobPool,\n private readonly server: PFrameInternal.HttpServer,\n private readonly cache: PFrameInternal.CachingObjectStore,\n ) {}\n\n public static async init(\n blobDriver: DownloadDriver,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n cacheConfig: PFrameInternal.CacheConfig,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new RemoteBlobPool(blobDriver, logger);\n const store = new BlobStore({ remoteBlobProvider: pool, logger });\n const cachingStore = (await HttpHelpers.createCachingObjectStore({\n upstream: store,\n config: cacheConfig,\n logger,\n })) as PFrameInternal.CachingObjectStore; // TODO: remove cast after next PFrames release\n\n const handler = HttpHelpers.createRequestHandler({ store: cachingStore });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n logger(\"info\", `PFrames HTTP server started on ${server.info.url}`);\n\n return new RemoteBlobProviderImpl(pool, server, cachingStore);\n }\n\n public acquire(params: BlobResourceRef): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return this.cache.getMetrics();\n }\n\n public async resetCache(): Promise<void> {\n await this.cache.reset();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n await this.cache[Symbol.asyncDispose]();\n await this.pool[Symbol.asyncDispose]();\n }\n}\n\nexport interface InternalPFrameDriver extends AbstractInternalPFrameDriver<\n PColumnDataUniversal<PlTreeNodeAccessor>\n> {}\n\nexport type PFrameDriverOps = AbstractPFrameDriverOps & {\n /** Port to run parquet HTTP server on. */\n parquetServerPort: number;\n};\n\nexport const PFrameDriverOpsDefaults: PFrameDriverOps = {\n ...AbstractPFrameDriverOpsDefaults,\n parquetServerPort: 0, // 0 means that some unused port will be assigned by the OS\n};\n\n/**\n * Tuning for the persistent parquet blob cache, minus its filesystem path (which\n * is supplied separately - see {@link createPFrameDriver}'s `cachePath`). Carries\n * only the size/eviction knobs of {@link PFrameInternal.CacheConfig}.\n */\nexport type ParquetCacheOps = Omit<PFrameInternal.CacheConfig, \"cachePath\">;\n\nexport async function createPFrameDriver(params: {\n blobDriver: DownloadDriver;\n logger: MiLogger;\n spillPath: string;\n cachePath: string;\n options: PFrameDriverOps;\n cacheOps: ParquetCacheOps;\n}): Promise<InternalPFrameDriver> {\n const resolvedSpillPath = path.resolve(params.spillPath);\n await emptyDir(resolvedSpillPath);\n\n const logger: PFrameInternal.Logger = (level, message) => params.logger[level](message);\n const localBlobProvider = new LocalBlobProviderImpl(params.blobDriver, logger);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(\n params.blobDriver,\n logger,\n { port: params.options.parquetServerPort },\n { cachePath: path.resolve(params.cachePath), ...params.cacheOps },\n );\n\n const resolveDataInfo = (spec: PColumnSpec, data: PColumnDataUniversal<PlTreeNodeAccessor>) => {\n if (isPlTreeNodeAccessor(data)) {\n return parseDataInfoResource(data) ?? makeJsonDataInfo(spec, []);\n }\n\n return isDataInfo(data)\n ? data.type === \"ParquetPartitioned\"\n ? mapDataInfo(data, (a) => traverseParquetChunkResource(a))\n : mapDataInfo(data, (a) => makeLocalBlobRef(a))\n : makeJsonDataInfo(spec, data);\n };\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n spillPath: resolvedSpillPath,\n options: params.options,\n resolveDataInfo,\n });\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"driver.d.ts","names":[],"sources":["../../src/pool/driver.ts"],"mappings":";;;;;;;UA4SiB,oBAAA,SAA6B,4BAAA,CAC5C,oBAAA,CAAqB,kBAAA;AAAA,KAGX,eAAA,GAAkB,uBAAA;EAJQ,0CAMpC,iBAAA;AAAA;;;;;;KAaU,eAAA,GAAkB,IAAA,CAAK,cAAA,CAAe,WAAA"}
1
+ {"version":3,"file":"driver.d.ts","names":[],"sources":["../../src/pool/driver.ts"],"mappings":";;;;;;;UA4SiB,oBAAA,SAA6B,4BAAA,CAC5C,oBAAA,CAAqB,kBAAA;AAAA,KAGX,eAAA,GAAkB,uBAAuB;EAJf,0CAMpC,iBAAiB;AAAA;;;;;;KAaP,eAAA,GAAkB,IAAI,CAAC,cAAA,CAAe,WAAA"}
@@ -16,6 +16,8 @@ function makeBlobId(res) {
16
16
  return String(globalId);
17
17
  }
18
18
  var LocalBlobProviderImpl = class extends RefCountPoolBase {
19
+ blobDriver;
20
+ logger;
19
21
  constructor(blobDriver, logger) {
20
22
  super();
21
23
  this.blobDriver = blobDriver;
@@ -49,6 +51,8 @@ var LocalBlobProviderImpl = class extends RefCountPoolBase {
49
51
  }
50
52
  };
51
53
  var RemoteBlobPool = class extends RefCountPoolBase {
54
+ blobDriver;
55
+ logger;
52
56
  constructor(blobDriver, logger) {
53
57
  super();
54
58
  this.blobDriver = blobDriver;
@@ -134,6 +138,9 @@ var BlobStore = class extends PFrameInternal.BaseObjectStore {
134
138
  }
135
139
  };
136
140
  var RemoteBlobProviderImpl = class RemoteBlobProviderImpl {
141
+ pool;
142
+ server;
143
+ cache;
137
144
  constructor(pool, server, cache) {
138
145
  this.pool = pool;
139
146
  this.server = server;
@@ -1 +1 @@
1
- {"version":3,"file":"driver.js","names":[],"sources":["../../src/pool/driver.ts"],"sourcesContent":["import {\n mapDataInfo,\n isDataInfo,\n ensureError,\n PFrameDriverError,\n isAbortError,\n type LocalBlobHandleAndSize,\n type RemoteBlobHandleAndSize,\n type RemoteBlobHandle,\n type ContentHandler,\n type PColumnSpec,\n type PColumnDataUniversal,\n} from \"@platforma-sdk/model\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { emptyDir } from \"@milaboratories/ts-helpers\";\nimport { RefCountPoolBase, type PoolEntry, type MiLogger } from \"@milaboratories/helpers\";\nimport type { DownloadDriver } from \"@milaboratories/pl-drivers\";\nimport { isPlTreeNodeAccessor, type PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type { Computable, ComputableStableDefined } from \"@milaboratories/computable\";\nimport {\n makeJsonDataInfo,\n AbstractPFrameDriver,\n AbstractPFrameDriverOpsDefaults,\n type AbstractInternalPFrameDriver,\n type AbstractPFrameDriverOps,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"@milaboratories/pf-driver\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport {\n BlobResourceRef,\n makeLocalBlobRef,\n parseDataInfoResource,\n traverseParquetChunkResource,\n} from \"./data\";\nimport { isDownloadNetworkError400 } from \"@milaboratories/pl-drivers\";\nimport { parseSignedResourceId } from \"@milaboratories/pl-client\";\n\nfunction makeBlobId(res: BlobResourceRef): PFrameInternal.PFrameBlobId {\n const { globalId } = parseSignedResourceId(res.resourceInfo.id);\n return String(globalId) as PFrameInternal.PFrameBlobId;\n}\n\ntype LocalBlob = ComputableStableDefined<LocalBlobHandleAndSize>;\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<BlobResourceRef, PFrameInternal.PFrameBlobId, LocalBlob>\n implements LocalBlobProvider<BlobResourceRef>\n{\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: PFrameInternal.Logger,\n ) {\n super();\n }\n\n protected calculateParamsKey(params: BlobResourceRef): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(\n params: BlobResourceRef,\n _key: PFrameInternal.PFrameBlobId,\n ): LocalBlob {\n return this.blobDriver.getDownloadedBlob(params.resourceInfo);\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): LocalBlob {\n const resource = super.tryGetByKey(blobId);\n if (!resource) throw new PFrameDriverError(`Local blob with id ${blobId} not found.`);\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (blobIds: PFrameInternal.PFrameBlobId[]) => {\n try {\n await Promise.all(\n blobIds.map((blobId) => this.getByKey(blobId).awaitStableFullValue(signal)),\n );\n } catch (err: unknown) {\n if (!isAbortError(err)) throw err;\n }\n },\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const computable = this.getByKey(blobId);\n const blob = await computable.awaitStableValue(signal);\n return await this.blobDriver.getContentDirect(blob.handle, { signal });\n },\n };\n }\n}\n\ntype RemoteBlob = Computable<RemoteBlobHandleAndSize>;\nclass RemoteBlobPool extends RefCountPoolBase<\n BlobResourceRef,\n PFrameInternal.PFrameBlobId,\n RemoteBlob\n> {\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: PFrameInternal.Logger,\n ) {\n super();\n }\n\n protected calculateParamsKey(params: BlobResourceRef): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(\n params: BlobResourceRef,\n _key: PFrameInternal.PFrameBlobId,\n ): RemoteBlob {\n if (params.onDemandSnapshot === undefined) {\n throw new PFrameDriverError(\n `BlobResourceRef for rid ${params.toJSON()} is missing the on-demand snapshot; ` +\n `remote (parquet) blobs must be captured via makeRemoteBlobRef.`,\n );\n }\n return this.blobDriver.getOnDemandBlob(params.onDemandSnapshot);\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): RemoteBlob {\n const resource = super.tryGetByKey(blobId);\n if (!resource) throw new PFrameDriverError(`Remote blob with id ${blobId} not found.`);\n return resource;\n }\n\n public async withContent<T>(\n handle: RemoteBlobHandle,\n options: {\n range: PFrameInternal.FileRange;\n signal: AbortSignal;\n handler: ContentHandler<T>;\n },\n ): Promise<T> {\n return await this.blobDriver.withContent(handle, {\n range: {\n from: options.range.start,\n to: options.range.end + 1,\n },\n signal: options.signal,\n handler: options.handler,\n });\n }\n}\n\ninterface BlobStoreOptions extends PFrameInternal.ObjectStoreOptions {\n remoteBlobProvider: RemoteBlobPool;\n}\n\nclass BlobStore extends PFrameInternal.BaseObjectStore {\n private readonly remoteBlobProvider: RemoteBlobPool;\n\n constructor(options: BlobStoreOptions) {\n super(options);\n this.remoteBlobProvider = options.remoteBlobProvider;\n }\n\n public override async request(\n filename: PFrameInternal.ParquetFileName,\n params: {\n method: PFrameInternal.HttpMethod;\n range?: PFrameInternal.HttpRange;\n signal: AbortSignal;\n callback: (response: PFrameInternal.ObjectStoreResponse) => Promise<void>;\n },\n ): Promise<void> {\n const blobId = filename.slice(\n 0,\n -PFrameInternal.ParquetExtension.length,\n ) as PFrameInternal.PFrameBlobId;\n const respond = async (response: PFrameInternal.ObjectStoreResponse): Promise<void> => {\n try {\n await params.callback(response);\n } catch (error: unknown) {\n this.logger(\n \"warn\",\n `PFrames blob store received unhandled rejection from HTTP handler: ${ensureError(error)}`,\n );\n }\n };\n\n try {\n const computable = this.remoteBlobProvider.tryGetByKey(blobId);\n if (!computable) return await respond({ type: \"NotFound\" });\n\n let blob: RemoteBlobHandleAndSize;\n try {\n blob = await computable.getValue();\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `PFrames blob store failed to get blob from computable: ${ensureError(error)}`,\n );\n return await respond({ type: \"InternalError\" });\n }\n params.signal.throwIfAborted();\n\n const translatedRange = this.translate(blob.size, params.range);\n if (!translatedRange) {\n return await respond({\n type: \"RangeNotSatisfiable\",\n size: blob.size,\n });\n }\n\n if (params.method === \"HEAD\") {\n return await respond({\n type: \"Ok\",\n size: blob.size,\n range: translatedRange,\n });\n }\n\n this.logger(\n \"info\",\n `PFrames blob store requesting content for ${blobId}, ` +\n `range [${translatedRange.start}..=${translatedRange.end}]`,\n );\n return await this.remoteBlobProvider.withContent(blob.handle, {\n range: translatedRange,\n signal: params.signal,\n handler: async (data) => {\n return await respond({\n type: \"Ok\",\n size: blob.size,\n range: translatedRange,\n data: Readable.fromWeb(data),\n });\n },\n });\n } catch (error: unknown) {\n if (!isAbortError(error)) {\n if (isDownloadNetworkError400(error) && error.statusCode === 404) {\n this.logger(\"info\", `PFrames blob store known race error: ${ensureError(error)}`);\n } else {\n this.logger(\"warn\", `PFrames blob store unhandled error: ${ensureError(error)}`);\n }\n }\n return await respond({ type: \"InternalError\" });\n }\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<BlobResourceRef> {\n constructor(\n private readonly pool: RemoteBlobPool,\n private readonly server: PFrameInternal.HttpServer,\n private readonly cache: PFrameInternal.CachingObjectStore,\n ) {}\n\n public static async init(\n blobDriver: DownloadDriver,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n cacheConfig: PFrameInternal.CacheConfig,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new RemoteBlobPool(blobDriver, logger);\n const store = new BlobStore({ remoteBlobProvider: pool, logger });\n const cachingStore = (await HttpHelpers.createCachingObjectStore({\n upstream: store,\n config: cacheConfig,\n logger,\n })) as PFrameInternal.CachingObjectStore; // TODO: remove cast after next PFrames release\n\n const handler = HttpHelpers.createRequestHandler({ store: cachingStore });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n logger(\"info\", `PFrames HTTP server started on ${server.info.url}`);\n\n return new RemoteBlobProviderImpl(pool, server, cachingStore);\n }\n\n public acquire(params: BlobResourceRef): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return this.cache.getMetrics();\n }\n\n public async resetCache(): Promise<void> {\n await this.cache.reset();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n await this.cache[Symbol.asyncDispose]();\n await this.pool[Symbol.asyncDispose]();\n }\n}\n\nexport interface InternalPFrameDriver extends AbstractInternalPFrameDriver<\n PColumnDataUniversal<PlTreeNodeAccessor>\n> {}\n\nexport type PFrameDriverOps = AbstractPFrameDriverOps & {\n /** Port to run parquet HTTP server on. */\n parquetServerPort: number;\n};\n\nexport const PFrameDriverOpsDefaults: PFrameDriverOps = {\n ...AbstractPFrameDriverOpsDefaults,\n parquetServerPort: 0, // 0 means that some unused port will be assigned by the OS\n};\n\n/**\n * Tuning for the persistent parquet blob cache, minus its filesystem path (which\n * is supplied separately - see {@link createPFrameDriver}'s `cachePath`). Carries\n * only the size/eviction knobs of {@link PFrameInternal.CacheConfig}.\n */\nexport type ParquetCacheOps = Omit<PFrameInternal.CacheConfig, \"cachePath\">;\n\nexport async function createPFrameDriver(params: {\n blobDriver: DownloadDriver;\n logger: MiLogger;\n spillPath: string;\n cachePath: string;\n options: PFrameDriverOps;\n cacheOps: ParquetCacheOps;\n}): Promise<InternalPFrameDriver> {\n const resolvedSpillPath = path.resolve(params.spillPath);\n await emptyDir(resolvedSpillPath);\n\n const logger: PFrameInternal.Logger = (level, message) => params.logger[level](message);\n const localBlobProvider = new LocalBlobProviderImpl(params.blobDriver, logger);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(\n params.blobDriver,\n logger,\n { port: params.options.parquetServerPort },\n { cachePath: path.resolve(params.cachePath), ...params.cacheOps },\n );\n\n const resolveDataInfo = (spec: PColumnSpec, data: PColumnDataUniversal<PlTreeNodeAccessor>) => {\n if (isPlTreeNodeAccessor(data)) {\n return parseDataInfoResource(data) ?? makeJsonDataInfo(spec, []);\n }\n\n return isDataInfo(data)\n ? data.type === \"ParquetPartitioned\"\n ? mapDataInfo(data, (a) => traverseParquetChunkResource(a))\n : mapDataInfo(data, (a) => makeLocalBlobRef(a))\n : makeJsonDataInfo(spec, data);\n };\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n spillPath: resolvedSpillPath,\n options: params.options,\n resolveDataInfo,\n });\n}\n"],"mappings":";;;;;;;;;;;;;AAwCA,SAAS,WAAW,KAAmD;CACrE,MAAM,EAAE,aAAa,sBAAsB,IAAI,aAAa,GAAG;AAC/D,QAAO,OAAO,SAAS;;AAIzB,IAAM,wBAAN,cACU,iBAEV;CACE,YACE,YACA,QACA;AACA,SAAO;AAHU,OAAA,aAAA;AACA,OAAA,SAAA;;CAKnB,mBAA6B,QAAsD;AACjF,SAAO,WAAW,OAAO;;CAG3B,kBACE,QACA,MACW;AACX,SAAO,KAAK,WAAW,kBAAkB,OAAO,aAAa;;CAG/D,SAAgB,QAAgD;EAC9D,MAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,MAAI,CAAC,SAAU,OAAM,IAAI,kBAAkB,sBAAsB,OAAO,aAAa;AACrF,SAAO;;CAGT,eACE,QAC0D;AAC1D,SAAO;GACL,aAAa,OAAO,YAA2C;AAC7D,QAAI;AACF,WAAM,QAAQ,IACZ,QAAQ,KAAK,WAAW,KAAK,SAAS,OAAO,CAAC,qBAAqB,OAAO,CAAC,CAC5E;aACM,KAAc;AACrB,SAAI,CAAC,aAAa,IAAI,CAAE,OAAM;;;GAGlC,oBAAoB,OAAO,WAAwC;IAEjE,MAAM,OAAO,MADM,KAAK,SAAS,OAAO,CACV,iBAAiB,OAAO;AACtD,WAAO,MAAM,KAAK,WAAW,iBAAiB,KAAK,QAAQ,EAAE,QAAQ,CAAC;;GAEzE;;;AAKL,IAAM,iBAAN,cAA6B,iBAI3B;CACA,YACE,YACA,QACA;AACA,SAAO;AAHU,OAAA,aAAA;AACA,OAAA,SAAA;;CAKnB,mBAA6B,QAAsD;AACjF,SAAO,WAAW,OAAO;;CAG3B,kBACE,QACA,MACY;AACZ,MAAI,OAAO,qBAAqB,KAAA,EAC9B,OAAM,IAAI,kBACR,2BAA2B,OAAO,QAAQ,CAAC,oGAE5C;AAEH,SAAO,KAAK,WAAW,gBAAgB,OAAO,iBAAiB;;CAGjE,SAAgB,QAAiD;EAC/D,MAAM,WAAW,MAAM,YAAY,OAAO;AAC1C,MAAI,CAAC,SAAU,OAAM,IAAI,kBAAkB,uBAAuB,OAAO,aAAa;AACtF,SAAO;;CAGT,MAAa,YACX,QACA,SAKY;AACZ,SAAO,MAAM,KAAK,WAAW,YAAY,QAAQ;GAC/C,OAAO;IACL,MAAM,QAAQ,MAAM;IACpB,IAAI,QAAQ,MAAM,MAAM;IACzB;GACD,QAAQ,QAAQ;GAChB,SAAS,QAAQ;GAClB,CAAC;;;AAQN,IAAM,YAAN,cAAwB,eAAe,gBAAgB;CACrD;CAEA,YAAY,SAA2B;AACrC,QAAM,QAAQ;AACd,OAAK,qBAAqB,QAAQ;;CAGpC,MAAsB,QACpB,UACA,QAMe;EACf,MAAM,SAAS,SAAS,MACtB,GACA,CAAC,eAAe,iBAAiB,OAClC;EACD,MAAM,UAAU,OAAO,aAAgE;AACrF,OAAI;AACF,UAAM,OAAO,SAAS,SAAS;YACxB,OAAgB;AACvB,SAAK,OACH,QACA,sEAAsE,YAAY,MAAM,GACzF;;;AAIL,MAAI;GACF,MAAM,aAAa,KAAK,mBAAmB,YAAY,OAAO;AAC9D,OAAI,CAAC,WAAY,QAAO,MAAM,QAAQ,EAAE,MAAM,YAAY,CAAC;GAE3D,IAAI;AACJ,OAAI;AACF,WAAO,MAAM,WAAW,UAAU;YAC3B,OAAgB;AACvB,SAAK,OACH,SACA,0DAA0D,YAAY,MAAM,GAC7E;AACD,WAAO,MAAM,QAAQ,EAAE,MAAM,iBAAiB,CAAC;;AAEjD,UAAO,OAAO,gBAAgB;GAE9B,MAAM,kBAAkB,KAAK,UAAU,KAAK,MAAM,OAAO,MAAM;AAC/D,OAAI,CAAC,gBACH,QAAO,MAAM,QAAQ;IACnB,MAAM;IACN,MAAM,KAAK;IACZ,CAAC;AAGJ,OAAI,OAAO,WAAW,OACpB,QAAO,MAAM,QAAQ;IACnB,MAAM;IACN,MAAM,KAAK;IACX,OAAO;IACR,CAAC;AAGJ,QAAK,OACH,QACA,6CAA6C,OAAO,WACxC,gBAAgB,MAAM,KAAK,gBAAgB,IAAI,GAC5D;AACD,UAAO,MAAM,KAAK,mBAAmB,YAAY,KAAK,QAAQ;IAC5D,OAAO;IACP,QAAQ,OAAO;IACf,SAAS,OAAO,SAAS;AACvB,YAAO,MAAM,QAAQ;MACnB,MAAM;MACN,MAAM,KAAK;MACX,OAAO;MACP,MAAM,SAAS,QAAQ,KAAK;MAC7B,CAAC;;IAEL,CAAC;WACK,OAAgB;AACvB,OAAI,CAAC,aAAa,MAAM,CACtB,KAAI,0BAA0B,MAAM,IAAI,MAAM,eAAe,IAC3D,MAAK,OAAO,QAAQ,wCAAwC,YAAY,MAAM,GAAG;OAEjF,MAAK,OAAO,QAAQ,uCAAuC,YAAY,MAAM,GAAG;AAGpF,UAAO,MAAM,QAAQ,EAAE,MAAM,iBAAiB,CAAC;;;;AAKrD,IAAM,yBAAN,MAAM,uBAAsE;CAC1E,YACE,MACA,QACA,OACA;AAHiB,OAAA,OAAA;AACA,OAAA,SAAA;AACA,OAAA,QAAA;;CAGnB,aAAoB,KAClB,YACA,QACA,eACA,aACiC;EACjC,MAAM,OAAO,IAAI,eAAe,YAAY,OAAO;EACnD,MAAM,QAAQ,IAAI,UAAU;GAAE,oBAAoB;GAAM;GAAQ,CAAC;EACjE,MAAM,eAAgB,MAAM,YAAY,yBAAyB;GAC/D,UAAU;GACV,QAAQ;GACR;GACD,CAAC;EAEF,MAAM,UAAU,YAAY,qBAAqB,EAAE,OAAO,cAAc,CAAC;EACzE,MAAM,SAAS,MAAM,YAAY,iBAAiB;GAAE,GAAG;GAAe;GAAS,CAAC;AAChF,SAAO,QAAQ,kCAAkC,OAAO,KAAK,MAAM;AAEnE,SAAO,IAAI,uBAAuB,MAAM,QAAQ,aAAa;;CAG/D,QAAe,QAAiE;AAC9E,SAAO,KAAK,KAAK,QAAQ,OAAO;;CAGlC,iBAAuD;AACrD,SAAO,KAAK,OAAO;;CAGrB,MAAa,kBAA+D;AAC1E,SAAO,KAAK,MAAM,YAAY;;CAGhC,MAAa,aAA4B;AACvC,QAAM,KAAK,MAAM,OAAO;;CAG1B,OAAO,OAAO,gBAA+B;AAC3C,QAAM,KAAK,OAAO,MAAM;AACxB,QAAM,KAAK,MAAM,OAAO,eAAe;AACvC,QAAM,KAAK,KAAK,OAAO,eAAe;;;AAa1C,MAAa,0BAA2C;CACtD,GAAG;CACH,mBAAmB;CACpB;AASD,eAAsB,mBAAmB,QAOP;CAChC,MAAM,oBAAoB,KAAK,QAAQ,OAAO,UAAU;AACxD,OAAM,SAAS,kBAAkB;CAEjC,MAAM,UAAiC,OAAO,YAAY,OAAO,OAAO,OAAO,QAAQ;CACvF,MAAM,oBAAoB,IAAI,sBAAsB,OAAO,YAAY,OAAO;CAC9E,MAAM,qBAAqB,MAAM,uBAAuB,KACtD,OAAO,YACP,QACA,EAAE,MAAM,OAAO,QAAQ,mBAAmB,EAC1C;EAAE,WAAW,KAAK,QAAQ,OAAO,UAAU;EAAE,GAAG,OAAO;EAAU,CAClE;CAED,MAAM,mBAAmB,MAAmB,SAAmD;AAC7F,MAAI,qBAAqB,KAAK,CAC5B,QAAO,sBAAsB,KAAK,IAAI,iBAAiB,MAAM,EAAE,CAAC;AAGlE,SAAO,WAAW,KAAK,GACnB,KAAK,SAAS,uBACZ,YAAY,OAAO,MAAM,6BAA6B,EAAE,CAAC,GACzD,YAAY,OAAO,MAAM,iBAAiB,EAAE,CAAC,GAC/C,iBAAiB,MAAM,KAAK;;AAGlC,QAAO,IAAI,qBAAqB;EAC9B;EACA;EACA;EACA,WAAW;EACX,SAAS,OAAO;EAChB;EACD,CAAC"}
1
+ {"version":3,"file":"driver.js","names":[],"sources":["../../src/pool/driver.ts"],"sourcesContent":["import {\n mapDataInfo,\n isDataInfo,\n ensureError,\n PFrameDriverError,\n isAbortError,\n type LocalBlobHandleAndSize,\n type RemoteBlobHandleAndSize,\n type RemoteBlobHandle,\n type ContentHandler,\n type PColumnSpec,\n type PColumnDataUniversal,\n} from \"@platforma-sdk/model\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { emptyDir } from \"@milaboratories/ts-helpers\";\nimport { RefCountPoolBase, type PoolEntry, type MiLogger } from \"@milaboratories/helpers\";\nimport type { DownloadDriver } from \"@milaboratories/pl-drivers\";\nimport { isPlTreeNodeAccessor, type PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type { Computable, ComputableStableDefined } from \"@milaboratories/computable\";\nimport {\n makeJsonDataInfo,\n AbstractPFrameDriver,\n AbstractPFrameDriverOpsDefaults,\n type AbstractInternalPFrameDriver,\n type AbstractPFrameDriverOps,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"@milaboratories/pf-driver\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport {\n BlobResourceRef,\n makeLocalBlobRef,\n parseDataInfoResource,\n traverseParquetChunkResource,\n} from \"./data\";\nimport { isDownloadNetworkError400 } from \"@milaboratories/pl-drivers\";\nimport { parseSignedResourceId } from \"@milaboratories/pl-client\";\n\nfunction makeBlobId(res: BlobResourceRef): PFrameInternal.PFrameBlobId {\n const { globalId } = parseSignedResourceId(res.resourceInfo.id);\n return String(globalId) as PFrameInternal.PFrameBlobId;\n}\n\ntype LocalBlob = ComputableStableDefined<LocalBlobHandleAndSize>;\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<BlobResourceRef, PFrameInternal.PFrameBlobId, LocalBlob>\n implements LocalBlobProvider<BlobResourceRef>\n{\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: PFrameInternal.Logger,\n ) {\n super();\n }\n\n protected calculateParamsKey(params: BlobResourceRef): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(\n params: BlobResourceRef,\n _key: PFrameInternal.PFrameBlobId,\n ): LocalBlob {\n return this.blobDriver.getDownloadedBlob(params.resourceInfo);\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): LocalBlob {\n const resource = super.tryGetByKey(blobId);\n if (!resource) throw new PFrameDriverError(`Local blob with id ${blobId} not found.`);\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (blobIds: PFrameInternal.PFrameBlobId[]) => {\n try {\n await Promise.all(\n blobIds.map((blobId) => this.getByKey(blobId).awaitStableFullValue(signal)),\n );\n } catch (err: unknown) {\n if (!isAbortError(err)) throw err;\n }\n },\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const computable = this.getByKey(blobId);\n const blob = await computable.awaitStableValue(signal);\n return await this.blobDriver.getContentDirect(blob.handle, { signal });\n },\n };\n }\n}\n\ntype RemoteBlob = Computable<RemoteBlobHandleAndSize>;\nclass RemoteBlobPool extends RefCountPoolBase<\n BlobResourceRef,\n PFrameInternal.PFrameBlobId,\n RemoteBlob\n> {\n constructor(\n private readonly blobDriver: DownloadDriver,\n private readonly logger: PFrameInternal.Logger,\n ) {\n super();\n }\n\n protected calculateParamsKey(params: BlobResourceRef): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(\n params: BlobResourceRef,\n _key: PFrameInternal.PFrameBlobId,\n ): RemoteBlob {\n if (params.onDemandSnapshot === undefined) {\n throw new PFrameDriverError(\n `BlobResourceRef for rid ${params.toJSON()} is missing the on-demand snapshot; ` +\n `remote (parquet) blobs must be captured via makeRemoteBlobRef.`,\n );\n }\n return this.blobDriver.getOnDemandBlob(params.onDemandSnapshot);\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): RemoteBlob {\n const resource = super.tryGetByKey(blobId);\n if (!resource) throw new PFrameDriverError(`Remote blob with id ${blobId} not found.`);\n return resource;\n }\n\n public async withContent<T>(\n handle: RemoteBlobHandle,\n options: {\n range: PFrameInternal.FileRange;\n signal: AbortSignal;\n handler: ContentHandler<T>;\n },\n ): Promise<T> {\n return await this.blobDriver.withContent(handle, {\n range: {\n from: options.range.start,\n to: options.range.end + 1,\n },\n signal: options.signal,\n handler: options.handler,\n });\n }\n}\n\ninterface BlobStoreOptions extends PFrameInternal.ObjectStoreOptions {\n remoteBlobProvider: RemoteBlobPool;\n}\n\nclass BlobStore extends PFrameInternal.BaseObjectStore {\n private readonly remoteBlobProvider: RemoteBlobPool;\n\n constructor(options: BlobStoreOptions) {\n super(options);\n this.remoteBlobProvider = options.remoteBlobProvider;\n }\n\n public override async request(\n filename: PFrameInternal.ParquetFileName,\n params: {\n method: PFrameInternal.HttpMethod;\n range?: PFrameInternal.HttpRange;\n signal: AbortSignal;\n callback: (response: PFrameInternal.ObjectStoreResponse) => Promise<void>;\n },\n ): Promise<void> {\n const blobId = filename.slice(\n 0,\n -PFrameInternal.ParquetExtension.length,\n ) as PFrameInternal.PFrameBlobId;\n const respond = async (response: PFrameInternal.ObjectStoreResponse): Promise<void> => {\n try {\n await params.callback(response);\n } catch (error: unknown) {\n this.logger(\n \"warn\",\n `PFrames blob store received unhandled rejection from HTTP handler: ${ensureError(error)}`,\n );\n }\n };\n\n try {\n const computable = this.remoteBlobProvider.tryGetByKey(blobId);\n if (!computable) return await respond({ type: \"NotFound\" });\n\n let blob: RemoteBlobHandleAndSize;\n try {\n blob = await computable.getValue();\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `PFrames blob store failed to get blob from computable: ${ensureError(error)}`,\n );\n return await respond({ type: \"InternalError\" });\n }\n params.signal.throwIfAborted();\n\n const translatedRange = this.translate(blob.size, params.range);\n if (!translatedRange) {\n return await respond({\n type: \"RangeNotSatisfiable\",\n size: blob.size,\n });\n }\n\n if (params.method === \"HEAD\") {\n return await respond({\n type: \"Ok\",\n size: blob.size,\n range: translatedRange,\n });\n }\n\n this.logger(\n \"info\",\n `PFrames blob store requesting content for ${blobId}, ` +\n `range [${translatedRange.start}..=${translatedRange.end}]`,\n );\n return await this.remoteBlobProvider.withContent(blob.handle, {\n range: translatedRange,\n signal: params.signal,\n handler: async (data) => {\n return await respond({\n type: \"Ok\",\n size: blob.size,\n range: translatedRange,\n data: Readable.fromWeb(data),\n });\n },\n });\n } catch (error: unknown) {\n if (!isAbortError(error)) {\n if (isDownloadNetworkError400(error) && error.statusCode === 404) {\n this.logger(\"info\", `PFrames blob store known race error: ${ensureError(error)}`);\n } else {\n this.logger(\"warn\", `PFrames blob store unhandled error: ${ensureError(error)}`);\n }\n }\n return await respond({ type: \"InternalError\" });\n }\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<BlobResourceRef> {\n constructor(\n private readonly pool: RemoteBlobPool,\n private readonly server: PFrameInternal.HttpServer,\n private readonly cache: PFrameInternal.CachingObjectStore,\n ) {}\n\n public static async init(\n blobDriver: DownloadDriver,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n cacheConfig: PFrameInternal.CacheConfig,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new RemoteBlobPool(blobDriver, logger);\n const store = new BlobStore({ remoteBlobProvider: pool, logger });\n const cachingStore = (await HttpHelpers.createCachingObjectStore({\n upstream: store,\n config: cacheConfig,\n logger,\n })) as PFrameInternal.CachingObjectStore; // TODO: remove cast after next PFrames release\n\n const handler = HttpHelpers.createRequestHandler({ store: cachingStore });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n logger(\"info\", `PFrames HTTP server started on ${server.info.url}`);\n\n return new RemoteBlobProviderImpl(pool, server, cachingStore);\n }\n\n public acquire(params: BlobResourceRef): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return this.cache.getMetrics();\n }\n\n public async resetCache(): Promise<void> {\n await this.cache.reset();\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n await this.cache[Symbol.asyncDispose]();\n await this.pool[Symbol.asyncDispose]();\n }\n}\n\nexport interface InternalPFrameDriver extends AbstractInternalPFrameDriver<\n PColumnDataUniversal<PlTreeNodeAccessor>\n> {}\n\nexport type PFrameDriverOps = AbstractPFrameDriverOps & {\n /** Port to run parquet HTTP server on. */\n parquetServerPort: number;\n};\n\nexport const PFrameDriverOpsDefaults: PFrameDriverOps = {\n ...AbstractPFrameDriverOpsDefaults,\n parquetServerPort: 0, // 0 means that some unused port will be assigned by the OS\n};\n\n/**\n * Tuning for the persistent parquet blob cache, minus its filesystem path (which\n * is supplied separately - see {@link createPFrameDriver}'s `cachePath`). Carries\n * only the size/eviction knobs of {@link PFrameInternal.CacheConfig}.\n */\nexport type ParquetCacheOps = Omit<PFrameInternal.CacheConfig, \"cachePath\">;\n\nexport async function createPFrameDriver(params: {\n blobDriver: DownloadDriver;\n logger: MiLogger;\n spillPath: string;\n cachePath: string;\n options: PFrameDriverOps;\n cacheOps: ParquetCacheOps;\n}): Promise<InternalPFrameDriver> {\n const resolvedSpillPath = path.resolve(params.spillPath);\n await emptyDir(resolvedSpillPath);\n\n const logger: PFrameInternal.Logger = (level, message) => params.logger[level](message);\n const localBlobProvider = new LocalBlobProviderImpl(params.blobDriver, logger);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(\n params.blobDriver,\n logger,\n { port: params.options.parquetServerPort },\n { cachePath: path.resolve(params.cachePath), ...params.cacheOps },\n );\n\n const resolveDataInfo = (spec: PColumnSpec, data: PColumnDataUniversal<PlTreeNodeAccessor>) => {\n if (isPlTreeNodeAccessor(data)) {\n return parseDataInfoResource(data) ?? makeJsonDataInfo(spec, []);\n }\n\n return isDataInfo(data)\n ? data.type === \"ParquetPartitioned\"\n ? mapDataInfo(data, (a) => traverseParquetChunkResource(a))\n : mapDataInfo(data, (a) => makeLocalBlobRef(a))\n : makeJsonDataInfo(spec, data);\n };\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n spillPath: resolvedSpillPath,\n options: params.options,\n resolveDataInfo,\n });\n}\n"],"mappings":"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"}
@@ -1,2 +1,5 @@
1
- require("./result_pool.cjs");
2
- require("./driver.cjs");
1
+ const require_result_pool = require("./result_pool.cjs");
2
+ const require_driver = require("./driver.cjs");
3
+ exports.PFrameDriverOpsDefaults = require_driver.PFrameDriverOpsDefaults;
4
+ exports.ResultPool = require_result_pool.ResultPool;
5
+ exports.createPFrameDriver = require_driver.createPFrameDriver;
@@ -1 +1,2 @@
1
- import { InternalPFrameDriver, PFrameDriverOps, ParquetCacheOps } from "./driver.js";
1
+ import { InternalPFrameDriver, PFrameDriverOps, ParquetCacheOps } from "./driver.js";
2
+ export { InternalPFrameDriver, PFrameDriverOps, ParquetCacheOps };
@@ -1,2 +1,3 @@
1
- import "./result_pool.js";
2
- import "./driver.js";
1
+ import { ResultPool } from "./result_pool.js";
2
+ import { PFrameDriverOpsDefaults, createPFrameDriver } from "./driver.js";
3
+ export { PFrameDriverOpsDefaults, ResultPool, createPFrameDriver };
@@ -2,7 +2,7 @@ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
2
  const require_data = require("./data.cjs");
3
3
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
4
4
  let node_assert = require("node:assert");
5
- node_assert = require_runtime.__toESM(node_assert);
5
+ node_assert = require_runtime.__toESM(node_assert, 1);
6
6
  //#region src/pool/p_object_collection.ts
7
7
  function parseRawPObjectCollection(node, errorOnUnknownField = true, ignoreFieldErrors = false, prefix = "") {
8
8
  const entryPattern = /^(?<name>.*)\.(?<type>spec|data)$/;
@@ -1 +1 @@
1
- {"version":3,"file":"p_object_collection.cjs","names":["deriveLegacyPObjectId","deriveLocalPObjectId"],"sources":["../../src/pool/p_object_collection.ts"],"sourcesContent":["import { type PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type { PObject, PObjectSpec, ValueOrError } from \"@platforma-sdk/model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport assert from \"node:assert\";\nimport type { Writable } from \"utility-types\";\nimport { deriveLegacyPObjectId, deriveLocalPObjectId } from \"./data\";\n\n/** Represents specific staging or prod ctx data */\nexport interface RawPObjectCollection {\n /** true if no new results are expected */\n readonly locked: boolean;\n /** results by name */\n readonly results: Map<string, RawPObjectEntry>;\n}\n\n/** Single result in a particular ctx */\nexport interface RawPObjectEntry {\n /**\n * true - means this result has data field, however it may still be not ready\n * false - means it can be derived that this result incarnation is spec-only\n * undefined - means that it is not yet known\n * */\n readonly hasData?: boolean;\n\n /** Result may be added even if there is no data associated with it */\n readonly spec?: PObjectSpec;\n\n /**\n * Returns data accessor, or error, or undefined if data not yet available.\n * If data fuinction itself is not defined, this means that corresponding context\n * was not rendered.\n * */\n data?(): ValueOrError<PlTreeNodeAccessor, Error> | undefined;\n}\n\nexport function parseRawPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n ignoreFieldErrors: boolean = false,\n prefix: string = \"\",\n): RawPObjectCollection {\n const entryPattern = /^(?<name>.*)\\.(?<type>spec|data)$/;\n const results = new Map<string, Writable<RawPObjectEntry>>();\n for (const fieldName of node.listInputFields()) {\n const match = fieldName.match(entryPattern);\n if (!match) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n\n let name = notEmpty(match.groups?.name);\n if (!name.startsWith(prefix)) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n name = name.slice(prefix.length);\n\n const type = notEmpty(match.groups?.type) as \"spec\" | \"data\";\n let result = results.get(name);\n if (result === undefined) {\n result = {};\n results.set(name, result);\n }\n\n switch (type) {\n case \"spec\":\n result.spec = node\n .traverse({\n field: fieldName,\n ignoreError: ignoreFieldErrors,\n pureFieldErrorToUndefined: ignoreFieldErrors,\n })\n ?.getDataAsJson();\n break;\n case \"data\":\n result.hasData = true;\n result.data = () =>\n node.traverseOrError({\n field: fieldName,\n ignoreError: ignoreFieldErrors,\n });\n break;\n default:\n // other value types planned\n break;\n }\n }\n\n const locked = node.getInputsLocked();\n if (locked)\n for (const [, result] of results) if (result.data === undefined) result.hasData = false;\n\n return { locked, results };\n}\n\nexport function parseFinalPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n prefix: string = \"\",\n resolvePath: string[],\n): Record<string, PObject<PlTreeNodeAccessor>> {\n if (!node.getIsReadyOrError()) throw new Error(\"resource is not ready\");\n const rawCollection = parseRawPObjectCollection(node, errorOnUnknownField, false, prefix);\n assert(rawCollection.locked);\n const collection: Record<string, PObject<PlTreeNodeAccessor>> = {};\n for (const [outputName, result] of rawCollection.results) {\n if (result.spec === undefined) throw new Error(`no spec for key ${outputName}`);\n if (result.hasData !== true || result.data === undefined)\n throw new Error(`no data for key ${outputName}`);\n const data = result.data();\n if (data === undefined) throw new Error(`no data for key ${outputName}`);\n if (!data.ok) throw data.error;\n collection[outputName] = {\n id:\n resolvePath.length === 0\n ? deriveLegacyPObjectId(result.spec, data.value) // for old blocks opened in new desktop\n : deriveLocalPObjectId(resolvePath, outputName),\n spec: result.spec,\n data: data.value,\n };\n }\n return collection;\n}\n"],"mappings":";;;;;;AAmCA,SAAgB,0BACd,MACA,sBAA+B,MAC/B,oBAA6B,OAC7B,SAAiB,IACK;CACtB,MAAM,eAAe;CACrB,MAAM,0BAAU,IAAI,KAAwC;AAC5D,MAAK,MAAM,aAAa,KAAK,iBAAiB,EAAE;EAC9C,MAAM,QAAQ,UAAU,MAAM,aAAa;AAC3C,MAAI,CAAC,MACH,KAAI,oBAAqB,OAAM,IAAI,MAAM,yBAAyB,YAAY;MACzE;EAGP,IAAI,QAAA,GAAA,2BAAA,UAAgB,MAAM,QAAQ,KAAK;AACvC,MAAI,CAAC,KAAK,WAAW,OAAO,CAC1B,KAAI,oBAAqB,OAAM,IAAI,MAAM,yBAAyB,YAAY;MACzE;AAEP,SAAO,KAAK,MAAM,OAAO,OAAO;EAEhC,MAAM,QAAA,GAAA,2BAAA,UAAgB,MAAM,QAAQ,KAAK;EACzC,IAAI,SAAS,QAAQ,IAAI,KAAK;AAC9B,MAAI,WAAW,KAAA,GAAW;AACxB,YAAS,EAAE;AACX,WAAQ,IAAI,MAAM,OAAO;;AAG3B,UAAQ,MAAR;GACE,KAAK;AACH,WAAO,OAAO,KACX,SAAS;KACR,OAAO;KACP,aAAa;KACb,2BAA2B;KAC5B,CAAC,EACA,eAAe;AACnB;GACF,KAAK;AACH,WAAO,UAAU;AACjB,WAAO,aACL,KAAK,gBAAgB;KACnB,OAAO;KACP,aAAa;KACd,CAAC;AACJ;GACF,QAEE;;;CAIN,MAAM,SAAS,KAAK,iBAAiB;AACrC,KAAI;OACG,MAAM,GAAG,WAAW,QAAS,KAAI,OAAO,SAAS,KAAA,EAAW,QAAO,UAAU;;AAEpF,QAAO;EAAE;EAAQ;EAAS;;AAG5B,SAAgB,4BACd,MACA,sBAA+B,MAC/B,SAAiB,IACjB,aAC6C;AAC7C,KAAI,CAAC,KAAK,mBAAmB,CAAE,OAAM,IAAI,MAAM,wBAAwB;CACvE,MAAM,gBAAgB,0BAA0B,MAAM,qBAAqB,OAAO,OAAO;AACzF,EAAA,GAAA,YAAA,SAAO,cAAc,OAAO;CAC5B,MAAM,aAA0D,EAAE;AAClE,MAAK,MAAM,CAAC,YAAY,WAAW,cAAc,SAAS;AACxD,MAAI,OAAO,SAAS,KAAA,EAAW,OAAM,IAAI,MAAM,mBAAmB,aAAa;AAC/E,MAAI,OAAO,YAAY,QAAQ,OAAO,SAAS,KAAA,EAC7C,OAAM,IAAI,MAAM,mBAAmB,aAAa;EAClD,MAAM,OAAO,OAAO,MAAM;AAC1B,MAAI,SAAS,KAAA,EAAW,OAAM,IAAI,MAAM,mBAAmB,aAAa;AACxE,MAAI,CAAC,KAAK,GAAI,OAAM,KAAK;AACzB,aAAW,cAAc;GACvB,IACE,YAAY,WAAW,IACnBA,aAAAA,sBAAsB,OAAO,MAAM,KAAK,MAAM,GAC9CC,aAAAA,qBAAqB,aAAa,WAAW;GACnD,MAAM,OAAO;GACb,MAAM,KAAK;GACZ;;AAEH,QAAO"}
1
+ {"version":3,"file":"p_object_collection.cjs","names":["deriveLegacyPObjectId","deriveLocalPObjectId"],"sources":["../../src/pool/p_object_collection.ts"],"sourcesContent":["import { type PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type { PObject, PObjectSpec, ValueOrError } from \"@platforma-sdk/model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport assert from \"node:assert\";\nimport type { Writable } from \"utility-types\";\nimport { deriveLegacyPObjectId, deriveLocalPObjectId } from \"./data\";\n\n/** Represents specific staging or prod ctx data */\nexport interface RawPObjectCollection {\n /** true if no new results are expected */\n readonly locked: boolean;\n /** results by name */\n readonly results: Map<string, RawPObjectEntry>;\n}\n\n/** Single result in a particular ctx */\nexport interface RawPObjectEntry {\n /**\n * true - means this result has data field, however it may still be not ready\n * false - means it can be derived that this result incarnation is spec-only\n * undefined - means that it is not yet known\n * */\n readonly hasData?: boolean;\n\n /** Result may be added even if there is no data associated with it */\n readonly spec?: PObjectSpec;\n\n /**\n * Returns data accessor, or error, or undefined if data not yet available.\n * If data fuinction itself is not defined, this means that corresponding context\n * was not rendered.\n * */\n data?(): ValueOrError<PlTreeNodeAccessor, Error> | undefined;\n}\n\nexport function parseRawPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n ignoreFieldErrors: boolean = false,\n prefix: string = \"\",\n): RawPObjectCollection {\n const entryPattern = /^(?<name>.*)\\.(?<type>spec|data)$/;\n const results = new Map<string, Writable<RawPObjectEntry>>();\n for (const fieldName of node.listInputFields()) {\n const match = fieldName.match(entryPattern);\n if (!match) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n\n let name = notEmpty(match.groups?.name);\n if (!name.startsWith(prefix)) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n name = name.slice(prefix.length);\n\n const type = notEmpty(match.groups?.type) as \"spec\" | \"data\";\n let result = results.get(name);\n if (result === undefined) {\n result = {};\n results.set(name, result);\n }\n\n switch (type) {\n case \"spec\":\n result.spec = node\n .traverse({\n field: fieldName,\n ignoreError: ignoreFieldErrors,\n pureFieldErrorToUndefined: ignoreFieldErrors,\n })\n ?.getDataAsJson();\n break;\n case \"data\":\n result.hasData = true;\n result.data = () =>\n node.traverseOrError({\n field: fieldName,\n ignoreError: ignoreFieldErrors,\n });\n break;\n default:\n // other value types planned\n break;\n }\n }\n\n const locked = node.getInputsLocked();\n if (locked)\n for (const [, result] of results) if (result.data === undefined) result.hasData = false;\n\n return { locked, results };\n}\n\nexport function parseFinalPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n prefix: string = \"\",\n resolvePath: string[],\n): Record<string, PObject<PlTreeNodeAccessor>> {\n if (!node.getIsReadyOrError()) throw new Error(\"resource is not ready\");\n const rawCollection = parseRawPObjectCollection(node, errorOnUnknownField, false, prefix);\n assert(rawCollection.locked);\n const collection: Record<string, PObject<PlTreeNodeAccessor>> = {};\n for (const [outputName, result] of rawCollection.results) {\n if (result.spec === undefined) throw new Error(`no spec for key ${outputName}`);\n if (result.hasData !== true || result.data === undefined)\n throw new Error(`no data for key ${outputName}`);\n const data = result.data();\n if (data === undefined) throw new Error(`no data for key ${outputName}`);\n if (!data.ok) throw data.error;\n collection[outputName] = {\n id:\n resolvePath.length === 0\n ? deriveLegacyPObjectId(result.spec, data.value) // for old blocks opened in new desktop\n : deriveLocalPObjectId(resolvePath, outputName),\n spec: result.spec,\n data: data.value,\n };\n }\n return collection;\n}\n"],"mappings":";;;;;;AAmCA,SAAgB,0BACd,MACA,sBAA+B,MAC/B,oBAA6B,OAC7B,SAAiB,IACK;CACtB,MAAM,eAAe;CACrB,MAAM,0BAAU,IAAI,IAAuC;CAC3D,KAAK,MAAM,aAAa,KAAK,gBAAgB,GAAG;EAC9C,MAAM,QAAQ,UAAU,MAAM,YAAY;EAC1C,IAAI,CAAC,OACH,IAAI,qBAAqB,MAAM,IAAI,MAAM,yBAAyB,WAAW;OACxE;EAGP,IAAI,QAAA,GAAA,2BAAA,SAAA,CAAgB,MAAM,QAAQ,IAAI;EACtC,IAAI,CAAC,KAAK,WAAW,MAAM,GACzB,IAAI,qBAAqB,MAAM,IAAI,MAAM,yBAAyB,WAAW;OACxE;EAEP,OAAO,KAAK,MAAM,OAAO,MAAM;EAE/B,MAAM,QAAA,GAAA,2BAAA,SAAA,CAAgB,MAAM,QAAQ,IAAI;EACxC,IAAI,SAAS,QAAQ,IAAI,IAAI;EAC7B,IAAI,WAAW,KAAA,GAAW;GACxB,SAAS,CAAC;GACV,QAAQ,IAAI,MAAM,MAAM;EAC1B;EAEA,QAAQ,MAAR;GACE,KAAK;IACH,OAAO,OAAO,KACX,SAAS;KACR,OAAO;KACP,aAAa;KACb,2BAA2B;IAC7B,CAAC,CAAC,EACA,cAAc;IAClB;GACF,KAAK;IACH,OAAO,UAAU;IACjB,OAAO,aACL,KAAK,gBAAgB;KACnB,OAAO;KACP,aAAa;IACf,CAAC;IACH;GACF,SAEE;EACJ;CACF;CAEA,MAAM,SAAS,KAAK,gBAAgB;CACpC,IAAI;OACG,MAAM,GAAG,WAAW,SAAS,IAAI,OAAO,SAAS,KAAA,GAAW,OAAO,UAAU;CAAA;CAEpF,OAAO;EAAE;EAAQ;CAAQ;AAC3B;AAEA,SAAgB,4BACd,MACA,sBAA+B,MAC/B,SAAiB,IACjB,aAC6C;CAC7C,IAAI,CAAC,KAAK,kBAAkB,GAAG,MAAM,IAAI,MAAM,uBAAuB;CACtE,MAAM,gBAAgB,0BAA0B,MAAM,qBAAqB,OAAO,MAAM;CACxF,CAAA,GAAA,YAAA,QAAA,CAAO,cAAc,MAAM;CAC3B,MAAM,aAA0D,CAAC;CACjE,KAAK,MAAM,CAAC,YAAY,WAAW,cAAc,SAAS;EACxD,IAAI,OAAO,SAAS,KAAA,GAAW,MAAM,IAAI,MAAM,mBAAmB,YAAY;EAC9E,IAAI,OAAO,YAAY,QAAQ,OAAO,SAAS,KAAA,GAC7C,MAAM,IAAI,MAAM,mBAAmB,YAAY;EACjD,MAAM,OAAO,OAAO,KAAK;EACzB,IAAI,SAAS,KAAA,GAAW,MAAM,IAAI,MAAM,mBAAmB,YAAY;EACvE,IAAI,CAAC,KAAK,IAAI,MAAM,KAAK;EACzB,WAAW,cAAc;GACvB,IACE,YAAY,WAAW,IACnBA,aAAAA,sBAAsB,OAAO,MAAM,KAAK,KAAK,IAC7CC,aAAAA,qBAAqB,aAAa,UAAU;GAClD,MAAM,OAAO;GACb,MAAM,KAAK;EACb;CACF;CACA,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"p_object_collection.js","names":[],"sources":["../../src/pool/p_object_collection.ts"],"sourcesContent":["import { type PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type { PObject, PObjectSpec, ValueOrError } from \"@platforma-sdk/model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport assert from \"node:assert\";\nimport type { Writable } from \"utility-types\";\nimport { deriveLegacyPObjectId, deriveLocalPObjectId } from \"./data\";\n\n/** Represents specific staging or prod ctx data */\nexport interface RawPObjectCollection {\n /** true if no new results are expected */\n readonly locked: boolean;\n /** results by name */\n readonly results: Map<string, RawPObjectEntry>;\n}\n\n/** Single result in a particular ctx */\nexport interface RawPObjectEntry {\n /**\n * true - means this result has data field, however it may still be not ready\n * false - means it can be derived that this result incarnation is spec-only\n * undefined - means that it is not yet known\n * */\n readonly hasData?: boolean;\n\n /** Result may be added even if there is no data associated with it */\n readonly spec?: PObjectSpec;\n\n /**\n * Returns data accessor, or error, or undefined if data not yet available.\n * If data fuinction itself is not defined, this means that corresponding context\n * was not rendered.\n * */\n data?(): ValueOrError<PlTreeNodeAccessor, Error> | undefined;\n}\n\nexport function parseRawPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n ignoreFieldErrors: boolean = false,\n prefix: string = \"\",\n): RawPObjectCollection {\n const entryPattern = /^(?<name>.*)\\.(?<type>spec|data)$/;\n const results = new Map<string, Writable<RawPObjectEntry>>();\n for (const fieldName of node.listInputFields()) {\n const match = fieldName.match(entryPattern);\n if (!match) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n\n let name = notEmpty(match.groups?.name);\n if (!name.startsWith(prefix)) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n name = name.slice(prefix.length);\n\n const type = notEmpty(match.groups?.type) as \"spec\" | \"data\";\n let result = results.get(name);\n if (result === undefined) {\n result = {};\n results.set(name, result);\n }\n\n switch (type) {\n case \"spec\":\n result.spec = node\n .traverse({\n field: fieldName,\n ignoreError: ignoreFieldErrors,\n pureFieldErrorToUndefined: ignoreFieldErrors,\n })\n ?.getDataAsJson();\n break;\n case \"data\":\n result.hasData = true;\n result.data = () =>\n node.traverseOrError({\n field: fieldName,\n ignoreError: ignoreFieldErrors,\n });\n break;\n default:\n // other value types planned\n break;\n }\n }\n\n const locked = node.getInputsLocked();\n if (locked)\n for (const [, result] of results) if (result.data === undefined) result.hasData = false;\n\n return { locked, results };\n}\n\nexport function parseFinalPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n prefix: string = \"\",\n resolvePath: string[],\n): Record<string, PObject<PlTreeNodeAccessor>> {\n if (!node.getIsReadyOrError()) throw new Error(\"resource is not ready\");\n const rawCollection = parseRawPObjectCollection(node, errorOnUnknownField, false, prefix);\n assert(rawCollection.locked);\n const collection: Record<string, PObject<PlTreeNodeAccessor>> = {};\n for (const [outputName, result] of rawCollection.results) {\n if (result.spec === undefined) throw new Error(`no spec for key ${outputName}`);\n if (result.hasData !== true || result.data === undefined)\n throw new Error(`no data for key ${outputName}`);\n const data = result.data();\n if (data === undefined) throw new Error(`no data for key ${outputName}`);\n if (!data.ok) throw data.error;\n collection[outputName] = {\n id:\n resolvePath.length === 0\n ? deriveLegacyPObjectId(result.spec, data.value) // for old blocks opened in new desktop\n : deriveLocalPObjectId(resolvePath, outputName),\n spec: result.spec,\n data: data.value,\n };\n }\n return collection;\n}\n"],"mappings":";;;;AAmCA,SAAgB,0BACd,MACA,sBAA+B,MAC/B,oBAA6B,OAC7B,SAAiB,IACK;CACtB,MAAM,eAAe;CACrB,MAAM,0BAAU,IAAI,KAAwC;AAC5D,MAAK,MAAM,aAAa,KAAK,iBAAiB,EAAE;EAC9C,MAAM,QAAQ,UAAU,MAAM,aAAa;AAC3C,MAAI,CAAC,MACH,KAAI,oBAAqB,OAAM,IAAI,MAAM,yBAAyB,YAAY;MACzE;EAGP,IAAI,OAAO,SAAS,MAAM,QAAQ,KAAK;AACvC,MAAI,CAAC,KAAK,WAAW,OAAO,CAC1B,KAAI,oBAAqB,OAAM,IAAI,MAAM,yBAAyB,YAAY;MACzE;AAEP,SAAO,KAAK,MAAM,OAAO,OAAO;EAEhC,MAAM,OAAO,SAAS,MAAM,QAAQ,KAAK;EACzC,IAAI,SAAS,QAAQ,IAAI,KAAK;AAC9B,MAAI,WAAW,KAAA,GAAW;AACxB,YAAS,EAAE;AACX,WAAQ,IAAI,MAAM,OAAO;;AAG3B,UAAQ,MAAR;GACE,KAAK;AACH,WAAO,OAAO,KACX,SAAS;KACR,OAAO;KACP,aAAa;KACb,2BAA2B;KAC5B,CAAC,EACA,eAAe;AACnB;GACF,KAAK;AACH,WAAO,UAAU;AACjB,WAAO,aACL,KAAK,gBAAgB;KACnB,OAAO;KACP,aAAa;KACd,CAAC;AACJ;GACF,QAEE;;;CAIN,MAAM,SAAS,KAAK,iBAAiB;AACrC,KAAI;OACG,MAAM,GAAG,WAAW,QAAS,KAAI,OAAO,SAAS,KAAA,EAAW,QAAO,UAAU;;AAEpF,QAAO;EAAE;EAAQ;EAAS;;AAG5B,SAAgB,4BACd,MACA,sBAA+B,MAC/B,SAAiB,IACjB,aAC6C;AAC7C,KAAI,CAAC,KAAK,mBAAmB,CAAE,OAAM,IAAI,MAAM,wBAAwB;CACvE,MAAM,gBAAgB,0BAA0B,MAAM,qBAAqB,OAAO,OAAO;AACzF,QAAO,cAAc,OAAO;CAC5B,MAAM,aAA0D,EAAE;AAClE,MAAK,MAAM,CAAC,YAAY,WAAW,cAAc,SAAS;AACxD,MAAI,OAAO,SAAS,KAAA,EAAW,OAAM,IAAI,MAAM,mBAAmB,aAAa;AAC/E,MAAI,OAAO,YAAY,QAAQ,OAAO,SAAS,KAAA,EAC7C,OAAM,IAAI,MAAM,mBAAmB,aAAa;EAClD,MAAM,OAAO,OAAO,MAAM;AAC1B,MAAI,SAAS,KAAA,EAAW,OAAM,IAAI,MAAM,mBAAmB,aAAa;AACxE,MAAI,CAAC,KAAK,GAAI,OAAM,KAAK;AACzB,aAAW,cAAc;GACvB,IACE,YAAY,WAAW,IACnB,sBAAsB,OAAO,MAAM,KAAK,MAAM,GAC9C,qBAAqB,aAAa,WAAW;GACnD,MAAM,OAAO;GACb,MAAM,KAAK;GACZ;;AAEH,QAAO"}
1
+ {"version":3,"file":"p_object_collection.js","names":[],"sources":["../../src/pool/p_object_collection.ts"],"sourcesContent":["import { type PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type { PObject, PObjectSpec, ValueOrError } from \"@platforma-sdk/model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport assert from \"node:assert\";\nimport type { Writable } from \"utility-types\";\nimport { deriveLegacyPObjectId, deriveLocalPObjectId } from \"./data\";\n\n/** Represents specific staging or prod ctx data */\nexport interface RawPObjectCollection {\n /** true if no new results are expected */\n readonly locked: boolean;\n /** results by name */\n readonly results: Map<string, RawPObjectEntry>;\n}\n\n/** Single result in a particular ctx */\nexport interface RawPObjectEntry {\n /**\n * true - means this result has data field, however it may still be not ready\n * false - means it can be derived that this result incarnation is spec-only\n * undefined - means that it is not yet known\n * */\n readonly hasData?: boolean;\n\n /** Result may be added even if there is no data associated with it */\n readonly spec?: PObjectSpec;\n\n /**\n * Returns data accessor, or error, or undefined if data not yet available.\n * If data fuinction itself is not defined, this means that corresponding context\n * was not rendered.\n * */\n data?(): ValueOrError<PlTreeNodeAccessor, Error> | undefined;\n}\n\nexport function parseRawPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n ignoreFieldErrors: boolean = false,\n prefix: string = \"\",\n): RawPObjectCollection {\n const entryPattern = /^(?<name>.*)\\.(?<type>spec|data)$/;\n const results = new Map<string, Writable<RawPObjectEntry>>();\n for (const fieldName of node.listInputFields()) {\n const match = fieldName.match(entryPattern);\n if (!match) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n\n let name = notEmpty(match.groups?.name);\n if (!name.startsWith(prefix)) {\n if (errorOnUnknownField) throw new Error(`unexpected field name ${fieldName}`);\n else continue;\n }\n name = name.slice(prefix.length);\n\n const type = notEmpty(match.groups?.type) as \"spec\" | \"data\";\n let result = results.get(name);\n if (result === undefined) {\n result = {};\n results.set(name, result);\n }\n\n switch (type) {\n case \"spec\":\n result.spec = node\n .traverse({\n field: fieldName,\n ignoreError: ignoreFieldErrors,\n pureFieldErrorToUndefined: ignoreFieldErrors,\n })\n ?.getDataAsJson();\n break;\n case \"data\":\n result.hasData = true;\n result.data = () =>\n node.traverseOrError({\n field: fieldName,\n ignoreError: ignoreFieldErrors,\n });\n break;\n default:\n // other value types planned\n break;\n }\n }\n\n const locked = node.getInputsLocked();\n if (locked)\n for (const [, result] of results) if (result.data === undefined) result.hasData = false;\n\n return { locked, results };\n}\n\nexport function parseFinalPObjectCollection(\n node: PlTreeNodeAccessor,\n errorOnUnknownField: boolean = true,\n prefix: string = \"\",\n resolvePath: string[],\n): Record<string, PObject<PlTreeNodeAccessor>> {\n if (!node.getIsReadyOrError()) throw new Error(\"resource is not ready\");\n const rawCollection = parseRawPObjectCollection(node, errorOnUnknownField, false, prefix);\n assert(rawCollection.locked);\n const collection: Record<string, PObject<PlTreeNodeAccessor>> = {};\n for (const [outputName, result] of rawCollection.results) {\n if (result.spec === undefined) throw new Error(`no spec for key ${outputName}`);\n if (result.hasData !== true || result.data === undefined)\n throw new Error(`no data for key ${outputName}`);\n const data = result.data();\n if (data === undefined) throw new Error(`no data for key ${outputName}`);\n if (!data.ok) throw data.error;\n collection[outputName] = {\n id:\n resolvePath.length === 0\n ? deriveLegacyPObjectId(result.spec, data.value) // for old blocks opened in new desktop\n : deriveLocalPObjectId(resolvePath, outputName),\n spec: result.spec,\n data: data.value,\n };\n }\n return collection;\n}\n"],"mappings":";;;;AAmCA,SAAgB,0BACd,MACA,sBAA+B,MAC/B,oBAA6B,OAC7B,SAAiB,IACK;CACtB,MAAM,eAAe;CACrB,MAAM,0BAAU,IAAI,IAAuC;CAC3D,KAAK,MAAM,aAAa,KAAK,gBAAgB,GAAG;EAC9C,MAAM,QAAQ,UAAU,MAAM,YAAY;EAC1C,IAAI,CAAC,OACH,IAAI,qBAAqB,MAAM,IAAI,MAAM,yBAAyB,WAAW;OACxE;EAGP,IAAI,OAAO,SAAS,MAAM,QAAQ,IAAI;EACtC,IAAI,CAAC,KAAK,WAAW,MAAM,GACzB,IAAI,qBAAqB,MAAM,IAAI,MAAM,yBAAyB,WAAW;OACxE;EAEP,OAAO,KAAK,MAAM,OAAO,MAAM;EAE/B,MAAM,OAAO,SAAS,MAAM,QAAQ,IAAI;EACxC,IAAI,SAAS,QAAQ,IAAI,IAAI;EAC7B,IAAI,WAAW,KAAA,GAAW;GACxB,SAAS,CAAC;GACV,QAAQ,IAAI,MAAM,MAAM;EAC1B;EAEA,QAAQ,MAAR;GACE,KAAK;IACH,OAAO,OAAO,KACX,SAAS;KACR,OAAO;KACP,aAAa;KACb,2BAA2B;IAC7B,CAAC,CAAC,EACA,cAAc;IAClB;GACF,KAAK;IACH,OAAO,UAAU;IACjB,OAAO,aACL,KAAK,gBAAgB;KACnB,OAAO;KACP,aAAa;IACf,CAAC;IACH;GACF,SAEE;EACJ;CACF;CAEA,MAAM,SAAS,KAAK,gBAAgB;CACpC,IAAI;OACG,MAAM,GAAG,WAAW,SAAS,IAAI,OAAO,SAAS,KAAA,GAAW,OAAO,UAAU;CAAA;CAEpF,OAAO;EAAE;EAAQ;CAAQ;AAC3B;AAEA,SAAgB,4BACd,MACA,sBAA+B,MAC/B,SAAiB,IACjB,aAC6C;CAC7C,IAAI,CAAC,KAAK,kBAAkB,GAAG,MAAM,IAAI,MAAM,uBAAuB;CACtE,MAAM,gBAAgB,0BAA0B,MAAM,qBAAqB,OAAO,MAAM;CACxF,OAAO,cAAc,MAAM;CAC3B,MAAM,aAA0D,CAAC;CACjE,KAAK,MAAM,CAAC,YAAY,WAAW,cAAc,SAAS;EACxD,IAAI,OAAO,SAAS,KAAA,GAAW,MAAM,IAAI,MAAM,mBAAmB,YAAY;EAC9E,IAAI,OAAO,YAAY,QAAQ,OAAO,SAAS,KAAA,GAC7C,MAAM,IAAI,MAAM,mBAAmB,YAAY;EACjD,MAAM,OAAO,OAAO,KAAK;EACzB,IAAI,SAAS,KAAA,GAAW,MAAM,IAAI,MAAM,mBAAmB,YAAY;EACvE,IAAI,CAAC,KAAK,IAAI,MAAM,KAAK;EACzB,WAAW,cAAc;GACvB,IACE,YAAY,WAAW,IACnB,sBAAsB,OAAO,MAAM,KAAK,KAAK,IAC7C,qBAAqB,aAAa,UAAU;GAClD,MAAM,OAAO;GACb,MAAM,KAAK;EACb;CACF;CACA,OAAO;AACT"}
@@ -1,4 +1,3 @@
1
- require("../_virtual/_rolldown/runtime.cjs");
2
1
  const require_project_model = require("../model/project_model.cjs");
3
2
  const require_args = require("../model/args.cjs");
4
3
  const require_project_model_util = require("../model/project_model_util.cjs");
@@ -8,6 +7,8 @@ let _platforma_sdk_model = require("@platforma-sdk/model");
8
7
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
9
8
  //#region src/pool/result_pool.ts
10
9
  var ResultPool = class ResultPool {
10
+ ctx;
11
+ blocks;
11
12
  allSpecsAvailable;
12
13
  constructor(ctx, blocks) {
13
14
  this.ctx = ctx;
@@ -1 +1 @@
1
- {"version":3,"file":"result_pool.cjs","names":["deriveGlobalPObjectId","outputRef","ProjectStructureKey","stagingGraph","allBlocks","projectFieldName","parseRawPObjectCollection"],"sources":["../../src/pool/result_pool.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport type { PlTreeEntry, PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type {\n Option,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PlRef,\n ResultCollection,\n ResultPoolEntry,\n ValueOrError,\n} from \"@platforma-sdk/model\";\nimport { executePSpecPredicate, mapValueInVOE } from \"@platforma-sdk/model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { outputRef } from \"../model/args\";\nimport type { Block, ProjectStructure } from \"../model/project_model\";\nimport { ProjectStructureKey, projectFieldName } from \"../model/project_model\";\nimport { allBlocks, stagingGraph } from \"../model/project_model_util\";\nimport type { Optional } from \"utility-types\";\nimport { deriveGlobalPObjectId } from \"./data\";\nimport type { RawPObjectCollection, RawPObjectEntry } from \"./p_object_collection\";\nimport { parseRawPObjectCollection } from \"./p_object_collection\";\n\n/** All exported results are addressed */\nexport type ResultKey = Pick<PlRef, \"blockId\" | \"name\">;\n\n/** Represents current information about particular block */\ninterface PoolBlock {\n /** Meta information from the project structure */\n readonly info: Block;\n /** Production ctx, if exists. If block's prod was executed, this field is guaranteed to be defined. */\n readonly prod?: RawPObjectCollection;\n /** Staging ctx, if exists. If staging was rendered, this field is guaranteed to be defined. */\n readonly staging?: RawPObjectCollection;\n}\n\nexport interface ExtendedResultCollection<T> extends ResultCollection<T> {\n readonly instabilityMarker: string | undefined;\n}\n\nexport interface ExtendedOption extends Option {\n readonly spec: PObjectSpec;\n}\n\nexport class ResultPool {\n private readonly allSpecsAvailable: boolean;\n private constructor(\n private readonly ctx: ComputableCtx,\n private readonly blocks: Map<string, PoolBlock>,\n ) {\n let allSpecsAvailable = true;\n outer: for (const block of blocks.values()) {\n for (const ctx of [block.prod, block.staging])\n if (ctx !== undefined) {\n if (!ctx.locked) {\n allSpecsAvailable = false;\n break outer;\n }\n for (const result of ctx.results.values()) {\n if (result.spec === undefined) {\n allSpecsAvailable = false;\n break outer;\n }\n }\n }\n }\n this.allSpecsAvailable = allSpecsAvailable;\n }\n\n public getSpecByRef(blockId: string, exportName: string): PObjectSpec | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n let result = block.prod?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n result = block.staging?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n // Note: Don't mark unstable when staging is absent - it may be intentionally skipped\n // for v3 blocks with undefined prerunArgs.\n if (block.staging !== undefined && !block.staging.locked)\n this.ctx.markUnstable(`staging_not_locked:${blockId}`);\n else if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if neither prod nor staging is present, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataOrErrorByRef(\n blockId: string,\n exportName: string,\n ): ValueOrError<PObject<PlTreeNodeAccessor>, Error> | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n const result = block.prod?.results?.get(exportName);\n const data = result?.data?.();\n if (result !== undefined && result.spec !== undefined && data !== undefined)\n return mapValueInVOE(data, (value) => ({\n id: deriveGlobalPObjectId(blockId, exportName),\n spec: result.spec!,\n data: value,\n }));\n if (result !== undefined) this.ctx.markUnstable(`no_data:${blockId}:${exportName}`);\n if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if prod is absent, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataByRef(\n blockId: string,\n exportName: string,\n ): PObject<PlTreeNodeAccessor> | undefined {\n const res = this.getDataOrErrorByRef(blockId, exportName);\n if (res === undefined || !res.ok) return undefined;\n return res.value;\n }\n\n public getData(): ExtendedResultCollection<PObject<PlTreeNodeAccessor>> {\n const resultWithErrors = this.getDataWithErrors();\n const entries: ResultPoolEntry<PObject<PlTreeNodeAccessor>>[] = [];\n for (const res of resultWithErrors.entries)\n if (res.obj.id !== undefined && res.obj.data.ok)\n entries.push({\n ref: res.ref,\n obj: {\n id: res.obj.id,\n spec: res.obj.spec,\n data: res.obj.data.value,\n },\n });\n return {\n entries,\n isComplete: resultWithErrors.isComplete,\n instabilityMarker: resultWithErrors.instabilityMarker,\n };\n }\n\n public getDataWithErrors(): ExtendedResultCollection<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, Error>>, \"id\">\n > {\n const entries: ResultPoolEntry<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, Error>>, \"id\">\n >[] = [];\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n const tryAddEntry = (blockId: string, exportName: string, result: RawPObjectEntry) => {\n if (result.spec !== undefined && result.hasData === true && result.data !== undefined) {\n const data = result.data();\n if (data !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: {\n id: data.ok ? deriveGlobalPObjectId(blockId, exportName) : undefined,\n spec: result.spec,\n data,\n },\n });\n } else markUnstable(`no_data:${blockId}:${exportName}`); // because data will eventually be resolved\n }\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // any signal that this export will be (or already is) present in the prod\n // will prevent adding it from staging\n exportsProcessed.add(exportName);\n tryAddEntry(blockId, exportName, result);\n }\n }\n\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results) {\n // trying to add something only if result is absent in prod\n if (exportsProcessed.has(exportName)) continue;\n tryAddEntry(blockId, exportName, result);\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public getSpecs(): ExtendedResultCollection<PObjectSpec> {\n const entries: ResultPoolEntry<PObjectSpec>[] = [];\n\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results)\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec,\n });\n exportsProcessed.add(exportName);\n }\n }\n // Note: Don't mark unstable when staging is absent - it may be intentionally skipped\n // for v3 blocks with undefined prerunArgs. If prod exists, use it; if neither exists,\n // the block simply has no specs to contribute.\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // staging have higher priority when we are interested in specs\n if (exportsProcessed.has(exportName)) continue;\n\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec,\n });\n }\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public calculateOptions(predicate: PSpecPredicate): ExtendedOption[] {\n const found: ExtendedOption[] = [];\n for (const block of this.blocks.values()) {\n const exportsChecked = new Set<string>();\n const addToFound = (ctx: RawPObjectCollection) => {\n for (const [exportName, result] of ctx.results) {\n if (exportsChecked.has(exportName) || result.spec === undefined) continue;\n exportsChecked.add(exportName);\n if (executePSpecPredicate(predicate, result.spec))\n found.push({\n label: block.info.label + \" / \" + exportName,\n ref: outputRef(block.info.id, exportName),\n spec: result.spec,\n });\n }\n };\n if (block.staging !== undefined) addToFound(block.staging);\n if (block.prod !== undefined) addToFound(block.prod);\n }\n return found;\n }\n\n public static create(ctx: ComputableCtx, prjEntry: PlTreeEntry, rootBlockId: string): ResultPool {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const graph = stagingGraph(structure);\n const targetBlocks = graph.traverseIds(\"upstream\", rootBlockId);\n\n const blocks = new Map<string, PoolBlock>();\n\n for (const blockInfo of allBlocks(structure)) {\n if (!targetBlocks.has(blockInfo.id)) continue;\n\n const prod = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, \"prodCtx\"),\n ignoreError: true,\n pureFieldErrorToUndefined: true,\n stableIfNotFound: true,\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, \"prodUiCtx\"),\n stableIfNotFound: true,\n }),\n );\n const staging = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, \"stagingCtx\"),\n ignoreError: true,\n pureFieldErrorToUndefined: true,\n stableIfNotFound: true,\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, \"stagingUiCtx\"),\n stableIfNotFound: true,\n }),\n );\n\n blocks.set(blockInfo.id, { info: blockInfo, prod, staging });\n }\n\n return new ResultPool(ctx, blocks);\n }\n}\n\n/** Loads single BContext data */\nfunction loadCtx(\n calculated: boolean,\n ctxAccessor: ValueOrError<PlTreeNodeAccessor, Error> | undefined,\n): RawPObjectCollection | undefined {\n if (ctxAccessor === undefined) {\n if (calculated)\n // this case defines the situation when ctx holder is present, but the ctx itself is\n // not yet available, to simplify the logic we make this situation indistinguishable\n // from empty unlocked cotext\n return { locked: false, results: new Map() };\n else return undefined;\n }\n\n if (ctxAccessor.ok) return parseRawPObjectCollection(ctxAccessor.value, false, true);\n else return undefined;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"result_pool.cjs","names":["deriveGlobalPObjectId","outputRef","ProjectStructureKey","stagingGraph","allBlocks","projectFieldName","parseRawPObjectCollection"],"sources":["../../src/pool/result_pool.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport type { PlTreeEntry, PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type {\n Option,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PlRef,\n ResultCollection,\n ResultPoolEntry,\n ValueOrError,\n} from \"@platforma-sdk/model\";\nimport { executePSpecPredicate, mapValueInVOE } from \"@platforma-sdk/model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { outputRef } from \"../model/args\";\nimport type { Block, ProjectStructure } from \"../model/project_model\";\nimport { ProjectStructureKey, projectFieldName } from \"../model/project_model\";\nimport { allBlocks, stagingGraph } from \"../model/project_model_util\";\nimport type { Optional } from \"utility-types\";\nimport { deriveGlobalPObjectId } from \"./data\";\nimport type { RawPObjectCollection, RawPObjectEntry } from \"./p_object_collection\";\nimport { parseRawPObjectCollection } from \"./p_object_collection\";\n\n/** All exported results are addressed */\nexport type ResultKey = Pick<PlRef, \"blockId\" | \"name\">;\n\n/** Represents current information about particular block */\ninterface PoolBlock {\n /** Meta information from the project structure */\n readonly info: Block;\n /** Production ctx, if exists. If block's prod was executed, this field is guaranteed to be defined. */\n readonly prod?: RawPObjectCollection;\n /** Staging ctx, if exists. If staging was rendered, this field is guaranteed to be defined. */\n readonly staging?: RawPObjectCollection;\n}\n\nexport interface ExtendedResultCollection<T> extends ResultCollection<T> {\n readonly instabilityMarker: string | undefined;\n}\n\nexport interface ExtendedOption extends Option {\n readonly spec: PObjectSpec;\n}\n\nexport class ResultPool {\n private readonly allSpecsAvailable: boolean;\n private constructor(\n private readonly ctx: ComputableCtx,\n private readonly blocks: Map<string, PoolBlock>,\n ) {\n let allSpecsAvailable = true;\n outer: for (const block of blocks.values()) {\n for (const ctx of [block.prod, block.staging])\n if (ctx !== undefined) {\n if (!ctx.locked) {\n allSpecsAvailable = false;\n break outer;\n }\n for (const result of ctx.results.values()) {\n if (result.spec === undefined) {\n allSpecsAvailable = false;\n break outer;\n }\n }\n }\n }\n this.allSpecsAvailable = allSpecsAvailable;\n }\n\n public getSpecByRef(blockId: string, exportName: string): PObjectSpec | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n let result = block.prod?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n result = block.staging?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n // Note: Don't mark unstable when staging is absent - it may be intentionally skipped\n // for v3 blocks with undefined prerunArgs.\n if (block.staging !== undefined && !block.staging.locked)\n this.ctx.markUnstable(`staging_not_locked:${blockId}`);\n else if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if neither prod nor staging is present, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataOrErrorByRef(\n blockId: string,\n exportName: string,\n ): ValueOrError<PObject<PlTreeNodeAccessor>, Error> | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n const result = block.prod?.results?.get(exportName);\n const data = result?.data?.();\n if (result !== undefined && result.spec !== undefined && data !== undefined)\n return mapValueInVOE(data, (value) => ({\n id: deriveGlobalPObjectId(blockId, exportName),\n spec: result.spec!,\n data: value,\n }));\n if (result !== undefined) this.ctx.markUnstable(`no_data:${blockId}:${exportName}`);\n if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if prod is absent, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataByRef(\n blockId: string,\n exportName: string,\n ): PObject<PlTreeNodeAccessor> | undefined {\n const res = this.getDataOrErrorByRef(blockId, exportName);\n if (res === undefined || !res.ok) return undefined;\n return res.value;\n }\n\n public getData(): ExtendedResultCollection<PObject<PlTreeNodeAccessor>> {\n const resultWithErrors = this.getDataWithErrors();\n const entries: ResultPoolEntry<PObject<PlTreeNodeAccessor>>[] = [];\n for (const res of resultWithErrors.entries)\n if (res.obj.id !== undefined && res.obj.data.ok)\n entries.push({\n ref: res.ref,\n obj: {\n id: res.obj.id,\n spec: res.obj.spec,\n data: res.obj.data.value,\n },\n });\n return {\n entries,\n isComplete: resultWithErrors.isComplete,\n instabilityMarker: resultWithErrors.instabilityMarker,\n };\n }\n\n public getDataWithErrors(): ExtendedResultCollection<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, Error>>, \"id\">\n > {\n const entries: ResultPoolEntry<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, Error>>, \"id\">\n >[] = [];\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n const tryAddEntry = (blockId: string, exportName: string, result: RawPObjectEntry) => {\n if (result.spec !== undefined && result.hasData === true && result.data !== undefined) {\n const data = result.data();\n if (data !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: {\n id: data.ok ? deriveGlobalPObjectId(blockId, exportName) : undefined,\n spec: result.spec,\n data,\n },\n });\n } else markUnstable(`no_data:${blockId}:${exportName}`); // because data will eventually be resolved\n }\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // any signal that this export will be (or already is) present in the prod\n // will prevent adding it from staging\n exportsProcessed.add(exportName);\n tryAddEntry(blockId, exportName, result);\n }\n }\n\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results) {\n // trying to add something only if result is absent in prod\n if (exportsProcessed.has(exportName)) continue;\n tryAddEntry(blockId, exportName, result);\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public getSpecs(): ExtendedResultCollection<PObjectSpec> {\n const entries: ResultPoolEntry<PObjectSpec>[] = [];\n\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results)\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec,\n });\n exportsProcessed.add(exportName);\n }\n }\n // Note: Don't mark unstable when staging is absent - it may be intentionally skipped\n // for v3 blocks with undefined prerunArgs. If prod exists, use it; if neither exists,\n // the block simply has no specs to contribute.\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // staging have higher priority when we are interested in specs\n if (exportsProcessed.has(exportName)) continue;\n\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec,\n });\n }\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public calculateOptions(predicate: PSpecPredicate): ExtendedOption[] {\n const found: ExtendedOption[] = [];\n for (const block of this.blocks.values()) {\n const exportsChecked = new Set<string>();\n const addToFound = (ctx: RawPObjectCollection) => {\n for (const [exportName, result] of ctx.results) {\n if (exportsChecked.has(exportName) || result.spec === undefined) continue;\n exportsChecked.add(exportName);\n if (executePSpecPredicate(predicate, result.spec))\n found.push({\n label: block.info.label + \" / \" + exportName,\n ref: outputRef(block.info.id, exportName),\n spec: result.spec,\n });\n }\n };\n if (block.staging !== undefined) addToFound(block.staging);\n if (block.prod !== undefined) addToFound(block.prod);\n }\n return found;\n }\n\n public static create(ctx: ComputableCtx, prjEntry: PlTreeEntry, rootBlockId: string): ResultPool {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const graph = stagingGraph(structure);\n const targetBlocks = graph.traverseIds(\"upstream\", rootBlockId);\n\n const blocks = new Map<string, PoolBlock>();\n\n for (const blockInfo of allBlocks(structure)) {\n if (!targetBlocks.has(blockInfo.id)) continue;\n\n const prod = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, \"prodCtx\"),\n ignoreError: true,\n pureFieldErrorToUndefined: true,\n stableIfNotFound: true,\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, \"prodUiCtx\"),\n stableIfNotFound: true,\n }),\n );\n const staging = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, \"stagingCtx\"),\n ignoreError: true,\n pureFieldErrorToUndefined: true,\n stableIfNotFound: true,\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, \"stagingUiCtx\"),\n stableIfNotFound: true,\n }),\n );\n\n blocks.set(blockInfo.id, { info: blockInfo, prod, staging });\n }\n\n return new ResultPool(ctx, blocks);\n }\n}\n\n/** Loads single BContext data */\nfunction loadCtx(\n calculated: boolean,\n ctxAccessor: ValueOrError<PlTreeNodeAccessor, Error> | undefined,\n): RawPObjectCollection | undefined {\n if (ctxAccessor === undefined) {\n if (calculated)\n // this case defines the situation when ctx holder is present, but the ctx itself is\n // not yet available, to simplify the logic we make this situation indistinguishable\n // from empty unlocked cotext\n return { locked: false, results: new Map() };\n else return undefined;\n }\n\n if (ctxAccessor.ok) return parseRawPObjectCollection(ctxAccessor.value, false, true);\n else return undefined;\n}\n"],"mappings":"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"}
@@ -7,6 +7,8 @@ import { executePSpecPredicate, mapValueInVOE } from "@platforma-sdk/model";
7
7
  import { notEmpty } from "@milaboratories/ts-helpers";
8
8
  //#region src/pool/result_pool.ts
9
9
  var ResultPool = class ResultPool {
10
+ ctx;
11
+ blocks;
10
12
  allSpecsAvailable;
11
13
  constructor(ctx, blocks) {
12
14
  this.ctx = ctx;
@@ -1 +1 @@
1
- {"version":3,"file":"result_pool.js","names":[],"sources":["../../src/pool/result_pool.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport type { PlTreeEntry, PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type {\n Option,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PlRef,\n ResultCollection,\n ResultPoolEntry,\n ValueOrError,\n} from \"@platforma-sdk/model\";\nimport { executePSpecPredicate, mapValueInVOE } from \"@platforma-sdk/model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { outputRef } from \"../model/args\";\nimport type { Block, ProjectStructure } from \"../model/project_model\";\nimport { ProjectStructureKey, projectFieldName } from \"../model/project_model\";\nimport { allBlocks, stagingGraph } from \"../model/project_model_util\";\nimport type { Optional } from \"utility-types\";\nimport { deriveGlobalPObjectId } from \"./data\";\nimport type { RawPObjectCollection, RawPObjectEntry } from \"./p_object_collection\";\nimport { parseRawPObjectCollection } from \"./p_object_collection\";\n\n/** All exported results are addressed */\nexport type ResultKey = Pick<PlRef, \"blockId\" | \"name\">;\n\n/** Represents current information about particular block */\ninterface PoolBlock {\n /** Meta information from the project structure */\n readonly info: Block;\n /** Production ctx, if exists. If block's prod was executed, this field is guaranteed to be defined. */\n readonly prod?: RawPObjectCollection;\n /** Staging ctx, if exists. If staging was rendered, this field is guaranteed to be defined. */\n readonly staging?: RawPObjectCollection;\n}\n\nexport interface ExtendedResultCollection<T> extends ResultCollection<T> {\n readonly instabilityMarker: string | undefined;\n}\n\nexport interface ExtendedOption extends Option {\n readonly spec: PObjectSpec;\n}\n\nexport class ResultPool {\n private readonly allSpecsAvailable: boolean;\n private constructor(\n private readonly ctx: ComputableCtx,\n private readonly blocks: Map<string, PoolBlock>,\n ) {\n let allSpecsAvailable = true;\n outer: for (const block of blocks.values()) {\n for (const ctx of [block.prod, block.staging])\n if (ctx !== undefined) {\n if (!ctx.locked) {\n allSpecsAvailable = false;\n break outer;\n }\n for (const result of ctx.results.values()) {\n if (result.spec === undefined) {\n allSpecsAvailable = false;\n break outer;\n }\n }\n }\n }\n this.allSpecsAvailable = allSpecsAvailable;\n }\n\n public getSpecByRef(blockId: string, exportName: string): PObjectSpec | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n let result = block.prod?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n result = block.staging?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n // Note: Don't mark unstable when staging is absent - it may be intentionally skipped\n // for v3 blocks with undefined prerunArgs.\n if (block.staging !== undefined && !block.staging.locked)\n this.ctx.markUnstable(`staging_not_locked:${blockId}`);\n else if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if neither prod nor staging is present, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataOrErrorByRef(\n blockId: string,\n exportName: string,\n ): ValueOrError<PObject<PlTreeNodeAccessor>, Error> | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n const result = block.prod?.results?.get(exportName);\n const data = result?.data?.();\n if (result !== undefined && result.spec !== undefined && data !== undefined)\n return mapValueInVOE(data, (value) => ({\n id: deriveGlobalPObjectId(blockId, exportName),\n spec: result.spec!,\n data: value,\n }));\n if (result !== undefined) this.ctx.markUnstable(`no_data:${blockId}:${exportName}`);\n if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if prod is absent, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataByRef(\n blockId: string,\n exportName: string,\n ): PObject<PlTreeNodeAccessor> | undefined {\n const res = this.getDataOrErrorByRef(blockId, exportName);\n if (res === undefined || !res.ok) return undefined;\n return res.value;\n }\n\n public getData(): ExtendedResultCollection<PObject<PlTreeNodeAccessor>> {\n const resultWithErrors = this.getDataWithErrors();\n const entries: ResultPoolEntry<PObject<PlTreeNodeAccessor>>[] = [];\n for (const res of resultWithErrors.entries)\n if (res.obj.id !== undefined && res.obj.data.ok)\n entries.push({\n ref: res.ref,\n obj: {\n id: res.obj.id,\n spec: res.obj.spec,\n data: res.obj.data.value,\n },\n });\n return {\n entries,\n isComplete: resultWithErrors.isComplete,\n instabilityMarker: resultWithErrors.instabilityMarker,\n };\n }\n\n public getDataWithErrors(): ExtendedResultCollection<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, Error>>, \"id\">\n > {\n const entries: ResultPoolEntry<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, Error>>, \"id\">\n >[] = [];\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n const tryAddEntry = (blockId: string, exportName: string, result: RawPObjectEntry) => {\n if (result.spec !== undefined && result.hasData === true && result.data !== undefined) {\n const data = result.data();\n if (data !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: {\n id: data.ok ? deriveGlobalPObjectId(blockId, exportName) : undefined,\n spec: result.spec,\n data,\n },\n });\n } else markUnstable(`no_data:${blockId}:${exportName}`); // because data will eventually be resolved\n }\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // any signal that this export will be (or already is) present in the prod\n // will prevent adding it from staging\n exportsProcessed.add(exportName);\n tryAddEntry(blockId, exportName, result);\n }\n }\n\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results) {\n // trying to add something only if result is absent in prod\n if (exportsProcessed.has(exportName)) continue;\n tryAddEntry(blockId, exportName, result);\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public getSpecs(): ExtendedResultCollection<PObjectSpec> {\n const entries: ResultPoolEntry<PObjectSpec>[] = [];\n\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results)\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec,\n });\n exportsProcessed.add(exportName);\n }\n }\n // Note: Don't mark unstable when staging is absent - it may be intentionally skipped\n // for v3 blocks with undefined prerunArgs. If prod exists, use it; if neither exists,\n // the block simply has no specs to contribute.\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // staging have higher priority when we are interested in specs\n if (exportsProcessed.has(exportName)) continue;\n\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec,\n });\n }\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public calculateOptions(predicate: PSpecPredicate): ExtendedOption[] {\n const found: ExtendedOption[] = [];\n for (const block of this.blocks.values()) {\n const exportsChecked = new Set<string>();\n const addToFound = (ctx: RawPObjectCollection) => {\n for (const [exportName, result] of ctx.results) {\n if (exportsChecked.has(exportName) || result.spec === undefined) continue;\n exportsChecked.add(exportName);\n if (executePSpecPredicate(predicate, result.spec))\n found.push({\n label: block.info.label + \" / \" + exportName,\n ref: outputRef(block.info.id, exportName),\n spec: result.spec,\n });\n }\n };\n if (block.staging !== undefined) addToFound(block.staging);\n if (block.prod !== undefined) addToFound(block.prod);\n }\n return found;\n }\n\n public static create(ctx: ComputableCtx, prjEntry: PlTreeEntry, rootBlockId: string): ResultPool {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const graph = stagingGraph(structure);\n const targetBlocks = graph.traverseIds(\"upstream\", rootBlockId);\n\n const blocks = new Map<string, PoolBlock>();\n\n for (const blockInfo of allBlocks(structure)) {\n if (!targetBlocks.has(blockInfo.id)) continue;\n\n const prod = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, \"prodCtx\"),\n ignoreError: true,\n pureFieldErrorToUndefined: true,\n stableIfNotFound: true,\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, \"prodUiCtx\"),\n stableIfNotFound: true,\n }),\n );\n const staging = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, \"stagingCtx\"),\n ignoreError: true,\n pureFieldErrorToUndefined: true,\n stableIfNotFound: true,\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, \"stagingUiCtx\"),\n stableIfNotFound: true,\n }),\n );\n\n blocks.set(blockInfo.id, { info: blockInfo, prod, staging });\n }\n\n return new ResultPool(ctx, blocks);\n }\n}\n\n/** Loads single BContext data */\nfunction loadCtx(\n calculated: boolean,\n ctxAccessor: ValueOrError<PlTreeNodeAccessor, Error> | undefined,\n): RawPObjectCollection | undefined {\n if (ctxAccessor === undefined) {\n if (calculated)\n // this case defines the situation when ctx holder is present, but the ctx itself is\n // not yet available, to simplify the logic we make this situation indistinguishable\n // from empty unlocked cotext\n return { locked: false, results: new Map() };\n else return undefined;\n }\n\n if (ctxAccessor.ok) return parseRawPObjectCollection(ctxAccessor.value, false, true);\n else return undefined;\n}\n"],"mappings":";;;;;;;;AA4CA,IAAa,aAAb,MAAa,WAAW;CACtB;CACA,YACE,KACA,QACA;AAFiB,OAAA,MAAA;AACA,OAAA,SAAA;EAEjB,IAAI,oBAAoB;AACxB,QAAO,MAAK,MAAM,SAAS,OAAO,QAAQ,CACxC,MAAK,MAAM,OAAO,CAAC,MAAM,MAAM,MAAM,QAAQ,CAC3C,KAAI,QAAQ,KAAA,GAAW;AACrB,OAAI,CAAC,IAAI,QAAQ;AACf,wBAAoB;AACpB,UAAM;;AAER,QAAK,MAAM,UAAU,IAAI,QAAQ,QAAQ,CACvC,KAAI,OAAO,SAAS,KAAA,GAAW;AAC7B,wBAAoB;AACpB,UAAM;;;AAKhB,OAAK,oBAAoB;;CAG3B,aAAoB,SAAiB,YAA6C;EAChF,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ;AACtC,MAAI,UAAU,KAAA,EAAW,QAAO,KAAA;EAChC,IAAI,SAAS,MAAM,MAAM,SAAS,IAAI,WAAW,EAAE;AACnD,MAAI,WAAW,KAAA,EAAW,QAAO;AACjC,WAAS,MAAM,SAAS,SAAS,IAAI,WAAW,EAAE;AAClD,MAAI,WAAW,KAAA,EAAW,QAAO;AAGjC,MAAI,MAAM,YAAY,KAAA,KAAa,CAAC,MAAM,QAAQ,OAChD,MAAK,IAAI,aAAa,sBAAsB,UAAU;WAC/C,MAAM,SAAS,KAAA,KAAa,CAAC,MAAM,KAAK,OAC/C,MAAK,IAAI,aAAa,mBAAmB,UAAU;;CAKvD,oBACE,SACA,YAC8D;EAC9D,MAAM,QAAQ,KAAK,OAAO,IAAI,QAAQ;AACtC,MAAI,UAAU,KAAA,EAAW,QAAO,KAAA;EAChC,MAAM,SAAS,MAAM,MAAM,SAAS,IAAI,WAAW;EACnD,MAAM,OAAO,QAAQ,QAAQ;AAC7B,MAAI,WAAW,KAAA,KAAa,OAAO,SAAS,KAAA,KAAa,SAAS,KAAA,EAChE,QAAO,cAAc,OAAO,WAAW;GACrC,IAAI,sBAAsB,SAAS,WAAW;GAC9C,MAAM,OAAO;GACb,MAAM;GACP,EAAE;AACL,MAAI,WAAW,KAAA,EAAW,MAAK,IAAI,aAAa,WAAW,QAAQ,GAAG,aAAa;AACnF,MAAI,MAAM,SAAS,KAAA,KAAa,CAAC,MAAM,KAAK,OAC1C,MAAK,IAAI,aAAa,mBAAmB,UAAU;;CAKvD,aACE,SACA,YACyC;EACzC,MAAM,MAAM,KAAK,oBAAoB,SAAS,WAAW;AACzD,MAAI,QAAQ,KAAA,KAAa,CAAC,IAAI,GAAI,QAAO,KAAA;AACzC,SAAO,IAAI;;CAGb,UAAwE;EACtE,MAAM,mBAAmB,KAAK,mBAAmB;EACjD,MAAM,UAA0D,EAAE;AAClE,OAAK,MAAM,OAAO,iBAAiB,QACjC,KAAI,IAAI,IAAI,OAAO,KAAA,KAAa,IAAI,IAAI,KAAK,GAC3C,SAAQ,KAAK;GACX,KAAK,IAAI;GACT,KAAK;IACH,IAAI,IAAI,IAAI;IACZ,MAAM,IAAI,IAAI;IACd,MAAM,IAAI,IAAI,KAAK;IACpB;GACF,CAAC;AACN,SAAO;GACL;GACA,YAAY,iBAAiB;GAC7B,mBAAmB,iBAAiB;GACrC;;CAGH,oBAEE;EACA,MAAM,UAEA,EAAE;EACR,IAAI,aAAa;EAEjB,IAAI,oBAAwC,KAAA;EAC5C,MAAM,gBAAgB,WAAmB;AACvC,OAAI,sBAAsB,KAAA,EAAW,qBAAoB;AACzD,gBAAa;;EAGf,MAAM,eAAe,SAAiB,YAAoB,WAA4B;AACpF,OAAI,OAAO,SAAS,KAAA,KAAa,OAAO,YAAY,QAAQ,OAAO,SAAS,KAAA,GAAW;IACrF,MAAM,OAAO,OAAO,MAAM;AAC1B,QAAI,SAAS,KAAA,EACX,SAAQ,KAAK;KACX,KAAK,UAAU,SAAS,WAAW;KACnC,KAAK;MACH,IAAI,KAAK,KAAK,sBAAsB,SAAS,WAAW,GAAG,KAAA;MAC3D,MAAM,OAAO;MACb;MACD;KACF,CAAC;QACG,cAAa,WAAW,QAAQ,GAAG,aAAa;;;AAI3D,OAAK,MAAM,CAAC,SAAS,UAAU,KAAK,QAAQ;GAC1C,MAAM,mCAAmB,IAAI,KAAa;AAE1C,OAAI,MAAM,SAAS,KAAA,GAAW;AAC5B,QAAI,CAAC,MAAM,KAAK,OAAQ,cAAa,mBAAmB,UAAU;AAClE,SAAK,MAAM,CAAC,YAAY,WAAW,MAAM,KAAK,SAAS;AAGrD,sBAAiB,IAAI,WAAW;AAChC,iBAAY,SAAS,YAAY,OAAO;;;AAI5C,OAAI,MAAM,YAAY,KAAA,GAAW;AAC/B,QAAI,CAAC,MAAM,QAAQ,OAAQ,cAAa,sBAAsB,UAAU;AAExE,SAAK,MAAM,CAAC,YAAY,WAAW,MAAM,QAAQ,SAAS;AAExD,SAAI,iBAAiB,IAAI,WAAW,CAAE;AACtC,iBAAY,SAAS,YAAY,OAAO;;;;AAK9C,SAAO;GAAE;GAAS;GAAY;GAAmB;;CAGnD,WAAyD;EACvD,MAAM,UAA0C,EAAE;EAElD,IAAI,aAAa;EAEjB,IAAI,oBAAwC,KAAA;EAC5C,MAAM,gBAAgB,WAAmB;AACvC,OAAI,sBAAsB,KAAA,EAAW,qBAAoB;AACzD,gBAAa;;AAGf,OAAK,MAAM,CAAC,SAAS,UAAU,KAAK,QAAQ;GAC1C,MAAM,mCAAmB,IAAI,KAAa;AAC1C,OAAI,MAAM,YAAY,KAAA,GAAW;AAC/B,QAAI,CAAC,MAAM,QAAQ,OAAQ,cAAa,sBAAsB,UAAU;AAExE,SAAK,MAAM,CAAC,YAAY,WAAW,MAAM,QAAQ,QAC/C,KAAI,OAAO,SAAS,KAAA,GAAW;AAC7B,aAAQ,KAAK;MACX,KAAK,UAAU,SAAS,WAAW;MACnC,KAAK,OAAO;MACb,CAAC;AACF,sBAAiB,IAAI,WAAW;;;AAOtC,OAAI,MAAM,SAAS,KAAA,GAAW;AAC5B,QAAI,CAAC,MAAM,KAAK,OAAQ,cAAa,mBAAmB,UAAU;AAClE,SAAK,MAAM,CAAC,YAAY,WAAW,MAAM,KAAK,SAAS;AAErD,SAAI,iBAAiB,IAAI,WAAW,CAAE;AAEtC,SAAI,OAAO,SAAS,KAAA,EAClB,SAAQ,KAAK;MACX,KAAK,UAAU,SAAS,WAAW;MACnC,KAAK,OAAO;MACb,CAAC;;;;AAMV,SAAO;GAAE;GAAS;GAAY;GAAmB;;CAGnD,iBAAwB,WAA6C;EACnE,MAAM,QAA0B,EAAE;AAClC,OAAK,MAAM,SAAS,KAAK,OAAO,QAAQ,EAAE;GACxC,MAAM,iCAAiB,IAAI,KAAa;GACxC,MAAM,cAAc,QAA8B;AAChD,SAAK,MAAM,CAAC,YAAY,WAAW,IAAI,SAAS;AAC9C,SAAI,eAAe,IAAI,WAAW,IAAI,OAAO,SAAS,KAAA,EAAW;AACjE,oBAAe,IAAI,WAAW;AAC9B,SAAI,sBAAsB,WAAW,OAAO,KAAK,CAC/C,OAAM,KAAK;MACT,OAAO,MAAM,KAAK,QAAQ,QAAQ;MAClC,KAAK,UAAU,MAAM,KAAK,IAAI,WAAW;MACzC,MAAM,OAAO;MACd,CAAC;;;AAGR,OAAI,MAAM,YAAY,KAAA,EAAW,YAAW,MAAM,QAAQ;AAC1D,OAAI,MAAM,SAAS,KAAA,EAAW,YAAW,MAAM,KAAK;;AAEtD,SAAO;;CAGT,OAAc,OAAO,KAAoB,UAAuB,aAAiC;EAC/F,MAAM,MAAM,IAAI,SAAS,SAAS,CAAC,MAAM;EAEzC,MAAM,YAAY,SAAS,IAAI,kBAAoC,oBAAoB,CAAC;EAExF,MAAM,eADQ,aAAa,UAAU,CACV,YAAY,YAAY,YAAY;EAE/D,MAAM,yBAAS,IAAI,KAAwB;AAE3C,OAAK,MAAM,aAAa,UAAU,UAAU,EAAE;AAC5C,OAAI,CAAC,aAAa,IAAI,UAAU,GAAG,CAAE;GAErC,MAAM,OAAO,QACX,IAAI,SAAS;IACX,OAAO,iBAAiB,UAAU,IAAI,UAAU;IAChD,aAAa;IACb,2BAA2B;IAC3B,kBAAkB;IACnB,CAAC,KAAK,KAAA,GACP,IAAI,gBAAgB;IAClB,OAAO,iBAAiB,UAAU,IAAI,YAAY;IAClD,kBAAkB;IACnB,CAAC,CACH;GACD,MAAM,UAAU,QACd,IAAI,SAAS;IACX,OAAO,iBAAiB,UAAU,IAAI,aAAa;IACnD,aAAa;IACb,2BAA2B;IAC3B,kBAAkB;IACnB,CAAC,KAAK,KAAA,GACP,IAAI,gBAAgB;IAClB,OAAO,iBAAiB,UAAU,IAAI,eAAe;IACrD,kBAAkB;IACnB,CAAC,CACH;AAED,UAAO,IAAI,UAAU,IAAI;IAAE,MAAM;IAAW;IAAM;IAAS,CAAC;;AAG9D,SAAO,IAAI,WAAW,KAAK,OAAO;;;;AAKtC,SAAS,QACP,YACA,aACkC;AAClC,KAAI,gBAAgB,KAAA,EAClB,KAAI,WAIF,QAAO;EAAE,QAAQ;EAAO,yBAAS,IAAI,KAAK;EAAE;KACzC,QAAO,KAAA;AAGd,KAAI,YAAY,GAAI,QAAO,0BAA0B,YAAY,OAAO,OAAO,KAAK;KAC/E,QAAO,KAAA"}
1
+ {"version":3,"file":"result_pool.js","names":[],"sources":["../../src/pool/result_pool.ts"],"sourcesContent":["import type { ComputableCtx } from \"@milaboratories/computable\";\nimport type { PlTreeEntry, PlTreeNodeAccessor } from \"@milaboratories/pl-tree\";\nimport type {\n Option,\n PObject,\n PObjectSpec,\n PSpecPredicate,\n PlRef,\n ResultCollection,\n ResultPoolEntry,\n ValueOrError,\n} from \"@platforma-sdk/model\";\nimport { executePSpecPredicate, mapValueInVOE } from \"@platforma-sdk/model\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { outputRef } from \"../model/args\";\nimport type { Block, ProjectStructure } from \"../model/project_model\";\nimport { ProjectStructureKey, projectFieldName } from \"../model/project_model\";\nimport { allBlocks, stagingGraph } from \"../model/project_model_util\";\nimport type { Optional } from \"utility-types\";\nimport { deriveGlobalPObjectId } from \"./data\";\nimport type { RawPObjectCollection, RawPObjectEntry } from \"./p_object_collection\";\nimport { parseRawPObjectCollection } from \"./p_object_collection\";\n\n/** All exported results are addressed */\nexport type ResultKey = Pick<PlRef, \"blockId\" | \"name\">;\n\n/** Represents current information about particular block */\ninterface PoolBlock {\n /** Meta information from the project structure */\n readonly info: Block;\n /** Production ctx, if exists. If block's prod was executed, this field is guaranteed to be defined. */\n readonly prod?: RawPObjectCollection;\n /** Staging ctx, if exists. If staging was rendered, this field is guaranteed to be defined. */\n readonly staging?: RawPObjectCollection;\n}\n\nexport interface ExtendedResultCollection<T> extends ResultCollection<T> {\n readonly instabilityMarker: string | undefined;\n}\n\nexport interface ExtendedOption extends Option {\n readonly spec: PObjectSpec;\n}\n\nexport class ResultPool {\n private readonly allSpecsAvailable: boolean;\n private constructor(\n private readonly ctx: ComputableCtx,\n private readonly blocks: Map<string, PoolBlock>,\n ) {\n let allSpecsAvailable = true;\n outer: for (const block of blocks.values()) {\n for (const ctx of [block.prod, block.staging])\n if (ctx !== undefined) {\n if (!ctx.locked) {\n allSpecsAvailable = false;\n break outer;\n }\n for (const result of ctx.results.values()) {\n if (result.spec === undefined) {\n allSpecsAvailable = false;\n break outer;\n }\n }\n }\n }\n this.allSpecsAvailable = allSpecsAvailable;\n }\n\n public getSpecByRef(blockId: string, exportName: string): PObjectSpec | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n let result = block.prod?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n result = block.staging?.results?.get(exportName)?.spec;\n if (result !== undefined) return result;\n // Note: Don't mark unstable when staging is absent - it may be intentionally skipped\n // for v3 blocks with undefined prerunArgs.\n if (block.staging !== undefined && !block.staging.locked)\n this.ctx.markUnstable(`staging_not_locked:${blockId}`);\n else if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if neither prod nor staging is present, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataOrErrorByRef(\n blockId: string,\n exportName: string,\n ): ValueOrError<PObject<PlTreeNodeAccessor>, Error> | undefined {\n const block = this.blocks.get(blockId);\n if (block === undefined) return undefined;\n const result = block.prod?.results?.get(exportName);\n const data = result?.data?.();\n if (result !== undefined && result.spec !== undefined && data !== undefined)\n return mapValueInVOE(data, (value) => ({\n id: deriveGlobalPObjectId(blockId, exportName),\n spec: result.spec!,\n data: value,\n }));\n if (result !== undefined) this.ctx.markUnstable(`no_data:${blockId}:${exportName}`);\n if (block.prod !== undefined && !block.prod.locked)\n this.ctx.markUnstable(`prod_not_locked:${blockId}`);\n // if prod is absent, returned undefined value is considered stable\n return undefined;\n }\n\n public getDataByRef(\n blockId: string,\n exportName: string,\n ): PObject<PlTreeNodeAccessor> | undefined {\n const res = this.getDataOrErrorByRef(blockId, exportName);\n if (res === undefined || !res.ok) return undefined;\n return res.value;\n }\n\n public getData(): ExtendedResultCollection<PObject<PlTreeNodeAccessor>> {\n const resultWithErrors = this.getDataWithErrors();\n const entries: ResultPoolEntry<PObject<PlTreeNodeAccessor>>[] = [];\n for (const res of resultWithErrors.entries)\n if (res.obj.id !== undefined && res.obj.data.ok)\n entries.push({\n ref: res.ref,\n obj: {\n id: res.obj.id,\n spec: res.obj.spec,\n data: res.obj.data.value,\n },\n });\n return {\n entries,\n isComplete: resultWithErrors.isComplete,\n instabilityMarker: resultWithErrors.instabilityMarker,\n };\n }\n\n public getDataWithErrors(): ExtendedResultCollection<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, Error>>, \"id\">\n > {\n const entries: ResultPoolEntry<\n Optional<PObject<ValueOrError<PlTreeNodeAccessor, Error>>, \"id\">\n >[] = [];\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n const tryAddEntry = (blockId: string, exportName: string, result: RawPObjectEntry) => {\n if (result.spec !== undefined && result.hasData === true && result.data !== undefined) {\n const data = result.data();\n if (data !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: {\n id: data.ok ? deriveGlobalPObjectId(blockId, exportName) : undefined,\n spec: result.spec,\n data,\n },\n });\n } else markUnstable(`no_data:${blockId}:${exportName}`); // because data will eventually be resolved\n }\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // any signal that this export will be (or already is) present in the prod\n // will prevent adding it from staging\n exportsProcessed.add(exportName);\n tryAddEntry(blockId, exportName, result);\n }\n }\n\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results) {\n // trying to add something only if result is absent in prod\n if (exportsProcessed.has(exportName)) continue;\n tryAddEntry(blockId, exportName, result);\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public getSpecs(): ExtendedResultCollection<PObjectSpec> {\n const entries: ResultPoolEntry<PObjectSpec>[] = [];\n\n let isComplete = true;\n\n let instabilityMarker: string | undefined = undefined;\n const markUnstable = (marker: string) => {\n if (instabilityMarker === undefined) instabilityMarker = marker;\n isComplete = false;\n };\n\n for (const [blockId, block] of this.blocks) {\n const exportsProcessed = new Set<string>();\n if (block.staging !== undefined) {\n if (!block.staging.locked) markUnstable(`staging_not_locked:${blockId}`);\n\n for (const [exportName, result] of block.staging.results)\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec,\n });\n exportsProcessed.add(exportName);\n }\n }\n // Note: Don't mark unstable when staging is absent - it may be intentionally skipped\n // for v3 blocks with undefined prerunArgs. If prod exists, use it; if neither exists,\n // the block simply has no specs to contribute.\n\n if (block.prod !== undefined) {\n if (!block.prod.locked) markUnstable(`prod_not_locked:${blockId}`);\n for (const [exportName, result] of block.prod.results) {\n // staging have higher priority when we are interested in specs\n if (exportsProcessed.has(exportName)) continue;\n\n if (result.spec !== undefined) {\n entries.push({\n ref: outputRef(blockId, exportName),\n obj: result.spec,\n });\n }\n }\n }\n }\n\n return { entries, isComplete, instabilityMarker };\n }\n\n public calculateOptions(predicate: PSpecPredicate): ExtendedOption[] {\n const found: ExtendedOption[] = [];\n for (const block of this.blocks.values()) {\n const exportsChecked = new Set<string>();\n const addToFound = (ctx: RawPObjectCollection) => {\n for (const [exportName, result] of ctx.results) {\n if (exportsChecked.has(exportName) || result.spec === undefined) continue;\n exportsChecked.add(exportName);\n if (executePSpecPredicate(predicate, result.spec))\n found.push({\n label: block.info.label + \" / \" + exportName,\n ref: outputRef(block.info.id, exportName),\n spec: result.spec,\n });\n }\n };\n if (block.staging !== undefined) addToFound(block.staging);\n if (block.prod !== undefined) addToFound(block.prod);\n }\n return found;\n }\n\n public static create(ctx: ComputableCtx, prjEntry: PlTreeEntry, rootBlockId: string): ResultPool {\n const prj = ctx.accessor(prjEntry).node();\n\n const structure = notEmpty(prj.getKeyValueAsJson<ProjectStructure>(ProjectStructureKey));\n const graph = stagingGraph(structure);\n const targetBlocks = graph.traverseIds(\"upstream\", rootBlockId);\n\n const blocks = new Map<string, PoolBlock>();\n\n for (const blockInfo of allBlocks(structure)) {\n if (!targetBlocks.has(blockInfo.id)) continue;\n\n const prod = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, \"prodCtx\"),\n ignoreError: true,\n pureFieldErrorToUndefined: true,\n stableIfNotFound: true,\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, \"prodUiCtx\"),\n stableIfNotFound: true,\n }),\n );\n const staging = loadCtx(\n prj.traverse({\n field: projectFieldName(blockInfo.id, \"stagingCtx\"),\n ignoreError: true,\n pureFieldErrorToUndefined: true,\n stableIfNotFound: true,\n }) !== undefined,\n prj.traverseOrError({\n field: projectFieldName(blockInfo.id, \"stagingUiCtx\"),\n stableIfNotFound: true,\n }),\n );\n\n blocks.set(blockInfo.id, { info: blockInfo, prod, staging });\n }\n\n return new ResultPool(ctx, blocks);\n }\n}\n\n/** Loads single BContext data */\nfunction loadCtx(\n calculated: boolean,\n ctxAccessor: ValueOrError<PlTreeNodeAccessor, Error> | undefined,\n): RawPObjectCollection | undefined {\n if (ctxAccessor === undefined) {\n if (calculated)\n // this case defines the situation when ctx holder is present, but the ctx itself is\n // not yet available, to simplify the logic we make this situation indistinguishable\n // from empty unlocked cotext\n return { locked: false, results: new Map() };\n else return undefined;\n }\n\n if (ctxAccessor.ok) return parseRawPObjectCollection(ctxAccessor.value, false, true);\n else return undefined;\n}\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- require("./_virtual/_rolldown/runtime.cjs");
2
1
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
3
2
  let _milaboratories_pf_spec_driver = require("@milaboratories/pf-spec-driver");
4
3
  //#region src/service_factories.ts
@@ -1 +1 @@
1
- {"version":3,"file":"service_factories.cjs","names":["ModelServiceRegistry","Services","SpecDriver"],"sources":["../src/service_factories.ts"],"sourcesContent":["/**\n * Model service factories — add a factory for each new service here.\n *\n * Each entry maps a Services key to a factory function that creates the\n * model-side driver instance, or null if the service has no model-side driver\n * (e.g. node services whose driver is provided by the desktop app).\n */\n\nimport { ModelServiceRegistry, Services } from \"@milaboratories/pl-model-common\";\nimport { SpecDriver } from \"@milaboratories/pf-spec-driver\";\nimport { type MiLogger } from \"@milaboratories/ts-helpers\";\n\nexport type ModelServiceOptions = {\n logger: MiLogger;\n};\n\nexport function createModelServiceRegistry(options: ModelServiceOptions) {\n return new ModelServiceRegistry(Services, {\n PFrameSpec: () => new SpecDriver({ logger: options.logger }),\n PFrame: null,\n Dialog: null,\n });\n}\n"],"mappings":";;;;;;;;;;;AAgBA,SAAgB,2BAA2B,SAA8B;AACvE,QAAO,IAAIA,gCAAAA,qBAAqBC,gCAAAA,UAAU;EACxC,kBAAkB,IAAIC,+BAAAA,WAAW,EAAE,QAAQ,QAAQ,QAAQ,CAAC;EAC5D,QAAQ;EACR,QAAQ;EACT,CAAC"}
1
+ {"version":3,"file":"service_factories.cjs","names":["ModelServiceRegistry","Services","SpecDriver"],"sources":["../src/service_factories.ts"],"sourcesContent":["/**\n * Model service factories — add a factory for each new service here.\n *\n * Each entry maps a Services key to a factory function that creates the\n * model-side driver instance, or null if the service has no model-side driver\n * (e.g. node services whose driver is provided by the desktop app).\n */\n\nimport { ModelServiceRegistry, Services } from \"@milaboratories/pl-model-common\";\nimport { SpecDriver } from \"@milaboratories/pf-spec-driver\";\nimport { type MiLogger } from \"@milaboratories/ts-helpers\";\n\nexport type ModelServiceOptions = {\n logger: MiLogger;\n};\n\nexport function createModelServiceRegistry(options: ModelServiceOptions) {\n return new ModelServiceRegistry(Services, {\n PFrameSpec: () => new SpecDriver({ logger: options.logger }),\n PFrame: null,\n Dialog: null,\n });\n}\n"],"mappings":";;;;;;;;;;AAgBA,SAAgB,2BAA2B,SAA8B;CACvE,OAAO,IAAIA,gCAAAA,qBAAqBC,gCAAAA,UAAU;EACxC,kBAAkB,IAAIC,+BAAAA,WAAW,EAAE,QAAQ,QAAQ,OAAO,CAAC;EAC3D,QAAQ;EACR,QAAQ;CACV,CAAC;AACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"service_factories.js","names":[],"sources":["../src/service_factories.ts"],"sourcesContent":["/**\n * Model service factories — add a factory for each new service here.\n *\n * Each entry maps a Services key to a factory function that creates the\n * model-side driver instance, or null if the service has no model-side driver\n * (e.g. node services whose driver is provided by the desktop app).\n */\n\nimport { ModelServiceRegistry, Services } from \"@milaboratories/pl-model-common\";\nimport { SpecDriver } from \"@milaboratories/pf-spec-driver\";\nimport { type MiLogger } from \"@milaboratories/ts-helpers\";\n\nexport type ModelServiceOptions = {\n logger: MiLogger;\n};\n\nexport function createModelServiceRegistry(options: ModelServiceOptions) {\n return new ModelServiceRegistry(Services, {\n PFrameSpec: () => new SpecDriver({ logger: options.logger }),\n PFrame: null,\n Dialog: null,\n });\n}\n"],"mappings":";;;;;;;;;;AAgBA,SAAgB,2BAA2B,SAA8B;AACvE,QAAO,IAAI,qBAAqB,UAAU;EACxC,kBAAkB,IAAI,WAAW,EAAE,QAAQ,QAAQ,QAAQ,CAAC;EAC5D,QAAQ;EACR,QAAQ;EACT,CAAC"}
1
+ {"version":3,"file":"service_factories.js","names":[],"sources":["../src/service_factories.ts"],"sourcesContent":["/**\n * Model service factories — add a factory for each new service here.\n *\n * Each entry maps a Services key to a factory function that creates the\n * model-side driver instance, or null if the service has no model-side driver\n * (e.g. node services whose driver is provided by the desktop app).\n */\n\nimport { ModelServiceRegistry, Services } from \"@milaboratories/pl-model-common\";\nimport { SpecDriver } from \"@milaboratories/pf-spec-driver\";\nimport { type MiLogger } from \"@milaboratories/ts-helpers\";\n\nexport type ModelServiceOptions = {\n logger: MiLogger;\n};\n\nexport function createModelServiceRegistry(options: ModelServiceOptions) {\n return new ModelServiceRegistry(Services, {\n PFrameSpec: () => new SpecDriver({ logger: options.logger }),\n PFrame: null,\n Dialog: null,\n });\n}\n"],"mappings":";;;;;;;;;;AAgBA,SAAgB,2BAA2B,SAA8B;CACvE,OAAO,IAAI,qBAAqB,UAAU;EACxC,kBAAkB,IAAI,WAAW,EAAE,QAAQ,QAAQ,OAAO,CAAC;EAC3D,QAAQ;EACR,QAAQ;CACV,CAAC;AACH"}
@@ -1,6 +1,6 @@
1
1
  const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
2
  let node_path = require("node:path");
3
- node_path = require_runtime.__toESM(node_path);
3
+ node_path = require_runtime.__toESM(node_path, 1);
4
4
  let node_worker_threads = require("node:worker_threads");
5
5
  //#region src/worker/WorkerManager.ts
6
6
  var WorkerManager = class {
@@ -8,7 +8,8 @@ var WorkerManager = class {
8
8
  worker;
9
9
  pendingRequests = /* @__PURE__ */ new Map();
10
10
  constructor() {
11
- const worker = this.worker = new node_worker_threads.Worker(typeof global !== "undefined" && "__WORKER_PATH__" in global ? global.__WORKER_PATH__ : node_path.default.resolve(__dirname, `worker.${typeof module !== "undefined" ? "cjs" : "js"}`), { workerData: {} });
11
+ const workerPath = typeof global !== "undefined" && "__WORKER_PATH__" in global ? global.__WORKER_PATH__ : node_path.default.resolve(__dirname, `worker.${typeof module !== "undefined" ? "cjs" : "js"}`);
12
+ const worker = this.worker = new node_worker_threads.Worker(workerPath, { workerData: {} });
12
13
  worker.on("message", ({ id, data, error }) => {
13
14
  const { resolve, reject } = this.pendingRequests.get(id);
14
15
  this.pendingRequests.delete(id);