nodepyx 1.0.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.
- package/LICENSE +22 -0
- package/README.md +399 -0
- package/binding.gyp +73 -0
- package/dist/core/PyCallable.d.ts +65 -0
- package/dist/core/PyCallable.d.ts.map +1 -0
- package/dist/core/PyCallable.js +109 -0
- package/dist/core/PyCallable.js.map +1 -0
- package/dist/core/PyContext.d.ts +76 -0
- package/dist/core/PyContext.d.ts.map +1 -0
- package/dist/core/PyContext.js +228 -0
- package/dist/core/PyContext.js.map +1 -0
- package/dist/core/PyIterator.d.ts +84 -0
- package/dist/core/PyIterator.d.ts.map +1 -0
- package/dist/core/PyIterator.js +243 -0
- package/dist/core/PyIterator.js.map +1 -0
- package/dist/core/PyModule.d.ts +55 -0
- package/dist/core/PyModule.d.ts.map +1 -0
- package/dist/core/PyModule.js +172 -0
- package/dist/core/PyModule.js.map +1 -0
- package/dist/core/PyProxy.d.ts +65 -0
- package/dist/core/PyProxy.d.ts.map +1 -0
- package/dist/core/PyProxy.js +483 -0
- package/dist/core/PyProxy.js.map +1 -0
- package/dist/core/PyRuntime.d.ts +105 -0
- package/dist/core/PyRuntime.d.ts.map +1 -0
- package/dist/core/PyRuntime.js +438 -0
- package/dist/core/PyRuntime.js.map +1 -0
- package/dist/env/CondaManager.d.ts +118 -0
- package/dist/env/CondaManager.d.ts.map +1 -0
- package/dist/env/CondaManager.js +401 -0
- package/dist/env/CondaManager.js.map +1 -0
- package/dist/env/PackageInstaller.d.ts +233 -0
- package/dist/env/PackageInstaller.d.ts.map +1 -0
- package/dist/env/PackageInstaller.js +609 -0
- package/dist/env/PackageInstaller.js.map +1 -0
- package/dist/env/PythonDetector.d.ts +103 -0
- package/dist/env/PythonDetector.d.ts.map +1 -0
- package/dist/env/PythonDetector.js +381 -0
- package/dist/env/PythonDetector.js.map +1 -0
- package/dist/env/VenvManager.d.ts +117 -0
- package/dist/env/VenvManager.d.ts.map +1 -0
- package/dist/env/VenvManager.js +331 -0
- package/dist/env/VenvManager.js.map +1 -0
- package/dist/index.d.ts +169 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +393 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/Plugin.interface.d.ts +41 -0
- package/dist/plugins/Plugin.interface.d.ts.map +1 -0
- package/dist/plugins/Plugin.interface.js +12 -0
- package/dist/plugins/Plugin.interface.js.map +1 -0
- package/dist/plugins/PluginManager.d.ts +26 -0
- package/dist/plugins/PluginManager.d.ts.map +1 -0
- package/dist/plugins/PluginManager.js +174 -0
- package/dist/plugins/PluginManager.js.map +1 -0
- package/dist/plugins/builtin/NumpyPlugin.d.ts +17 -0
- package/dist/plugins/builtin/NumpyPlugin.d.ts.map +1 -0
- package/dist/plugins/builtin/NumpyPlugin.js +41 -0
- package/dist/plugins/builtin/NumpyPlugin.js.map +1 -0
- package/dist/plugins/builtin/PandasPlugin.d.ts +19 -0
- package/dist/plugins/builtin/PandasPlugin.d.ts.map +1 -0
- package/dist/plugins/builtin/PandasPlugin.js +57 -0
- package/dist/plugins/builtin/PandasPlugin.js.map +1 -0
- package/dist/plugins/builtin/TorchPlugin.d.ts +23 -0
- package/dist/plugins/builtin/TorchPlugin.d.ts.map +1 -0
- package/dist/plugins/builtin/TorchPlugin.js +50 -0
- package/dist/plugins/builtin/TorchPlugin.js.map +1 -0
- package/dist/plugins/index.d.ts +7 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +12 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/serialization/DataFrameBridge.d.ts +141 -0
- package/dist/serialization/DataFrameBridge.d.ts.map +1 -0
- package/dist/serialization/DataFrameBridge.js +355 -0
- package/dist/serialization/DataFrameBridge.js.map +1 -0
- package/dist/serialization/MsgPackSerializer.d.ts +45 -0
- package/dist/serialization/MsgPackSerializer.d.ts.map +1 -0
- package/dist/serialization/MsgPackSerializer.js +242 -0
- package/dist/serialization/MsgPackSerializer.js.map +1 -0
- package/dist/serialization/NumpyBridge.d.ts +96 -0
- package/dist/serialization/NumpyBridge.d.ts.map +1 -0
- package/dist/serialization/NumpyBridge.js +323 -0
- package/dist/serialization/NumpyBridge.js.map +1 -0
- package/dist/serialization/Serializer.d.ts +78 -0
- package/dist/serialization/Serializer.d.ts.map +1 -0
- package/dist/serialization/Serializer.js +281 -0
- package/dist/serialization/Serializer.js.map +1 -0
- package/dist/types/PythonTypeMapper.d.ts +87 -0
- package/dist/types/PythonTypeMapper.d.ts.map +1 -0
- package/dist/types/PythonTypeMapper.js +449 -0
- package/dist/types/PythonTypeMapper.js.map +1 -0
- package/dist/types/StubCache.d.ts +109 -0
- package/dist/types/StubCache.d.ts.map +1 -0
- package/dist/types/StubCache.js +333 -0
- package/dist/types/StubCache.js.map +1 -0
- package/dist/types/TypeGenerator.d.ts +139 -0
- package/dist/types/TypeGenerator.d.ts.map +1 -0
- package/dist/types/TypeGenerator.js +372 -0
- package/dist/types/TypeGenerator.js.map +1 -0
- package/dist/types/addon.d.ts +114 -0
- package/dist/types/addon.d.ts.map +1 -0
- package/dist/types/addon.js +32 -0
- package/dist/types/addon.js.map +1 -0
- package/dist/types/config.d.ts +175 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +35 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/python.d.ts +235 -0
- package/dist/types/python.d.ts.map +1 -0
- package/dist/types/python.js +7 -0
- package/dist/types/python.js.map +1 -0
- package/dist/utils/ErrorTranslator.d.ts +83 -0
- package/dist/utils/ErrorTranslator.d.ts.map +1 -0
- package/dist/utils/ErrorTranslator.js +210 -0
- package/dist/utils/ErrorTranslator.js.map +1 -0
- package/dist/utils/Logger.d.ts +27 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +115 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/MemoryMonitor.d.ts +44 -0
- package/dist/utils/MemoryMonitor.d.ts.map +1 -0
- package/dist/utils/MemoryMonitor.js +143 -0
- package/dist/utils/MemoryMonitor.js.map +1 -0
- package/package.json +177 -0
- package/python/error_handler.py +433 -0
- package/python/nodepyx_runtime.py +575 -0
- package/python/serializer.py +379 -0
- package/python/type_inspector.py +288 -0
- package/scripts/build-native.js +68 -0
- package/scripts/download-prebuilds.js +99 -0
- package/scripts/generate-stubs.js +405 -0
- package/scripts/install.js +260 -0
- package/src/core/PyCallable.ts +137 -0
- package/src/core/PyContext.ts +296 -0
- package/src/core/PyIterator.ts +294 -0
- package/src/core/PyModule.ts +194 -0
- package/src/core/PyProxy.ts +605 -0
- package/src/core/PyRuntime.ts +504 -0
- package/src/env/CondaManager.ts +451 -0
- package/src/env/PackageInstaller.ts +738 -0
- package/src/env/PythonDetector.ts +414 -0
- package/src/env/VenvManager.ts +396 -0
- package/src/index.ts +425 -0
- package/src/native/gil_guard.cpp +26 -0
- package/src/native/gil_guard.h +175 -0
- package/src/native/nodepyx_addon.cpp +886 -0
- package/src/native/python_bridge.cpp +790 -0
- package/src/native/python_bridge.h +257 -0
- package/src/native/thread_pool.cpp +336 -0
- package/src/native/thread_pool.h +175 -0
- package/src/native/type_converter.cpp +901 -0
- package/src/native/type_converter.h +272 -0
- package/src/nextjs/PyProvider.tsx +123 -0
- package/src/nextjs/index.ts +21 -0
- package/src/nextjs/usePython.ts +106 -0
- package/src/nextjs/withnodepyx.ts +88 -0
- package/src/plugins/Plugin.interface.ts +51 -0
- package/src/plugins/PluginManager.ts +155 -0
- package/src/plugins/builtin/NumpyPlugin.ts +36 -0
- package/src/plugins/builtin/PandasPlugin.ts +49 -0
- package/src/plugins/builtin/TorchPlugin.ts +56 -0
- package/src/plugins/index.ts +7 -0
- package/src/serialization/DataFrameBridge.ts +398 -0
- package/src/serialization/MsgPackSerializer.ts +220 -0
- package/src/serialization/NumpyBridge.ts +332 -0
- package/src/serialization/Serializer.ts +320 -0
- package/src/types/PythonTypeMapper.ts +495 -0
- package/src/types/StubCache.ts +340 -0
- package/src/types/TypeGenerator.ts +491 -0
- package/src/types/addon.ts +170 -0
- package/src/types/config.ts +226 -0
- package/src/types/index.ts +55 -0
- package/src/types/python.ts +309 -0
- package/src/types/stubs/numpy.d.ts +441 -0
- package/src/types/stubs/pandas.d.ts +575 -0
- package/src/types/stubs/sklearn.d.ts +728 -0
- package/src/types/stubs/torch.d.ts +694 -0
- package/src/utils/ErrorTranslator.ts +220 -0
- package/src/utils/Logger.ts +119 -0
- package/src/utils/MemoryMonitor.ts +175 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* nodepyx — DataFrameBridge
|
|
4
|
+
* Converts Pandas DataFrames and Series to/from JavaScript objects.
|
|
5
|
+
*
|
|
6
|
+
* ─── Wire Protocol ──────────────────────────────────────────────────────────
|
|
7
|
+
*
|
|
8
|
+
* DataFrames use the "split" orientation of pandas JSON:
|
|
9
|
+
* {
|
|
10
|
+
* "columns": ["col1", "col2", ...],
|
|
11
|
+
* "data": [[row0_val0, row0_val1], [row1_val0, row1_val1], ...],
|
|
12
|
+
* "index": [0, 1, 2, ...],
|
|
13
|
+
* "dtypes": {"col1": "int64", "col2": "object", ...},
|
|
14
|
+
* "shape": [nrows, ncols]
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* For large DataFrames (>64KB) the JSON is embedded in a MessagePack
|
|
18
|
+
* binary to reduce parse overhead. The format field in SerializedValue
|
|
19
|
+
* tells the bridge which path to take:
|
|
20
|
+
* format === 'pandas_dataframe' → DataFrame decode
|
|
21
|
+
* format === 'pandas_series' → Series decode
|
|
22
|
+
*
|
|
23
|
+
* Series wire format:
|
|
24
|
+
* {
|
|
25
|
+
* "name": "my_series",
|
|
26
|
+
* "data": [1, 2, 3, 4],
|
|
27
|
+
* "index": [0, 1, 2, 3],
|
|
28
|
+
* "dtype": "int64",
|
|
29
|
+
* "length": 4
|
|
30
|
+
* }
|
|
31
|
+
*
|
|
32
|
+
* ─── JavaScript representation ───────────────────────────────────────────────
|
|
33
|
+
*
|
|
34
|
+
* DataFrameResult (records orientation is built client-side):
|
|
35
|
+
* {
|
|
36
|
+
* columns: string[],
|
|
37
|
+
* data: Record<string, unknown>[], ↠row objects
|
|
38
|
+
* index: unknown[],
|
|
39
|
+
* dtypes: Record<string, string>,
|
|
40
|
+
* shape: [number, number]
|
|
41
|
+
* }
|
|
42
|
+
*
|
|
43
|
+
* SeriesResult:
|
|
44
|
+
* {
|
|
45
|
+
* name: string,
|
|
46
|
+
* data: unknown[],
|
|
47
|
+
* index: unknown[],
|
|
48
|
+
* dtype: string,
|
|
49
|
+
* length: number
|
|
50
|
+
* }
|
|
51
|
+
*/
|
|
52
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
53
|
+
if (k2 === undefined) k2 = k;
|
|
54
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
55
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
56
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
57
|
+
}
|
|
58
|
+
Object.defineProperty(o, k2, desc);
|
|
59
|
+
}) : (function(o, m, k, k2) {
|
|
60
|
+
if (k2 === undefined) k2 = k;
|
|
61
|
+
o[k2] = m[k];
|
|
62
|
+
}));
|
|
63
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
64
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
65
|
+
}) : function(o, v) {
|
|
66
|
+
o["default"] = v;
|
|
67
|
+
});
|
|
68
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
69
|
+
var ownKeys = function(o) {
|
|
70
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
71
|
+
var ar = [];
|
|
72
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
73
|
+
return ar;
|
|
74
|
+
};
|
|
75
|
+
return ownKeys(o);
|
|
76
|
+
};
|
|
77
|
+
return function (mod) {
|
|
78
|
+
if (mod && mod.__esModule) return mod;
|
|
79
|
+
var result = {};
|
|
80
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
81
|
+
__setModuleDefault(result, mod);
|
|
82
|
+
return result;
|
|
83
|
+
};
|
|
84
|
+
})();
|
|
85
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
86
|
+
exports.DataFrameBridge = void 0;
|
|
87
|
+
const msgpack = __importStar(require("@msgpack/msgpack"));
|
|
88
|
+
const Logger_1 = require("../utils/Logger");
|
|
89
|
+
const logger = new Logger_1.Logger('DataFrameBridge');
|
|
90
|
+
/**
|
|
91
|
+
* DataFrameBridge — bidirectional conversion for Pandas DataFrames and Series.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* const bridge = new DataFrameBridge();
|
|
96
|
+
*
|
|
97
|
+
* // Deserialize a DataFrame received from Python
|
|
98
|
+
* const df: DataFrameResult = bridge.deserializeDataFrame(sv);
|
|
99
|
+
* console.log(df.columns); // ['city', 'population']
|
|
100
|
+
* console.log(df.data[0]); // { city: 'Algiers', population: 3500000 }
|
|
101
|
+
*
|
|
102
|
+
* // Serialize a records-array back to Python
|
|
103
|
+
* const sv2 = bridge.serializeDataFrame(df.data, df.columns);
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
class DataFrameBridge {
|
|
107
|
+
// ─── Deserialization (Python → JS) ────────────────────────────────────────
|
|
108
|
+
/**
|
|
109
|
+
* Deserialize a PANDAS_DATAFRAME SerializedValue → DataFrameResult.
|
|
110
|
+
*/
|
|
111
|
+
deserializeDataFrame(sv) {
|
|
112
|
+
try {
|
|
113
|
+
const wire = this._decodeWire(sv);
|
|
114
|
+
return this._buildDataFrameResult(wire);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
logger.error('DataFrameBridge.deserializeDataFrame failed', err);
|
|
118
|
+
return { columns: [], data: [], records: [], index: [], dtypes: {}, shape: [0, 0] };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Deserialize a PANDAS_SERIES SerializedValue → SeriesResult.
|
|
123
|
+
*/
|
|
124
|
+
deserializeSeries(sv) {
|
|
125
|
+
try {
|
|
126
|
+
const wire = this._decodeWire(sv);
|
|
127
|
+
return this._buildSeriesResult(wire);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
logger.error('DataFrameBridge.deserializeSeries failed', err);
|
|
131
|
+
return { name: '', data: [], values: [], index: [], dtype: 'object', length: 0 };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// ─── Serialization (JS → Python) ─────────────────────────────────────────
|
|
135
|
+
/**
|
|
136
|
+
* Serialize a records-array (array of row objects) into a PANDAS_DATAFRAME
|
|
137
|
+
* SerializedValue that Python can reconstruct with pd.DataFrame(wire).
|
|
138
|
+
*
|
|
139
|
+
* @param records - array of row objects (e.g. [{col1: val1, col2: val2}, ...])
|
|
140
|
+
* @param columns - explicit column order; inferred from first record if omitted
|
|
141
|
+
*/
|
|
142
|
+
serializeDataFrame(records, columns, options = {}) {
|
|
143
|
+
const cols = columns ?? (records[0] ? Object.keys(records[0]) : []);
|
|
144
|
+
const maxRows = options.maxRows;
|
|
145
|
+
const rows = maxRows !== undefined ? records.slice(0, maxRows) : records;
|
|
146
|
+
// Build split-orientation wire object
|
|
147
|
+
const wire = {
|
|
148
|
+
columns: cols,
|
|
149
|
+
data: rows.map(row => cols.map(col => row[col] ?? null)),
|
|
150
|
+
index: rows.map((_, i) => i),
|
|
151
|
+
dtypes: {},
|
|
152
|
+
shape: [rows.length, cols.length],
|
|
153
|
+
};
|
|
154
|
+
return this._encodeWire(wire, 'dataframe', options.forceMsgPack);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Serialize a plain array of values into a PANDAS_SERIES SerializedValue.
|
|
158
|
+
*
|
|
159
|
+
* @param data - the series values
|
|
160
|
+
* @param name - series name
|
|
161
|
+
* @param index - optional explicit index
|
|
162
|
+
*/
|
|
163
|
+
serializeSeries(data, name = '', index) {
|
|
164
|
+
const wire = {
|
|
165
|
+
name,
|
|
166
|
+
data,
|
|
167
|
+
index: index ?? data.map((_, i) => i),
|
|
168
|
+
dtype: this._inferDtype(data),
|
|
169
|
+
length: data.length,
|
|
170
|
+
};
|
|
171
|
+
return this._encodeWire(wire, 'series');
|
|
172
|
+
}
|
|
173
|
+
// ─── DataFrame transformation helpers ────────────────────────────────────
|
|
174
|
+
/**
|
|
175
|
+
* Convert a DataFrameResult to a 2-D array (column-major).
|
|
176
|
+
* Useful for charting libraries.
|
|
177
|
+
*/
|
|
178
|
+
static toColumnArrays(df) {
|
|
179
|
+
const result = {};
|
|
180
|
+
for (const col of df.columns) {
|
|
181
|
+
result[col] = df.data.map(row => row[col]);
|
|
182
|
+
}
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Convert a DataFrameResult to a 2-D raw array (no column keys).
|
|
187
|
+
* Row-major: result[row][colIndex].
|
|
188
|
+
*/
|
|
189
|
+
static toMatrix(df) {
|
|
190
|
+
return df.data.map(row => df.columns.map(col => row[col]));
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Filter rows of a DataFrameResult.
|
|
194
|
+
*/
|
|
195
|
+
static filterRows(df, predicate) {
|
|
196
|
+
const filteredData = [];
|
|
197
|
+
const filteredIndex = [];
|
|
198
|
+
for (let i = 0; i < df.data.length; i++) {
|
|
199
|
+
const row = df.data[i];
|
|
200
|
+
const idx = df.index[i];
|
|
201
|
+
if (predicate(row, idx)) {
|
|
202
|
+
filteredData.push(row);
|
|
203
|
+
filteredIndex.push(idx);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
...df,
|
|
208
|
+
data: filteredData,
|
|
209
|
+
records: filteredData,
|
|
210
|
+
index: filteredIndex,
|
|
211
|
+
shape: [filteredData.length, df.shape[1]],
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Select specific columns from a DataFrameResult.
|
|
216
|
+
*/
|
|
217
|
+
static selectColumns(df, cols) {
|
|
218
|
+
const validCols = cols.filter(c => df.columns.includes(c));
|
|
219
|
+
const data = df.data.map(row => Object.fromEntries(validCols.map(c => [c, row[c]])));
|
|
220
|
+
return {
|
|
221
|
+
columns: validCols,
|
|
222
|
+
data,
|
|
223
|
+
records: data,
|
|
224
|
+
index: df.index,
|
|
225
|
+
dtypes: Object.fromEntries(validCols.map(c => [c, df.dtypes[c] ?? 'object'])),
|
|
226
|
+
shape: [df.shape[0], validCols.length],
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Compute basic descriptive stats for a numeric column in a DataFrameResult.
|
|
231
|
+
*/
|
|
232
|
+
static describeColumn(df, col) {
|
|
233
|
+
const values = df.data
|
|
234
|
+
.map(row => Number(row[col]))
|
|
235
|
+
.filter(v => Number.isFinite(v));
|
|
236
|
+
const count = values.length;
|
|
237
|
+
if (count === 0) {
|
|
238
|
+
return { count: 0, mean: 0, std: 0, min: 0, max: 0, sum: 0 };
|
|
239
|
+
}
|
|
240
|
+
const sum = values.reduce((a, b) => a + b, 0);
|
|
241
|
+
const mean = sum / count;
|
|
242
|
+
const min = Math.min(...values);
|
|
243
|
+
const max = Math.max(...values);
|
|
244
|
+
const variance = values.reduce((acc, v) => acc + (v - mean) ** 2, 0) / count;
|
|
245
|
+
const std = Math.sqrt(variance);
|
|
246
|
+
return { count, mean, std, min, max, sum };
|
|
247
|
+
}
|
|
248
|
+
// ─── Private helpers ──────────────────────────────────────────────────────
|
|
249
|
+
_decodeWire(sv) {
|
|
250
|
+
const data = sv.data;
|
|
251
|
+
if (!data) {
|
|
252
|
+
throw new Error('SerializedValue.data is null');
|
|
253
|
+
}
|
|
254
|
+
if (typeof data === 'string') {
|
|
255
|
+
return JSON.parse(data);
|
|
256
|
+
}
|
|
257
|
+
if (data instanceof Uint8Array) {
|
|
258
|
+
// Attempt MessagePack first
|
|
259
|
+
try {
|
|
260
|
+
const decoded = msgpack.decode(data);
|
|
261
|
+
if (decoded && typeof decoded === 'object') {
|
|
262
|
+
return decoded;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
// Fall through to UTF-8 JSON
|
|
267
|
+
}
|
|
268
|
+
// Try JSON
|
|
269
|
+
const text = new TextDecoder().decode(data);
|
|
270
|
+
return JSON.parse(text);
|
|
271
|
+
}
|
|
272
|
+
throw new Error(`DataFrameBridge: unsupported data type: ${typeof data}`);
|
|
273
|
+
}
|
|
274
|
+
_encodeWire(wire, format, forceMsgPack) {
|
|
275
|
+
const json = JSON.stringify(wire);
|
|
276
|
+
const useMsgPack = forceMsgPack ?? json.length > 65_536;
|
|
277
|
+
if (useMsgPack) {
|
|
278
|
+
const packed = msgpack.encode(wire);
|
|
279
|
+
return {
|
|
280
|
+
format: format,
|
|
281
|
+
data: packed,
|
|
282
|
+
metadata: {
|
|
283
|
+
length: ('data' in wire) ? wire.data.length : 0,
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
format: format,
|
|
289
|
+
data: json,
|
|
290
|
+
metadata: {
|
|
291
|
+
length: ('data' in wire) ? wire.data.length : 0,
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
_buildDataFrameResult(wire) {
|
|
296
|
+
const columns = wire.columns ?? [];
|
|
297
|
+
const rawData = wire.data ?? [];
|
|
298
|
+
const index = wire.index ?? rawData.map((_, i) => i);
|
|
299
|
+
const dtypes = wire.dtypes ?? {};
|
|
300
|
+
const nrows = rawData.length;
|
|
301
|
+
const ncols = columns.length;
|
|
302
|
+
// Convert 2-D array → records
|
|
303
|
+
const records = rawData.map(row => {
|
|
304
|
+
const obj = {};
|
|
305
|
+
for (let c = 0; c < columns.length; c++) {
|
|
306
|
+
obj[columns[c]] = row[c] ?? null;
|
|
307
|
+
}
|
|
308
|
+
return obj;
|
|
309
|
+
});
|
|
310
|
+
return {
|
|
311
|
+
columns,
|
|
312
|
+
data: records,
|
|
313
|
+
records,
|
|
314
|
+
index,
|
|
315
|
+
dtypes,
|
|
316
|
+
shape: wire.shape ?? [nrows, ncols],
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
_buildSeriesResult(wire) {
|
|
320
|
+
// Support both 'data' and 'values' as the series values key
|
|
321
|
+
const seriesData = wire.data ?? wire['values'] ?? [];
|
|
322
|
+
return {
|
|
323
|
+
name: wire.name ?? '',
|
|
324
|
+
data: seriesData,
|
|
325
|
+
values: seriesData,
|
|
326
|
+
index: wire.index ?? [],
|
|
327
|
+
dtype: wire.dtype ?? 'object',
|
|
328
|
+
length: wire.length ?? seriesData.length ?? 0,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
_inferDtype(data) {
|
|
332
|
+
if (data.length === 0) {
|
|
333
|
+
return 'object';
|
|
334
|
+
}
|
|
335
|
+
const sample = data.find(v => v !== null && v !== undefined);
|
|
336
|
+
if (sample === undefined) {
|
|
337
|
+
return 'object';
|
|
338
|
+
}
|
|
339
|
+
if (typeof sample === 'number') {
|
|
340
|
+
return Number.isInteger(sample) ? 'int64' : 'float64';
|
|
341
|
+
}
|
|
342
|
+
if (typeof sample === 'boolean') {
|
|
343
|
+
return 'bool';
|
|
344
|
+
}
|
|
345
|
+
if (typeof sample === 'string') {
|
|
346
|
+
return 'object';
|
|
347
|
+
}
|
|
348
|
+
if (sample instanceof Date) {
|
|
349
|
+
return 'datetime64[ns]';
|
|
350
|
+
}
|
|
351
|
+
return 'object';
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
exports.DataFrameBridge = DataFrameBridge;
|
|
355
|
+
//# sourceMappingURL=DataFrameBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataFrameBridge.js","sourceRoot":"","sources":["../../src/serialization/DataFrameBridge.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,0DAA4C;AAO5C,4CAAyC;AAEzC,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,iBAAiB,CAAC,CAAC;AAmC7C;;;;;;;;;;;;;;;GAeG;AACH,MAAa,eAAe;IAE1B,qKAAqK;IAErK;;OAEG;IACH,oBAAoB,CAAC,EAAmB;QACtC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAgB,EAAE,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACtF,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,EAAmB;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAa,EAAE,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAC;YAC9D,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QACnF,CAAC;IACH,CAAC;IAED,sKAAsK;IAEtK;;;;;;OAMG;IACH,kBAAkB,CAChB,OAAkC,EAClC,OAAkB,EAClB,UAAqC,EAAE;QAEvC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,MAAM,IAAI,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAEzE,sCAAsC;QACtC,MAAM,IAAI,GAAkB;YAC1B,OAAO,EAAE,IAAI;YACb,IAAI,EAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;YAC3D,KAAK,EAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9B,MAAM,EAAG,EAAE;YACX,KAAK,EAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;SACpC,CAAC;QAEF,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACnE,CAAC;IAED;;;;;;OAMG;IACH,eAAe,CACb,IAAe,EACf,OAAe,EAAE,EACjB,KAAiB;QAEjB,MAAM,IAAI,GAAe;YACvB,IAAI;YACJ,IAAI;YACJ,KAAK,EAAE,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACrC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;QAEF,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,0JAA0J;IAE1J;;;OAGG;IACH,MAAM,CAAC,cAAc,CACnB,EAAmB;QAEnB,MAAM,MAAM,GAA8B,EAAE,CAAC;QAC7C,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAmB;QACjC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU,CACf,EAAmB,EACnB,SAAoE;QAEpE,MAAM,YAAY,GAA8B,EAAE,CAAC;QACnD,MAAM,aAAa,GAAc,EAAE,CAAC;QAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;YACxB,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;gBACxB,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACvB,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,OAAO;YACL,GAAG,EAAE;YACL,IAAI,EAAK,YAAY;YACrB,OAAO,EAAE,YAAY;YACrB,KAAK,EAAI,aAAa;YACtB,KAAK,EAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC5C,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,EAAmB,EAAE,IAAc;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,OAAO;YACL,OAAO,EAAE,SAAS;YAClB,IAAI;YACJ,OAAO,EAAE,IAAI;YACb,KAAK,EAAI,EAAE,CAAC,KAAK;YACjB,MAAM,EAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;YAC9E,KAAK,EAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC;SACzC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,EAAmB,EAAE,GAAW;QAQpD,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI;aACnB,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAAA,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QAAA,CAAC;QAEhF,MAAM,GAAG,GAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC;QACzB,MAAM,GAAG,GAAI,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QACjC,MAAM,GAAG,GAAI,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;QAC7E,MAAM,GAAG,GAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC7C,CAAC;IAED,+LAA+L;IAEvL,WAAW,CAAI,EAAmB;QACxC,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAAA,CAAC;QAE7D,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;QAC/B,CAAC;QAED,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;YAC/B,4BAA4B;YAC5B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrC,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAAA,OAAO,OAAY,CAAC;gBAAA,CAAC;YACpE,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;YACD,WAAW;YACX,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;QAC/B,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,2CAA2C,OAAO,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;IAEO,WAAW,CACjB,IAAgC,EAChC,MAAqE,EACrE,YAAsB;QAEtB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,YAAY,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAExD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO;gBACL,MAAM,EAAE,MAA0B;gBAClC,IAAI,EAAI,MAAM;gBACd,QAAQ,EAAE;oBACR,MAAM,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;iBAChD;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,MAA0B;YAClC,IAAI,EAAI,IAAI;YACZ,QAAQ,EAAE;gBACR,MAAM,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;aAChD;SACF,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,IAAmB;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,IAAO,EAAE,CAAC;QACnC,MAAM,KAAK,GAAK,IAAI,CAAC,KAAK,IAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,MAAM,GAAI,IAAI,CAAC,MAAM,IAAK,EAAE,CAAC;QACnC,MAAM,KAAK,GAAK,OAAO,CAAC,MAAM,CAAC;QAC/B,MAAM,KAAK,GAAK,OAAO,CAAC,MAAM,CAAC;QAE/B,gCAAgC;QAChC,MAAM,OAAO,GAA8B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC3D,MAAM,GAAG,GAA4B,EAAE,CAAC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YACpC,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,OAAO;YACP,IAAI,EAAK,OAAO;YAChB,OAAO;YACP,KAAK;YACL,MAAM;YACN,KAAK,EAAI,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;SACtC,CAAC;IACJ,CAAC;IAEO,kBAAkB,CAAC,IAAgB;QACzC,4DAA4D;QAC5D,MAAM,UAAU,GAAc,IAAI,CAAC,IAAI,IAAK,IAA6C,CAAC,QAAQ,CAAc,IAAI,EAAE,CAAC;QACvH,OAAO;YACL,IAAI,EAAI,IAAI,CAAC,IAAI,IAAM,EAAE;YACzB,IAAI,EAAI,UAAU;YAClB,MAAM,EAAE,UAAU;YAClB,KAAK,EAAG,IAAI,CAAC,KAAK,IAAK,EAAE;YACzB,KAAK,EAAG,IAAI,CAAC,KAAK,IAAK,QAAQ;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC;SAC9C,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,IAAe;QACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAAA,OAAO,QAAQ,CAAC;QAAA,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;QAC7D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAAA,OAAO,QAAQ,CAAC;QAAA,CAAC;QAC5C,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QACxD,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,SAAS,EAAG,CAAC;YAAA,OAAO,MAAM,CAAC;QAAA,CAAC;QAClD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAI,CAAC;YAAA,OAAO,QAAQ,CAAC;QAAA,CAAC;QACpD,IAAI,MAAM,YAAY,IAAI,EAAQ,CAAC;YAAA,OAAO,gBAAgB,CAAC;QAAA,CAAC;QAC5D,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AA7RD,0CA6RC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nodepyx — MsgPackSerializer
|
|
3
|
+
* MessagePack encoder/decoder for high-performance binary serialization.
|
|
4
|
+
* Used for large arrays, complex objects, and bulk data transfer.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* MsgPackSerializer — encodes/decodes JavaScript ↔ MessagePack binary.
|
|
8
|
+
*
|
|
9
|
+
* Handles Python-specific types via extension codecs:
|
|
10
|
+
* - Python datetime → JS Date
|
|
11
|
+
* - Python set → JS Set
|
|
12
|
+
* - Python tuple → JS Array (immutable semantics lost, acceptable)
|
|
13
|
+
* - Python bytes → JS Uint8Array
|
|
14
|
+
* - Python complex → JS {real, imag}
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const serializer = new MsgPackSerializer();
|
|
19
|
+
* const encoded = serializer.encode({ key: 'value', nums: [1, 2, 3] });
|
|
20
|
+
* const decoded = serializer.decode(encoded);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare class MsgPackSerializer {
|
|
24
|
+
private readonly _encoderOptions;
|
|
25
|
+
private readonly _decoderOptions;
|
|
26
|
+
constructor();
|
|
27
|
+
/**
|
|
28
|
+
* Encode a JavaScript value to MessagePack binary.
|
|
29
|
+
*/
|
|
30
|
+
encode(value: unknown): Uint8Array;
|
|
31
|
+
/**
|
|
32
|
+
* Decode a MessagePack binary to a JavaScript value.
|
|
33
|
+
*/
|
|
34
|
+
decode(data: Uint8Array): unknown;
|
|
35
|
+
/**
|
|
36
|
+
* Encode a stream of values (for streaming large datasets).
|
|
37
|
+
*/
|
|
38
|
+
encodeStream(values: Iterable<unknown>): Uint8Array;
|
|
39
|
+
/**
|
|
40
|
+
* Decode a stream of values from MessagePack binary.
|
|
41
|
+
*/
|
|
42
|
+
decodeStream(data: Uint8Array): Iterable<unknown>;
|
|
43
|
+
private _createExtensionCodec;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=MsgPackSerializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MsgPackSerializer.d.ts","sourceRoot":"","sources":["../../src/serialization/MsgPackSerializer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;;IAmBzD;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU;IAgBlC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO;IAUjC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,UAAU;IAqBnD;;OAEG;IACF,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC;IAclD,OAAO,CAAC,qBAAqB;CA+E9B"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* nodepyx — MsgPackSerializer
|
|
4
|
+
* MessagePack encoder/decoder for high-performance binary serialization.
|
|
5
|
+
* Used for large arrays, complex objects, and bulk data transfer.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.MsgPackSerializer = void 0;
|
|
42
|
+
const msgpack = __importStar(require("@msgpack/msgpack"));
|
|
43
|
+
const Logger_1 = require("../utils/Logger");
|
|
44
|
+
const logger = new Logger_1.Logger('MsgPackSerializer');
|
|
45
|
+
/**
|
|
46
|
+
* Extension type definitions for custom Python types.
|
|
47
|
+
* Extension type 1 = Python datetime
|
|
48
|
+
* Extension type 2 = Python complex number
|
|
49
|
+
* Extension type 3 = Python set
|
|
50
|
+
* Extension type 4 = Python tuple
|
|
51
|
+
* Extension type 5 = Python bytes
|
|
52
|
+
*/
|
|
53
|
+
var MsgPackExtType;
|
|
54
|
+
(function (MsgPackExtType) {
|
|
55
|
+
MsgPackExtType[MsgPackExtType["DATETIME"] = 1] = "DATETIME";
|
|
56
|
+
MsgPackExtType[MsgPackExtType["COMPLEX"] = 2] = "COMPLEX";
|
|
57
|
+
MsgPackExtType[MsgPackExtType["SET"] = 3] = "SET";
|
|
58
|
+
MsgPackExtType[MsgPackExtType["TUPLE"] = 4] = "TUPLE";
|
|
59
|
+
MsgPackExtType[MsgPackExtType["BYTES"] = 5] = "BYTES";
|
|
60
|
+
MsgPackExtType[MsgPackExtType["NUMPY_DTYPE"] = 10] = "NUMPY_DTYPE";
|
|
61
|
+
})(MsgPackExtType || (MsgPackExtType = {}));
|
|
62
|
+
/**
|
|
63
|
+
* MsgPackSerializer — encodes/decodes JavaScript ↔ MessagePack binary.
|
|
64
|
+
*
|
|
65
|
+
* Handles Python-specific types via extension codecs:
|
|
66
|
+
* - Python datetime → JS Date
|
|
67
|
+
* - Python set → JS Set
|
|
68
|
+
* - Python tuple → JS Array (immutable semantics lost, acceptable)
|
|
69
|
+
* - Python bytes → JS Uint8Array
|
|
70
|
+
* - Python complex → JS {real, imag}
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* const serializer = new MsgPackSerializer();
|
|
75
|
+
* const encoded = serializer.encode({ key: 'value', nums: [1, 2, 3] });
|
|
76
|
+
* const decoded = serializer.decode(encoded);
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
class MsgPackSerializer {
|
|
80
|
+
_encoderOptions;
|
|
81
|
+
_decoderOptions;
|
|
82
|
+
constructor() {
|
|
83
|
+
this._encoderOptions = {
|
|
84
|
+
extensionCodec: this._createExtensionCodec(),
|
|
85
|
+
forceIntegerToFloat: false,
|
|
86
|
+
forceFloat32: false,
|
|
87
|
+
sortKeys: false,
|
|
88
|
+
maxDepth: 64,
|
|
89
|
+
};
|
|
90
|
+
this._decoderOptions = {
|
|
91
|
+
extensionCodec: this._createExtensionCodec(),
|
|
92
|
+
// rawBinaryType: 'Uint8Array',
|
|
93
|
+
useBigInt64: false,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Encode a JavaScript value to MessagePack binary.
|
|
98
|
+
*/
|
|
99
|
+
encode(value) {
|
|
100
|
+
try {
|
|
101
|
+
return msgpack.encode(value, this._encoderOptions);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
logger.error('MsgPack encoding failed', err);
|
|
105
|
+
// Fallback: try encoding as JSON string
|
|
106
|
+
try {
|
|
107
|
+
const json = JSON.stringify(value);
|
|
108
|
+
return msgpack.encode(json, this._encoderOptions);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Last resort: empty bytes
|
|
112
|
+
return new Uint8Array(0);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Decode a MessagePack binary to a JavaScript value.
|
|
118
|
+
*/
|
|
119
|
+
decode(data) {
|
|
120
|
+
if (!data || data.length === 0) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
return msgpack.decode(data, this._decoderOptions);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
logger.error('MsgPack decoding failed', err);
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Encode a stream of values (for streaming large datasets).
|
|
133
|
+
*/
|
|
134
|
+
encodeStream(values) {
|
|
135
|
+
const chunks = [];
|
|
136
|
+
let totalLength = 0;
|
|
137
|
+
for (const value of values) {
|
|
138
|
+
const encoded = this.encode(value);
|
|
139
|
+
chunks.push(encoded);
|
|
140
|
+
totalLength += encoded.length;
|
|
141
|
+
}
|
|
142
|
+
// Concatenate all chunks
|
|
143
|
+
const result = new Uint8Array(totalLength);
|
|
144
|
+
let offset = 0;
|
|
145
|
+
for (const chunk of chunks) {
|
|
146
|
+
result.set(chunk, offset);
|
|
147
|
+
offset += chunk.length;
|
|
148
|
+
}
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Decode a stream of values from MessagePack binary.
|
|
153
|
+
*/
|
|
154
|
+
*decodeStream(data) {
|
|
155
|
+
if (!data || data.length === 0) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
for (const item of msgpack.decodeMulti(data, this._decoderOptions)) {
|
|
160
|
+
yield item;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
logger.error('MsgPack stream decoding failed', err);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// ─── Extension Codec ────────────────────────────────────────────────────────
|
|
168
|
+
_createExtensionCodec() {
|
|
169
|
+
const codec = new msgpack.ExtensionCodec();
|
|
170
|
+
// ── Python datetime → JS Date ──────────────────────────────────────────
|
|
171
|
+
codec.register({
|
|
172
|
+
type: MsgPackExtType.DATETIME,
|
|
173
|
+
encode: (value) => {
|
|
174
|
+
if (value instanceof Date) {
|
|
175
|
+
const ms = value.getTime();
|
|
176
|
+
const buf = new ArrayBuffer(8);
|
|
177
|
+
new DataView(buf).setFloat64(0, ms, false);
|
|
178
|
+
return new Uint8Array(buf);
|
|
179
|
+
}
|
|
180
|
+
return null;
|
|
181
|
+
},
|
|
182
|
+
decode: (data) => {
|
|
183
|
+
const ms = new DataView(data.buffer, data.byteOffset, data.byteLength).getFloat64(0, false);
|
|
184
|
+
return new Date(ms);
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
// ── Python complex → {real, imag} ─────────────────────────────────────
|
|
188
|
+
codec.register({
|
|
189
|
+
type: MsgPackExtType.COMPLEX,
|
|
190
|
+
encode: (value) => {
|
|
191
|
+
if (value !== null &&
|
|
192
|
+
typeof value === 'object' &&
|
|
193
|
+
'real' in value &&
|
|
194
|
+
'imag' in value) {
|
|
195
|
+
const buf = new ArrayBuffer(16);
|
|
196
|
+
const dv = new DataView(buf);
|
|
197
|
+
dv.setFloat64(0, value.real, false);
|
|
198
|
+
dv.setFloat64(8, value.imag, false);
|
|
199
|
+
return new Uint8Array(buf);
|
|
200
|
+
}
|
|
201
|
+
return null;
|
|
202
|
+
},
|
|
203
|
+
decode: (data) => {
|
|
204
|
+
const dv = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
205
|
+
return {
|
|
206
|
+
real: dv.getFloat64(0, false),
|
|
207
|
+
imag: dv.getFloat64(8, false),
|
|
208
|
+
};
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
// ── Python set → JS Set ───────────────────────────────────────────────
|
|
212
|
+
codec.register({
|
|
213
|
+
type: MsgPackExtType.SET,
|
|
214
|
+
encode: (value) => {
|
|
215
|
+
if (value instanceof Set) {
|
|
216
|
+
const arr = Array.from(value);
|
|
217
|
+
return this.encode(arr);
|
|
218
|
+
}
|
|
219
|
+
return null;
|
|
220
|
+
},
|
|
221
|
+
decode: (data) => {
|
|
222
|
+
const arr = this.decode(data);
|
|
223
|
+
return new Set(arr);
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
// ── Python tuple → JS Array ───────────────────────────────────────────
|
|
227
|
+
codec.register({
|
|
228
|
+
type: MsgPackExtType.TUPLE,
|
|
229
|
+
encode: (_value) => {
|
|
230
|
+
// Tuples are encoded as arrays by Python side
|
|
231
|
+
return null;
|
|
232
|
+
},
|
|
233
|
+
decode: (data) => {
|
|
234
|
+
const decoded = this.decode(data);
|
|
235
|
+
return Array.isArray(decoded) ? decoded : [decoded];
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
return codec;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
exports.MsgPackSerializer = MsgPackSerializer;
|
|
242
|
+
//# sourceMappingURL=MsgPackSerializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MsgPackSerializer.js","sourceRoot":"","sources":["../../src/serialization/MsgPackSerializer.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,0DAA4C;AAC5C,4CAAyC;AAEzC,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,mBAAmB,CAAC,CAAC;AAE/C;;;;;;;GAOG;AACH,IAAK,cAOJ;AAPD,WAAK,cAAc;IACjB,2DAAY,CAAA;IACZ,yDAAW,CAAA;IACX,iDAAO,CAAA;IACP,qDAAS,CAAA;IACT,qDAAS,CAAA;IACT,kEAAgB,CAAA;AAClB,CAAC,EAPI,cAAc,KAAd,cAAc,QAOlB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,iBAAiB;IACX,eAAe,CAAyB;IACxC,eAAe,CAAyB;IAEzD;QACE,IAAI,CAAC,eAAe,GAAG;YACrB,cAAc,EAAE,IAAI,CAAC,qBAAqB,EAAE;YAC5C,mBAAmB,EAAE,KAAK;YAC1B,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG;YACrB,cAAc,EAAE,IAAI,CAAC,qBAAqB,EAAE;YAC5C,+BAA+B;YAE/B,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAc;QACnB,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;YAC7C,wCAAwC;YACxC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACnC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;gBAC3B,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAgB;QACrB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAAA,OAAO,IAAI,CAAC;QAAA,CAAC;QAC9C,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,MAAyB;QACpC,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;QAChC,CAAC;QAED,yBAAyB;QACzB,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;QAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;QACzB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,CAAC,YAAY,CAAC,IAAgB;QAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAAA,OAAO;QAAA,CAAC;QAEzC,IAAI,CAAC;YACH,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnE,MAAM,IAAI,CAAC;YACb,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,qMAAqM;IAE7L,qBAAqB;QAC3B,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAE3C,oKAAoK;QACpK,KAAK,CAAC,QAAQ,CAAC;YACb,IAAI,EAAE,cAAc,CAAC,QAAQ;YAC7B,MAAM,EAAE,CAAC,KAAc,EAAqB,EAAE;gBAC5C,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;oBAC1B,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;oBAC3B,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;oBAC/B,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;oBAC3C,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC7B,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,CAAC,IAAgB,EAAQ,EAAE;gBACjC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBAC5F,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;YACtB,CAAC;SACF,CAAC,CAAC;QAEH,yJAAyJ;QACzJ,KAAK,CAAC,QAAQ,CAAC;YACb,IAAI,EAAE,cAAc,CAAC,OAAO;YAC5B,MAAM,EAAE,CAAC,KAAc,EAAqB,EAAE;gBAC5C,IACE,KAAK,KAAK,IAAI;oBACd,OAAO,KAAK,KAAK,QAAQ;oBACzB,MAAM,IAAK,KAAiC;oBAC5C,MAAM,IAAK,KAAiC,EAC5C,CAAC;oBACD,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC;oBAChC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;oBAC7B,EAAE,CAAC,UAAU,CAAC,CAAC,EAAG,KAA0B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBAC1D,EAAE,CAAC,UAAU,CAAC,CAAC,EAAG,KAA0B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBAC1D,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC7B,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,CAAC,IAAgB,EAAkC,EAAE;gBAC3D,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBACvE,OAAO;oBACL,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC;oBAC7B,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC;iBAC9B,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;QAEH,6KAA6K;QAC7K,KAAK,CAAC,QAAQ,CAAC;YACb,IAAI,EAAE,cAAc,CAAC,GAAG;YACxB,MAAM,EAAE,CAAC,KAAc,EAAqB,EAAE;gBAC5C,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;oBACzB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC1B,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,CAAC,IAAgB,EAAgB,EAAE;gBACzC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAc,CAAC;gBAC3C,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;SACF,CAAC,CAAC;QAEH,qKAAqK;QACrK,KAAK,CAAC,QAAQ,CAAC;YACb,IAAI,EAAE,cAAc,CAAC,KAAK;YAC1B,MAAM,EAAE,CAAC,MAAe,EAAqB,EAAE;gBAC7C,8CAA8C;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,CAAC,IAAgB,EAAa,EAAE;gBACtC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAClC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACtD,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA7KD,8CA6KC"}
|