@milaboratories/pf-driver 1.8.5 → 1.9.0

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 (39) hide show
  1. package/dist/driver_impl.js +1 -1
  2. package/dist/driver_impl.js.map +1 -1
  3. package/dist/pframe_pool.js +1 -1
  4. package/dist/pframe_pool.js.map +1 -1
  5. package/dist/ptable_def_pool.js.map +1 -1
  6. package/dist/ptable_pool.js.map +1 -1
  7. package/dist/ptable_shared.d.ts +1 -2
  8. package/dist/ptable_shared.js.map +1 -1
  9. package/package.json +9 -10
  10. package/src/driver_impl.ts +1 -1
  11. package/src/pframe_pool.ts +2 -2
  12. package/src/ptable_def_pool.ts +2 -1
  13. package/src/ptable_pool.ts +2 -1
  14. package/src/ptable_shared.ts +4 -3
  15. package/dist/_virtual/_@oxc-project_runtime@0.137.0/helpers/esm/usingCtx.cjs +0 -57
  16. package/dist/_virtual/_rolldown/runtime.cjs +0 -23
  17. package/dist/csv_writer.cjs +0 -83
  18. package/dist/csv_writer.cjs.map +0 -1
  19. package/dist/data_info_helpers.cjs +0 -23
  20. package/dist/data_info_helpers.cjs.map +0 -1
  21. package/dist/driver_double.cjs +0 -114
  22. package/dist/driver_double.cjs.map +0 -1
  23. package/dist/driver_impl.cjs +0 -455
  24. package/dist/driver_impl.cjs.map +0 -1
  25. package/dist/index.cjs +0 -9
  26. package/dist/logging.cjs +0 -9
  27. package/dist/logging.cjs.map +0 -1
  28. package/dist/pframe_pool.cjs +0 -215
  29. package/dist/pframe_pool.cjs.map +0 -1
  30. package/dist/ptable_cache_per_frame.cjs +0 -58
  31. package/dist/ptable_cache_per_frame.cjs.map +0 -1
  32. package/dist/ptable_cache_plain.cjs +0 -45
  33. package/dist/ptable_cache_plain.cjs.map +0 -1
  34. package/dist/ptable_def_pool.cjs +0 -66
  35. package/dist/ptable_def_pool.cjs.map +0 -1
  36. package/dist/ptable_pool.cjs +0 -84
  37. package/dist/ptable_pool.cjs.map +0 -1
  38. package/dist/ptable_shared.cjs +0 -63
  39. package/dist/ptable_shared.cjs.map +0 -1
