@milaboratories/pf-driver 1.0.68 → 1.1.1

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 (61) hide show
  1. package/dist/data_info_helpers.cjs +2 -2
  2. package/dist/data_info_helpers.cjs.map +1 -1
  3. package/dist/data_info_helpers.d.ts +1 -1
  4. package/dist/data_info_helpers.js +1 -1
  5. package/dist/data_info_helpers.js.map +1 -1
  6. package/dist/driver_decl.d.ts +1 -1
  7. package/dist/driver_double.cjs +5 -5
  8. package/dist/driver_double.cjs.map +1 -1
  9. package/dist/driver_double.d.ts +1 -1
  10. package/dist/driver_double.js +1 -1
  11. package/dist/driver_double.js.map +1 -1
  12. package/dist/driver_impl.cjs +11 -11
  13. package/dist/driver_impl.cjs.map +1 -1
  14. package/dist/driver_impl.d.ts +1 -1
  15. package/dist/driver_impl.js +1 -1
  16. package/dist/driver_impl.js.map +1 -1
  17. package/dist/index.cjs +2 -0
  18. package/dist/index.d.ts +2 -1
  19. package/dist/index.js +2 -1
  20. package/dist/pframe_pool.cjs +13 -13
  21. package/dist/pframe_pool.cjs.map +1 -1
  22. package/dist/pframe_pool.d.ts +1 -1
  23. package/dist/pframe_pool.js +1 -1
  24. package/dist/pframe_pool.js.map +1 -1
  25. package/dist/pl-middle-layer/src/js_render/spec_driver.cjs +43 -0
  26. package/dist/pl-middle-layer/src/js_render/spec_driver.cjs.map +1 -0
  27. package/dist/pl-middle-layer/src/js_render/spec_driver.d.ts +20 -0
  28. package/dist/pl-middle-layer/src/js_render/spec_driver.js +42 -0
  29. package/dist/pl-middle-layer/src/js_render/spec_driver.js.map +1 -0
  30. package/dist/ptable_cache_per_frame.cjs.map +1 -1
  31. package/dist/ptable_cache_per_frame.d.ts +1 -1
  32. package/dist/ptable_cache_per_frame.js.map +1 -1
  33. package/dist/ptable_cache_plain.cjs.map +1 -1
  34. package/dist/ptable_cache_plain.d.ts +1 -1
  35. package/dist/ptable_cache_plain.js.map +1 -1
  36. package/dist/ptable_def_pool.cjs +2 -2
  37. package/dist/ptable_def_pool.cjs.map +1 -1
  38. package/dist/ptable_def_pool.d.ts +1 -1
  39. package/dist/ptable_def_pool.js +1 -1
  40. package/dist/ptable_def_pool.js.map +1 -1
  41. package/dist/ptable_pool.cjs +6 -6
  42. package/dist/ptable_pool.cjs.map +1 -1
  43. package/dist/ptable_pool.d.ts +1 -1
  44. package/dist/ptable_pool.js +1 -1
  45. package/dist/ptable_pool.js.map +1 -1
  46. package/dist/ptable_shared.cjs.map +1 -1
  47. package/dist/ptable_shared.d.ts +1 -1
  48. package/dist/ptable_shared.js.map +1 -1
  49. package/package.json +5 -5
  50. package/src/data_info_helpers.ts +1 -1
  51. package/src/driver_decl.ts +1 -1
  52. package/src/driver_double.test.ts +30 -28
  53. package/src/driver_double.ts +1 -1
  54. package/src/driver_impl.ts +1 -1
  55. package/src/index.ts +1 -0
  56. package/src/pframe_pool.ts +1 -1
  57. package/src/ptable_cache_per_frame.ts +1 -1
  58. package/src/ptable_cache_plain.ts +1 -1
  59. package/src/ptable_def_pool.ts +1 -1
  60. package/src/ptable_pool.ts +1 -1
  61. package/src/ptable_shared.ts +1 -1
@@ -1,6 +1,6 @@
1
1
  const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
2
2
  const require_logging = require('./logging.cjs');
3
- let _platforma_sdk_model = require("@platforma-sdk/model");
3
+ let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
4
4
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
5
5
  let _milaboratories_pframes_rs_node = require("@milaboratories/pframes-rs-node");
6
6
  let _milaboratories_pl_model_middle_layer = require("@milaboratories/pl-model-middle-layer");
@@ -47,7 +47,7 @@ var PFrameHolder = class {
47
47
  data: makeRemoteBlobId(v.data)
48
48
  }))
49
49
  };
50
- default: (0, _platforma_sdk_model.assertNever)(data);
50
+ default: (0, _milaboratories_pl_model_common.assertNever)(data);
51
51
  }
52
52
  };
