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,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nodepyx — NumpyBridge
|
|
3
|
+
* Converts NumPy arrays to/from JavaScript TypedArrays.
|
|
4
|
+
*
|
|
5
|
+
* Wire protocol (binary layout for NUMPY_ARRAY format):
|
|
6
|
+
* Bytes 0-3 : uint32 LE — ndim (number of dimensions)
|
|
7
|
+
* Bytes 4-7 : uint32 LE — dtype code (see NumpyDTypeCode)
|
|
8
|
+
* Bytes 8-11 : uint32 LE — itemsize in bytes
|
|
9
|
+
* Bytes 12-15 : uint32 LE — total element count
|
|
10
|
+
* Bytes 16.. : ndim × uint32 LE — shape dimensions
|
|
11
|
+
* After shape : raw element bytes (C-contiguous order)
|
|
12
|
+
*
|
|
13
|
+
* When SharedArrayBuffer is enabled the element bytes are placed in a
|
|
14
|
+
* SharedArrayBuffer so the data can be read from Node.js worker threads
|
|
15
|
+
* without copying.
|
|
16
|
+
*/
|
|
17
|
+
import type { SerializedValue, NumPyArrayResult } from '../types/python';
|
|
18
|
+
export declare enum NumpyDTypeCode {
|
|
19
|
+
BOOL = 0,
|
|
20
|
+
INT8 = 1,
|
|
21
|
+
INT16 = 2,
|
|
22
|
+
INT32 = 3,
|
|
23
|
+
INT64 = 4,
|
|
24
|
+
UINT8 = 5,
|
|
25
|
+
UINT16 = 6,
|
|
26
|
+
UINT32 = 7,
|
|
27
|
+
UINT64 = 8,
|
|
28
|
+
FLOAT32 = 9,
|
|
29
|
+
FLOAT64 = 10,
|
|
30
|
+
COMPLEX64 = 11,
|
|
31
|
+
COMPLEX128 = 12
|
|
32
|
+
}
|
|
33
|
+
export type NumpyDType = 'bool' | 'int8' | 'int16' | 'int32' | 'int64' | 'uint8' | 'uint16' | 'uint32' | 'uint64' | 'float32' | 'float64' | 'complex64' | 'complex128';
|
|
34
|
+
interface NumpyBridgeOptions {
|
|
35
|
+
/**
|
|
36
|
+
* Use SharedArrayBuffer for large arrays.
|
|
37
|
+
* Requires `Cross-Origin-Opener-Policy: same-origin` and
|
|
38
|
+
* `Cross-Origin-Embedder-Policy: require-corp` response headers.
|
|
39
|
+
*/
|
|
40
|
+
useSharedArrayBuffer?: boolean;
|
|
41
|
+
/** Threshold in bytes above which SharedArrayBuffer is used. Default: 1 MB */
|
|
42
|
+
sharedArrayBufferThreshold?: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* NumpyBridge — converts NumPy arrays ↔ TypedArrays.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* const bridge = new NumpyBridge();
|
|
50
|
+
*
|
|
51
|
+
* // Serialize a Float32Array → NumPy wire format
|
|
52
|
+
* const sv = bridge.serializeTypedArray(new Float32Array([1, 2, 3]), 'float32');
|
|
53
|
+
*
|
|
54
|
+
* // Deserialize NumPy wire format → TypedArray
|
|
55
|
+
* const arr = bridge.deserialize(sv) as Float32Array;
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare class NumpyBridge {
|
|
59
|
+
private readonly _useShared;
|
|
60
|
+
private readonly _sharedThreshold;
|
|
61
|
+
constructor(options?: NumpyBridgeOptions);
|
|
62
|
+
/**
|
|
63
|
+
* Deserialize a NUMPY_ARRAY SerializedValue to a TypedArray.
|
|
64
|
+
*/
|
|
65
|
+
deserialize(sv: SerializedValue): NumPyArrayResult | null;
|
|
66
|
+
/**
|
|
67
|
+
* Serialize a TypedArray to a NUMPY_ARRAY SerializedValue.
|
|
68
|
+
*
|
|
69
|
+
* @param arr — the typed array
|
|
70
|
+
* @param dtype — NumPy dtype string
|
|
71
|
+
* @param shape — optional explicit shape; defaults to [arr.length]
|
|
72
|
+
*/
|
|
73
|
+
serializeTypedArray(arr: ArrayBufferView, dtype: NumpyDType | {
|
|
74
|
+
dtype: string;
|
|
75
|
+
itemsize: number;
|
|
76
|
+
}, shape?: number[]): SerializedValue;
|
|
77
|
+
/**
|
|
78
|
+
* Create an empty NumPy array SerializedValue (used for zero-size results).
|
|
79
|
+
*/
|
|
80
|
+
serializeEmpty(dtype?: NumpyDType): SerializedValue;
|
|
81
|
+
private _decodeBuffer;
|
|
82
|
+
private _buildTypedArray;
|
|
83
|
+
/**
|
|
84
|
+
* Detect dtype code from a TypedArray instance.
|
|
85
|
+
*/
|
|
86
|
+
static detectDType(arr: ArrayBufferView): {
|
|
87
|
+
dtype: NumpyDType;
|
|
88
|
+
itemsize: number;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Return the item size in bytes for a dtype string.
|
|
92
|
+
*/
|
|
93
|
+
static itemSizeOf(dtype: NumpyDType): number;
|
|
94
|
+
}
|
|
95
|
+
export {};
|
|
96
|
+
//# sourceMappingURL=NumpyBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumpyBridge.d.ts","sourceRoot":"","sources":["../../src/serialization/NumpyBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAoB,gBAAgB,EAAmB,MAAM,iBAAiB,CAAC;AAO5G,oBAAY,cAAc;IACxB,IAAI,IAAQ;IACZ,IAAI,IAAQ;IACZ,KAAK,IAAO;IACZ,KAAK,IAAO;IACZ,KAAK,IAAO;IACZ,KAAK,IAAO;IACZ,MAAM,IAAM;IACZ,MAAM,IAAM;IACZ,MAAM,IAAM;IACZ,OAAO,IAAK;IACZ,OAAO,KAAK;IACZ,SAAS,KAAM;IACf,UAAU,KAAK;CAChB;AAED,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GACpC,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GACxC,SAAS,GAAG,SAAS,GACrB,WAAW,GAAG,YAAY,CAAC;AAE/B,UAAU,kBAAkB;IAC1B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,8EAA8E;IAC9E,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACrC;AAyCD;;;;;;;;;;;;;GAaG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAE9B,OAAO,GAAE,kBAAuB;IAO5C;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,eAAe,GAAG,gBAAgB,GAAG,IAAI;IAiCzD;;;;;;OAMG;IACH,mBAAmB,CACjB,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,UAAU,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EACvD,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,eAAe;IA8ClB;;OAEG;IACH,cAAc,CAAC,KAAK,GAAE,UAAsB,GAAG,eAAe;IAM9D,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,gBAAgB;IAkDxB;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAiBjF;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM;CAI7C"}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* nodepyx — NumpyBridge
|
|
4
|
+
* Converts NumPy arrays to/from JavaScript TypedArrays.
|
|
5
|
+
*
|
|
6
|
+
* Wire protocol (binary layout for NUMPY_ARRAY format):
|
|
7
|
+
* Bytes 0-3 : uint32 LE — ndim (number of dimensions)
|
|
8
|
+
* Bytes 4-7 : uint32 LE — dtype code (see NumpyDTypeCode)
|
|
9
|
+
* Bytes 8-11 : uint32 LE — itemsize in bytes
|
|
10
|
+
* Bytes 12-15 : uint32 LE — total element count
|
|
11
|
+
* Bytes 16.. : ndim × uint32 LE — shape dimensions
|
|
12
|
+
* After shape : raw element bytes (C-contiguous order)
|
|
13
|
+
*
|
|
14
|
+
* When SharedArrayBuffer is enabled the element bytes are placed in a
|
|
15
|
+
* SharedArrayBuffer so the data can be read from Node.js worker threads
|
|
16
|
+
* without copying.
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.NumpyBridge = exports.NumpyDTypeCode = void 0;
|
|
20
|
+
const Logger_1 = require("../utils/Logger");
|
|
21
|
+
const logger = new Logger_1.Logger('NumpyBridge');
|
|
22
|
+
// ─── NumPy dtype codes (must match Python side nodepyx_runtime.py) ───────────
|
|
23
|
+
var NumpyDTypeCode;
|
|
24
|
+
(function (NumpyDTypeCode) {
|
|
25
|
+
NumpyDTypeCode[NumpyDTypeCode["BOOL"] = 0] = "BOOL";
|
|
26
|
+
NumpyDTypeCode[NumpyDTypeCode["INT8"] = 1] = "INT8";
|
|
27
|
+
NumpyDTypeCode[NumpyDTypeCode["INT16"] = 2] = "INT16";
|
|
28
|
+
NumpyDTypeCode[NumpyDTypeCode["INT32"] = 3] = "INT32";
|
|
29
|
+
NumpyDTypeCode[NumpyDTypeCode["INT64"] = 4] = "INT64";
|
|
30
|
+
NumpyDTypeCode[NumpyDTypeCode["UINT8"] = 5] = "UINT8";
|
|
31
|
+
NumpyDTypeCode[NumpyDTypeCode["UINT16"] = 6] = "UINT16";
|
|
32
|
+
NumpyDTypeCode[NumpyDTypeCode["UINT32"] = 7] = "UINT32";
|
|
33
|
+
NumpyDTypeCode[NumpyDTypeCode["UINT64"] = 8] = "UINT64";
|
|
34
|
+
NumpyDTypeCode[NumpyDTypeCode["FLOAT32"] = 9] = "FLOAT32";
|
|
35
|
+
NumpyDTypeCode[NumpyDTypeCode["FLOAT64"] = 10] = "FLOAT64";
|
|
36
|
+
NumpyDTypeCode[NumpyDTypeCode["COMPLEX64"] = 11] = "COMPLEX64";
|
|
37
|
+
NumpyDTypeCode[NumpyDTypeCode["COMPLEX128"] = 12] = "COMPLEX128";
|
|
38
|
+
})(NumpyDTypeCode || (exports.NumpyDTypeCode = NumpyDTypeCode = {}));
|
|
39
|
+
/** Header size in bytes (see layout above) */
|
|
40
|
+
const HEADER_BYTES = 16;
|
|
41
|
+
// ─── dtype string → NumpyDTypeCode ──────────────────────────────────────────
|
|
42
|
+
const DTYPE_STRING_TO_CODE = {
|
|
43
|
+
bool: NumpyDTypeCode.BOOL,
|
|
44
|
+
int8: NumpyDTypeCode.INT8,
|
|
45
|
+
int16: NumpyDTypeCode.INT16,
|
|
46
|
+
int32: NumpyDTypeCode.INT32,
|
|
47
|
+
int64: NumpyDTypeCode.INT64,
|
|
48
|
+
uint8: NumpyDTypeCode.UINT8,
|
|
49
|
+
uint16: NumpyDTypeCode.UINT16,
|
|
50
|
+
uint32: NumpyDTypeCode.UINT32,
|
|
51
|
+
uint64: NumpyDTypeCode.UINT64,
|
|
52
|
+
float32: NumpyDTypeCode.FLOAT32,
|
|
53
|
+
float64: NumpyDTypeCode.FLOAT64,
|
|
54
|
+
complex64: NumpyDTypeCode.COMPLEX64,
|
|
55
|
+
complex128: NumpyDTypeCode.COMPLEX128,
|
|
56
|
+
};
|
|
57
|
+
// ─── NumpyDTypeCode → item size in bytes ────────────────────────────────────
|
|
58
|
+
const DTYPE_CODE_TO_ITEMSIZE = {
|
|
59
|
+
[NumpyDTypeCode.BOOL]: 1,
|
|
60
|
+
[NumpyDTypeCode.INT8]: 1,
|
|
61
|
+
[NumpyDTypeCode.INT16]: 2,
|
|
62
|
+
[NumpyDTypeCode.INT32]: 4,
|
|
63
|
+
[NumpyDTypeCode.INT64]: 8,
|
|
64
|
+
[NumpyDTypeCode.UINT8]: 1,
|
|
65
|
+
[NumpyDTypeCode.UINT16]: 2,
|
|
66
|
+
[NumpyDTypeCode.UINT32]: 4,
|
|
67
|
+
[NumpyDTypeCode.UINT64]: 8,
|
|
68
|
+
[NumpyDTypeCode.FLOAT32]: 4,
|
|
69
|
+
[NumpyDTypeCode.FLOAT64]: 8,
|
|
70
|
+
[NumpyDTypeCode.COMPLEX64]: 8,
|
|
71
|
+
[NumpyDTypeCode.COMPLEX128]: 16,
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* NumpyBridge — converts NumPy arrays ↔ TypedArrays.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* const bridge = new NumpyBridge();
|
|
79
|
+
*
|
|
80
|
+
* // Serialize a Float32Array → NumPy wire format
|
|
81
|
+
* const sv = bridge.serializeTypedArray(new Float32Array([1, 2, 3]), 'float32');
|
|
82
|
+
*
|
|
83
|
+
* // Deserialize NumPy wire format → TypedArray
|
|
84
|
+
* const arr = bridge.deserialize(sv) as Float32Array;
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
class NumpyBridge {
|
|
88
|
+
_useShared;
|
|
89
|
+
_sharedThreshold;
|
|
90
|
+
constructor(options = {}) {
|
|
91
|
+
this._useShared = options.useSharedArrayBuffer ?? false;
|
|
92
|
+
this._sharedThreshold = options.sharedArrayBufferThreshold ?? 1_048_576; // 1 MB
|
|
93
|
+
}
|
|
94
|
+
// ─── Python wire format → TypedArray ─────────────────────────────────────
|
|
95
|
+
/**
|
|
96
|
+
* Deserialize a NUMPY_ARRAY SerializedValue to a TypedArray.
|
|
97
|
+
*/
|
|
98
|
+
deserialize(sv) {
|
|
99
|
+
if (sv.format !== 'numpy_array') {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
const rawData = sv.data;
|
|
103
|
+
if (!rawData) {
|
|
104
|
+
logger.warn('NumpyBridge.deserialize: invalid data');
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
let u8;
|
|
109
|
+
if (typeof rawData === 'string') {
|
|
110
|
+
// base64-encoded binary
|
|
111
|
+
const buf = Buffer.from(rawData, 'base64');
|
|
112
|
+
u8 = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
113
|
+
}
|
|
114
|
+
else if (rawData instanceof Uint8Array) {
|
|
115
|
+
u8 = rawData;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
logger.warn('NumpyBridge.deserialize: unsupported data type');
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
if (u8.length < HEADER_BYTES) {
|
|
122
|
+
logger.warn('NumpyBridge.deserialize: buffer too small');
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
return this._decodeBuffer(u8);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
logger.error('NumpyBridge.deserialize failed', err);
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// ─── TypedArray → Python wire format ─────────────────────────────────────
|
|
133
|
+
/**
|
|
134
|
+
* Serialize a TypedArray to a NUMPY_ARRAY SerializedValue.
|
|
135
|
+
*
|
|
136
|
+
* @param arr — the typed array
|
|
137
|
+
* @param dtype — NumPy dtype string
|
|
138
|
+
* @param shape — optional explicit shape; defaults to [arr.length]
|
|
139
|
+
*/
|
|
140
|
+
serializeTypedArray(arr, dtype, shape) {
|
|
141
|
+
const dtypeStr = (typeof dtype === 'string' ? dtype : dtype.dtype);
|
|
142
|
+
const dtypeCode = DTYPE_STRING_TO_CODE[dtypeStr] ?? NumpyDTypeCode.FLOAT64;
|
|
143
|
+
const itemSize = DTYPE_CODE_TO_ITEMSIZE[dtypeCode];
|
|
144
|
+
const dims = shape ?? [arr.byteLength / itemSize];
|
|
145
|
+
const ndim = dims.length;
|
|
146
|
+
const count = dims.reduce((a, b) => a * b, 1);
|
|
147
|
+
const dataBytes = count * itemSize;
|
|
148
|
+
const totalBytes = HEADER_BYTES + ndim * 4 + dataBytes;
|
|
149
|
+
const buffer = new ArrayBuffer(totalBytes);
|
|
150
|
+
const dv = new DataView(buffer);
|
|
151
|
+
const u8 = new Uint8Array(buffer);
|
|
152
|
+
// Write header
|
|
153
|
+
dv.setUint32(0, ndim, true);
|
|
154
|
+
dv.setUint32(4, dtypeCode, true);
|
|
155
|
+
dv.setUint32(8, itemSize, true);
|
|
156
|
+
dv.setUint32(12, count, true);
|
|
157
|
+
// Write shape
|
|
158
|
+
for (let i = 0; i < ndim; i++) {
|
|
159
|
+
dv.setUint32(HEADER_BYTES + i * 4, dims[i], true);
|
|
160
|
+
}
|
|
161
|
+
// Write data
|
|
162
|
+
const srcU8 = new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);
|
|
163
|
+
u8.set(srcU8, HEADER_BYTES + ndim * 4);
|
|
164
|
+
return {
|
|
165
|
+
format: 'numpy_array',
|
|
166
|
+
data: u8,
|
|
167
|
+
metadata: {
|
|
168
|
+
dtype: dtypeStr,
|
|
169
|
+
shape: dims,
|
|
170
|
+
itemSize,
|
|
171
|
+
size: dataBytes,
|
|
172
|
+
length: count,
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Create an empty NumPy array SerializedValue (used for zero-size results).
|
|
178
|
+
*/
|
|
179
|
+
serializeEmpty(dtype = 'float64') {
|
|
180
|
+
return this.serializeTypedArray(new Float64Array(0), dtype, [0]);
|
|
181
|
+
}
|
|
182
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────
|
|
183
|
+
_decodeBuffer(u8) {
|
|
184
|
+
const dv = new DataView(u8.buffer, u8.byteOffset, u8.byteLength);
|
|
185
|
+
const ndim = dv.getUint32(0, true);
|
|
186
|
+
const dtypeCode = dv.getUint32(4, true);
|
|
187
|
+
const itemSize = dv.getUint32(8, true);
|
|
188
|
+
const count = dv.getUint32(12, true);
|
|
189
|
+
// Read shape
|
|
190
|
+
const shape = [];
|
|
191
|
+
for (let i = 0; i < ndim; i++) {
|
|
192
|
+
shape.push(dv.getUint32(HEADER_BYTES + i * 4, true));
|
|
193
|
+
}
|
|
194
|
+
const dataOffset = HEADER_BYTES + ndim * 4;
|
|
195
|
+
const dataLength = count * itemSize;
|
|
196
|
+
if (u8.length < dataOffset + dataLength) {
|
|
197
|
+
throw new Error(`NumpyBridge: buffer too small. ` +
|
|
198
|
+
`Expected ${dataOffset + dataLength} bytes, got ${u8.length}`);
|
|
199
|
+
}
|
|
200
|
+
const srcBuffer = u8.buffer;
|
|
201
|
+
const srcByteOffset = u8.byteOffset + dataOffset;
|
|
202
|
+
return this._buildTypedArray(dtypeCode, srcBuffer, srcByteOffset, count, shape, ndim);
|
|
203
|
+
}
|
|
204
|
+
_buildTypedArray(code, srcBuffer, byteOffset, count, shape = [], ndim = 1) {
|
|
205
|
+
const useShared = this._useShared &&
|
|
206
|
+
typeof SharedArrayBuffer !== 'undefined' &&
|
|
207
|
+
count * DTYPE_CODE_TO_ITEMSIZE[code] >= this._sharedThreshold;
|
|
208
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
209
|
+
const targetBuffer = (useShared
|
|
210
|
+
? new SharedArrayBuffer(count * DTYPE_CODE_TO_ITEMSIZE[code])
|
|
211
|
+
: new ArrayBuffer(count * DTYPE_CODE_TO_ITEMSIZE[code]));
|
|
212
|
+
// Copy data
|
|
213
|
+
const src = new Uint8Array(srcBuffer, byteOffset, count * DTYPE_CODE_TO_ITEMSIZE[code]);
|
|
214
|
+
const dest = new Uint8Array(targetBuffer);
|
|
215
|
+
dest.set(src);
|
|
216
|
+
let data;
|
|
217
|
+
let dtypeStr;
|
|
218
|
+
switch (code) {
|
|
219
|
+
case NumpyDTypeCode.BOOL:
|
|
220
|
+
case NumpyDTypeCode.UINT8:
|
|
221
|
+
data = new Uint8Array(targetBuffer);
|
|
222
|
+
dtypeStr = code === NumpyDTypeCode.BOOL ? 'bool' : 'uint8';
|
|
223
|
+
break;
|
|
224
|
+
case NumpyDTypeCode.INT8:
|
|
225
|
+
data = new Int8Array(targetBuffer);
|
|
226
|
+
dtypeStr = 'int8';
|
|
227
|
+
break;
|
|
228
|
+
case NumpyDTypeCode.INT16:
|
|
229
|
+
data = new Int16Array(targetBuffer);
|
|
230
|
+
dtypeStr = 'int16';
|
|
231
|
+
break;
|
|
232
|
+
case NumpyDTypeCode.INT32:
|
|
233
|
+
data = new Int32Array(targetBuffer);
|
|
234
|
+
dtypeStr = 'int32';
|
|
235
|
+
break;
|
|
236
|
+
case NumpyDTypeCode.INT64:
|
|
237
|
+
data = new BigInt64Array(targetBuffer);
|
|
238
|
+
dtypeStr = 'int64';
|
|
239
|
+
break;
|
|
240
|
+
case NumpyDTypeCode.UINT16:
|
|
241
|
+
data = new Uint16Array(targetBuffer);
|
|
242
|
+
dtypeStr = 'uint16';
|
|
243
|
+
break;
|
|
244
|
+
case NumpyDTypeCode.UINT32:
|
|
245
|
+
data = new Uint32Array(targetBuffer);
|
|
246
|
+
dtypeStr = 'uint32';
|
|
247
|
+
break;
|
|
248
|
+
case NumpyDTypeCode.UINT64:
|
|
249
|
+
data = new BigUint64Array(targetBuffer);
|
|
250
|
+
dtypeStr = 'uint64';
|
|
251
|
+
break;
|
|
252
|
+
case NumpyDTypeCode.FLOAT32:
|
|
253
|
+
data = new Float32Array(targetBuffer);
|
|
254
|
+
dtypeStr = 'float32';
|
|
255
|
+
break;
|
|
256
|
+
case NumpyDTypeCode.COMPLEX64:
|
|
257
|
+
data = new Float32Array(targetBuffer);
|
|
258
|
+
dtypeStr = 'complex64';
|
|
259
|
+
break;
|
|
260
|
+
case NumpyDTypeCode.COMPLEX128:
|
|
261
|
+
data = new Float64Array(targetBuffer);
|
|
262
|
+
dtypeStr = 'complex128';
|
|
263
|
+
break;
|
|
264
|
+
case NumpyDTypeCode.FLOAT64:
|
|
265
|
+
default:
|
|
266
|
+
data = new Float64Array(targetBuffer);
|
|
267
|
+
dtypeStr = 'float64';
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
return { data, dtype: dtypeStr, shape, ndim };
|
|
271
|
+
}
|
|
272
|
+
// ─── Static helpers ───────────────────────────────────────────────────────
|
|
273
|
+
/**
|
|
274
|
+
* Detect dtype code from a TypedArray instance.
|
|
275
|
+
*/
|
|
276
|
+
static detectDType(arr) {
|
|
277
|
+
let dtype;
|
|
278
|
+
if (arr instanceof Float32Array) {
|
|
279
|
+
dtype = 'float32';
|
|
280
|
+
}
|
|
281
|
+
else if (arr instanceof Float64Array) {
|
|
282
|
+
dtype = 'float64';
|
|
283
|
+
}
|
|
284
|
+
else if (arr instanceof Int8Array) {
|
|
285
|
+
dtype = 'int8';
|
|
286
|
+
}
|
|
287
|
+
else if (arr instanceof Int16Array) {
|
|
288
|
+
dtype = 'int16';
|
|
289
|
+
}
|
|
290
|
+
else if (arr instanceof Int32Array) {
|
|
291
|
+
dtype = 'int32';
|
|
292
|
+
}
|
|
293
|
+
else if (arr instanceof BigInt64Array) {
|
|
294
|
+
dtype = 'int64';
|
|
295
|
+
}
|
|
296
|
+
else if (arr instanceof Uint8Array) {
|
|
297
|
+
dtype = 'uint8';
|
|
298
|
+
}
|
|
299
|
+
else if (arr instanceof Uint16Array) {
|
|
300
|
+
dtype = 'uint16';
|
|
301
|
+
}
|
|
302
|
+
else if (arr instanceof Uint32Array) {
|
|
303
|
+
dtype = 'uint32';
|
|
304
|
+
}
|
|
305
|
+
else if (arr instanceof BigUint64Array) {
|
|
306
|
+
dtype = 'uint64';
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
dtype = 'float64';
|
|
310
|
+
}
|
|
311
|
+
const code = DTYPE_STRING_TO_CODE[dtype] ?? NumpyDTypeCode.FLOAT64;
|
|
312
|
+
return { dtype, itemsize: DTYPE_CODE_TO_ITEMSIZE[code] };
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Return the item size in bytes for a dtype string.
|
|
316
|
+
*/
|
|
317
|
+
static itemSizeOf(dtype) {
|
|
318
|
+
const code = DTYPE_STRING_TO_CODE[dtype] ?? NumpyDTypeCode.FLOAT64;
|
|
319
|
+
return DTYPE_CODE_TO_ITEMSIZE[code];
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
exports.NumpyBridge = NumpyBridge;
|
|
323
|
+
//# sourceMappingURL=NumpyBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumpyBridge.js","sourceRoot":"","sources":["../../src/serialization/NumpyBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nodepyx — Serializer
|
|
3
|
+
* Central coordinator for Python ↔ JavaScript data conversion.
|
|
4
|
+
* Routes to specialized bridges (MsgPack, NumPy, DataFrame) based on format.
|
|
5
|
+
*/
|
|
6
|
+
import type { SerializedValue } from '../types/python';
|
|
7
|
+
/**
|
|
8
|
+
* SerializerOptions — controls serialization behavior.
|
|
9
|
+
*/
|
|
10
|
+
export interface SerializerOptions {
|
|
11
|
+
/** Use SharedArrayBuffer for large NumPy arrays (requires cross-origin isolation) */
|
|
12
|
+
useSharedArrayBuffer?: boolean;
|
|
13
|
+
/** Maximum size for inline JSON (bytes). Larger → binary */
|
|
14
|
+
maxJsonSize?: number;
|
|
15
|
+
/** Whether to wrap Python objects in PyProxy */
|
|
16
|
+
wrapPythonRefs?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Serializer — converts between Python wire format and JavaScript values.
|
|
20
|
+
*
|
|
21
|
+
* This is a singleton accessed via `Serializer.getInstance()`.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const serializer = Serializer.getInstance();
|
|
26
|
+
*
|
|
27
|
+
* // JavaScript → Python wire format
|
|
28
|
+
* const sv = await serializer.serialize([1, 2, 3, 4, 5]);
|
|
29
|
+
*
|
|
30
|
+
* // Python wire format → JavaScript
|
|
31
|
+
* const jsValue = await serializer.deserialize(sv);
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare class Serializer {
|
|
35
|
+
private static _instance;
|
|
36
|
+
private readonly _options;
|
|
37
|
+
private readonly _numpyBridge;
|
|
38
|
+
private readonly _dataframeBridge;
|
|
39
|
+
private readonly _msgpackSerializer;
|
|
40
|
+
private constructor();
|
|
41
|
+
static getInstance(options?: SerializerOptions): Serializer;
|
|
42
|
+
static resetInstance(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Deserialize a Python wire format value to JavaScript.
|
|
45
|
+
*
|
|
46
|
+
* Format routing:
|
|
47
|
+
* - JSON (0) → JSON.parse
|
|
48
|
+
* - MsgPack (1) → MessagePack decode
|
|
49
|
+
* - NumPy array (2) → TypedArray
|
|
50
|
+
* - DataFrame (3) → DataFrameResult
|
|
51
|
+
* - Series (4) → SeriesResult
|
|
52
|
+
* - PyRef (6) → PyProxy (via addon)
|
|
53
|
+
* - Bytes (7) → Uint8Array
|
|
54
|
+
* - None (8) → null
|
|
55
|
+
*/
|
|
56
|
+
deserialize(sv: SerializedValue): Promise<unknown>;
|
|
57
|
+
/**
|
|
58
|
+
* Deserialize synchronously (for non-async contexts).
|
|
59
|
+
* Limited: only works for simple types.
|
|
60
|
+
*/
|
|
61
|
+
deserializeSync(sv: SerializedValue): unknown;
|
|
62
|
+
/**
|
|
63
|
+
* Serialize a JavaScript value to Python wire format.
|
|
64
|
+
* Chooses the most efficient encoding automatically.
|
|
65
|
+
*/
|
|
66
|
+
serialize(value: unknown): Promise<SerializedValue>;
|
|
67
|
+
/**
|
|
68
|
+
* Serialize synchronously (for non-async contexts).
|
|
69
|
+
*/
|
|
70
|
+
serializeSync(value: unknown): SerializedValue;
|
|
71
|
+
private _deserializeJson;
|
|
72
|
+
private _deserializeMsgPack;
|
|
73
|
+
private _deserializePythonRef;
|
|
74
|
+
private _deserializeBytes;
|
|
75
|
+
private _serializeValue;
|
|
76
|
+
private _serializeValueSync;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=Serializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Serializer.d.ts","sourceRoot":"","sources":["../../src/serialization/Serializer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAQzB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,qFAAqF;IACrF,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,SAAS,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IAEvD,OAAO;IAWP,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU;IAO3D,MAAM,CAAC,aAAa,IAAI,IAAI;IAM5B;;;;;;;;;;;;OAYG;IACG,WAAW,CAAC,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAkCxD;;;OAGG;IACH,eAAe,CAAC,EAAE,EAAE,eAAe,GAAG,OAAO;IAqB7C;;;OAGG;IACG,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAIzD;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe;IAM9C,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,iBAAiB;YAYX,eAAe;IAI7B,OAAO,CAAC,mBAAmB;CAkG5B"}
|