@@ -1,83 +0,0 @@
1
- let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
2
- let _milaboratories_helpers = require("@milaboratories/helpers");
3
- //#region src/csv_writer.ts
4
- /** Format a CSV/TSV header row from column specs. Line ending is CRLF. */
5
- function formatHeader(specs, separator) {
6
- return specs.map((spec) => escapeField(getNativeColumnLabel(spec), separator)).join(separator) + "\r\n";
7
- }
8
- /** Format a single data row from parallel vectors. Line ending is CRLF. */
9
- function formatRow(vectors, rowIndex, separator) {
10
- return vectors.map((vector) => escapeField(serializeValue(vector, rowIndex), separator)).join(separator) + "\r\n";
11
- }
12
- async function* streamPTableRows(options) {
13
- const { pTable, columnIndices, headerNames, range, chunkSize, separator, signal, specs } = options;
14
- const { includeHeader, bom } = options;
15
- if (headerNames !== void 0 && headerNames.length !== columnIndices.length) throw new Error(`headerNames length (${headerNames.length}) must match columnIndices length (${columnIndices.length})`);
16
- if (bom) yield "";
17
- if (includeHeader) yield headerNames !== void 0 ? headerNames.map((name) => escapeField(name, separator)).join(separator) + "\r\n" : formatHeader(columnIndices.map((index) => specs[index]), separator);
18
- if ((0, _milaboratories_helpers.isNil)(range)) return;
19
- const end = range.offset + range.length;
20
- for (let from = range.offset; from < end; from += chunkSize) {
21
- signal?.throwIfAborted();
22
- const length = Math.min(chunkSize, end - from);
23
- const subRange = {
24
- offset: from,
25
- length
26
- };
27
- const vectors = await pTable.getData(columnIndices, {
28
- range: subRange,
29
- signal
30
- });
31
- const rows = [];
32
- for (let rowIndex = 0; rowIndex < length; rowIndex++) rows.push(formatRow(vectors, rowIndex, separator));
33
- yield rows.join("");
34
- }
35
- }
36
- /** Extract a human-readable label from a PTableColumnSpec. */
37
- function getNativeColumnLabel(spec) {
38
- const annotation = (0, _milaboratories_pl_model_common.readAnnotation)(spec.spec, _milaboratories_pl_model_common.Annotation.Label);
39
- return (0, _milaboratories_helpers.isNil)(annotation) ? spec.spec.name : annotation.trim();
40
- }
41
- /**
42
- * RFC 4180 field escaping.
43
- * Quote if the field contains the separator, a double-quote, CR, or LF.
44
- * Embedded `"` are doubled.
45
- */
46
- function escapeField(value, separator) {
47
- return needsQuoting(value, separator) ? "\"" + value.replace(/"/g, "\"\"") + "\"" : value;
48
- }
49
- /** Returns true when the value must be wrapped in double-quotes. */
50
- function needsQuoting(value, separator) {
51
- return value.includes(separator) || value.includes("\"") || value.includes("\r") || value.includes("\n");
52
- }
53
- /**
54
- * Serialize one cell value from a typed vector to its string representation.
55
- *
56
- * - `null` / `undefined` -> `""`
57
- * - `bigint` -> `String(x)`
58
- * - `NaN` / `+Inf` / `-Inf` -> `""`
59
- */
60
- function serializeValue(vector, rowIndex) {
61
- const rawValue = vector.data[rowIndex];
62
- if ((0, _milaboratories_helpers.isNil)(rawValue)) return "";
63
- if ((0, _milaboratories_pl_model_common.isValueNA)(vector, rowIndex)) return "";
64
- switch (vector.type) {
65
- case _milaboratories_pl_model_common.ValueType.Long: return String(rawValue);
66
- case _milaboratories_pl_model_common.ValueType.Float:
67
- case _milaboratories_pl_model_common.ValueType.Double: {
68
- const numeric = rawValue;
69
- return Number.isNaN(numeric) || !Number.isFinite(numeric) ? "" : String(numeric);
70
- }
71
- case _milaboratories_pl_model_common.ValueType.Int: return String(rawValue);
72
- case _milaboratories_pl_model_common.ValueType.String: return rawValue;
73
- case _milaboratories_pl_model_common.ValueType.Bytes: return "";
74
- default: return String(rawValue);
75
- }
76
- }
77
- //#endregion
78
- exports.formatHeader = formatHeader;
79
- exports.formatRow = formatRow;
80
- exports.getNativeColumnLabel = getNativeColumnLabel;
81
- exports.streamPTableRows = streamPTableRows;
82
-
83
- //# sourceMappingURL=csv_writer.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"csv_writer.cjs","names":["Annotation","ValueType"],"sources":["../src/csv_writer.ts"],"sourcesContent":["import {\n Annotation,\n isValueNA,\n readAnnotation,\n ValueType,\n type PTableColumnSpec,\n type PTableVector,\n type TableRange,\n} from \"@milaboratories/pl-model-common\";\nimport { isNil } from \"@milaboratories/helpers\";\n\n/** Minimal subset of PTable required by streamPTableRows. */\nexport interface PTableDataSource {\n getData(\n columnIndices: number[],\n options?: { range?: TableRange; signal?: AbortSignal },\n ): Promise<PTableVector[]>;\n}\n\n// ── Public API (high-level → low-level) ──────────────────────────────\n\n/** Format a CSV/TSV header row from column specs. Line ending is CRLF. */\nexport function formatHeader(specs: PTableColumnSpec[], separator: string): string {\n return (\n specs.map((spec) => escapeField(getNativeColumnLabel(spec), separator)).join(separator) + \"\\r\\n\"\n );\n}\n\n/** Format a single data row from parallel vectors. Line ending is CRLF. */\nexport function formatRow(vectors: PTableVector[], rowIndex: number, separator: string): string {\n return (\n vectors\n .map((vector) => escapeField(serializeValue(vector, rowIndex), separator))\n .join(separator) + \"\\r\\n\"\n );\n}\n\n/**\n * Async generator that streams CSV/TSV content chunk by chunk.\n *\n * The caller is responsible for providing a concrete `range` (already clipped\n * to the table shape). When `range` is undefined the generator does nothing\n * beyond emitting an optional BOM and header.\n */\nexport interface StreamPTableRowsOptions {\n pTable: PTableDataSource;\n specs: PTableColumnSpec[];\n columnIndices: number[];\n /**\n * Header names aligned 1:1 with `columnIndices`. When provided they are\n * written verbatim, letting callers supply disambiguated labels the spec's\n * intrinsic `pl7.app/label` may not carry. When omitted the header is derived\n * from `specs` via {@link getNativeColumnLabel}.\n */\n headerNames?: string[];\n range?: TableRange;\n chunkSize: number;\n separator: string;\n includeHeader: boolean;\n bom: boolean;\n signal?: AbortSignal;\n}\nexport async function* streamPTableRows(options: StreamPTableRowsOptions): AsyncIterable<string> {\n const { pTable, columnIndices, headerNames, range, chunkSize, separator, signal, specs } =\n options;\n const { includeHeader, bom } = options;\n\n if (headerNames !== undefined && headerNames.length !== columnIndices.length) {\n throw new Error(\n `headerNames length (${headerNames.length}) must match columnIndices length (${columnIndices.length})`,\n );\n }\n\n if (bom) {\n yield \"\\uFEFF\";\n }\n\n if (includeHeader) {\n yield headerNames !== undefined\n ? headerNames.map((name) => escapeField(name, separator)).join(separator) + \"\\r\\n\"\n : formatHeader(\n columnIndices.map((index) => specs[index]),\n separator,\n );\n }\n\n if (isNil(range)) {\n return;\n }\n\n const end = range.offset + range.length;\n\n for (let from = range.offset; from < end; from += chunkSize) {\n signal?.throwIfAborted();\n\n const length = Math.min(chunkSize, end - from);\n const subRange: TableRange = { offset: from, length };\n\n const vectors = await pTable.getData(columnIndices, { range: subRange, signal });\n\n const rows: string[] = [];\n for (let rowIndex = 0; rowIndex < length; rowIndex++) {\n rows.push(formatRow(vectors, rowIndex, separator));\n }\n yield rows.join(\"\");\n }\n}\n\n// ── Helpers (low-level) ──────────────────────────────────────────────\n\n/** Extract a human-readable label from a PTableColumnSpec. */\nexport function getNativeColumnLabel(spec: PTableColumnSpec): string {\n const annotation = readAnnotation(spec.spec, Annotation.Label);\n return isNil(annotation) ? spec.spec.name : annotation.trim();\n}\n\n/**\n * RFC 4180 field escaping.\n * Quote if the field contains the separator, a double-quote, CR, or LF.\n * Embedded `\"` are doubled.\n */\nfunction escapeField(value: string, separator: string): string {\n return needsQuoting(value, separator) ? '\"' + value.replace(/\"/g, '\"\"') + '\"' : value;\n}\n\n/** Returns true when the value must be wrapped in double-quotes. */\nfunction needsQuoting(value: string, separator: string): boolean {\n return (\n value.includes(separator) || value.includes('\"') || value.includes(\"\\r\") || value.includes(\"\\n\")\n );\n}\n\n/**\n * Serialize one cell value from a typed vector to its string representation.\n *\n * - `null` / `undefined` -> `\"\"`\n * - `bigint` -> `String(x)`\n * - `NaN` / `+Inf` / `-Inf` -> `\"\"`\n */\nfunction serializeValue(vector: PTableVector, rowIndex: number): string {\n const rawValue = vector.data[rowIndex];\n\n if (isNil(rawValue)) {\n return \"\";\n }\n\n if (isValueNA(vector, rowIndex)) {\n return \"\";\n }\n\n switch (vector.type) {\n case ValueType.Long: {\n // BigInt64Array element — may be stored as bigint\n return String(rawValue);\n }\n case ValueType.Float:\n case ValueType.Double: {\n const numeric = rawValue as number;\n return Number.isNaN(numeric) || !Number.isFinite(numeric) ? \"\" : String(numeric);\n }\n case ValueType.Int: {\n return String(rawValue);\n }\n case ValueType.String: {\n return rawValue as string;\n }\n case ValueType.Bytes: {\n return \"\";\n }\n default: {\n return String(rawValue);\n }\n }\n}\n"],"mappings":";;;;AAsBA,SAAgB,aAAa,OAA2B,WAA2B;CACjF,OACE,MAAM,KAAK,SAAS,YAAY,qBAAqB,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI;AAE9F;;AAGA,SAAgB,UAAU,SAAyB,UAAkB,WAA2B;CAC9F,OACE,QACG,KAAK,WAAW,YAAY,eAAe,QAAQ,QAAQ,GAAG,SAAS,CAAC,CAAC,CACzE,KAAK,SAAS,IAAI;AAEzB;AA2BA,gBAAuB,iBAAiB,SAAyD;CAC/F,MAAM,EAAE,QAAQ,eAAe,aAAa,OAAO,WAAW,WAAW,QAAQ,UAC/E;CACF,MAAM,EAAE,eAAe,QAAQ;CAE/B,IAAI,gBAAgB,KAAA,KAAa,YAAY,WAAW,cAAc,QACpE,MAAM,IAAI,MACR,uBAAuB,YAAY,OAAO,qCAAqC,cAAc,OAAO,EACtG;CAGF,IAAI,KACF,MAAM;CAGR,IAAI,eACF,MAAM,gBAAgB,KAAA,IAClB,YAAY,KAAK,SAAS,YAAY,MAAM,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,SAC1E,aACE,cAAc,KAAK,UAAU,MAAM,MAAM,GACzC,SACF;CAGN,KAAA,GAAA,wBAAA,MAAA,CAAU,KAAK,GACb;CAGF,MAAM,MAAM,MAAM,SAAS,MAAM;CAEjC,KAAK,IAAI,OAAO,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW;EAC3D,QAAQ,eAAe;EAEvB,MAAM,SAAS,KAAK,IAAI,WAAW,MAAM,IAAI;EAC7C,MAAM,WAAuB;GAAE,QAAQ;GAAM;EAAO;EAEpD,MAAM,UAAU,MAAM,OAAO,QAAQ,eAAe;GAAE,OAAO;GAAU;EAAO,CAAC;EAE/E,MAAM,OAAiB,CAAC;EACxB,KAAK,IAAI,WAAW,GAAG,WAAW,QAAQ,YACxC,KAAK,KAAK,UAAU,SAAS,UAAU,SAAS,CAAC;EAEnD,MAAM,KAAK,KAAK,EAAE;CACpB;AACF;;AAKA,SAAgB,qBAAqB,MAAgC;CACnE,MAAM,cAAA,GAAA,gCAAA,eAAA,CAA4B,KAAK,MAAMA,gCAAAA,WAAW,KAAK;CAC7D,QAAA,GAAA,wBAAA,MAAA,CAAa,UAAU,IAAI,KAAK,KAAK,OAAO,WAAW,KAAK;AAC9D;;;;;;AAOA,SAAS,YAAY,OAAe,WAA2B;CAC7D,OAAO,aAAa,OAAO,SAAS,IAAI,OAAM,MAAM,QAAQ,MAAM,MAAI,IAAI,OAAM;AAClF;;AAGA,SAAS,aAAa,OAAe,WAA4B;CAC/D,OACE,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,IAAG,KAAK,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI;AAEnG;;;;;;;;AASA,SAAS,eAAe,QAAsB,UAA0B;CACtE,MAAM,WAAW,OAAO,KAAK;CAE7B,KAAA,GAAA,wBAAA,MAAA,CAAU,QAAQ,GAChB,OAAO;CAGT,KAAA,GAAA,gCAAA,UAAA,CAAc,QAAQ,QAAQ,GAC5B,OAAO;CAGT,QAAQ,OAAO,MAAf;EACE,KAAKC,gCAAAA,UAAU,MAEb,OAAO,OAAO,QAAQ;EAExB,KAAKA,gCAAAA,UAAU;EACf,KAAKA,gCAAAA,UAAU,QAAQ;GACrB,MAAM,UAAU;GAChB,OAAO,OAAO,MAAM,OAAO,KAAK,CAAC,OAAO,SAAS,OAAO,IAAI,KAAK,OAAO,OAAO;EACjF;EACA,KAAKA,gCAAAA,UAAU,KACb,OAAO,OAAO,QAAQ;EAExB,KAAKA,gCAAAA,UAAU,QACb,OAAO;EAET,KAAKA,gCAAAA,UAAU,OACb,OAAO;EAET,SACE,OAAO,OAAO,QAAQ;CAE1B;AACF"}
@@ -1,23 +0,0 @@
1
- let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
2
- //#region src/data_info_helpers.ts
3
- function makeJsonDataInfo(spec, data) {
4
- const keyLength = spec.axesSpec.length;
5
- const jsonData = {};
6
- for (const { key, val } of data) {
7
- if (key.length !== keyLength) {
8
- const error = new _milaboratories_pl_model_common.PFrameDriverError(`Inconsistent inline column key length`);
9
- error.cause = /* @__PURE__ */ new Error(`Inline column key length ${key.length} differs from axes count ${keyLength}`);
10
- throw error;
11
- }
12
- jsonData[JSON.stringify(key)] = val;
13
- }
14
- return {
15
- type: "Json",
16
- keyLength,
17
- data: jsonData
18
- };
19
- }
20
- //#endregion
21
- exports.makeJsonDataInfo = makeJsonDataInfo;
22
-
23
- //# sourceMappingURL=data_info_helpers.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"data_info_helpers.cjs","names":["PFrameDriverError"],"sources":["../src/data_info_helpers.ts"],"sourcesContent":["import {\n PFrameDriverError,\n type PColumnSpec,\n type PColumnValues,\n type JsonDataInfo,\n type PColumnValue,\n} from \"@milaboratories/pl-model-common\";\n\nexport function makeJsonDataInfo(spec: PColumnSpec, data: PColumnValues): JsonDataInfo {\n const keyLength = spec.axesSpec.length;\n const jsonData: Record<string, PColumnValue> = {};\n for (const { key, val } of data) {\n if (key.length !== keyLength) {\n const error = new PFrameDriverError(`Inconsistent inline column key length`);\n error.cause = new Error(\n `Inline column key length ${key.length} differs from axes count ${keyLength}`,\n );\n throw error;\n }\n jsonData[JSON.stringify(key)] = val;\n }\n\n return {\n type: \"Json\",\n keyLength,\n data: jsonData,\n };\n}\n"],"mappings":";;AAQA,SAAgB,iBAAiB,MAAmB,MAAmC;CACrF,MAAM,YAAY,KAAK,SAAS;CAChC,MAAM,WAAyC,CAAC;CAChD,KAAK,MAAM,EAAE,KAAK,SAAS,MAAM;EAC/B,IAAI,IAAI,WAAW,WAAW;GAC5B,MAAM,QAAQ,IAAIA,gCAAAA,kBAAkB,uCAAuC;GAC3E,MAAM,wBAAQ,IAAI,MAChB,4BAA4B,IAAI,OAAO,2BAA2B,WACpE;GACA,MAAM;EACR;EACA,SAAS,KAAK,UAAU,GAAG,KAAK;CAClC;CAEA,OAAO;EACL,MAAM;EACN;EACA,MAAM;CACR;AACF"}
@@ -1,114 +0,0 @@
1
- const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
2
- const require_driver_impl = require("./driver_impl.cjs");
3
- const require_data_info_helpers = require("./data_info_helpers.cjs");
4
- let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
5
- let _milaboratories_helpers = require("@milaboratories/helpers");
6
- let _milaboratories_pframes_rs_node = require("@milaboratories/pframes-rs-node");
7
- let node_os = require("node:os");
8
- let node_fs = require("node:fs");
9
- node_fs = require_runtime.__toESM(node_fs, 1);
10
- let _milaboratories_pl_model_middle_layer = require("@milaboratories/pl-model-middle-layer");
11
- let node_path = require("node:path");
12
- node_path = require_runtime.__toESM(node_path, 1);
13
- //#region src/driver_double.ts
14
- function makeFolderPath(dataFolder) {
15
- if (!node_fs.default.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {
16
- const error = new _milaboratories_pl_model_common.PFrameDriverError(`Invalid data folder`);
17
- error.cause = /* @__PURE__ */ new Error(`Folder ${dataFolder} does not exist`);
18
- throw error;
19
- }
20
- return dataFolder;
21
- }
22
- function makeBlobId(res) {
23
- return res;
24
- }
25
- var LocalBlobProviderImpl = class extends _milaboratories_helpers.RefCountPoolBase {
26
- dataFolder;
27
- constructor(dataFolder) {
28
- super();
29
- this.dataFolder = dataFolder;
30
- }
31
- calculateParamsKey(params) {
32
- return makeBlobId(params);
33
- }
34
- createNewResource(params, _key) {
35
- const filePath = node_path.default.join(this.dataFolder, params);
36
- if (!node_fs.default.statSync(filePath, { throwIfNoEntry: false })?.isFile()) {
37
- const error = new _milaboratories_pl_model_common.PFrameDriverError(`Invalid file name`);
38
- error.cause = /* @__PURE__ */ new Error(`File ${filePath} does not exist`);
39
- throw error;
40
- }
41
- return filePath;
42
- }
43
- getByKey(blobId) {
44
- const resource = super.tryGetByKey(blobId);
45
- if (!resource) {
46
- const error = new _milaboratories_pl_model_common.PFrameDriverError(`Invalid blob id`);
47
- error.cause = /* @__PURE__ */ new Error(`Blob with id ${blobId} not found.`);
48
- throw error;
49
- }
50
- return resource;
51
- }
52
- makeDataSource(signal) {
53
- return {
54
- preloadBlob: async (_blobIds) => {},
55
- resolveBlobContent: async (blobId) => {
56
- const filePath = this.getByKey(blobId);
57
- return await node_fs.default.promises.readFile(filePath, { signal });
58
- }
59
- };
60
- }
61
- };
62
- var RemoteBlobProviderImpl = class RemoteBlobProviderImpl {
63
- pool;
64
- server;
65
- constructor(pool, server) {
66
- this.pool = pool;
67
- this.server = server;
68
- }
69
- static async init(dataFolder, logger, serverOptions) {
70
- const pool = new LocalBlobProviderImpl(dataFolder);
71
- const underlyingStore = await _milaboratories_pframes_rs_node.HttpHelpers.createFsStore({
72
- rootDir: dataFolder,
73
- logger
74
- });
75
- const handler = _milaboratories_pframes_rs_node.HttpHelpers.createRequestHandler({ store: { request: (filename, params) => {
76
- const blobId = filename.slice(0, -_milaboratories_pl_model_middle_layer.PFrameInternal.ParquetExtension.length);
77
- return underlyingStore.request(blobId, params);
78
- } } });
79
- return new RemoteBlobProviderImpl(pool, await _milaboratories_pframes_rs_node.HttpHelpers.createHttpServer({
80
- ...serverOptions,
81
- handler
82
- }));
83
- }
84
- acquire(params) {
85
- return this.pool.acquire(params);
86
- }
87
- httpServerInfo() {
88
- return this.server.info;
89
- }
90
- async getCacheMetrics() {
91
- return null;
92
- }
93
- async resetCache() {}
94
- async [Symbol.asyncDispose]() {
95
- await this.server.stop();
96
- await this.pool[Symbol.asyncDispose]();
97
- }
98
- };
99
- async function createPFrameDriverDouble({ dataFolder = (0, node_os.tmpdir)(), logger = console.log }) {
100
- const localBlobProvider = new LocalBlobProviderImpl(dataFolder);
101
- const remoteBlobProvider = await RemoteBlobProviderImpl.init(dataFolder, logger, {});
102
- const resolveDataInfo = (spec, data) => (0, _milaboratories_pl_model_common.isDataInfo)(data) ? data : require_data_info_helpers.makeJsonDataInfo(spec, data);
103
- return new require_driver_impl.AbstractPFrameDriver({
104
- logger,
105
- localBlobProvider,
106
- remoteBlobProvider,
107
- resolveDataInfo
108
- });
109
- }
110
- //#endregion
111
- exports.createPFrameDriverDouble = createPFrameDriverDouble;
112
- exports.makeFolderPath = makeFolderPath;
113
-
114
- //# sourceMappingURL=driver_double.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"driver_double.cjs","names":["fs","PFrameDriverError","RefCountPoolBase","path","HttpHelpers","PFrameInternal","makeJsonDataInfo","AbstractPFrameDriver"],"sources":["../src/driver_double.ts"],"sourcesContent":["import {\n isDataInfo,\n PFrameDriverError,\n type Branded,\n type PColumnSpec,\n type PColumnValues,\n} from \"@milaboratories/pl-model-common\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { RefCountPoolBase, type PoolEntry } from \"@milaboratories/helpers\";\nimport { HttpHelpers } from \"@milaboratories/pframes-rs-node\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { tmpdir } from \"node:os\";\nimport type { AbstractInternalPFrameDriver } from \"./driver_decl\";\nimport {\n AbstractPFrameDriver,\n type LocalBlobProvider,\n type RemoteBlobProvider,\n} from \"./driver_impl\";\nimport { makeJsonDataInfo } from \"./data_info_helpers\";\n\nexport type FileName = Branded<string, \"FileName\">;\nexport type FilePath = Branded<string, \"FilePath\">;\nexport type FolderPath = Branded<string, \"FolderPath\">;\n\nexport function makeFolderPath(dataFolder: string): FolderPath {\n if (!fs.statSync(dataFolder, { throwIfNoEntry: false })?.isDirectory()) {\n const error = new PFrameDriverError(`Invalid data folder`);\n error.cause = new Error(`Folder ${dataFolder} does not exist`);\n throw error;\n }\n return dataFolder as FolderPath;\n}\n\nfunction makeBlobId(res: FileName): PFrameInternal.PFrameBlobId {\n return res as string as PFrameInternal.PFrameBlobId;\n}\n\nclass LocalBlobProviderImpl\n extends RefCountPoolBase<FileName, PFrameInternal.PFrameBlobId, FilePath>\n implements LocalBlobProvider<FileName>\n{\n constructor(private readonly dataFolder: FolderPath) {\n super();\n }\n\n protected calculateParamsKey(params: FileName): PFrameInternal.PFrameBlobId {\n return makeBlobId(params);\n }\n\n protected createNewResource(params: FileName, _key: PFrameInternal.PFrameBlobId): FilePath {\n const filePath = path.join(this.dataFolder, params);\n if (!fs.statSync(filePath, { throwIfNoEntry: false })?.isFile()) {\n const error = new PFrameDriverError(`Invalid file name`);\n error.cause = new Error(`File ${filePath} does not exist`);\n throw error;\n }\n return filePath as FilePath;\n }\n\n public getByKey(blobId: PFrameInternal.PFrameBlobId): FilePath {\n const resource = super.tryGetByKey(blobId);\n if (!resource) {\n const error = new PFrameDriverError(`Invalid blob id`);\n error.cause = new Error(`Blob with id ${blobId} not found.`);\n throw error;\n }\n return resource;\n }\n\n public makeDataSource(\n signal: AbortSignal,\n ): Omit<PFrameInternal.PFrameDataSourceV2, \"parquetServer\"> {\n return {\n preloadBlob: async (_blobIds: PFrameInternal.PFrameBlobId[]) => {},\n resolveBlobContent: async (blobId: PFrameInternal.PFrameBlobId) => {\n const filePath = this.getByKey(blobId);\n return await fs.promises.readFile(filePath, { signal });\n },\n };\n }\n}\n\nclass RemoteBlobProviderImpl implements RemoteBlobProvider<FileName> {\n constructor(\n private readonly pool: LocalBlobProviderImpl,\n private readonly server: PFrameInternal.HttpServer,\n ) {}\n\n public static async init(\n dataFolder: FolderPath,\n logger: PFrameInternal.Logger,\n serverOptions: Omit<PFrameInternal.HttpServerOptions, \"handler\">,\n ): Promise<RemoteBlobProviderImpl> {\n const pool = new LocalBlobProviderImpl(dataFolder);\n\n const underlyingStore = await HttpHelpers.createFsStore({ rootDir: dataFolder, logger });\n const store: PFrameInternal.ObjectStore = {\n request: (filename, params) => {\n const blobId = filename.slice(0, -PFrameInternal.ParquetExtension.length);\n return underlyingStore.request(blobId as PFrameInternal.ParquetFileName, params);\n },\n };\n\n const handler = HttpHelpers.createRequestHandler({ store });\n const server = await HttpHelpers.createHttpServer({ ...serverOptions, handler });\n\n return new RemoteBlobProviderImpl(pool, server);\n }\n\n public acquire(params: FileName): PoolEntry<PFrameInternal.PFrameBlobId> {\n return this.pool.acquire(params);\n }\n\n public httpServerInfo(): PFrameInternal.HttpServerInfo {\n return this.server.info;\n }\n\n public async getCacheMetrics(): Promise<PFrameInternal.CacheMetrics | null> {\n return null;\n }\n\n public async resetCache(): Promise<void> {}\n\n async [Symbol.asyncDispose](): Promise<void> {\n await this.server.stop();\n await this.pool[Symbol.asyncDispose]();\n }\n}\n\nexport type InternalPFrameDriverDouble = AbstractInternalPFrameDriver<\n PFrameInternal.DataInfo<FileName> | PColumnValues\n>;\n\n// It's mock for testing purposes, not a real test!\nexport async function createPFrameDriverDouble({\n dataFolder = tmpdir() as FolderPath,\n logger = console.log,\n}: {\n dataFolder?: FolderPath;\n logger?: PFrameInternal.Logger;\n}): Promise<InternalPFrameDriverDouble> {\n const localBlobProvider = new LocalBlobProviderImpl(dataFolder);\n const remoteBlobProvider = await RemoteBlobProviderImpl.init(dataFolder, logger, {});\n\n const resolveDataInfo = (\n spec: PColumnSpec,\n data: PFrameInternal.DataInfo<FileName> | PColumnValues,\n ) => (isDataInfo(data) ? data : makeJsonDataInfo(spec, data));\n\n return new AbstractPFrameDriver({\n logger,\n localBlobProvider,\n remoteBlobProvider,\n resolveDataInfo,\n });\n}\n"],"mappings":"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"}