pynect 0.0.0-stage → 0.2.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 (177) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +478 -2
  3. package/SECURITY.md +34 -0
  4. package/binding.gyp +60 -0
  5. package/dist/cli/codegen.d.ts +3 -0
  6. package/dist/cli/codegen.d.ts.map +1 -0
  7. package/dist/cli/codegen.js +543 -0
  8. package/dist/cli/codegen.js.map +1 -0
  9. package/dist/cli/sync.d.ts +3 -0
  10. package/dist/cli/sync.d.ts.map +1 -0
  11. package/dist/cli/sync.js +48 -0
  12. package/dist/cli/sync.js.map +1 -0
  13. package/dist/config/project.d.ts +57 -0
  14. package/dist/config/project.d.ts.map +1 -0
  15. package/dist/config/project.js +176 -0
  16. package/dist/config/project.js.map +1 -0
  17. package/dist/core/IsolatedWorker.d.ts +39 -0
  18. package/dist/core/IsolatedWorker.d.ts.map +1 -0
  19. package/dist/core/IsolatedWorker.js +178 -0
  20. package/dist/core/IsolatedWorker.js.map +1 -0
  21. package/dist/core/PyCallable.d.ts +67 -0
  22. package/dist/core/PyCallable.d.ts.map +1 -0
  23. package/dist/core/PyCallable.js +104 -0
  24. package/dist/core/PyCallable.js.map +1 -0
  25. package/dist/core/PyContext.d.ts +76 -0
  26. package/dist/core/PyContext.d.ts.map +1 -0
  27. package/dist/core/PyContext.js +239 -0
  28. package/dist/core/PyContext.js.map +1 -0
  29. package/dist/core/PyIterator.d.ts +84 -0
  30. package/dist/core/PyIterator.d.ts.map +1 -0
  31. package/dist/core/PyIterator.js +243 -0
  32. package/dist/core/PyIterator.js.map +1 -0
  33. package/dist/core/PyModule.d.ts +53 -0
  34. package/dist/core/PyModule.d.ts.map +1 -0
  35. package/dist/core/PyModule.js +162 -0
  36. package/dist/core/PyModule.js.map +1 -0
  37. package/dist/core/PyProxy.d.ts +75 -0
  38. package/dist/core/PyProxy.d.ts.map +1 -0
  39. package/dist/core/PyProxy.js +563 -0
  40. package/dist/core/PyProxy.js.map +1 -0
  41. package/dist/core/PyRuntime.d.ts +112 -0
  42. package/dist/core/PyRuntime.d.ts.map +1 -0
  43. package/dist/core/PyRuntime.js +546 -0
  44. package/dist/core/PyRuntime.js.map +1 -0
  45. package/dist/env/PackageInstaller.d.ts +232 -0
  46. package/dist/env/PackageInstaller.d.ts.map +1 -0
  47. package/dist/env/PackageInstaller.js +628 -0
  48. package/dist/env/PackageInstaller.js.map +1 -0
  49. package/dist/env/ProjectEnvironment.d.ts +63 -0
  50. package/dist/env/ProjectEnvironment.d.ts.map +1 -0
  51. package/dist/env/ProjectEnvironment.js +379 -0
  52. package/dist/env/ProjectEnvironment.js.map +1 -0
  53. package/dist/env/PyfigAdapter.d.ts +32 -0
  54. package/dist/env/PyfigAdapter.d.ts.map +1 -0
  55. package/dist/env/PyfigAdapter.js +10 -0
  56. package/dist/env/PyfigAdapter.js.map +1 -0
  57. package/dist/env/PythonDetector.d.ts +48 -0
  58. package/dist/env/PythonDetector.d.ts.map +1 -0
  59. package/dist/env/PythonDetector.js +182 -0
  60. package/dist/env/PythonDetector.js.map +1 -0
  61. package/dist/env/PythonProvisioner.d.ts +16 -0
  62. package/dist/env/PythonProvisioner.d.ts.map +1 -0
  63. package/dist/env/PythonProvisioner.js +42 -0
  64. package/dist/env/PythonProvisioner.js.map +1 -0
  65. package/dist/env/VenvManager.d.ts +55 -0
  66. package/dist/env/VenvManager.d.ts.map +1 -0
  67. package/dist/env/VenvManager.js +153 -0
  68. package/dist/env/VenvManager.js.map +1 -0
  69. package/dist/env/executables.d.ts +3 -0
  70. package/dist/env/executables.d.ts.map +1 -0
  71. package/dist/env/executables.js +14 -0
  72. package/dist/env/executables.js.map +1 -0
  73. package/dist/index.d.ts +182 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +393 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/native/NativeAddonLoader.d.ts +11 -0
  78. package/dist/native/NativeAddonLoader.d.ts.map +1 -0
  79. package/dist/native/NativeAddonLoader.js +75 -0
  80. package/dist/native/NativeAddonLoader.js.map +1 -0
  81. package/dist/plugins/Plugin.interface.d.ts +41 -0
  82. package/dist/plugins/Plugin.interface.d.ts.map +1 -0
  83. package/dist/plugins/Plugin.interface.js +12 -0
  84. package/dist/plugins/Plugin.interface.js.map +1 -0
  85. package/dist/plugins/PluginManager.d.ts +26 -0
  86. package/dist/plugins/PluginManager.d.ts.map +1 -0
  87. package/dist/plugins/PluginManager.js +174 -0
  88. package/dist/plugins/PluginManager.js.map +1 -0
  89. package/dist/plugins/builtin/NumpyPlugin.d.ts +17 -0
  90. package/dist/plugins/builtin/NumpyPlugin.d.ts.map +1 -0
  91. package/dist/plugins/builtin/NumpyPlugin.js +41 -0
  92. package/dist/plugins/builtin/NumpyPlugin.js.map +1 -0
  93. package/dist/plugins/builtin/PandasPlugin.d.ts +19 -0
  94. package/dist/plugins/builtin/PandasPlugin.d.ts.map +1 -0
  95. package/dist/plugins/builtin/PandasPlugin.js +57 -0
  96. package/dist/plugins/builtin/PandasPlugin.js.map +1 -0
  97. package/dist/plugins/builtin/TorchPlugin.d.ts +23 -0
  98. package/dist/plugins/builtin/TorchPlugin.d.ts.map +1 -0
  99. package/dist/plugins/builtin/TorchPlugin.js +50 -0
  100. package/dist/plugins/builtin/TorchPlugin.js.map +1 -0
  101. package/dist/plugins/index.d.ts +7 -0
  102. package/dist/plugins/index.d.ts.map +1 -0
  103. package/dist/plugins/index.js +12 -0
  104. package/dist/plugins/index.js.map +1 -0
  105. package/dist/serialization/DataFrameBridge.d.ts +141 -0
  106. package/dist/serialization/DataFrameBridge.d.ts.map +1 -0
  107. package/dist/serialization/DataFrameBridge.js +355 -0
  108. package/dist/serialization/DataFrameBridge.js.map +1 -0
  109. package/dist/serialization/MsgPackSerializer.d.ts +45 -0
  110. package/dist/serialization/MsgPackSerializer.d.ts.map +1 -0
  111. package/dist/serialization/MsgPackSerializer.js +242 -0
  112. package/dist/serialization/MsgPackSerializer.js.map +1 -0
  113. package/dist/serialization/NumpyBridge.d.ts +96 -0
  114. package/dist/serialization/NumpyBridge.d.ts.map +1 -0
  115. package/dist/serialization/NumpyBridge.js +323 -0
  116. package/dist/serialization/NumpyBridge.js.map +1 -0
  117. package/dist/serialization/Serializer.d.ts +78 -0
  118. package/dist/serialization/Serializer.d.ts.map +1 -0
  119. package/dist/serialization/Serializer.js +281 -0
  120. package/dist/serialization/Serializer.js.map +1 -0
  121. package/dist/types/addon.d.ts +131 -0
  122. package/dist/types/addon.d.ts.map +1 -0
  123. package/dist/types/addon.js +32 -0
  124. package/dist/types/addon.js.map +1 -0
  125. package/dist/types/config.d.ts +233 -0
  126. package/dist/types/config.d.ts.map +1 -0
  127. package/dist/types/config.js +60 -0
  128. package/dist/types/config.js.map +1 -0
  129. package/dist/types/index.d.ts +10 -0
  130. package/dist/types/index.d.ts.map +1 -0
  131. package/dist/types/index.js +12 -0
  132. package/dist/types/index.js.map +1 -0
  133. package/dist/types/python.d.ts +235 -0
  134. package/dist/types/python.d.ts.map +1 -0
  135. package/dist/types/python.js +7 -0
  136. package/dist/types/python.js.map +1 -0
  137. package/dist/utils/ErrorTranslator.d.ts +83 -0
  138. package/dist/utils/ErrorTranslator.d.ts.map +1 -0
  139. package/dist/utils/ErrorTranslator.js +210 -0
  140. package/dist/utils/ErrorTranslator.js.map +1 -0
  141. package/dist/utils/Locking.d.ts +3 -0
  142. package/dist/utils/Locking.d.ts.map +1 -0
  143. package/dist/utils/Locking.js +10 -0
  144. package/dist/utils/Locking.js.map +1 -0
  145. package/dist/utils/Logger.d.ts +27 -0
  146. package/dist/utils/Logger.d.ts.map +1 -0
  147. package/dist/utils/Logger.js +115 -0
  148. package/dist/utils/Logger.js.map +1 -0
  149. package/dist/utils/MemoryMonitor.d.ts +43 -0
  150. package/dist/utils/MemoryMonitor.d.ts.map +1 -0
  151. package/dist/utils/MemoryMonitor.js +143 -0
  152. package/dist/utils/MemoryMonitor.js.map +1 -0
  153. package/package.json +114 -4
  154. package/python/ast_inspector.py +248 -0
  155. package/python/error_handler.py +432 -0
  156. package/python/isolated_worker.py +94 -0
  157. package/python/pynect_dispatcher.py +382 -0
  158. package/python/pynect_runtime.py +574 -0
  159. package/python/serializer.py +373 -0
  160. package/python/type_inspector.py +315 -0
  161. package/scripts/build-native.js +50 -0
  162. package/scripts/cli.js +21 -0
  163. package/scripts/ensure-native.js +85 -0
  164. package/scripts/postinstall.js +40 -0
  165. package/scripts/pyfig.js +113 -0
  166. package/scripts/python-provisioner.js +23 -0
  167. package/scripts/smoke-python-boundary.js +103 -0
  168. package/src/native/NativeAddonLoader.ts +98 -0
  169. package/src/native/gil_guard.cpp +25 -0
  170. package/src/native/gil_guard.h +174 -0
  171. package/src/native/pynect_addon.cpp +942 -0
  172. package/src/native/python_bridge.cpp +904 -0
  173. package/src/native/python_bridge.h +263 -0
  174. package/src/native/thread_pool.cpp +375 -0
  175. package/src/native/thread_pool.h +185 -0
  176. package/src/native/type_converter.cpp +906 -0
  177. package/src/native/type_converter.h +271 -0