53
53
  const jsonifiedColumns = columns.map((column) => ({
@@ -72,13 +72,13 @@ var PFrameHolder = class {
72
72
  this.pFramePromise = Promise.all(promises).then(() => pFrame).catch((err) => {
73
73
  this.dispose();
74
74
  pFrame.dispose();
75
- const error = new _platforma_sdk_model.PFrameDriverError("PFrame creation failed asynchronously");
76
- error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`, { cause: (0, _platforma_sdk_model.ensureError)(err) });
75
+ const error = new _milaboratories_pl_model_common.PFrameDriverError("PFrame creation failed asynchronously");
76
+ error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`, { cause: (0, _milaboratories_pl_model_common.ensureError)(err) });
77
77
  throw error;
78
78
  });
79
79
  } catch (err) {
80
- const error = new _platforma_sdk_model.PFrameDriverError("PFrame creation failed synchronously");
81
- error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`, { cause: (0, _platforma_sdk_model.ensureError)(err) });
80
+ const error = new _milaboratories_pl_model_common.PFrameDriverError("PFrame creation failed synchronously");
81
+ error.cause = new Error(`PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`, { cause: (0, _milaboratories_pl_model_common.ensureError)(err) });
82
82
  throw error;
83
83
  }
84
84
  }
@@ -107,13 +107,13 @@ var PFramePool = class extends _milaboratories_ts_helpers.RefCountPoolBase {
107
107
  return stableKeyFromPFrameData(params);
108
108
  }
109
109
  createNewResource(params, key) {
110
- if (require_logging.logPFrames()) this.logger("info", `PFrame creation (pFrameHandle = ${key}): ${JSON.stringify(params, _platforma_sdk_model.bigintReplacer)}`);
110
+ if (require_logging.logPFrames()) this.logger("info", `PFrame creation (pFrameHandle = ${key}): ${JSON.stringify(params, _milaboratories_pl_model_common.bigintReplacer)}`);
111
111
  return new PFrameHolder(key, this.localBlobProvider, this.remoteBlobProvider, this.logger, this.spillPath, params);
112
112
  }
113
113
  getByKey(key) {
114
114
  const resource = super.tryGetByKey(key);
115
115
  if (!resource) {
116
- const error = new _platforma_sdk_model.PFrameDriverError(`Invalid PFrame handle`);
116
+ const error = new _milaboratories_pl_model_common.PFrameDriverError(`Invalid PFrame handle`);
117
117
  error.cause = /* @__PURE__ */ new Error(`PFrame with handle ${key} not found`);
118
118
  throw error;
119
119
  }
@@ -121,7 +121,7 @@ var PFramePool = class extends _milaboratories_ts_helpers.RefCountPoolBase {
121
121
  }
122
122
  };
123
123
  function stableKeyFromPFrameData(data) {
124
- const orderedData = [...data].map((column) => (0, _platforma_sdk_model.mapPObjectData)(column, (r) => {
124
+ const orderedData = [...data].map((column) => (0, _milaboratories_pl_model_common.mapPObjectData)(column, (r) => {
125
125
  let result;
126
126
  const type = r.type;
127
127
  switch (type) {
@@ -141,7 +141,7 @@ function stableKeyFromPFrameData(data) {
141
141
  keyLength: r.partitionKeyLength,
142
142
  payload: Object.entries(r.parts).map(([part, info]) => ({
143
143
  key: part,
144
- value: (0, _platforma_sdk_model.canonicalizeJson)(info)
144
+ value: (0, _milaboratories_pl_model_common.canonicalizeJson)(info)
145
145
  }))
146
146
  };
147
147
  break;
@@ -151,7 +151,7 @@ function stableKeyFromPFrameData(data) {
151
151
  keyLength: r.partitionKeyLength,
152
152
  payload: Object.entries(r.parts).map(([part, info]) => ({
153
153
  key: part,
154
- value: [(0, _platforma_sdk_model.canonicalizeJson)(info.index), (0, _platforma_sdk_model.canonicalizeJson)(info.values)]
154
+ value: [(0, _milaboratories_pl_model_common.canonicalizeJson)(info.index), (0, _milaboratories_pl_model_common.canonicalizeJson)(info.values)]
155
155
  }))
156
156
  };
157
157
  break;
@@ -161,14 +161,14 @@ function stableKeyFromPFrameData(data) {
161
161
  keyLength: r.partitionKeyLength,
162
162
  payload: Object.entries(r.parts).map(([part, info]) => ({
163
163
  key: part,
164
- value: info.dataDigest || [(0, _platforma_sdk_model.canonicalizeJson)(info.data), JSON.stringify({
164
+ value: info.dataDigest || [(0, _milaboratories_pl_model_common.canonicalizeJson)(info.data), JSON.stringify({
165
165
  axes: info.axes,
166
166
  column: info.column
167
167
  })]
168
168
  }))
169
169
  };
170
170
  break;
171
- default: throw new _platforma_sdk_model.PFrameDriverError(`unsupported resource type: ${JSON.stringify(type)}`);
171
+ default: throw new _milaboratories_pl_model_common.PFrameDriverError(`unsupported resource type: ${JSON.stringify(type)}`);
172
172
  }
173
173
  result.payload.sort((lhs, rhs) => lhs.key < rhs.key ? -1 : 1);
174
174
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"pframe_pool.cjs","names":["PFrameInternal","PFrameFactory","PFrameDriverError","RefCountPoolBase","logPFrames","bigintReplacer"],"sources":["../src/pframe_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n canonicalizeJson,\n ensureError,\n mapPObjectData,\n PFrameDriverError,\n type JsonSerializable,\n type PColumn,\n type PFrameHandle,\n} from \"@platforma-sdk/model\";\nimport { hashJson, PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\nimport { mapValues } from \"es-toolkit\";\nimport { logPFrames } from \"./logging\";\n\nexport interface LocalBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n makeDataSource(signal: AbortSignal): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\">;\n}\n\nexport interface RemoteBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n httpServerInfo(): PFrameInternal.HttpServerInfo;\n}\n\nexport class PFrameHolder<TreeEntry extends JsonSerializable> implements Disposable {\n public readonly pFramePromise: Promise<PFrameInternal.PFrameV13>;\n private readonly abortController = new AbortController();\n\n private readonly localBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n private readonly remoteBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n\n constructor(\n frameId: PFrameInternal.PFrameId,\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n columns: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ) {\n const makeLocalBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const localBlob = this.localBlobProvider.acquire(blob);\n this.localBlobs.push(localBlob);\n return localBlob.key;\n };\n\n const makeRemoteBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const remoteBlob = this.remoteBlobProvider.acquire(blob);\n this.remoteBlobs.push(remoteBlob);\n return `${remoteBlob.key}${PFrameInternal.ParquetExtension}` as PFrameInternal.PFrameBlobId;\n };\n\n const mapColumnData = (\n data: PFrameInternal.DataInfo<TreeEntry>,\n ): PFrameInternal.DataInfo<PFrameInternal.PFrameBlobId> => {\n switch (data.type) {\n case \"Json\":\n return { ...data };\n case \"JsonPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, makeLocalBlobId),\n };\n case \"BinaryPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n index: makeLocalBlobId(v.index),\n values: makeLocalBlobId(v.values),\n })),\n };\n case \"ParquetPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n ...v,\n data: makeRemoteBlobId(v.data),\n })),\n };\n default:\n assertNever(data);\n }\n };\n\n const jsonifiedColumns = columns.map((column) => ({\n ...column,\n data: mapColumnData(column.data),\n }));\n\n try {\n const pFrame = PFrameFactory.createPFrame({ frameId, spillPath: this.spillPath, logger });\n pFrame.setDataSource({\n ...this.localBlobProvider.makeDataSource(this.disposeSignal),\n parquetServer: this.remoteBlobProvider.httpServerInfo(),\n });\n\n const promises: Promise<void>[] = [];\n for (const column of jsonifiedColumns) {\n pFrame.addColumnSpec(column.id, column.spec);\n promises.push(pFrame.setColumnData(column.id, column.data, { signal: this.disposeSignal }));\n }\n\n this.pFramePromise = Promise.all(promises)\n .then(() => pFrame)\n .catch((err) => {\n this.dispose();\n pFrame.dispose();\n const error = new PFrameDriverError(\"PFrame creation failed asynchronously\");\n error.cause = new Error(\n `PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`,\n { cause: ensureError(err) },\n );\n throw error;\n });\n } catch (err: unknown) {\n const error = new PFrameDriverError(\"PFrame creation failed synchronously\");\n error.cause = new Error(\n `PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`,\n { cause: ensureError(err) },\n );\n throw error;\n }\n }\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n private dispose(): void {\n this.abortController.abort();\n this.localBlobs.forEach((entry) => entry.unref());\n this.remoteBlobs.forEach((entry) => entry.unref());\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n void this.pFramePromise\n .then((pFrame) => pFrame.dispose())\n .catch(() => {\n /* mute error */\n });\n }\n}\n\nexport class PFramePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<\n PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n PFrameHandle,\n PFrameHolder<TreeEntry>\n> {\n constructor(\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n private readonly logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n ) {\n super();\n }\n\n protected calculateParamsKey(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ): PFrameHandle {\n return stableKeyFromPFrameData(params);\n }\n\n protected createNewResource(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n key: PFrameHandle,\n ): PFrameHolder<TreeEntry> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PFrame creation (pFrameHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n return new PFrameHolder(\n key,\n this.localBlobProvider,\n this.remoteBlobProvider,\n this.logger,\n this.spillPath,\n params,\n );\n }\n\n public getByKey(key: PFrameHandle): PFrameHolder<TreeEntry> {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PFrame handle`);\n error.cause = new Error(`PFrame with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n\nfunction stableKeyFromPFrameData<TreeEntry extends JsonSerializable>(\n data: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n): PFrameHandle {\n const orderedData = [...data].map((column) =>\n mapPObjectData(column, (r) => {\n let result: {\n type: string;\n keyLength: number;\n payload: {\n key: string;\n value: null | number | string | [string, string];\n }[];\n };\n const type = r.type;\n switch (type) {\n case \"Json\":\n result = {\n type: r.type,\n keyLength: r.keyLength,\n payload: Object.entries(r.data).map(([part, value]) => ({\n key: part,\n value,\n })),\n };\n break;\n case \"JsonPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: canonicalizeJson(info),\n })),\n };\n break;\n case \"BinaryPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: [canonicalizeJson(info.index), canonicalizeJson(info.values)] as const,\n })),\n };\n break;\n case \"ParquetPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value:\n info.dataDigest ||\n ([\n canonicalizeJson(info.data),\n JSON.stringify({ axes: info.axes, column: info.column }),\n ] as const),\n })),\n };\n break;\n default:\n throw new PFrameDriverError(\n `unsupported resource type: ${JSON.stringify(type satisfies never)}`,\n );\n }\n result.payload.sort((lhs, rhs) => (lhs.key < rhs.key ? -1 : 1));\n return result;\n }),\n );\n orderedData.sort((lhs, rhs) => (lhs.id < rhs.id ? -1 : 1));\n return hashJson(orderedData) as string as PFrameHandle;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pframe_pool.cjs","names":["PFrameInternal","PFrameFactory","PFrameDriverError","RefCountPoolBase","logPFrames","bigintReplacer"],"sources":["../src/pframe_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n canonicalizeJson,\n ensureError,\n mapPObjectData,\n PFrameDriverError,\n type JsonSerializable,\n type PColumn,\n type PFrameHandle,\n} from \"@milaboratories/pl-model-common\";\nimport { hashJson, PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\nimport { mapValues } from \"es-toolkit\";\nimport { logPFrames } from \"./logging\";\n\nexport interface LocalBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n makeDataSource(signal: AbortSignal): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\">;\n}\n\nexport interface RemoteBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n httpServerInfo(): PFrameInternal.HttpServerInfo;\n}\n\nexport class PFrameHolder<TreeEntry extends JsonSerializable> implements Disposable {\n public readonly pFramePromise: Promise<PFrameInternal.PFrameV13>;\n private readonly abortController = new AbortController();\n\n private readonly localBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n private readonly remoteBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n\n constructor(\n frameId: PFrameInternal.PFrameId,\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n columns: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ) {\n const makeLocalBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const localBlob = this.localBlobProvider.acquire(blob);\n this.localBlobs.push(localBlob);\n return localBlob.key;\n };\n\n const makeRemoteBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const remoteBlob = this.remoteBlobProvider.acquire(blob);\n this.remoteBlobs.push(remoteBlob);\n return `${remoteBlob.key}${PFrameInternal.ParquetExtension}` as PFrameInternal.PFrameBlobId;\n };\n\n const mapColumnData = (\n data: PFrameInternal.DataInfo<TreeEntry>,\n ): PFrameInternal.DataInfo<PFrameInternal.PFrameBlobId> => {\n switch (data.type) {\n case \"Json\":\n return { ...data };\n case \"JsonPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, makeLocalBlobId),\n };\n case \"BinaryPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n index: makeLocalBlobId(v.index),\n values: makeLocalBlobId(v.values),\n })),\n };\n case \"ParquetPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n ...v,\n data: makeRemoteBlobId(v.data),\n })),\n };\n default:\n assertNever(data);\n }\n };\n\n const jsonifiedColumns = columns.map((column) => ({\n ...column,\n data: mapColumnData(column.data),\n }));\n\n try {\n const pFrame = PFrameFactory.createPFrame({ frameId, spillPath: this.spillPath, logger });\n pFrame.setDataSource({\n ...this.localBlobProvider.makeDataSource(this.disposeSignal),\n parquetServer: this.remoteBlobProvider.httpServerInfo(),\n });\n\n const promises: Promise<void>[] = [];\n for (const column of jsonifiedColumns) {\n pFrame.addColumnSpec(column.id, column.spec);\n promises.push(pFrame.setColumnData(column.id, column.data, { signal: this.disposeSignal }));\n }\n\n this.pFramePromise = Promise.all(promises)\n .then(() => pFrame)\n .catch((err) => {\n this.dispose();\n pFrame.dispose();\n const error = new PFrameDriverError(\"PFrame creation failed asynchronously\");\n error.cause = new Error(\n `PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`,\n { cause: ensureError(err) },\n );\n throw error;\n });\n } catch (err: unknown) {\n const error = new PFrameDriverError(\"PFrame creation failed synchronously\");\n error.cause = new Error(\n `PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`,\n { cause: ensureError(err) },\n );\n throw error;\n }\n }\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n private dispose(): void {\n this.abortController.abort();\n this.localBlobs.forEach((entry) => entry.unref());\n this.remoteBlobs.forEach((entry) => entry.unref());\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n void this.pFramePromise\n .then((pFrame) => pFrame.dispose())\n .catch(() => {\n /* mute error */\n });\n }\n}\n\nexport class PFramePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<\n PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n PFrameHandle,\n PFrameHolder<TreeEntry>\n> {\n constructor(\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n private readonly logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n ) {\n super();\n }\n\n protected calculateParamsKey(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ): PFrameHandle {\n return stableKeyFromPFrameData(params);\n }\n\n protected createNewResource(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n key: PFrameHandle,\n ): PFrameHolder<TreeEntry> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PFrame creation (pFrameHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n return new PFrameHolder(\n key,\n this.localBlobProvider,\n this.remoteBlobProvider,\n this.logger,\n this.spillPath,\n params,\n );\n }\n\n public getByKey(key: PFrameHandle): PFrameHolder<TreeEntry> {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PFrame handle`);\n error.cause = new Error(`PFrame with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n\nfunction stableKeyFromPFrameData<TreeEntry extends JsonSerializable>(\n data: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n): PFrameHandle {\n const orderedData = [...data].map((column) =>\n mapPObjectData(column, (r) => {\n let result: {\n type: string;\n keyLength: number;\n payload: {\n key: string;\n value: null | number | string | [string, string];\n }[];\n };\n const type = r.type;\n switch (type) {\n case \"Json\":\n result = {\n type: r.type,\n keyLength: r.keyLength,\n payload: Object.entries(r.data).map(([part, value]) => ({\n key: part,\n value,\n })),\n };\n break;\n case \"JsonPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: canonicalizeJson(info),\n })),\n };\n break;\n case \"BinaryPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: [canonicalizeJson(info.index), canonicalizeJson(info.values)] as const,\n })),\n };\n break;\n case \"ParquetPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value:\n info.dataDigest ||\n ([\n canonicalizeJson(info.data),\n JSON.stringify({ axes: info.axes, column: info.column }),\n ] as const),\n })),\n };\n break;\n default:\n throw new PFrameDriverError(\n `unsupported resource type: ${JSON.stringify(type satisfies never)}`,\n );\n }\n result.payload.sort((lhs, rhs) => (lhs.key < rhs.key ? -1 : 1));\n return result;\n }),\n );\n orderedData.sort((lhs, rhs) => (lhs.id < rhs.id ? -1 : 1));\n return hashJson(orderedData) as string as PFrameHandle;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { JsonSerializable, PColumn, PFrameHandle } from "@platforma-sdk/model";
1
+ import { JsonSerializable, PColumn, PFrameHandle } from "@milaboratories/pl-model-common";
2
2
  import { PoolEntry, RefCountPoolBase } from "@milaboratories/ts-helpers";
3
3
  import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
4
4
 
@@ -1,5 +1,5 @@
1
1
  import { logPFrames } from "./logging.js";
2
- import { PFrameDriverError, assertNever, bigintReplacer, canonicalizeJson, ensureError, mapPObjectData } from "@platforma-sdk/model";
2
+ import { PFrameDriverError, assertNever, bigintReplacer, canonicalizeJson, ensureError, mapPObjectData } from "@milaboratories/pl-model-common";
3
3
  import { RefCountPoolBase } from "@milaboratories/ts-helpers";
4
4
  import { PFrameFactory } from "@milaboratories/pframes-rs-node";
5
5
  import { PFrameInternal, hashJson } from "@milaboratories/pl-model-middle-layer";
@@ -1 +1 @@
1
- {"version":3,"file":"pframe_pool.js","names":[],"sources":["../src/pframe_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n canonicalizeJson,\n ensureError,\n mapPObjectData,\n PFrameDriverError,\n type JsonSerializable,\n type PColumn,\n type PFrameHandle,\n} from \"@platforma-sdk/model\";\nimport { hashJson, PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\nimport { mapValues } from \"es-toolkit\";\nimport { logPFrames } from \"./logging\";\n\nexport interface LocalBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n makeDataSource(signal: AbortSignal): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\">;\n}\n\nexport interface RemoteBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n httpServerInfo(): PFrameInternal.HttpServerInfo;\n}\n\nexport class PFrameHolder<TreeEntry extends JsonSerializable> implements Disposable {\n public readonly pFramePromise: Promise<PFrameInternal.PFrameV13>;\n private readonly abortController = new AbortController();\n\n private readonly localBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n private readonly remoteBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n\n constructor(\n frameId: PFrameInternal.PFrameId,\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n columns: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ) {\n const makeLocalBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const localBlob = this.localBlobProvider.acquire(blob);\n this.localBlobs.push(localBlob);\n return localBlob.key;\n };\n\n const makeRemoteBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const remoteBlob = this.remoteBlobProvider.acquire(blob);\n this.remoteBlobs.push(remoteBlob);\n return `${remoteBlob.key}${PFrameInternal.ParquetExtension}` as PFrameInternal.PFrameBlobId;\n };\n\n const mapColumnData = (\n data: PFrameInternal.DataInfo<TreeEntry>,\n ): PFrameInternal.DataInfo<PFrameInternal.PFrameBlobId> => {\n switch (data.type) {\n case \"Json\":\n return { ...data };\n case \"JsonPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, makeLocalBlobId),\n };\n case \"BinaryPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n index: makeLocalBlobId(v.index),\n values: makeLocalBlobId(v.values),\n })),\n };\n case \"ParquetPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n ...v,\n data: makeRemoteBlobId(v.data),\n })),\n };\n default:\n assertNever(data);\n }\n };\n\n const jsonifiedColumns = columns.map((column) => ({\n ...column,\n data: mapColumnData(column.data),\n }));\n\n try {\n const pFrame = PFrameFactory.createPFrame({ frameId, spillPath: this.spillPath, logger });\n pFrame.setDataSource({\n ...this.localBlobProvider.makeDataSource(this.disposeSignal),\n parquetServer: this.remoteBlobProvider.httpServerInfo(),\n });\n\n const promises: Promise<void>[] = [];\n for (const column of jsonifiedColumns) {\n pFrame.addColumnSpec(column.id, column.spec);\n promises.push(pFrame.setColumnData(column.id, column.data, { signal: this.disposeSignal }));\n }\n\n this.pFramePromise = Promise.all(promises)\n .then(() => pFrame)\n .catch((err) => {\n this.dispose();\n pFrame.dispose();\n const error = new PFrameDriverError(\"PFrame creation failed asynchronously\");\n error.cause = new Error(\n `PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`,\n { cause: ensureError(err) },\n );\n throw error;\n });\n } catch (err: unknown) {\n const error = new PFrameDriverError(\"PFrame creation failed synchronously\");\n error.cause = new Error(\n `PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`,\n { cause: ensureError(err) },\n );\n throw error;\n }\n }\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n private dispose(): void {\n this.abortController.abort();\n this.localBlobs.forEach((entry) => entry.unref());\n this.remoteBlobs.forEach((entry) => entry.unref());\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n void this.pFramePromise\n .then((pFrame) => pFrame.dispose())\n .catch(() => {\n /* mute error */\n });\n }\n}\n\nexport class PFramePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<\n PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n PFrameHandle,\n PFrameHolder<TreeEntry>\n> {\n constructor(\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n private readonly logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n ) {\n super();\n }\n\n protected calculateParamsKey(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ): PFrameHandle {\n return stableKeyFromPFrameData(params);\n }\n\n protected createNewResource(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n key: PFrameHandle,\n ): PFrameHolder<TreeEntry> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PFrame creation (pFrameHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n return new PFrameHolder(\n key,\n this.localBlobProvider,\n this.remoteBlobProvider,\n this.logger,\n this.spillPath,\n params,\n );\n }\n\n public getByKey(key: PFrameHandle): PFrameHolder<TreeEntry> {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PFrame handle`);\n error.cause = new Error(`PFrame with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n\nfunction stableKeyFromPFrameData<TreeEntry extends JsonSerializable>(\n data: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n): PFrameHandle {\n const orderedData = [...data].map((column) =>\n mapPObjectData(column, (r) => {\n let result: {\n type: string;\n keyLength: number;\n payload: {\n key: string;\n value: null | number | string | [string, string];\n }[];\n };\n const type = r.type;\n switch (type) {\n case \"Json\":\n result = {\n type: r.type,\n keyLength: r.keyLength,\n payload: Object.entries(r.data).map(([part, value]) => ({\n key: part,\n value,\n })),\n };\n break;\n case \"JsonPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: canonicalizeJson(info),\n })),\n };\n break;\n case \"BinaryPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: [canonicalizeJson(info.index), canonicalizeJson(info.values)] as const,\n })),\n };\n break;\n case \"ParquetPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value:\n info.dataDigest ||\n ([\n canonicalizeJson(info.data),\n JSON.stringify({ axes: info.axes, column: info.column }),\n ] as const),\n })),\n };\n break;\n default:\n throw new PFrameDriverError(\n `unsupported resource type: ${JSON.stringify(type satisfies never)}`,\n );\n }\n result.payload.sort((lhs, rhs) => (lhs.key < rhs.key ? -1 : 1));\n return result;\n }),\n );\n orderedData.sort((lhs, rhs) => (lhs.id < rhs.id ? -1 : 1));\n return hashJson(orderedData) as string as PFrameHandle;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pframe_pool.js","names":[],"sources":["../src/pframe_pool.ts"],"sourcesContent":["import {\n assertNever,\n bigintReplacer,\n canonicalizeJson,\n ensureError,\n mapPObjectData,\n PFrameDriverError,\n type JsonSerializable,\n type PColumn,\n type PFrameHandle,\n} from \"@milaboratories/pl-model-common\";\nimport { hashJson, PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { PFrameFactory } from \"@milaboratories/pframes-rs-node\";\nimport { mapValues } from \"es-toolkit\";\nimport { logPFrames } from \"./logging\";\n\nexport interface LocalBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n makeDataSource(signal: AbortSignal): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\">;\n}\n\nexport interface RemoteBlobProvider<TreeEntry extends JsonSerializable> {\n acquire(params: TreeEntry): PoolEntry<PFrameInternal.PFrameBlobId>;\n httpServerInfo(): PFrameInternal.HttpServerInfo;\n}\n\nexport class PFrameHolder<TreeEntry extends JsonSerializable> implements Disposable {\n public readonly pFramePromise: Promise<PFrameInternal.PFrameV13>;\n private readonly abortController = new AbortController();\n\n private readonly localBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n private readonly remoteBlobs: PoolEntry<PFrameInternal.PFrameBlobId>[] = [];\n\n constructor(\n frameId: PFrameInternal.PFrameId,\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n columns: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ) {\n const makeLocalBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const localBlob = this.localBlobProvider.acquire(blob);\n this.localBlobs.push(localBlob);\n return localBlob.key;\n };\n\n const makeRemoteBlobId = (blob: TreeEntry): PFrameInternal.PFrameBlobId => {\n const remoteBlob = this.remoteBlobProvider.acquire(blob);\n this.remoteBlobs.push(remoteBlob);\n return `${remoteBlob.key}${PFrameInternal.ParquetExtension}` as PFrameInternal.PFrameBlobId;\n };\n\n const mapColumnData = (\n data: PFrameInternal.DataInfo<TreeEntry>,\n ): PFrameInternal.DataInfo<PFrameInternal.PFrameBlobId> => {\n switch (data.type) {\n case \"Json\":\n return { ...data };\n case \"JsonPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, makeLocalBlobId),\n };\n case \"BinaryPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n index: makeLocalBlobId(v.index),\n values: makeLocalBlobId(v.values),\n })),\n };\n case \"ParquetPartitioned\":\n return {\n ...data,\n parts: mapValues(data.parts, (v) => ({\n ...v,\n data: makeRemoteBlobId(v.data),\n })),\n };\n default:\n assertNever(data);\n }\n };\n\n const jsonifiedColumns = columns.map((column) => ({\n ...column,\n data: mapColumnData(column.data),\n }));\n\n try {\n const pFrame = PFrameFactory.createPFrame({ frameId, spillPath: this.spillPath, logger });\n pFrame.setDataSource({\n ...this.localBlobProvider.makeDataSource(this.disposeSignal),\n parquetServer: this.remoteBlobProvider.httpServerInfo(),\n });\n\n const promises: Promise<void>[] = [];\n for (const column of jsonifiedColumns) {\n pFrame.addColumnSpec(column.id, column.spec);\n promises.push(pFrame.setColumnData(column.id, column.data, { signal: this.disposeSignal }));\n }\n\n this.pFramePromise = Promise.all(promises)\n .then(() => pFrame)\n .catch((err) => {\n this.dispose();\n pFrame.dispose();\n const error = new PFrameDriverError(\"PFrame creation failed asynchronously\");\n error.cause = new Error(\n `PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`,\n { cause: ensureError(err) },\n );\n throw error;\n });\n } catch (err: unknown) {\n const error = new PFrameDriverError(\"PFrame creation failed synchronously\");\n error.cause = new Error(\n `PFrame cannot be created from columns: ${JSON.stringify(jsonifiedColumns)}`,\n { cause: ensureError(err) },\n );\n throw error;\n }\n }\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n private dispose(): void {\n this.abortController.abort();\n this.localBlobs.forEach((entry) => entry.unref());\n this.remoteBlobs.forEach((entry) => entry.unref());\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n void this.pFramePromise\n .then((pFrame) => pFrame.dispose())\n .catch(() => {\n /* mute error */\n });\n }\n}\n\nexport class PFramePool<TreeEntry extends JsonSerializable> extends RefCountPoolBase<\n PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n PFrameHandle,\n PFrameHolder<TreeEntry>\n> {\n constructor(\n private readonly localBlobProvider: LocalBlobProvider<TreeEntry>,\n private readonly remoteBlobProvider: RemoteBlobProvider<TreeEntry>,\n private readonly logger: PFrameInternal.Logger,\n private readonly spillPath: string,\n ) {\n super();\n }\n\n protected calculateParamsKey(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n ): PFrameHandle {\n return stableKeyFromPFrameData(params);\n }\n\n protected createNewResource(\n params: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n key: PFrameHandle,\n ): PFrameHolder<TreeEntry> {\n if (logPFrames()) {\n this.logger(\n \"info\",\n `PFrame creation (pFrameHandle = ${key}): ` + `${JSON.stringify(params, bigintReplacer)}`,\n );\n }\n return new PFrameHolder(\n key,\n this.localBlobProvider,\n this.remoteBlobProvider,\n this.logger,\n this.spillPath,\n params,\n );\n }\n\n public getByKey(key: PFrameHandle): PFrameHolder<TreeEntry> {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PFrame handle`);\n error.cause = new Error(`PFrame with handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n\nfunction stableKeyFromPFrameData<TreeEntry extends JsonSerializable>(\n data: PColumn<PFrameInternal.DataInfo<TreeEntry>>[],\n): PFrameHandle {\n const orderedData = [...data].map((column) =>\n mapPObjectData(column, (r) => {\n let result: {\n type: string;\n keyLength: number;\n payload: {\n key: string;\n value: null | number | string | [string, string];\n }[];\n };\n const type = r.type;\n switch (type) {\n case \"Json\":\n result = {\n type: r.type,\n keyLength: r.keyLength,\n payload: Object.entries(r.data).map(([part, value]) => ({\n key: part,\n value,\n })),\n };\n break;\n case \"JsonPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: canonicalizeJson(info),\n })),\n };\n break;\n case \"BinaryPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value: [canonicalizeJson(info.index), canonicalizeJson(info.values)] as const,\n })),\n };\n break;\n case \"ParquetPartitioned\":\n result = {\n type: r.type,\n keyLength: r.partitionKeyLength,\n payload: Object.entries(r.parts).map(([part, info]) => ({\n key: part,\n value:\n info.dataDigest ||\n ([\n canonicalizeJson(info.data),\n JSON.stringify({ axes: info.axes, column: info.column }),\n ] as const),\n })),\n };\n break;\n default:\n throw new PFrameDriverError(\n `unsupported resource type: ${JSON.stringify(type satisfies never)}`,\n );\n }\n result.payload.sort((lhs, rhs) => (lhs.key < rhs.key ? -1 : 1));\n return result;\n }),\n );\n orderedData.sort((lhs, rhs) => (lhs.id < rhs.id ? -1 : 1));\n return hashJson(orderedData) as string as PFrameHandle;\n}\n"],"mappings":";;;;;;;;AA2BA,IAAa,eAAb,MAAoF;CAClF,AAAgB;CAChB,AAAiB,kBAAkB,IAAI,iBAAiB;CAExD,AAAiB,aAAuD,EAAE;CAC1E,AAAiB,cAAwD,EAAE;CAE3E,YACE,SACA,AAAiB,mBACjB,AAAiB,oBACjB,QACA,AAAiB,WACjB,SACA;EALiB;EACA;EAEA;EAGjB,MAAM,mBAAmB,SAAiD;GACxE,MAAM,YAAY,KAAK,kBAAkB,QAAQ,KAAK;AACtD,QAAK,WAAW,KAAK,UAAU;AAC/B,UAAO,UAAU;;EAGnB,MAAM,oBAAoB,SAAiD;GACzE,MAAM,aAAa,KAAK,mBAAmB,QAAQ,KAAK;AACxD,QAAK,YAAY,KAAK,WAAW;AACjC,UAAO,GAAG,WAAW,MAAM,eAAe;;EAG5C,MAAM,iBACJ,SACyD;AACzD,WAAQ,KAAK,MAAb;IACE,KAAK,OACH,QAAO,EAAE,GAAG,MAAM;IACpB,KAAK,kBACH,QAAO;KACL,GAAG;KACH,OAAO,UAAU,KAAK,OAAO,gBAAgB;KAC9C;IACH,KAAK,oBACH,QAAO;KACL,GAAG;KACH,OAAO,UAAU,KAAK,QAAQ,OAAO;MACnC,OAAO,gBAAgB,EAAE,MAAM;MAC/B,QAAQ,gBAAgB,EAAE,OAAO;MAClC,EAAE;KACJ;IACH,KAAK,qBACH,QAAO;KACL,GAAG;KACH,OAAO,UAAU,KAAK,QAAQ,OAAO;MACnC,GAAG;MACH,MAAM,iBAAiB,EAAE,KAAK;MAC/B,EAAE;KACJ;IACH,QACE,aAAY,KAAK;;;EAIvB,MAAM,mBAAmB,QAAQ,KAAK,YAAY;GAChD,GAAG;GACH,MAAM,cAAc,OAAO,KAAK;GACjC,EAAE;AAEH,MAAI;GACF,MAAM,SAAS,cAAc,aAAa;IAAE;IAAS,WAAW,KAAK;IAAW;IAAQ,CAAC;AACzF,UAAO,cAAc;IACnB,GAAG,KAAK,kBAAkB,eAAe,KAAK,cAAc;IAC5D,eAAe,KAAK,mBAAmB,gBAAgB;IACxD,CAAC;GAEF,MAAM,WAA4B,EAAE;AACpC,QAAK,MAAM,UAAU,kBAAkB;AACrC,WAAO,cAAc,OAAO,IAAI,OAAO,KAAK;AAC5C,aAAS,KAAK,OAAO,cAAc,OAAO,IAAI,OAAO,MAAM,EAAE,QAAQ,KAAK,eAAe,CAAC,CAAC;;AAG7F,QAAK,gBAAgB,QAAQ,IAAI,SAAS,CACvC,WAAW,OAAO,CAClB,OAAO,QAAQ;AACd,SAAK,SAAS;AACd,WAAO,SAAS;IAChB,MAAM,QAAQ,IAAI,kBAAkB,wCAAwC;AAC5E,UAAM,QAAQ,IAAI,MAChB,0CAA0C,KAAK,UAAU,iBAAiB,IAC1E,EAAE,OAAO,YAAY,IAAI,EAAE,CAC5B;AACD,UAAM;KACN;WACG,KAAc;GACrB,MAAM,QAAQ,IAAI,kBAAkB,uCAAuC;AAC3E,SAAM,QAAQ,IAAI,MAChB,0CAA0C,KAAK,UAAU,iBAAiB,IAC1E,EAAE,OAAO,YAAY,IAAI,EAAE,CAC5B;AACD,SAAM;;;CAIV,IAAW,gBAA6B;AACtC,SAAO,KAAK,gBAAgB;;CAG9B,AAAQ,UAAgB;AACtB,OAAK,gBAAgB,OAAO;AAC5B,OAAK,WAAW,SAAS,UAAU,MAAM,OAAO,CAAC;AACjD,OAAK,YAAY,SAAS,UAAU,MAAM,OAAO,CAAC;;CAGpD,CAAC,OAAO,WAAiB;AACvB,OAAK,SAAS;AACd,EAAK,KAAK,cACP,MAAM,WAAW,OAAO,SAAS,CAAC,CAClC,YAAY,GAEX;;;AAIR,IAAa,aAAb,cAAoE,iBAIlE;CACA,YACE,AAAiB,mBACjB,AAAiB,oBACjB,AAAiB,QACjB,AAAiB,WACjB;AACA,SAAO;EALU;EACA;EACA;EACA;;CAKnB,AAAU,mBACR,QACc;AACd,SAAO,wBAAwB,OAAO;;CAGxC,AAAU,kBACR,QACA,KACyB;AACzB,MAAI,YAAY,CACd,MAAK,OACH,QACA,mCAAmC,IAAI,KAAU,KAAK,UAAU,QAAQ,eAAe,GACxF;AAEH,SAAO,IAAI,aACT,KACA,KAAK,mBACL,KAAK,oBACL,KAAK,QACL,KAAK,WACL,OACD;;CAGH,AAAO,SAAS,KAA4C;EAC1D,MAAM,WAAW,MAAM,YAAY,IAAI;AACvC,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAI,kBAAkB,wBAAwB;AAC5D,SAAM,wBAAQ,IAAI,MAAM,sBAAsB,IAAI,YAAY;AAC9D,SAAM;;AAER,SAAO;;;AAIX,SAAS,wBACP,MACc;CACd,MAAM,cAAc,CAAC,GAAG,KAAK,CAAC,KAAK,WACjC,eAAe,SAAS,MAAM;EAC5B,IAAI;EAQJ,MAAM,OAAO,EAAE;AACf,UAAQ,MAAR;GACE,KAAK;AACH,aAAS;KACP,MAAM,EAAE;KACR,WAAW,EAAE;KACb,SAAS,OAAO,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,YAAY;MACtD,KAAK;MACL;MACD,EAAE;KACJ;AACD;GACF,KAAK;AACH,aAAS;KACP,MAAM,EAAE;KACR,WAAW,EAAE;KACb,SAAS,OAAO,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,WAAW;MACtD,KAAK;MACL,OAAO,iBAAiB,KAAK;MAC9B,EAAE;KACJ;AACD;GACF,KAAK;AACH,aAAS;KACP,MAAM,EAAE;KACR,WAAW,EAAE;KACb,SAAS,OAAO,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,WAAW;MACtD,KAAK;MACL,OAAO,CAAC,iBAAiB,KAAK,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC;MACrE,EAAE;KACJ;AACD;GACF,KAAK;AACH,aAAS;KACP,MAAM,EAAE;KACR,WAAW,EAAE;KACb,SAAS,OAAO,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,WAAW;MACtD,KAAK;MACL,OACE,KAAK,cACJ,CACC,iBAAiB,KAAK,KAAK,EAC3B,KAAK,UAAU;OAAE,MAAM,KAAK;OAAM,QAAQ,KAAK;OAAQ,CAAC,CACzD;MACJ,EAAE;KACJ;AACD;GACF,QACE,OAAM,IAAI,kBACR,8BAA8B,KAAK,UAAU,KAAqB,GACnE;;AAEL,SAAO,QAAQ,MAAM,KAAK,QAAS,IAAI,MAAM,IAAI,MAAM,KAAK,EAAG;AAC/D,SAAO;GACP,CACH;AACD,aAAY,MAAM,KAAK,QAAS,IAAI,KAAK,IAAI,KAAK,KAAK,EAAG;AAC1D,QAAO,SAAS,YAAY"}
@@ -0,0 +1,43 @@
1
+ const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
2
+ let _milaboratories_pframes_rs_wasm = require("@milaboratories/pframes-rs-wasm");
3
+ let node_crypto = require("node:crypto");
4
+
5
+ //#region ../pl-middle-layer/src/js_render/spec_driver.ts
6
+ /**
7
+ * Manages spec-only PFrame instances (WASM) with handle-based lifecycle.
8
+ *
9
+ * All operations are synchronous — WASM computes results immediately.
10
+ */
11
+ var SpecDriver = class {
12
+ frames = /* @__PURE__ */ new Map();
13
+ createSpecFrame(specs) {
14
+ const frame = (0, _milaboratories_pframes_rs_wasm.createPFrame)(specs);
15
+ const handle = (0, node_crypto.randomUUID)();
16
+ this.frames.set(handle, frame);
17
+ return handle;
18
+ }
19
+ specFrameDiscoverColumns(handle, request) {
20
+ return this.getFrame(handle).discoverColumns(request);
21
+ }
22
+ disposeSpecFrame(handle) {
23
+ const frame = this.frames.get(handle);
24
+ if (frame) {
25
+ frame[Symbol.dispose]();
26
+ this.frames.delete(handle);
27
+ }
28
+ }
29
+ /** Dispose all managed spec frames. */
30
+ disposeAll() {
31
+ for (const frame of this.frames.values()) frame[Symbol.dispose]();
32
+ this.frames.clear();
33
+ }
34
+ getFrame(handle) {
35
+ const frame = this.frames.get(handle);
36
+ if (frame === void 0) throw new Error(`No such spec frame: ${handle}`);
37
+ return frame;
38
+ }
39
+ };
40
+
41
+ //#endregion
42
+ exports.SpecDriver = SpecDriver;
43
+ //# sourceMappingURL=spec_driver.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec_driver.cjs","names":[],"sources":["../../../../../pl-middle-layer/src/js_render/spec_driver.ts"],"sourcesContent":["import { createPFrame } from \"@milaboratories/pframes-rs-wasm\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type {\n PColumnSpec,\n PSpecDriver,\n SpecFrameHandle,\n DiscoverColumnsRequest,\n DiscoverColumnsResponse,\n} from \"@milaboratories/pl-model-common\";\nimport { randomUUID } from \"node:crypto\";\n\n/**\n * Manages spec-only PFrame instances (WASM) with handle-based lifecycle.\n *\n * All operations are synchronous — WASM computes results immediately.\n */\nexport class SpecDriver implements PSpecDriver {\n private readonly frames = new Map<string, PFrameInternal.PFrameWasm>();\n\n createSpecFrame(specs: Record<string, PColumnSpec>): SpecFrameHandle {\n const frame = createPFrame(specs);\n const handle = randomUUID() as SpecFrameHandle;\n this.frames.set(handle, frame);\n return handle;\n }\n\n specFrameDiscoverColumns(\n handle: SpecFrameHandle,\n request: DiscoverColumnsRequest,\n ): DiscoverColumnsResponse {\n return this.getFrame(handle).discoverColumns(request);\n }\n\n disposeSpecFrame(handle: SpecFrameHandle): void {\n const frame = this.frames.get(handle);\n if (frame) {\n frame[Symbol.dispose]();\n this.frames.delete(handle);\n }\n }\n\n /** Dispose all managed spec frames. */\n disposeAll(): void {\n for (const frame of this.frames.values()) {\n frame[Symbol.dispose]();\n }\n this.frames.clear();\n }\n\n private getFrame(handle: string): PFrameInternal.PFrameWasm {\n const frame = this.frames.get(handle);\n if (frame === undefined) throw new Error(`No such spec frame: ${handle}`);\n return frame;\n }\n}\n"],"mappings":";;;;;;;;;;AAgBA,IAAa,aAAb,MAA+C;CAC7C,AAAiB,yBAAS,IAAI,KAAwC;CAEtE,gBAAgB,OAAqD;EACnE,MAAM,0DAAqB,MAAM;EACjC,MAAM,sCAAqB;AAC3B,OAAK,OAAO,IAAI,QAAQ,MAAM;AAC9B,SAAO;;CAGT,yBACE,QACA,SACyB;AACzB,SAAO,KAAK,SAAS,OAAO,CAAC,gBAAgB,QAAQ;;CAGvD,iBAAiB,QAA+B;EAC9C,MAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,MAAI,OAAO;AACT,SAAM,OAAO,UAAU;AACvB,QAAK,OAAO,OAAO,OAAO;;;;CAK9B,aAAmB;AACjB,OAAK,MAAM,SAAS,KAAK,OAAO,QAAQ,CACtC,OAAM,OAAO,UAAU;AAEzB,OAAK,OAAO,OAAO;;CAGrB,AAAQ,SAAS,QAA2C;EAC1D,MAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,uBAAuB,SAAS;AACzE,SAAO"}
@@ -0,0 +1,20 @@
1
+ import { DiscoverColumnsRequest, DiscoverColumnsResponse, PColumnSpec, PSpecDriver, SpecFrameHandle } from "@milaboratories/pl-model-common";
2
+
3
+ //#region ../pl-middle-layer/src/js_render/spec_driver.d.ts
4
+ /**
5
+ * Manages spec-only PFrame instances (WASM) with handle-based lifecycle.
6
+ *
7
+ * All operations are synchronous — WASM computes results immediately.
8
+ */
9
+ declare class SpecDriver implements PSpecDriver {
10
+ private readonly frames;
11
+ createSpecFrame(specs: Record<string, PColumnSpec>): SpecFrameHandle;
12
+ specFrameDiscoverColumns(handle: SpecFrameHandle, request: DiscoverColumnsRequest): DiscoverColumnsResponse;
13
+ disposeSpecFrame(handle: SpecFrameHandle): void;
14
+ /** Dispose all managed spec frames. */
15
+ disposeAll(): void;
16
+ private getFrame;
17
+ }
18
+ //#endregion
19
+ export { SpecDriver };
20
+ //# sourceMappingURL=spec_driver.d.ts.map
@@ -0,0 +1,42 @@
1
+ import { createPFrame } from "@milaboratories/pframes-rs-wasm";
2
+ import { randomUUID } from "node:crypto";
3
+
4
+ //#region ../pl-middle-layer/src/js_render/spec_driver.ts
5
+ /**
6
+ * Manages spec-only PFrame instances (WASM) with handle-based lifecycle.
7
+ *
8
+ * All operations are synchronous — WASM computes results immediately.
9
+ */
10
+ var SpecDriver = class {
11
+ frames = /* @__PURE__ */ new Map();
12
+ createSpecFrame(specs) {
13
+ const frame = createPFrame(specs);
14
+ const handle = randomUUID();
15
+ this.frames.set(handle, frame);
16
+ return handle;
17
+ }
18
+ specFrameDiscoverColumns(handle, request) {
19
+ return this.getFrame(handle).discoverColumns(request);
20
+ }
21
+ disposeSpecFrame(handle) {
22
+ const frame = this.frames.get(handle);
23
+ if (frame) {
24
+ frame[Symbol.dispose]();
25
+ this.frames.delete(handle);
26
+ }
27
+ }
28
+ /** Dispose all managed spec frames. */
29
+ disposeAll() {
30
+ for (const frame of this.frames.values()) frame[Symbol.dispose]();
31
+ this.frames.clear();
32
+ }
33
+ getFrame(handle) {
34
+ const frame = this.frames.get(handle);
35
+ if (frame === void 0) throw new Error(`No such spec frame: ${handle}`);
36
+ return frame;
37
+ }
38
+ };
39
+
40
+ //#endregion
41
+ export { SpecDriver };
42
+ //# sourceMappingURL=spec_driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec_driver.js","names":[],"sources":["../../../../../pl-middle-layer/src/js_render/spec_driver.ts"],"sourcesContent":["import { createPFrame } from \"@milaboratories/pframes-rs-wasm\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type {\n PColumnSpec,\n PSpecDriver,\n SpecFrameHandle,\n DiscoverColumnsRequest,\n DiscoverColumnsResponse,\n} from \"@milaboratories/pl-model-common\";\nimport { randomUUID } from \"node:crypto\";\n\n/**\n * Manages spec-only PFrame instances (WASM) with handle-based lifecycle.\n *\n * All operations are synchronous — WASM computes results immediately.\n */\nexport class SpecDriver implements PSpecDriver {\n private readonly frames = new Map<string, PFrameInternal.PFrameWasm>();\n\n createSpecFrame(specs: Record<string, PColumnSpec>): SpecFrameHandle {\n const frame = createPFrame(specs);\n const handle = randomUUID() as SpecFrameHandle;\n this.frames.set(handle, frame);\n return handle;\n }\n\n specFrameDiscoverColumns(\n handle: SpecFrameHandle,\n request: DiscoverColumnsRequest,\n ): DiscoverColumnsResponse {\n return this.getFrame(handle).discoverColumns(request);\n }\n\n disposeSpecFrame(handle: SpecFrameHandle): void {\n const frame = this.frames.get(handle);\n if (frame) {\n frame[Symbol.dispose]();\n this.frames.delete(handle);\n }\n }\n\n /** Dispose all managed spec frames. */\n disposeAll(): void {\n for (const frame of this.frames.values()) {\n frame[Symbol.dispose]();\n }\n this.frames.clear();\n }\n\n private getFrame(handle: string): PFrameInternal.PFrameWasm {\n const frame = this.frames.get(handle);\n if (frame === undefined) throw new Error(`No such spec frame: ${handle}`);\n return frame;\n }\n}\n"],"mappings":";;;;;;;;;AAgBA,IAAa,aAAb,MAA+C;CAC7C,AAAiB,yBAAS,IAAI,KAAwC;CAEtE,gBAAgB,OAAqD;EACnE,MAAM,QAAQ,aAAa,MAAM;EACjC,MAAM,SAAS,YAAY;AAC3B,OAAK,OAAO,IAAI,QAAQ,MAAM;AAC9B,SAAO;;CAGT,yBACE,QACA,SACyB;AACzB,SAAO,KAAK,SAAS,OAAO,CAAC,gBAAgB,QAAQ;;CAGvD,iBAAiB,QAA+B;EAC9C,MAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,MAAI,OAAO;AACT,SAAM,OAAO,UAAU;AACvB,QAAK,OAAO,OAAO,OAAO;;;;CAK9B,aAAmB;AACjB,OAAK,MAAM,SAAS,KAAK,OAAO,QAAQ,CACtC,OAAM,OAAO,UAAU;AAEzB,OAAK,OAAO,OAAO;;CAGrB,AAAQ,SAAS,QAA2C;EAC1D,MAAM,QAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,MAAI,UAAU,OAAW,OAAM,IAAI,MAAM,uBAAuB,SAAS;AACzE,SAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"ptable_cache_per_frame.cjs","names":["LRUCache","logPFrames"],"sources":["../src/ptable_cache_per_frame.ts"],"sourcesContent":["import type { PFrameHandle, PTableHandle } from \"@platforma-sdk/model\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type { PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { LRUCache } from \"lru-cache\";\nimport { logPFrames } from \"./logging\";\nimport type { PTableHolder } from \"./ptable_pool\";\n\nexport type PTableCachePerFrameOps = {\n /** Maximum number of `calculateTableData` results cached for each PFrame */\n pFrameCacheMaxCount: number;\n /**\n * Maximum size of `calculateTableData` results cached for PFrames overall.\n * The limit is soft, as the same table could be materialized with other requests and will not be deleted in such case.\n * Also each table has predecessors, overlapping predecessors will be counted twice, so the effective limit is smaller.\n */\n pFramesCacheMaxSize: number;\n};\n\nexport const PTableCachePerFrameOpsDefaults: PTableCachePerFrameOps = {\n pFrameCacheMaxCount: 18, // SHM trees create 3 PTables per graphic, we want to cache 6 graphics per PFrame\n pFramesCacheMaxSize: 8 * 1024 * 1024 * 1024, // 8 GB, same as blob driver cache (must be at least 2GB)\n};\n\nexport class PTableCachePerFrame {\n private readonly perFrame = new Map<\n PFrameHandle,\n LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>\n >();\n private readonly global: LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>;\n private readonly disposeListeners = new Set<PTableHandle>();\n\n constructor(\n private readonly logger: PFrameInternal.Logger,\n private readonly ops: PTableCachePerFrameOps,\n ) {\n this.global = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n maxSize: this.ops.pFramesCacheMaxSize,\n dispose: (resource, key, reason) => {\n if (reason === \"evict\") {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n }\n\n if (this.perFrame.get(resource.resource.pFrame)?.size === 0) {\n this.perFrame.delete(resource.resource.pFrame);\n }\n\n resource.unref();\n if (logPFrames()) {\n logger(\"info\", `calculateTableData cache - removed PTable ${key} (reason: ${reason})`);\n }\n },\n });\n }\n\n public cache(resource: PoolEntry<PTableHandle, PTableHolder>, size: number): void {\n const key = resource.key;\n if (logPFrames()) {\n this.logger(\"info\", `calculateTableData cache - added PTable ${key} with size ${size}`);\n }\n\n this.global.set(key, resource, { size: Math.max(size, 1) }); // 1 is minimum size to avoid cache evictions\n\n let perFrame = this.perFrame.get(resource.resource.pFrame);\n if (!perFrame) {\n perFrame = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n max: this.ops.pFrameCacheMaxCount,\n dispose: (_resource, key, reason) => {\n if (reason === \"evict\") {\n this.global.delete(key);\n }\n },\n });\n this.perFrame.set(resource.resource.pFrame, perFrame);\n }\n perFrame.set(key, resource);\n\n if (!this.disposeListeners.has(key)) {\n const disposeListener = () => {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n this.global.delete(key);\n\n this.disposeListeners.delete(key);\n resource.resource.disposeSignal.removeEventListener(\"abort\", disposeListener);\n };\n this.disposeListeners.add(key);\n resource.resource.disposeSignal.addEventListener(\"abort\", disposeListener);\n }\n }\n}\n"],"mappings":";;;;;AAkBA,MAAa,iCAAyD;CACpE,qBAAqB;CACrB,qBAAqB,IAAI,OAAO,OAAO;CACxC;AAED,IAAa,sBAAb,MAAiC;CAC/B,AAAiB,2BAAW,IAAI,KAG7B;CACH,AAAiB;CACjB,AAAiB,mCAAmB,IAAI,KAAmB;CAE3D,YACE,AAAiB,QACjB,AAAiB,KACjB;EAFiB;EACA;AAEjB,OAAK,SAAS,IAAIA,mBAA8D;GAC9E,SAAS,KAAK,IAAI;GAClB,UAAU,UAAU,KAAK,WAAW;AAClC,QAAI,WAAW,QACb,MAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,OAAO,IAAI;AAG1D,QAAI,KAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,SAAS,EACxD,MAAK,SAAS,OAAO,SAAS,SAAS,OAAO;AAGhD,aAAS,OAAO;AAChB,QAAIC,4BAAY,CACd,QAAO,QAAQ,6CAA6C,IAAI,YAAY,OAAO,GAAG;;GAG3F,CAAC;;CAGJ,AAAO,MAAM,UAAiD,MAAoB;EAChF,MAAM,MAAM,SAAS;AACrB,MAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,2CAA2C,IAAI,aAAa,OAAO;AAGzF,OAAK,OAAO,IAAI,KAAK,UAAU,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,EAAE,CAAC;EAE3D,IAAI,WAAW,KAAK,SAAS,IAAI,SAAS,SAAS,OAAO;AAC1D,MAAI,CAAC,UAAU;AACb,cAAW,IAAID,mBAA8D;IAC3E,KAAK,KAAK,IAAI;IACd,UAAU,WAAW,KAAK,WAAW;AACnC,SAAI,WAAW,QACb,MAAK,OAAO,OAAO,IAAI;;IAG5B,CAAC;AACF,QAAK,SAAS,IAAI,SAAS,SAAS,QAAQ,SAAS;;AAEvD,WAAS,IAAI,KAAK,SAAS;AAE3B,MAAI,CAAC,KAAK,iBAAiB,IAAI,IAAI,EAAE;GACnC,MAAM,wBAAwB;AAC5B,SAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,OAAO,IAAI;AACxD,SAAK,OAAO,OAAO,IAAI;AAEvB,SAAK,iBAAiB,OAAO,IAAI;AACjC,aAAS,SAAS,cAAc,oBAAoB,SAAS,gBAAgB;;AAE/E,QAAK,iBAAiB,IAAI,IAAI;AAC9B,YAAS,SAAS,cAAc,iBAAiB,SAAS,gBAAgB"}
1
+ {"version":3,"file":"ptable_cache_per_frame.cjs","names":["LRUCache","logPFrames"],"sources":["../src/ptable_cache_per_frame.ts"],"sourcesContent":["import type { PFrameHandle, PTableHandle } from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type { PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { LRUCache } from \"lru-cache\";\nimport { logPFrames } from \"./logging\";\nimport type { PTableHolder } from \"./ptable_pool\";\n\nexport type PTableCachePerFrameOps = {\n /** Maximum number of `calculateTableData` results cached for each PFrame */\n pFrameCacheMaxCount: number;\n /**\n * Maximum size of `calculateTableData` results cached for PFrames overall.\n * The limit is soft, as the same table could be materialized with other requests and will not be deleted in such case.\n * Also each table has predecessors, overlapping predecessors will be counted twice, so the effective limit is smaller.\n */\n pFramesCacheMaxSize: number;\n};\n\nexport const PTableCachePerFrameOpsDefaults: PTableCachePerFrameOps = {\n pFrameCacheMaxCount: 18, // SHM trees create 3 PTables per graphic, we want to cache 6 graphics per PFrame\n pFramesCacheMaxSize: 8 * 1024 * 1024 * 1024, // 8 GB, same as blob driver cache (must be at least 2GB)\n};\n\nexport class PTableCachePerFrame {\n private readonly perFrame = new Map<\n PFrameHandle,\n LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>\n >();\n private readonly global: LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>;\n private readonly disposeListeners = new Set<PTableHandle>();\n\n constructor(\n private readonly logger: PFrameInternal.Logger,\n private readonly ops: PTableCachePerFrameOps,\n ) {\n this.global = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n maxSize: this.ops.pFramesCacheMaxSize,\n dispose: (resource, key, reason) => {\n if (reason === \"evict\") {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n }\n\n if (this.perFrame.get(resource.resource.pFrame)?.size === 0) {\n this.perFrame.delete(resource.resource.pFrame);\n }\n\n resource.unref();\n if (logPFrames()) {\n logger(\"info\", `calculateTableData cache - removed PTable ${key} (reason: ${reason})`);\n }\n },\n });\n }\n\n public cache(resource: PoolEntry<PTableHandle, PTableHolder>, size: number): void {\n const key = resource.key;\n if (logPFrames()) {\n this.logger(\"info\", `calculateTableData cache - added PTable ${key} with size ${size}`);\n }\n\n this.global.set(key, resource, { size: Math.max(size, 1) }); // 1 is minimum size to avoid cache evictions\n\n let perFrame = this.perFrame.get(resource.resource.pFrame);\n if (!perFrame) {\n perFrame = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n max: this.ops.pFrameCacheMaxCount,\n dispose: (_resource, key, reason) => {\n if (reason === \"evict\") {\n this.global.delete(key);\n }\n },\n });\n this.perFrame.set(resource.resource.pFrame, perFrame);\n }\n perFrame.set(key, resource);\n\n if (!this.disposeListeners.has(key)) {\n const disposeListener = () => {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n this.global.delete(key);\n\n this.disposeListeners.delete(key);\n resource.resource.disposeSignal.removeEventListener(\"abort\", disposeListener);\n };\n this.disposeListeners.add(key);\n resource.resource.disposeSignal.addEventListener(\"abort\", disposeListener);\n }\n }\n}\n"],"mappings":";;;;;AAkBA,MAAa,iCAAyD;CACpE,qBAAqB;CACrB,qBAAqB,IAAI,OAAO,OAAO;CACxC;AAED,IAAa,sBAAb,MAAiC;CAC/B,AAAiB,2BAAW,IAAI,KAG7B;CACH,AAAiB;CACjB,AAAiB,mCAAmB,IAAI,KAAmB;CAE3D,YACE,AAAiB,QACjB,AAAiB,KACjB;EAFiB;EACA;AAEjB,OAAK,SAAS,IAAIA,mBAA8D;GAC9E,SAAS,KAAK,IAAI;GAClB,UAAU,UAAU,KAAK,WAAW;AAClC,QAAI,WAAW,QACb,MAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,OAAO,IAAI;AAG1D,QAAI,KAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,SAAS,EACxD,MAAK,SAAS,OAAO,SAAS,SAAS,OAAO;AAGhD,aAAS,OAAO;AAChB,QAAIC,4BAAY,CACd,QAAO,QAAQ,6CAA6C,IAAI,YAAY,OAAO,GAAG;;GAG3F,CAAC;;CAGJ,AAAO,MAAM,UAAiD,MAAoB;EAChF,MAAM,MAAM,SAAS;AACrB,MAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,2CAA2C,IAAI,aAAa,OAAO;AAGzF,OAAK,OAAO,IAAI,KAAK,UAAU,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,EAAE,CAAC;EAE3D,IAAI,WAAW,KAAK,SAAS,IAAI,SAAS,SAAS,OAAO;AAC1D,MAAI,CAAC,UAAU;AACb,cAAW,IAAID,mBAA8D;IAC3E,KAAK,KAAK,IAAI;IACd,UAAU,WAAW,KAAK,WAAW;AACnC,SAAI,WAAW,QACb,MAAK,OAAO,OAAO,IAAI;;IAG5B,CAAC;AACF,QAAK,SAAS,IAAI,SAAS,SAAS,QAAQ,SAAS;;AAEvD,WAAS,IAAI,KAAK,SAAS;AAE3B,MAAI,CAAC,KAAK,iBAAiB,IAAI,IAAI,EAAE;GACnC,MAAM,wBAAwB;AAC5B,SAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,OAAO,IAAI;AACxD,SAAK,OAAO,OAAO,IAAI;AAEvB,SAAK,iBAAiB,OAAO,IAAI;AACjC,aAAS,SAAS,cAAc,oBAAoB,SAAS,gBAAgB;;AAE/E,QAAK,iBAAiB,IAAI,IAAI;AAC9B,YAAS,SAAS,cAAc,iBAAiB,SAAS,gBAAgB"}
@@ -1,5 +1,5 @@
1
1
  import "./ptable_pool.js";
2
- import { PTableHandle } from "@platforma-sdk/model";
2
+ import { PTableHandle } from "@milaboratories/pl-model-common";
3
3
  import { PoolEntry } from "@milaboratories/ts-helpers";
4
4
  import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"ptable_cache_per_frame.js","names":[],"sources":["../src/ptable_cache_per_frame.ts"],"sourcesContent":["import type { PFrameHandle, PTableHandle } from \"@platforma-sdk/model\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type { PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { LRUCache } from \"lru-cache\";\nimport { logPFrames } from \"./logging\";\nimport type { PTableHolder } from \"./ptable_pool\";\n\nexport type PTableCachePerFrameOps = {\n /** Maximum number of `calculateTableData` results cached for each PFrame */\n pFrameCacheMaxCount: number;\n /**\n * Maximum size of `calculateTableData` results cached for PFrames overall.\n * The limit is soft, as the same table could be materialized with other requests and will not be deleted in such case.\n * Also each table has predecessors, overlapping predecessors will be counted twice, so the effective limit is smaller.\n */\n pFramesCacheMaxSize: number;\n};\n\nexport const PTableCachePerFrameOpsDefaults: PTableCachePerFrameOps = {\n pFrameCacheMaxCount: 18, // SHM trees create 3 PTables per graphic, we want to cache 6 graphics per PFrame\n pFramesCacheMaxSize: 8 * 1024 * 1024 * 1024, // 8 GB, same as blob driver cache (must be at least 2GB)\n};\n\nexport class PTableCachePerFrame {\n private readonly perFrame = new Map<\n PFrameHandle,\n LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>\n >();\n private readonly global: LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>;\n private readonly disposeListeners = new Set<PTableHandle>();\n\n constructor(\n private readonly logger: PFrameInternal.Logger,\n private readonly ops: PTableCachePerFrameOps,\n ) {\n this.global = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n maxSize: this.ops.pFramesCacheMaxSize,\n dispose: (resource, key, reason) => {\n if (reason === \"evict\") {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n }\n\n if (this.perFrame.get(resource.resource.pFrame)?.size === 0) {\n this.perFrame.delete(resource.resource.pFrame);\n }\n\n resource.unref();\n if (logPFrames()) {\n logger(\"info\", `calculateTableData cache - removed PTable ${key} (reason: ${reason})`);\n }\n },\n });\n }\n\n public cache(resource: PoolEntry<PTableHandle, PTableHolder>, size: number): void {\n const key = resource.key;\n if (logPFrames()) {\n this.logger(\"info\", `calculateTableData cache - added PTable ${key} with size ${size}`);\n }\n\n this.global.set(key, resource, { size: Math.max(size, 1) }); // 1 is minimum size to avoid cache evictions\n\n let perFrame = this.perFrame.get(resource.resource.pFrame);\n if (!perFrame) {\n perFrame = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n max: this.ops.pFrameCacheMaxCount,\n dispose: (_resource, key, reason) => {\n if (reason === \"evict\") {\n this.global.delete(key);\n }\n },\n });\n this.perFrame.set(resource.resource.pFrame, perFrame);\n }\n perFrame.set(key, resource);\n\n if (!this.disposeListeners.has(key)) {\n const disposeListener = () => {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n this.global.delete(key);\n\n this.disposeListeners.delete(key);\n resource.resource.disposeSignal.removeEventListener(\"abort\", disposeListener);\n };\n this.disposeListeners.add(key);\n resource.resource.disposeSignal.addEventListener(\"abort\", disposeListener);\n }\n }\n}\n"],"mappings":";;;;AAkBA,MAAa,iCAAyD;CACpE,qBAAqB;CACrB,qBAAqB,IAAI,OAAO,OAAO;CACxC;AAED,IAAa,sBAAb,MAAiC;CAC/B,AAAiB,2BAAW,IAAI,KAG7B;CACH,AAAiB;CACjB,AAAiB,mCAAmB,IAAI,KAAmB;CAE3D,YACE,AAAiB,QACjB,AAAiB,KACjB;EAFiB;EACA;AAEjB,OAAK,SAAS,IAAI,SAA8D;GAC9E,SAAS,KAAK,IAAI;GAClB,UAAU,UAAU,KAAK,WAAW;AAClC,QAAI,WAAW,QACb,MAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,OAAO,IAAI;AAG1D,QAAI,KAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,SAAS,EACxD,MAAK,SAAS,OAAO,SAAS,SAAS,OAAO;AAGhD,aAAS,OAAO;AAChB,QAAI,YAAY,CACd,QAAO,QAAQ,6CAA6C,IAAI,YAAY,OAAO,GAAG;;GAG3F,CAAC;;CAGJ,AAAO,MAAM,UAAiD,MAAoB;EAChF,MAAM,MAAM,SAAS;AACrB,MAAI,YAAY,CACd,MAAK,OAAO,QAAQ,2CAA2C,IAAI,aAAa,OAAO;AAGzF,OAAK,OAAO,IAAI,KAAK,UAAU,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,EAAE,CAAC;EAE3D,IAAI,WAAW,KAAK,SAAS,IAAI,SAAS,SAAS,OAAO;AAC1D,MAAI,CAAC,UAAU;AACb,cAAW,IAAI,SAA8D;IAC3E,KAAK,KAAK,IAAI;IACd,UAAU,WAAW,KAAK,WAAW;AACnC,SAAI,WAAW,QACb,MAAK,OAAO,OAAO,IAAI;;IAG5B,CAAC;AACF,QAAK,SAAS,IAAI,SAAS,SAAS,QAAQ,SAAS;;AAEvD,WAAS,IAAI,KAAK,SAAS;AAE3B,MAAI,CAAC,KAAK,iBAAiB,IAAI,IAAI,EAAE;GACnC,MAAM,wBAAwB;AAC5B,SAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,OAAO,IAAI;AACxD,SAAK,OAAO,OAAO,IAAI;AAEvB,SAAK,iBAAiB,OAAO,IAAI;AACjC,aAAS,SAAS,cAAc,oBAAoB,SAAS,gBAAgB;;AAE/E,QAAK,iBAAiB,IAAI,IAAI;AAC9B,YAAS,SAAS,cAAc,iBAAiB,SAAS,gBAAgB"}
1
+ {"version":3,"file":"ptable_cache_per_frame.js","names":[],"sources":["../src/ptable_cache_per_frame.ts"],"sourcesContent":["import type { PFrameHandle, PTableHandle } from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type { PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { LRUCache } from \"lru-cache\";\nimport { logPFrames } from \"./logging\";\nimport type { PTableHolder } from \"./ptable_pool\";\n\nexport type PTableCachePerFrameOps = {\n /** Maximum number of `calculateTableData` results cached for each PFrame */\n pFrameCacheMaxCount: number;\n /**\n * Maximum size of `calculateTableData` results cached for PFrames overall.\n * The limit is soft, as the same table could be materialized with other requests and will not be deleted in such case.\n * Also each table has predecessors, overlapping predecessors will be counted twice, so the effective limit is smaller.\n */\n pFramesCacheMaxSize: number;\n};\n\nexport const PTableCachePerFrameOpsDefaults: PTableCachePerFrameOps = {\n pFrameCacheMaxCount: 18, // SHM trees create 3 PTables per graphic, we want to cache 6 graphics per PFrame\n pFramesCacheMaxSize: 8 * 1024 * 1024 * 1024, // 8 GB, same as blob driver cache (must be at least 2GB)\n};\n\nexport class PTableCachePerFrame {\n private readonly perFrame = new Map<\n PFrameHandle,\n LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>\n >();\n private readonly global: LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>;\n private readonly disposeListeners = new Set<PTableHandle>();\n\n constructor(\n private readonly logger: PFrameInternal.Logger,\n private readonly ops: PTableCachePerFrameOps,\n ) {\n this.global = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n maxSize: this.ops.pFramesCacheMaxSize,\n dispose: (resource, key, reason) => {\n if (reason === \"evict\") {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n }\n\n if (this.perFrame.get(resource.resource.pFrame)?.size === 0) {\n this.perFrame.delete(resource.resource.pFrame);\n }\n\n resource.unref();\n if (logPFrames()) {\n logger(\"info\", `calculateTableData cache - removed PTable ${key} (reason: ${reason})`);\n }\n },\n });\n }\n\n public cache(resource: PoolEntry<PTableHandle, PTableHolder>, size: number): void {\n const key = resource.key;\n if (logPFrames()) {\n this.logger(\"info\", `calculateTableData cache - added PTable ${key} with size ${size}`);\n }\n\n this.global.set(key, resource, { size: Math.max(size, 1) }); // 1 is minimum size to avoid cache evictions\n\n let perFrame = this.perFrame.get(resource.resource.pFrame);\n if (!perFrame) {\n perFrame = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n max: this.ops.pFrameCacheMaxCount,\n dispose: (_resource, key, reason) => {\n if (reason === \"evict\") {\n this.global.delete(key);\n }\n },\n });\n this.perFrame.set(resource.resource.pFrame, perFrame);\n }\n perFrame.set(key, resource);\n\n if (!this.disposeListeners.has(key)) {\n const disposeListener = () => {\n this.perFrame.get(resource.resource.pFrame)?.delete(key);\n this.global.delete(key);\n\n this.disposeListeners.delete(key);\n resource.resource.disposeSignal.removeEventListener(\"abort\", disposeListener);\n };\n this.disposeListeners.add(key);\n resource.resource.disposeSignal.addEventListener(\"abort\", disposeListener);\n }\n }\n}\n"],"mappings":";;;;AAkBA,MAAa,iCAAyD;CACpE,qBAAqB;CACrB,qBAAqB,IAAI,OAAO,OAAO;CACxC;AAED,IAAa,sBAAb,MAAiC;CAC/B,AAAiB,2BAAW,IAAI,KAG7B;CACH,AAAiB;CACjB,AAAiB,mCAAmB,IAAI,KAAmB;CAE3D,YACE,AAAiB,QACjB,AAAiB,KACjB;EAFiB;EACA;AAEjB,OAAK,SAAS,IAAI,SAA8D;GAC9E,SAAS,KAAK,IAAI;GAClB,UAAU,UAAU,KAAK,WAAW;AAClC,QAAI,WAAW,QACb,MAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,OAAO,IAAI;AAG1D,QAAI,KAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,SAAS,EACxD,MAAK,SAAS,OAAO,SAAS,SAAS,OAAO;AAGhD,aAAS,OAAO;AAChB,QAAI,YAAY,CACd,QAAO,QAAQ,6CAA6C,IAAI,YAAY,OAAO,GAAG;;GAG3F,CAAC;;CAGJ,AAAO,MAAM,UAAiD,MAAoB;EAChF,MAAM,MAAM,SAAS;AACrB,MAAI,YAAY,CACd,MAAK,OAAO,QAAQ,2CAA2C,IAAI,aAAa,OAAO;AAGzF,OAAK,OAAO,IAAI,KAAK,UAAU,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,EAAE,CAAC;EAE3D,IAAI,WAAW,KAAK,SAAS,IAAI,SAAS,SAAS,OAAO;AAC1D,MAAI,CAAC,UAAU;AACb,cAAW,IAAI,SAA8D;IAC3E,KAAK,KAAK,IAAI;IACd,UAAU,WAAW,KAAK,WAAW;AACnC,SAAI,WAAW,QACb,MAAK,OAAO,OAAO,IAAI;;IAG5B,CAAC;AACF,QAAK,SAAS,IAAI,SAAS,SAAS,QAAQ,SAAS;;AAEvD,WAAS,IAAI,KAAK,SAAS;AAE3B,MAAI,CAAC,KAAK,iBAAiB,IAAI,IAAI,EAAE;GACnC,MAAM,wBAAwB;AAC5B,SAAK,SAAS,IAAI,SAAS,SAAS,OAAO,EAAE,OAAO,IAAI;AACxD,SAAK,OAAO,OAAO,IAAI;AAEvB,SAAK,iBAAiB,OAAO,IAAI;AACjC,aAAS,SAAS,cAAc,oBAAoB,SAAS,gBAAgB;;AAE/E,QAAK,iBAAiB,IAAI,IAAI;AAC9B,YAAS,SAAS,cAAc,iBAAiB,SAAS,gBAAgB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ptable_cache_plain.cjs","names":["LRUCache","logPFrames"],"sources":["../src/ptable_cache_plain.ts"],"sourcesContent":["import type { PTableHandle } from \"@platforma-sdk/model\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type { PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { LRUCache } from \"lru-cache\";\nimport { logPFrames } from \"./logging\";\nimport type { PTableHolder } from \"./ptable_pool\";\n\nexport type PTableCachePlainOps = {\n /**\n * Maximum size of `createPTable` results cached on disk.\n * The limit is soft, as the same table could be materialized with other requests and will not be deleted in such case.\n * Also each table has predecessors, overlapping predecessors will be counted twice, so the effective limit is smaller.\n */\n pTablesCacheMaxSize: number;\n};\n\nexport const PTableCachePlainOpsDefaults: PTableCachePlainOps = {\n pTablesCacheMaxSize: 32 * 1024 * 1024 * 1024, // 32 GB (must be at least 8GB)\n};\n\nexport class PTableCachePlain {\n private readonly global: LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>;\n private readonly disposeListeners = new Set<PTableHandle>();\n\n constructor(\n private readonly logger: PFrameInternal.Logger,\n ops: PTableCachePlainOps,\n ) {\n this.global = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n maxSize: ops.pTablesCacheMaxSize,\n dispose: (resource, key, reason) => {\n resource.unref();\n if (logPFrames()) {\n logger(\"info\", `createPTable cache - removed PTable ${key} (reason: ${reason})`);\n }\n },\n });\n }\n\n public cache(\n resource: PoolEntry<PTableHandle, PTableHolder>,\n size: number,\n defDisposeSignal: AbortSignal,\n ): void {\n const key = resource.key;\n if (logPFrames()) {\n this.logger(\"info\", `createPTable cache - added PTable ${key} with size ${size}`);\n }\n\n const status: LRUCache.Status<PoolEntry<PTableHandle, PTableHolder>> = {};\n this.global.set(key, resource, { size: Math.max(size, 1), status }); // 1 is minimum size to avoid cache evictions\n\n if (status.maxEntrySizeExceeded) {\n resource.unref();\n if (logPFrames()) {\n this.logger(\"info\", `createPTable cache - removed PTable ${key} (maxEntrySizeExceeded)`);\n }\n } else {\n if (!this.disposeListeners.has(key)) {\n const disposeListener = () => {\n this.global.delete(key);\n\n this.disposeListeners.delete(key);\n defDisposeSignal.removeEventListener(\"abort\", disposeListener);\n };\n this.disposeListeners.add(key);\n defDisposeSignal.addEventListener(\"abort\", disposeListener);\n }\n }\n }\n}\n"],"mappings":";;;;;AAgBA,MAAa,8BAAmD,EAC9D,qBAAqB,KAAK,OAAO,OAAO,MACzC;AAED,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CACjB,AAAiB,mCAAmB,IAAI,KAAmB;CAE3D,YACE,AAAiB,QACjB,KACA;EAFiB;AAGjB,OAAK,SAAS,IAAIA,mBAA8D;GAC9E,SAAS,IAAI;GACb,UAAU,UAAU,KAAK,WAAW;AAClC,aAAS,OAAO;AAChB,QAAIC,4BAAY,CACd,QAAO,QAAQ,uCAAuC,IAAI,YAAY,OAAO,GAAG;;GAGrF,CAAC;;CAGJ,AAAO,MACL,UACA,MACA,kBACM;EACN,MAAM,MAAM,SAAS;AACrB,MAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,qCAAqC,IAAI,aAAa,OAAO;EAGnF,MAAM,SAAiE,EAAE;AACzE,OAAK,OAAO,IAAI,KAAK,UAAU;GAAE,MAAM,KAAK,IAAI,MAAM,EAAE;GAAE;GAAQ,CAAC;AAEnE,MAAI,OAAO,sBAAsB;AAC/B,YAAS,OAAO;AAChB,OAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,uCAAuC,IAAI,yBAAyB;aAGtF,CAAC,KAAK,iBAAiB,IAAI,IAAI,EAAE;GACnC,MAAM,wBAAwB;AAC5B,SAAK,OAAO,OAAO,IAAI;AAEvB,SAAK,iBAAiB,OAAO,IAAI;AACjC,qBAAiB,oBAAoB,SAAS,gBAAgB;;AAEhE,QAAK,iBAAiB,IAAI,IAAI;AAC9B,oBAAiB,iBAAiB,SAAS,gBAAgB"}
1
+ {"version":3,"file":"ptable_cache_plain.cjs","names":["LRUCache","logPFrames"],"sources":["../src/ptable_cache_plain.ts"],"sourcesContent":["import type { PTableHandle } from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type { PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { LRUCache } from \"lru-cache\";\nimport { logPFrames } from \"./logging\";\nimport type { PTableHolder } from \"./ptable_pool\";\n\nexport type PTableCachePlainOps = {\n /**\n * Maximum size of `createPTable` results cached on disk.\n * The limit is soft, as the same table could be materialized with other requests and will not be deleted in such case.\n * Also each table has predecessors, overlapping predecessors will be counted twice, so the effective limit is smaller.\n */\n pTablesCacheMaxSize: number;\n};\n\nexport const PTableCachePlainOpsDefaults: PTableCachePlainOps = {\n pTablesCacheMaxSize: 32 * 1024 * 1024 * 1024, // 32 GB (must be at least 8GB)\n};\n\nexport class PTableCachePlain {\n private readonly global: LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>;\n private readonly disposeListeners = new Set<PTableHandle>();\n\n constructor(\n private readonly logger: PFrameInternal.Logger,\n ops: PTableCachePlainOps,\n ) {\n this.global = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n maxSize: ops.pTablesCacheMaxSize,\n dispose: (resource, key, reason) => {\n resource.unref();\n if (logPFrames()) {\n logger(\"info\", `createPTable cache - removed PTable ${key} (reason: ${reason})`);\n }\n },\n });\n }\n\n public cache(\n resource: PoolEntry<PTableHandle, PTableHolder>,\n size: number,\n defDisposeSignal: AbortSignal,\n ): void {\n const key = resource.key;\n if (logPFrames()) {\n this.logger(\"info\", `createPTable cache - added PTable ${key} with size ${size}`);\n }\n\n const status: LRUCache.Status<PoolEntry<PTableHandle, PTableHolder>> = {};\n this.global.set(key, resource, { size: Math.max(size, 1), status }); // 1 is minimum size to avoid cache evictions\n\n if (status.maxEntrySizeExceeded) {\n resource.unref();\n if (logPFrames()) {\n this.logger(\"info\", `createPTable cache - removed PTable ${key} (maxEntrySizeExceeded)`);\n }\n } else {\n if (!this.disposeListeners.has(key)) {\n const disposeListener = () => {\n this.global.delete(key);\n\n this.disposeListeners.delete(key);\n defDisposeSignal.removeEventListener(\"abort\", disposeListener);\n };\n this.disposeListeners.add(key);\n defDisposeSignal.addEventListener(\"abort\", disposeListener);\n }\n }\n }\n}\n"],"mappings":";;;;;AAgBA,MAAa,8BAAmD,EAC9D,qBAAqB,KAAK,OAAO,OAAO,MACzC;AAED,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CACjB,AAAiB,mCAAmB,IAAI,KAAmB;CAE3D,YACE,AAAiB,QACjB,KACA;EAFiB;AAGjB,OAAK,SAAS,IAAIA,mBAA8D;GAC9E,SAAS,IAAI;GACb,UAAU,UAAU,KAAK,WAAW;AAClC,aAAS,OAAO;AAChB,QAAIC,4BAAY,CACd,QAAO,QAAQ,uCAAuC,IAAI,YAAY,OAAO,GAAG;;GAGrF,CAAC;;CAGJ,AAAO,MACL,UACA,MACA,kBACM;EACN,MAAM,MAAM,SAAS;AACrB,MAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,qCAAqC,IAAI,aAAa,OAAO;EAGnF,MAAM,SAAiE,EAAE;AACzE,OAAK,OAAO,IAAI,KAAK,UAAU;GAAE,MAAM,KAAK,IAAI,MAAM,EAAE;GAAE;GAAQ,CAAC;AAEnE,MAAI,OAAO,sBAAsB;AAC/B,YAAS,OAAO;AAChB,OAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,uCAAuC,IAAI,yBAAyB;aAGtF,CAAC,KAAK,iBAAiB,IAAI,IAAI,EAAE;GACnC,MAAM,wBAAwB;AAC5B,SAAK,OAAO,OAAO,IAAI;AAEvB,SAAK,iBAAiB,OAAO,IAAI;AACjC,qBAAiB,oBAAoB,SAAS,gBAAgB;;AAEhE,QAAK,iBAAiB,IAAI,IAAI;AAC9B,oBAAiB,iBAAiB,SAAS,gBAAgB"}
@@ -1,5 +1,5 @@
1
1
  import "./ptable_pool.js";
2
- import { PTableHandle } from "@platforma-sdk/model";
2
+ import { PTableHandle } from "@milaboratories/pl-model-common";
3
3
  import { PoolEntry } from "@milaboratories/ts-helpers";
4
4
  import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"ptable_cache_plain.js","names":[],"sources":["../src/ptable_cache_plain.ts"],"sourcesContent":["import type { PTableHandle } from \"@platforma-sdk/model\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type { PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { LRUCache } from \"lru-cache\";\nimport { logPFrames } from \"./logging\";\nimport type { PTableHolder } from \"./ptable_pool\";\n\nexport type PTableCachePlainOps = {\n /**\n * Maximum size of `createPTable` results cached on disk.\n * The limit is soft, as the same table could be materialized with other requests and will not be deleted in such case.\n * Also each table has predecessors, overlapping predecessors will be counted twice, so the effective limit is smaller.\n */\n pTablesCacheMaxSize: number;\n};\n\nexport const PTableCachePlainOpsDefaults: PTableCachePlainOps = {\n pTablesCacheMaxSize: 32 * 1024 * 1024 * 1024, // 32 GB (must be at least 8GB)\n};\n\nexport class PTableCachePlain {\n private readonly global: LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>;\n private readonly disposeListeners = new Set<PTableHandle>();\n\n constructor(\n private readonly logger: PFrameInternal.Logger,\n ops: PTableCachePlainOps,\n ) {\n this.global = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n maxSize: ops.pTablesCacheMaxSize,\n dispose: (resource, key, reason) => {\n resource.unref();\n if (logPFrames()) {\n logger(\"info\", `createPTable cache - removed PTable ${key} (reason: ${reason})`);\n }\n },\n });\n }\n\n public cache(\n resource: PoolEntry<PTableHandle, PTableHolder>,\n size: number,\n defDisposeSignal: AbortSignal,\n ): void {\n const key = resource.key;\n if (logPFrames()) {\n this.logger(\"info\", `createPTable cache - added PTable ${key} with size ${size}`);\n }\n\n const status: LRUCache.Status<PoolEntry<PTableHandle, PTableHolder>> = {};\n this.global.set(key, resource, { size: Math.max(size, 1), status }); // 1 is minimum size to avoid cache evictions\n\n if (status.maxEntrySizeExceeded) {\n resource.unref();\n if (logPFrames()) {\n this.logger(\"info\", `createPTable cache - removed PTable ${key} (maxEntrySizeExceeded)`);\n }\n } else {\n if (!this.disposeListeners.has(key)) {\n const disposeListener = () => {\n this.global.delete(key);\n\n this.disposeListeners.delete(key);\n defDisposeSignal.removeEventListener(\"abort\", disposeListener);\n };\n this.disposeListeners.add(key);\n defDisposeSignal.addEventListener(\"abort\", disposeListener);\n }\n }\n }\n}\n"],"mappings":";;;;AAgBA,MAAa,8BAAmD,EAC9D,qBAAqB,KAAK,OAAO,OAAO,MACzC;AAED,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CACjB,AAAiB,mCAAmB,IAAI,KAAmB;CAE3D,YACE,AAAiB,QACjB,KACA;EAFiB;AAGjB,OAAK,SAAS,IAAI,SAA8D;GAC9E,SAAS,IAAI;GACb,UAAU,UAAU,KAAK,WAAW;AAClC,aAAS,OAAO;AAChB,QAAI,YAAY,CACd,QAAO,QAAQ,uCAAuC,IAAI,YAAY,OAAO,GAAG;;GAGrF,CAAC;;CAGJ,AAAO,MACL,UACA,MACA,kBACM;EACN,MAAM,MAAM,SAAS;AACrB,MAAI,YAAY,CACd,MAAK,OAAO,QAAQ,qCAAqC,IAAI,aAAa,OAAO;EAGnF,MAAM,SAAiE,EAAE;AACzE,OAAK,OAAO,IAAI,KAAK,UAAU;GAAE,MAAM,KAAK,IAAI,MAAM,EAAE;GAAE;GAAQ,CAAC;AAEnE,MAAI,OAAO,sBAAsB;AAC/B,YAAS,OAAO;AAChB,OAAI,YAAY,CACd,MAAK,OAAO,QAAQ,uCAAuC,IAAI,yBAAyB;aAGtF,CAAC,KAAK,iBAAiB,IAAI,IAAI,EAAE;GACnC,MAAM,wBAAwB;AAC5B,SAAK,OAAO,OAAO,IAAI;AAEvB,SAAK,iBAAiB,OAAO,IAAI;AACjC,qBAAiB,oBAAoB,SAAS,gBAAgB;;AAEhE,QAAK,iBAAiB,IAAI,IAAI;AAC9B,oBAAiB,iBAAiB,SAAS,gBAAgB"}
1
+ {"version":3,"file":"ptable_cache_plain.js","names":[],"sources":["../src/ptable_cache_plain.ts"],"sourcesContent":["import type { PTableHandle } from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport type { PoolEntry } from \"@milaboratories/ts-helpers\";\nimport { LRUCache } from \"lru-cache\";\nimport { logPFrames } from \"./logging\";\nimport type { PTableHolder } from \"./ptable_pool\";\n\nexport type PTableCachePlainOps = {\n /**\n * Maximum size of `createPTable` results cached on disk.\n * The limit is soft, as the same table could be materialized with other requests and will not be deleted in such case.\n * Also each table has predecessors, overlapping predecessors will be counted twice, so the effective limit is smaller.\n */\n pTablesCacheMaxSize: number;\n};\n\nexport const PTableCachePlainOpsDefaults: PTableCachePlainOps = {\n pTablesCacheMaxSize: 32 * 1024 * 1024 * 1024, // 32 GB (must be at least 8GB)\n};\n\nexport class PTableCachePlain {\n private readonly global: LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>;\n private readonly disposeListeners = new Set<PTableHandle>();\n\n constructor(\n private readonly logger: PFrameInternal.Logger,\n ops: PTableCachePlainOps,\n ) {\n this.global = new LRUCache<PTableHandle, PoolEntry<PTableHandle, PTableHolder>>({\n maxSize: ops.pTablesCacheMaxSize,\n dispose: (resource, key, reason) => {\n resource.unref();\n if (logPFrames()) {\n logger(\"info\", `createPTable cache - removed PTable ${key} (reason: ${reason})`);\n }\n },\n });\n }\n\n public cache(\n resource: PoolEntry<PTableHandle, PTableHolder>,\n size: number,\n defDisposeSignal: AbortSignal,\n ): void {\n const key = resource.key;\n if (logPFrames()) {\n this.logger(\"info\", `createPTable cache - added PTable ${key} with size ${size}`);\n }\n\n const status: LRUCache.Status<PoolEntry<PTableHandle, PTableHolder>> = {};\n this.global.set(key, resource, { size: Math.max(size, 1), status }); // 1 is minimum size to avoid cache evictions\n\n if (status.maxEntrySizeExceeded) {\n resource.unref();\n if (logPFrames()) {\n this.logger(\"info\", `createPTable cache - removed PTable ${key} (maxEntrySizeExceeded)`);\n }\n } else {\n if (!this.disposeListeners.has(key)) {\n const disposeListener = () => {\n this.global.delete(key);\n\n this.disposeListeners.delete(key);\n defDisposeSignal.removeEventListener(\"abort\", disposeListener);\n };\n this.disposeListeners.add(key);\n defDisposeSignal.addEventListener(\"abort\", disposeListener);\n }\n }\n }\n}\n"],"mappings":";;;;AAgBA,MAAa,8BAAmD,EAC9D,qBAAqB,KAAK,OAAO,OAAO,MACzC;AAED,IAAa,mBAAb,MAA8B;CAC5B,AAAiB;CACjB,AAAiB,mCAAmB,IAAI,KAAmB;CAE3D,YACE,AAAiB,QACjB,KACA;EAFiB;AAGjB,OAAK,SAAS,IAAI,SAA8D;GAC9E,SAAS,IAAI;GACb,UAAU,UAAU,KAAK,WAAW;AAClC,aAAS,OAAO;AAChB,QAAI,YAAY,CACd,QAAO,QAAQ,uCAAuC,IAAI,YAAY,OAAO,GAAG;;GAGrF,CAAC;;CAGJ,AAAO,MACL,UACA,MACA,kBACM;EACN,MAAM,MAAM,SAAS;AACrB,MAAI,YAAY,CACd,MAAK,OAAO,QAAQ,qCAAqC,IAAI,aAAa,OAAO;EAGnF,MAAM,SAAiE,EAAE;AACzE,OAAK,OAAO,IAAI,KAAK,UAAU;GAAE,MAAM,KAAK,IAAI,MAAM,EAAE;GAAE;GAAQ,CAAC;AAEnE,MAAI,OAAO,sBAAsB;AAC/B,YAAS,OAAO;AAChB,OAAI,YAAY,CACd,MAAK,OAAO,QAAQ,uCAAuC,IAAI,yBAAyB;aAGtF,CAAC,KAAK,iBAAiB,IAAI,IAAI,EAAE;GACnC,MAAM,wBAAwB;AAC5B,SAAK,OAAO,OAAO,IAAI;AAEvB,SAAK,iBAAiB,OAAO,IAAI;AACjC,qBAAiB,oBAAoB,SAAS,gBAAgB;;AAEhE,QAAK,iBAAiB,IAAI,IAAI;AAC9B,oBAAiB,iBAAiB,SAAS,gBAAgB"}
@@ -1,7 +1,7 @@
1
1
  const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
2
2
  const require_logging = require('./logging.cjs');
3
3
  const require_ptable_shared = require('./ptable_shared.cjs');
4
- let _platforma_sdk_model = require("@platforma-sdk/model");
4
+ let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
5
5
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
6
6
 
7
7
  //#region src/ptable_def_pool.ts
@@ -35,7 +35,7 @@ var PTableDefPool = class extends _milaboratories_ts_helpers.RefCountPoolBase {
35
35
  getByKey(key) {
36
36
  const resource = super.tryGetByKey(key);
37
37
  if (!resource) {
38
- const error = new _platforma_sdk_model.PFrameDriverError(`Invalid PTable handle`);
38
+ const error = new _milaboratories_pl_model_common.PFrameDriverError(`Invalid PTable handle`);
39
39
  error.cause = /* @__PURE__ */ new Error(`PTable definition for handle ${key} not found`);
40
40
  throw error;
41
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ptable_def_pool.cjs","names":["logPFrames","RefCountPoolBase","stableKeyFromFullPTableDef","PFrameDriverError"],"sources":["../src/ptable_def_pool.ts"],"sourcesContent":["import { PFrameDriverError, type PTableHandle } from \"@platforma-sdk/model\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase } from \"@milaboratories/ts-helpers\";\nimport { logPFrames } from \"./logging\";\nimport type { FullPTableDef } from \"./ptable_shared\";\nimport { stableKeyFromFullPTableDef } from \"./ptable_shared\";\n\nexport class PTableDefHolder implements Disposable {\n private readonly abortController = new AbortController();\n\n constructor(\n public readonly def: FullPTableDef,\n private readonly pTableHandle: PTableHandle,\n private readonly logger: PFrameInternal.Logger,\n ) {\n if (logPFrames()) {\n this.logger(\"info\", `PTable definition saved (pTableHandle = ${this.pTableHandle})`);\n }\n }\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n [Symbol.dispose](): void {\n this.abortController.abort();\n if (logPFrames()) {\n this.logger(\"info\", `PTable definition disposed (pTableHandle = ${this.pTableHandle})`);\n }\n }\n}\n\nexport class PTableDefPool extends RefCountPoolBase<FullPTableDef, PTableHandle, PTableDefHolder> {\n constructor(private readonly logger: PFrameInternal.Logger) {\n super();\n }\n\n protected calculateParamsKey(params: FullPTableDef): PTableHandle {\n return stableKeyFromFullPTableDef(params);\n }\n\n protected createNewResource(params: FullPTableDef, key: PTableHandle): PTableDefHolder {\n return new PTableDefHolder(params, key, this.logger);\n }\n\n public getByKey(key: PTableHandle): PTableDefHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PTable handle`);\n error.cause = new Error(`PTable definition for handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n"],"mappings":";;;;;;;AAOA,IAAa,kBAAb,MAAmD;CACjD,AAAiB,kBAAkB,IAAI,iBAAiB;CAExD,YACE,AAAgB,KAChB,AAAiB,cACjB,AAAiB,QACjB;EAHgB;EACC;EACA;AAEjB,MAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,2CAA2C,KAAK,aAAa,GAAG;;CAIxF,IAAW,gBAA6B;AACtC,SAAO,KAAK,gBAAgB;;CAG9B,CAAC,OAAO,WAAiB;AACvB,OAAK,gBAAgB,OAAO;AAC5B,MAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,8CAA8C,KAAK,aAAa,GAAG;;;AAK7F,IAAa,gBAAb,cAAmCC,4CAA+D;CAChG,YAAY,AAAiB,QAA+B;AAC1D,SAAO;EADoB;;CAI7B,AAAU,mBAAmB,QAAqC;AAChE,SAAOC,iDAA2B,OAAO;;CAG3C,AAAU,kBAAkB,QAAuB,KAAoC;AACrF,SAAO,IAAI,gBAAgB,QAAQ,KAAK,KAAK,OAAO;;CAGtD,AAAO,SAAS,KAAoC;EAClD,MAAM,WAAW,MAAM,YAAY,IAAI;AACvC,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAIC,uCAAkB,wBAAwB;AAC5D,SAAM,wBAAQ,IAAI,MAAM,gCAAgC,IAAI,YAAY;AACxE,SAAM;;AAER,SAAO"}
1
+ {"version":3,"file":"ptable_def_pool.cjs","names":["logPFrames","RefCountPoolBase","stableKeyFromFullPTableDef","PFrameDriverError"],"sources":["../src/ptable_def_pool.ts"],"sourcesContent":["import { PFrameDriverError, type PTableHandle } from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase } from \"@milaboratories/ts-helpers\";\nimport { logPFrames } from \"./logging\";\nimport type { FullPTableDef } from \"./ptable_shared\";\nimport { stableKeyFromFullPTableDef } from \"./ptable_shared\";\n\nexport class PTableDefHolder implements Disposable {\n private readonly abortController = new AbortController();\n\n constructor(\n public readonly def: FullPTableDef,\n private readonly pTableHandle: PTableHandle,\n private readonly logger: PFrameInternal.Logger,\n ) {\n if (logPFrames()) {\n this.logger(\"info\", `PTable definition saved (pTableHandle = ${this.pTableHandle})`);\n }\n }\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n [Symbol.dispose](): void {\n this.abortController.abort();\n if (logPFrames()) {\n this.logger(\"info\", `PTable definition disposed (pTableHandle = ${this.pTableHandle})`);\n }\n }\n}\n\nexport class PTableDefPool extends RefCountPoolBase<FullPTableDef, PTableHandle, PTableDefHolder> {\n constructor(private readonly logger: PFrameInternal.Logger) {\n super();\n }\n\n protected calculateParamsKey(params: FullPTableDef): PTableHandle {\n return stableKeyFromFullPTableDef(params);\n }\n\n protected createNewResource(params: FullPTableDef, key: PTableHandle): PTableDefHolder {\n return new PTableDefHolder(params, key, this.logger);\n }\n\n public getByKey(key: PTableHandle): PTableDefHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PTable handle`);\n error.cause = new Error(`PTable definition for handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n"],"mappings":";;;;;;;AAOA,IAAa,kBAAb,MAAmD;CACjD,AAAiB,kBAAkB,IAAI,iBAAiB;CAExD,YACE,AAAgB,KAChB,AAAiB,cACjB,AAAiB,QACjB;EAHgB;EACC;EACA;AAEjB,MAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,2CAA2C,KAAK,aAAa,GAAG;;CAIxF,IAAW,gBAA6B;AACtC,SAAO,KAAK,gBAAgB;;CAG9B,CAAC,OAAO,WAAiB;AACvB,OAAK,gBAAgB,OAAO;AAC5B,MAAIA,4BAAY,CACd,MAAK,OAAO,QAAQ,8CAA8C,KAAK,aAAa,GAAG;;;AAK7F,IAAa,gBAAb,cAAmCC,4CAA+D;CAChG,YAAY,AAAiB,QAA+B;AAC1D,SAAO;EADoB;;CAI7B,AAAU,mBAAmB,QAAqC;AAChE,SAAOC,iDAA2B,OAAO;;CAG3C,AAAU,kBAAkB,QAAuB,KAAoC;AACrF,SAAO,IAAI,gBAAgB,QAAQ,KAAK,KAAK,OAAO;;CAGtD,AAAO,SAAS,KAAoC;EAClD,MAAM,WAAW,MAAM,YAAY,IAAI;AACvC,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAIC,kDAAkB,wBAAwB;AAC5D,SAAM,wBAAQ,IAAI,MAAM,gCAAgC,IAAI,YAAY;AACxE,SAAM;;AAER,SAAO"}
@@ -1,4 +1,4 @@
1
1
  import "./ptable_shared.js";
2
- import { PTableHandle } from "@platforma-sdk/model";
2
+ import { PTableHandle } from "@milaboratories/pl-model-common";
3
3
  import { RefCountPoolBase } from "@milaboratories/ts-helpers";
4
4
  import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
@@ -1,6 +1,6 @@
1
1
  import { logPFrames } from "./logging.js";
2
2
  import { stableKeyFromFullPTableDef } from "./ptable_shared.js";
3
- import { PFrameDriverError } from "@platforma-sdk/model";
3
+ import { PFrameDriverError } from "@milaboratories/pl-model-common";
4
4
  import { RefCountPoolBase } from "@milaboratories/ts-helpers";
5
5
 
6
6
  //#region src/ptable_def_pool.ts
@@ -1 +1 @@
1
- {"version":3,"file":"ptable_def_pool.js","names":[],"sources":["../src/ptable_def_pool.ts"],"sourcesContent":["import { PFrameDriverError, type PTableHandle } from \"@platforma-sdk/model\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase } from \"@milaboratories/ts-helpers\";\nimport { logPFrames } from \"./logging\";\nimport type { FullPTableDef } from \"./ptable_shared\";\nimport { stableKeyFromFullPTableDef } from \"./ptable_shared\";\n\nexport class PTableDefHolder implements Disposable {\n private readonly abortController = new AbortController();\n\n constructor(\n public readonly def: FullPTableDef,\n private readonly pTableHandle: PTableHandle,\n private readonly logger: PFrameInternal.Logger,\n ) {\n if (logPFrames()) {\n this.logger(\"info\", `PTable definition saved (pTableHandle = ${this.pTableHandle})`);\n }\n }\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n [Symbol.dispose](): void {\n this.abortController.abort();\n if (logPFrames()) {\n this.logger(\"info\", `PTable definition disposed (pTableHandle = ${this.pTableHandle})`);\n }\n }\n}\n\nexport class PTableDefPool extends RefCountPoolBase<FullPTableDef, PTableHandle, PTableDefHolder> {\n constructor(private readonly logger: PFrameInternal.Logger) {\n super();\n }\n\n protected calculateParamsKey(params: FullPTableDef): PTableHandle {\n return stableKeyFromFullPTableDef(params);\n }\n\n protected createNewResource(params: FullPTableDef, key: PTableHandle): PTableDefHolder {\n return new PTableDefHolder(params, key, this.logger);\n }\n\n public getByKey(key: PTableHandle): PTableDefHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PTable handle`);\n error.cause = new Error(`PTable definition for handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,kBAAb,MAAmD;CACjD,AAAiB,kBAAkB,IAAI,iBAAiB;CAExD,YACE,AAAgB,KAChB,AAAiB,cACjB,AAAiB,QACjB;EAHgB;EACC;EACA;AAEjB,MAAI,YAAY,CACd,MAAK,OAAO,QAAQ,2CAA2C,KAAK,aAAa,GAAG;;CAIxF,IAAW,gBAA6B;AACtC,SAAO,KAAK,gBAAgB;;CAG9B,CAAC,OAAO,WAAiB;AACvB,OAAK,gBAAgB,OAAO;AAC5B,MAAI,YAAY,CACd,MAAK,OAAO,QAAQ,8CAA8C,KAAK,aAAa,GAAG;;;AAK7F,IAAa,gBAAb,cAAmC,iBAA+D;CAChG,YAAY,AAAiB,QAA+B;AAC1D,SAAO;EADoB;;CAI7B,AAAU,mBAAmB,QAAqC;AAChE,SAAO,2BAA2B,OAAO;;CAG3C,AAAU,kBAAkB,QAAuB,KAAoC;AACrF,SAAO,IAAI,gBAAgB,QAAQ,KAAK,KAAK,OAAO;;CAGtD,AAAO,SAAS,KAAoC;EAClD,MAAM,WAAW,MAAM,YAAY,IAAI;AACvC,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAI,kBAAkB,wBAAwB;AAC5D,SAAM,wBAAQ,IAAI,MAAM,gCAAgC,IAAI,YAAY;AACxE,SAAM;;AAER,SAAO"}
1
+ {"version":3,"file":"ptable_def_pool.js","names":[],"sources":["../src/ptable_def_pool.ts"],"sourcesContent":["import { PFrameDriverError, type PTableHandle } from \"@milaboratories/pl-model-common\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase } from \"@milaboratories/ts-helpers\";\nimport { logPFrames } from \"./logging\";\nimport type { FullPTableDef } from \"./ptable_shared\";\nimport { stableKeyFromFullPTableDef } from \"./ptable_shared\";\n\nexport class PTableDefHolder implements Disposable {\n private readonly abortController = new AbortController();\n\n constructor(\n public readonly def: FullPTableDef,\n private readonly pTableHandle: PTableHandle,\n private readonly logger: PFrameInternal.Logger,\n ) {\n if (logPFrames()) {\n this.logger(\"info\", `PTable definition saved (pTableHandle = ${this.pTableHandle})`);\n }\n }\n\n public get disposeSignal(): AbortSignal {\n return this.abortController.signal;\n }\n\n [Symbol.dispose](): void {\n this.abortController.abort();\n if (logPFrames()) {\n this.logger(\"info\", `PTable definition disposed (pTableHandle = ${this.pTableHandle})`);\n }\n }\n}\n\nexport class PTableDefPool extends RefCountPoolBase<FullPTableDef, PTableHandle, PTableDefHolder> {\n constructor(private readonly logger: PFrameInternal.Logger) {\n super();\n }\n\n protected calculateParamsKey(params: FullPTableDef): PTableHandle {\n return stableKeyFromFullPTableDef(params);\n }\n\n protected createNewResource(params: FullPTableDef, key: PTableHandle): PTableDefHolder {\n return new PTableDefHolder(params, key, this.logger);\n }\n\n public getByKey(key: PTableHandle): PTableDefHolder {\n const resource = super.tryGetByKey(key);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid PTable handle`);\n error.cause = new Error(`PTable definition for handle ${key} not found`);\n throw error;\n }\n return resource;\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,kBAAb,MAAmD;CACjD,AAAiB,kBAAkB,IAAI,iBAAiB;CAExD,YACE,AAAgB,KAChB,AAAiB,cACjB,AAAiB,QACjB;EAHgB;EACC;EACA;AAEjB,MAAI,YAAY,CACd,MAAK,OAAO,QAAQ,2CAA2C,KAAK,aAAa,GAAG;;CAIxF,IAAW,gBAA6B;AACtC,SAAO,KAAK,gBAAgB;;CAG9B,CAAC,OAAO,WAAiB;AACvB,OAAK,gBAAgB,OAAO;AAC5B,MAAI,YAAY,CACd,MAAK,OAAO,QAAQ,8CAA8C,KAAK,aAAa,GAAG;;;AAK7F,IAAa,gBAAb,cAAmC,iBAA+D;CAChG,YAAY,AAAiB,QAA+B;AAC1D,SAAO;EADoB;;CAI7B,AAAU,mBAAmB,QAAqC;AAChE,SAAO,2BAA2B,OAAO;;CAG3C,AAAU,kBAAkB,QAAuB,KAAoC;AACrF,SAAO,IAAI,gBAAgB,QAAQ,KAAK,KAAK,OAAO;;CAGtD,AAAO,SAAS,KAAoC;EAClD,MAAM,WAAW,MAAM,YAAY,IAAI;AACvC,MAAI,CAAC,UAAU;GACb,MAAM,QAAQ,IAAI,kBAAkB,wBAAwB;AAC5D,SAAM,wBAAQ,IAAI,MAAM,gCAAgC,IAAI,YAAY;AACxE,SAAM;;AAER,SAAO"}
@@ -1,7 +1,7 @@
1
1
  const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
2
2
  const require_logging = require('./logging.cjs');
3
3
  const require_ptable_shared = require('./ptable_shared.cjs');
4
- let _platforma_sdk_model = require("@platforma-sdk/model");
4
+ let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
5
5
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
6
6
 
7
7
  //#region src/ptable_pool.ts
@@ -34,11 +34,11 @@ var PTablePool = class extends _milaboratories_ts_helpers.RefCountPoolBase {
34
34
  return require_ptable_shared.stableKeyFromFullPTableDef(params);
35
35
  }
36
36
  createNewResource(params, key) {
37
- if (require_logging.logPFrames()) this.logger("info", `PTable creation (pTableHandle = ${key}): ${JSON.stringify(params, _platforma_sdk_model.bigintReplacer)}`);
37
+ if (require_logging.logPFrames()) this.logger("info", `PTable creation (pTableHandle = ${key}): ${JSON.stringify(params, _milaboratories_pl_model_common.bigintReplacer)}`);
38
38
  switch (params.type) {
39
39
  case "v1": return this.createNewResourceV1(params, key);
40
40
  case "v2": return this.createNewResourceV2(params, key);
41
- default: throw new _platforma_sdk_model.PFrameDriverError(`Unsupported FullPTableDef type: ${params.type}`);
41
+ default: throw new _milaboratories_pl_model_common.PFrameDriverError(`Unsupported FullPTableDef type: ${params.type}`);
42
42
  }
43
43
  }
44
44
  createNewResourceV1(params, key) {
@@ -82,7 +82,7 @@ var PTablePool = class extends _milaboratories_ts_helpers.RefCountPoolBase {
82
82
  getByKey(key) {
83
83
  const resource = super.tryGetByKey(key);
84
84
  if (!resource) {
85
- const error = new _platforma_sdk_model.PFrameDriverError(`Invalid PTable handle`);
85
+ const error = new _milaboratories_pl_model_common.PFrameDriverError(`Invalid PTable handle`);
86
86
  error.cause = /* @__PURE__ */ new Error(`PTable with handle ${key} not found`);
87
87
  throw error;
88
88
  }
@@ -98,7 +98,7 @@ function hasArtificialColumns(entry) {
98
98
  case "full":
99
99
  case "inner": return entry.entries.some(hasArtificialColumns);
100
100
  case "outer": return hasArtificialColumns(entry.primary) || entry.secondary.some(hasArtificialColumns);
101
- default: (0, _platforma_sdk_model.assertNever)(entry);
101
+ default: (0, _milaboratories_pl_model_common.assertNever)(entry);
102
102
  }
103
103
  }
104
104
  function joinEntryToInternal(entry) {
@@ -143,7 +143,7 @@ function joinEntryToInternal(entry) {
143
143
  primary: joinEntryToInternal(entry.primary),
144
144
  secondary: entry.secondary.map((col) => joinEntryToInternal(col))
145
145
  };
146
- default: throw new _platforma_sdk_model.PFrameDriverError(`unsupported PFrame join entry type: ${type}`);
146
+ default: throw new _milaboratories_pl_model_common.PFrameDriverError(`unsupported PFrame join entry type: ${type}`);
147
147
  }
148
148
  }
149
149