@@ -0,0 +1,141 @@
1
+ /**
2
+ * pynect - DataFrameBridge
3
+ * Converts Pandas DataFrames and Series to/from JavaScript objects.
4
+ *
5
+ * Wire Protocol
6
+ *
7
+ * DataFrames use the "split" orientation of pandas JSON:
8
+ * {
9
+ * "columns": ["col1", "col2", ...],
10
+ * "data": [[row0_val0, row0_val1], [row1_val0, row1_val1], ...],
11
+ * "index": [0, 1, 2, ...],
12
+ * "dtypes": {"col1": "int64", "col2": "object", ...},
13
+ * "shape": [nrows, ncols]
14
+ * }
15
+ *
16
+ * For large DataFrames (>64KB) the JSON is embedded in a MessagePack
17
+ * binary to reduce parse overhead. The format field in SerializedValue
18
+ * tells the bridge which path to take:
19
+ * format === 'pandas_dataframe' -> DataFrame decode
20
+ * format === 'pandas_series' -> Series decode
21
+ *
22
+ * Series wire format:
23
+ * {
24
+ * "name": "my_series",
25
+ * "data": [1, 2, 3, 4],
26
+ * "index": [0, 1, 2, 3],
27
+ * "dtype": "int64",
28
+ * "length": 4
29
+ * }
30
+ *
31
+ * JavaScript representation
32
+ *
33
+ * DataFrameResult (records orientation is built client-side):
34
+ * {
35
+ * columns: string[],
36
+ * data: Record<string, unknown>[], <- row objects
37
+ * index: unknown[],
38
+ * dtypes: Record<string, string>,
39
+ * shape: [number, number]
40
+ * }
41
+ *
42
+ * SeriesResult:
43
+ * {
44
+ * name: string,
45
+ * data: unknown[],
46
+ * index: unknown[],
47
+ * dtype: string,
48
+ * length: number
49
+ * }
50
+ */
51
+ import type { SerializedValue, DataFrameResult, SeriesResult } from '../types/python';
52
+ interface DataFrameSerializeOptions {
53
+ /**
54
+ * Row limit when serializing JS -> Python.
55
+ * Excess rows are truncated. Default: unlimited.
56
+ */
57
+ maxRows?: number;
58
+ /**
59
+ * Use MessagePack instead of JSON for the wire format.
60
+ * Default: true when data size > 64 KB.
61
+ */
62
+ forceMsgPack?: boolean;
63
+ }
64
+ /**
65
+ * DataFrameBridge - bidirectional conversion for Pandas DataFrames and Series.
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * const bridge = new DataFrameBridge();
70
+ *
71
+ * // Deserialize a DataFrame received from Python
72
+ * const df: DataFrameResult = bridge.deserializeDataFrame(sv);
73
+ * console.log(df.columns); // ['city', 'population']
74
+ * console.log(df.data[0]); // { city: 'Algiers', population: 3500000 }
75
+ *
76
+ * // Serialize a records-array back to Python
77
+ * const sv2 = bridge.serializeDataFrame(df.data, df.columns);
78
+ * ```
79
+ */
80
+ export declare class DataFrameBridge {
81
+ /**
82
+ * Deserialize a PANDAS_DATAFRAME SerializedValue -> DataFrameResult.
83
+ */
84
+ deserializeDataFrame(sv: SerializedValue): DataFrameResult;
85
+ /**
86
+ * Deserialize a PANDAS_SERIES SerializedValue -> SeriesResult.
87
+ */
88
+ deserializeSeries(sv: SerializedValue): SeriesResult;
89
+ /**
90
+ * Serialize a records-array (array of row objects) into a PANDAS_DATAFRAME
91
+ * SerializedValue that Python can reconstruct with pd.DataFrame(wire).
92
+ *
93
+ * @param records - array of row objects (e.g. [{col1: val1, col2: val2}, ...])
94
+ * @param columns - explicit column order; inferred from first record if omitted
95
+ */
96
+ serializeDataFrame(records: Record<string, unknown>[], columns?: string[], options?: DataFrameSerializeOptions): SerializedValue;
97
+ /**
98
+ * Serialize a plain array of values into a PANDAS_SERIES SerializedValue.
99
+ *
100
+ * @param data - the series values
101
+ * @param name - series name
102
+ * @param index - optional explicit index
103
+ */
104
+ serializeSeries(data: unknown[], name?: string, index?: unknown[]): SerializedValue;
105
+ /**
106
+ * Convert a DataFrameResult to a 2-D array (column-major).
107
+ * Useful for charting libraries.
108
+ */
109
+ static toColumnArrays(df: DataFrameResult): Record<string, unknown[]>;
110
+ /**
111
+ * Convert a DataFrameResult to a 2-D raw array (no column keys).
112
+ * Row-major: result[row][colIndex].
113
+ */
114
+ static toMatrix(df: DataFrameResult): unknown[][];
115
+ /**
116
+ * Filter rows of a DataFrameResult.
117
+ */
118
+ static filterRows(df: DataFrameResult, predicate: (row: Record<string, unknown>, index: unknown) => boolean): DataFrameResult;
119
+ /**
120
+ * Select specific columns from a DataFrameResult.
121
+ */
122
+ static selectColumns(df: DataFrameResult, cols: string[]): DataFrameResult;
123
+ /**
124
+ * Compute basic descriptive stats for a numeric column in a DataFrameResult.
125
+ */
126
+ static describeColumn(df: DataFrameResult, col: string): {
127
+ count: number;
128
+ mean: number;
129
+ std: number;
130
+ min: number;
131
+ max: number;
132
+ sum: number;
133
+ };
134
+ private _decodeWire;
135
+ private _encodeWire;
136
+ private _buildDataFrameResult;
137
+ private _buildSeriesResult;
138
+ private _inferDtype;
139
+ }
140
+ export {};
141
+ //# sourceMappingURL=DataFrameBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataFrameBridge.d.ts","sourceRoot":"","sources":["../../src/serialization/DataFrameBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAGH,OAAO,KAAK,EACV,eAAe,EAEf,eAAe,EACf,YAAY,EACb,MAAM,iBAAiB,CAAC;AAyBzB,UAAU,yBAAyB;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,eAAe;IAI1B;;OAEG;IACH,oBAAoB,CAAC,EAAE,EAAE,eAAe,GAAG,eAAe;IAU1D;;OAEG;IACH,iBAAiB,CAAC,EAAE,EAAE,eAAe,GAAG,YAAY;IAYpD;;;;;;OAMG;IACH,kBAAkB,CAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAClC,OAAO,CAAC,EAAE,MAAM,EAAE,EAClB,OAAO,GAAE,yBAA8B,GACtC,eAAe;IAiBlB;;;;;;OAMG;IACH,eAAe,CACb,IAAI,EAAE,OAAO,EAAE,EACf,IAAI,GAAE,MAAW,EACjB,KAAK,CAAC,EAAE,OAAO,EAAE,GAChB,eAAe;IAclB;;;OAGG;IACH,MAAM,CAAC,cAAc,CACnB,EAAE,EAAE,eAAe,GAClB,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAQ5B;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,eAAe,GAAG,OAAO,EAAE,EAAE;IAIjD;;OAEG;IACH,MAAM,CAAC,UAAU,CACf,EAAE,EAAE,eAAe,EACnB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,GACnE,eAAe;IAsBlB;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe;IAa1E;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG;QACvD,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;KACb;IAoBD,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,WAAW;CAYpB"}
@@ -0,0 +1,355 @@
1
+ "use strict";
2
+ /**
3
+ * pynect - 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":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * pynect - 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"}