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.
Files changed (184) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +399 -0
  3. package/binding.gyp +73 -0
  4. package/dist/core/PyCallable.d.ts +65 -0
  5. package/dist/core/PyCallable.d.ts.map +1 -0
  6. package/dist/core/PyCallable.js +109 -0
  7. package/dist/core/PyCallable.js.map +1 -0
  8. package/dist/core/PyContext.d.ts +76 -0
  9. package/dist/core/PyContext.d.ts.map +1 -0
  10. package/dist/core/PyContext.js +228 -0
  11. package/dist/core/PyContext.js.map +1 -0
  12. package/dist/core/PyIterator.d.ts +84 -0
  13. package/dist/core/PyIterator.d.ts.map +1 -0
  14. package/dist/core/PyIterator.js +243 -0
  15. package/dist/core/PyIterator.js.map +1 -0
  16. package/dist/core/PyModule.d.ts +55 -0
  17. package/dist/core/PyModule.d.ts.map +1 -0
  18. package/dist/core/PyModule.js +172 -0
  19. package/dist/core/PyModule.js.map +1 -0
  20. package/dist/core/PyProxy.d.ts +65 -0
  21. package/dist/core/PyProxy.d.ts.map +1 -0
  22. package/dist/core/PyProxy.js +483 -0
  23. package/dist/core/PyProxy.js.map +1 -0
  24. package/dist/core/PyRuntime.d.ts +105 -0
  25. package/dist/core/PyRuntime.d.ts.map +1 -0
  26. package/dist/core/PyRuntime.js +438 -0
  27. package/dist/core/PyRuntime.js.map +1 -0
  28. package/dist/env/CondaManager.d.ts +118 -0
  29. package/dist/env/CondaManager.d.ts.map +1 -0
  30. package/dist/env/CondaManager.js +401 -0
  31. package/dist/env/CondaManager.js.map +1 -0
  32. package/dist/env/PackageInstaller.d.ts +233 -0
  33. package/dist/env/PackageInstaller.d.ts.map +1 -0
  34. package/dist/env/PackageInstaller.js +609 -0
  35. package/dist/env/PackageInstaller.js.map +1 -0
  36. package/dist/env/PythonDetector.d.ts +103 -0
  37. package/dist/env/PythonDetector.d.ts.map +1 -0
  38. package/dist/env/PythonDetector.js +381 -0
  39. package/dist/env/PythonDetector.js.map +1 -0
  40. package/dist/env/VenvManager.d.ts +117 -0
  41. package/dist/env/VenvManager.d.ts.map +1 -0
  42. package/dist/env/VenvManager.js +331 -0
  43. package/dist/env/VenvManager.js.map +1 -0
  44. package/dist/index.d.ts +169 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +393 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/plugins/Plugin.interface.d.ts +41 -0
  49. package/dist/plugins/Plugin.interface.d.ts.map +1 -0
  50. package/dist/plugins/Plugin.interface.js +12 -0
  51. package/dist/plugins/Plugin.interface.js.map +1 -0
  52. package/dist/plugins/PluginManager.d.ts +26 -0
  53. package/dist/plugins/PluginManager.d.ts.map +1 -0
  54. package/dist/plugins/PluginManager.js +174 -0
  55. package/dist/plugins/PluginManager.js.map +1 -0
  56. package/dist/plugins/builtin/NumpyPlugin.d.ts +17 -0
  57. package/dist/plugins/builtin/NumpyPlugin.d.ts.map +1 -0
  58. package/dist/plugins/builtin/NumpyPlugin.js +41 -0
  59. package/dist/plugins/builtin/NumpyPlugin.js.map +1 -0
  60. package/dist/plugins/builtin/PandasPlugin.d.ts +19 -0
  61. package/dist/plugins/builtin/PandasPlugin.d.ts.map +1 -0
  62. package/dist/plugins/builtin/PandasPlugin.js +57 -0
  63. package/dist/plugins/builtin/PandasPlugin.js.map +1 -0
  64. package/dist/plugins/builtin/TorchPlugin.d.ts +23 -0
  65. package/dist/plugins/builtin/TorchPlugin.d.ts.map +1 -0
  66. package/dist/plugins/builtin/TorchPlugin.js +50 -0
  67. package/dist/plugins/builtin/TorchPlugin.js.map +1 -0
  68. package/dist/plugins/index.d.ts +7 -0
  69. package/dist/plugins/index.d.ts.map +1 -0
  70. package/dist/plugins/index.js +12 -0
  71. package/dist/plugins/index.js.map +1 -0
  72. package/dist/serialization/DataFrameBridge.d.ts +141 -0
  73. package/dist/serialization/DataFrameBridge.d.ts.map +1 -0
  74. package/dist/serialization/DataFrameBridge.js +355 -0
  75. package/dist/serialization/DataFrameBridge.js.map +1 -0
  76. package/dist/serialization/MsgPackSerializer.d.ts +45 -0
  77. package/dist/serialization/MsgPackSerializer.d.ts.map +1 -0
  78. package/dist/serialization/MsgPackSerializer.js +242 -0
  79. package/dist/serialization/MsgPackSerializer.js.map +1 -0
  80. package/dist/serialization/NumpyBridge.d.ts +96 -0
  81. package/dist/serialization/NumpyBridge.d.ts.map +1 -0
  82. package/dist/serialization/NumpyBridge.js +323 -0
  83. package/dist/serialization/NumpyBridge.js.map +1 -0
  84. package/dist/serialization/Serializer.d.ts +78 -0
  85. package/dist/serialization/Serializer.d.ts.map +1 -0
  86. package/dist/serialization/Serializer.js +281 -0
  87. package/dist/serialization/Serializer.js.map +1 -0
  88. package/dist/types/PythonTypeMapper.d.ts +87 -0
  89. package/dist/types/PythonTypeMapper.d.ts.map +1 -0
  90. package/dist/types/PythonTypeMapper.js +449 -0
  91. package/dist/types/PythonTypeMapper.js.map +1 -0
  92. package/dist/types/StubCache.d.ts +109 -0
  93. package/dist/types/StubCache.d.ts.map +1 -0
  94. package/dist/types/StubCache.js +333 -0
  95. package/dist/types/StubCache.js.map +1 -0
  96. package/dist/types/TypeGenerator.d.ts +139 -0
  97. package/dist/types/TypeGenerator.d.ts.map +1 -0
  98. package/dist/types/TypeGenerator.js +372 -0
  99. package/dist/types/TypeGenerator.js.map +1 -0
  100. package/dist/types/addon.d.ts +114 -0
  101. package/dist/types/addon.d.ts.map +1 -0
  102. package/dist/types/addon.js +32 -0
  103. package/dist/types/addon.js.map +1 -0
  104. package/dist/types/config.d.ts +175 -0
  105. package/dist/types/config.d.ts.map +1 -0
  106. package/dist/types/config.js +35 -0
  107. package/dist/types/config.js.map +1 -0
  108. package/dist/types/index.d.ts +10 -0
  109. package/dist/types/index.d.ts.map +1 -0
  110. package/dist/types/index.js +12 -0
  111. package/dist/types/index.js.map +1 -0
  112. package/dist/types/python.d.ts +235 -0
  113. package/dist/types/python.d.ts.map +1 -0
  114. package/dist/types/python.js +7 -0
  115. package/dist/types/python.js.map +1 -0
  116. package/dist/utils/ErrorTranslator.d.ts +83 -0
  117. package/dist/utils/ErrorTranslator.d.ts.map +1 -0
  118. package/dist/utils/ErrorTranslator.js +210 -0
  119. package/dist/utils/ErrorTranslator.js.map +1 -0
  120. package/dist/utils/Logger.d.ts +27 -0
  121. package/dist/utils/Logger.d.ts.map +1 -0
  122. package/dist/utils/Logger.js +115 -0
  123. package/dist/utils/Logger.js.map +1 -0
  124. package/dist/utils/MemoryMonitor.d.ts +44 -0
  125. package/dist/utils/MemoryMonitor.d.ts.map +1 -0
  126. package/dist/utils/MemoryMonitor.js +143 -0
  127. package/dist/utils/MemoryMonitor.js.map +1 -0
  128. package/package.json +177 -0
  129. package/python/error_handler.py +433 -0
  130. package/python/nodepyx_runtime.py +575 -0
  131. package/python/serializer.py +379 -0
  132. package/python/type_inspector.py +288 -0
  133. package/scripts/build-native.js +68 -0
  134. package/scripts/download-prebuilds.js +99 -0
  135. package/scripts/generate-stubs.js +405 -0
  136. package/scripts/install.js +260 -0
  137. package/src/core/PyCallable.ts +137 -0
  138. package/src/core/PyContext.ts +296 -0
  139. package/src/core/PyIterator.ts +294 -0
  140. package/src/core/PyModule.ts +194 -0
  141. package/src/core/PyProxy.ts +605 -0
  142. package/src/core/PyRuntime.ts +504 -0
  143. package/src/env/CondaManager.ts +451 -0
  144. package/src/env/PackageInstaller.ts +738 -0
  145. package/src/env/PythonDetector.ts +414 -0
  146. package/src/env/VenvManager.ts +396 -0
  147. package/src/index.ts +425 -0
  148. package/src/native/gil_guard.cpp +26 -0
  149. package/src/native/gil_guard.h +175 -0
  150. package/src/native/nodepyx_addon.cpp +886 -0
  151. package/src/native/python_bridge.cpp +790 -0
  152. package/src/native/python_bridge.h +257 -0
  153. package/src/native/thread_pool.cpp +336 -0
  154. package/src/native/thread_pool.h +175 -0
  155. package/src/native/type_converter.cpp +901 -0
  156. package/src/native/type_converter.h +272 -0
  157. package/src/nextjs/PyProvider.tsx +123 -0
  158. package/src/nextjs/index.ts +21 -0
  159. package/src/nextjs/usePython.ts +106 -0
  160. package/src/nextjs/withnodepyx.ts +88 -0
  161. package/src/plugins/Plugin.interface.ts +51 -0
  162. package/src/plugins/PluginManager.ts +155 -0
  163. package/src/plugins/builtin/NumpyPlugin.ts +36 -0
  164. package/src/plugins/builtin/PandasPlugin.ts +49 -0
  165. package/src/plugins/builtin/TorchPlugin.ts +56 -0
  166. package/src/plugins/index.ts +7 -0
  167. package/src/serialization/DataFrameBridge.ts +398 -0
  168. package/src/serialization/MsgPackSerializer.ts +220 -0
  169. package/src/serialization/NumpyBridge.ts +332 -0
  170. package/src/serialization/Serializer.ts +320 -0
  171. package/src/types/PythonTypeMapper.ts +495 -0
  172. package/src/types/StubCache.ts +340 -0
  173. package/src/types/TypeGenerator.ts +491 -0
  174. package/src/types/addon.ts +170 -0
  175. package/src/types/config.ts +226 -0
  176. package/src/types/index.ts +55 -0
  177. package/src/types/python.ts +309 -0
  178. package/src/types/stubs/numpy.d.ts +441 -0
  179. package/src/types/stubs/pandas.d.ts +575 -0
  180. package/src/types/stubs/sklearn.d.ts +728 -0
  181. package/src/types/stubs/torch.d.ts +694 -0
  182. package/src/utils/ErrorTranslator.ts +220 -0
  183. package/src/utils/Logger.ts +119 -0
  184. package/src/utils/MemoryMonitor.ts +175 -0
@@ -0,0 +1,483 @@
1
+ "use strict";
2
+ /**
3
+ * nodepyx — PyProxy
4
+ *
5
+ * The heart of nodepyx's JavaScript API.
6
+ * Every Python object is represented as a PyProxy — a JavaScript Proxy that:
7
+ *
8
+ * 1. Intercepts property access → creates lazy child PyProxy
9
+ * 2. Intercepts function call → sends to Python worker thread
10
+ * 3. Intercepts `then` → resolves the proxy chain into a value (makes it awaitable)
11
+ * 4. Intercepts Symbol.iterator → enables for...of loops
12
+ * 5. Intercepts Symbol.asyncIterator → enables for await...of loops
13
+ * 6. Intercepts property assignment → sets Python attribute
14
+ *
15
+ * The key insight: attributes are NOT resolved eagerly. The chain
16
+ * `df.groupby('country').agg({'sales': 'sum'}).reset_index()`
17
+ * creates a chain of PyProxy objects, each recording the operation,
18
+ * and only executes when you `await` the final result.
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.PyProxy = exports.PYPROXY_PATH = exports.PYPROXY_OBJECTID = exports.PYPROXY_INTERNAL = void 0;
22
+ exports.isPyProxy = isPyProxy;
23
+ const ErrorTranslator_1 = require("../utils/ErrorTranslator");
24
+ const Logger_1 = require("../utils/Logger");
25
+ const logger = new Logger_1.Logger('PyProxy');
26
+ // Internal symbols used to brand PyProxy and access internals
27
+ exports.PYPROXY_INTERNAL = Symbol('nodepyx.internal');
28
+ exports.PYPROXY_OBJECTID = Symbol('nodepyx.objectId');
29
+ exports.PYPROXY_PATH = Symbol('nodepyx.path');
30
+ /**
31
+ * PyProxy — wraps any Python object in JavaScript.
32
+ *
33
+ * Usage:
34
+ * ```typescript
35
+ * const pd = await py.import('pandas');
36
+ * const df = await pd.read_csv('data.csv'); // df is a PyProxy
37
+ * const rows = await df.describe().to_dict('records'); // chained calls
38
+ * ```
39
+ */
40
+ class PyProxy {
41
+ /** Internal state — do not access directly from outside */
42
+ [exports.PYPROXY_INTERNAL];
43
+ constructor(internal) {
44
+ this[exports.PYPROXY_INTERNAL] = internal;
45
+ return new Proxy(this, PyProxy.handler);
46
+ }
47
+ // ─── Proxy Handler ─────────────────────────────────────────────────────────
48
+ static handler = {
49
+ get(target, prop, receiver) {
50
+ const internal = target[exports.PYPROXY_INTERNAL];
51
+ // ── Internal Symbol Access ──────────────────────────────────────────
52
+ if (prop === exports.PYPROXY_INTERNAL || prop === exports.PYPROXY_OBJECTID || prop === exports.PYPROXY_PATH) {
53
+ return Reflect.get(target, prop, receiver);
54
+ }
55
+ // ── JavaScript built-in symbols ──────────────────────────────────────
56
+ if (typeof prop === 'symbol') {
57
+ // Make for...of work (synchronous iteration via async iterator)
58
+ if (prop === Symbol.asyncIterator) {
59
+ return () => target._makeAsyncIterator(internal);
60
+ }
61
+ // Symbol.iterator — not directly supported for Python objects
62
+ if (prop === Symbol.iterator) {
63
+ return () => {
64
+ throw new Error('Python objects are not synchronously iterable from JavaScript. ' +
65
+ 'Use "for await...of" instead.');
66
+ };
67
+ }
68
+ // Symbol.toPrimitive — for coercion
69
+ if (prop === Symbol.toPrimitive) {
70
+ return (hint) => {
71
+ if (hint === 'string') {
72
+ return `[PyProxy id=${internal.objectId}]`;
73
+ }
74
+ return NaN;
75
+ };
76
+ }
77
+ // Symbol.toStringTag
78
+ if (prop === Symbol.toStringTag) {
79
+ return 'PyProxy';
80
+ }
81
+ return Reflect.get(target, prop, receiver);
82
+ }
83
+ // ── toString / valueOf ────────────────────────────────────────────────
84
+ if (prop === 'toString') {
85
+ return () => `[PyProxy id=${internal.objectId} path=${internal.path.join('.')}]`;
86
+ }
87
+ if (prop === 'valueOf') {
88
+ return () => target;
89
+ }
90
+ // ── then (Thenable — makes it work with await) ─────────────────────────
91
+ if (prop === 'then') {
92
+ return (onfulfilled, onrejected) => {
93
+ return target._resolve(internal).then(onfulfilled, onrejected);
94
+ };
95
+ }
96
+ // ── catch / finally (Promise chain support) ───────────────────────────
97
+ if (prop === 'catch') {
98
+ return (onrejected) => target._resolve(internal).catch(onrejected);
99
+ }
100
+ if (prop === 'finally') {
101
+ return (onfinally) => target._resolve(internal).finally(onfinally);
102
+ }
103
+ // ── Internal nodepyx methods ───────────────────────────────────────────
104
+ if (prop.startsWith('__nodepyx_')) {
105
+ return Reflect.get(target, prop, receiver);
106
+ }
107
+ // ── Check child cache (optimization) ──────────────────────────────────
108
+ if (internal.childCache.has(prop)) {
109
+ return internal.childCache.get(prop);
110
+ }
111
+ // ── Create lazy child PyProxy ──────────────────────────────────────────
112
+ const childInternal = {
113
+ objectId: internal.objectId,
114
+ path: [...internal.path, prop],
115
+ addon: internal.addon,
116
+ isResolved: false,
117
+ callTimeout: internal.callTimeout,
118
+ childCache: new Map(),
119
+ };
120
+ const child = new PyProxy(childInternal);
121
+ // Cache it for repeated access
122
+ if (internal.addon) {
123
+ internal.childCache.set(prop, child);
124
+ }
125
+ return child;
126
+ },
127
+ // ── Function call (proxy() or proxy.method()) ──────────────────────────
128
+ apply(target, _thisArg, args) {
129
+ const internal = target[exports.PYPROXY_INTERNAL];
130
+ return target._call(internal, args);
131
+ },
132
+ // ── Property assignment ────────────────────────────────────────────────
133
+ set(target, prop, value) {
134
+ const internal = target[exports.PYPROXY_INTERNAL];
135
+ if (typeof prop === 'symbol' || prop.startsWith('__nodepyx_')) {
136
+ return Reflect.set(target, prop, value);
137
+ }
138
+ // Schedule async setAttribute (best-effort, no await)
139
+ target._setAttr(internal, String(prop), value).catch(err => {
140
+ logger.error(`Failed to set Python attribute '${String(prop)}'`, err);
141
+ });
142
+ return true;
143
+ },
144
+ // ── has() — needed for 'in' operator ──────────────────────────────────
145
+ has(_target, _prop) {
146
+ // We can't know without checking Python; return true for everything
147
+ return true;
148
+ },
149
+ // ── deleteProperty ────────────────────────────────────────────────────
150
+ deleteProperty(target, prop) {
151
+ if (typeof prop === 'string') {
152
+ const internal = target[exports.PYPROXY_INTERNAL];
153
+ internal.addon.deleteAttribute(internal.objectId, prop).catch(err => {
154
+ logger.error(`Failed to delete Python attribute '${prop}'`, err);
155
+ });
156
+ internal.childCache.delete(prop);
157
+ }
158
+ return true;
159
+ },
160
+ // ── ownKeys — for Object.keys() ───────────────────────────────────────
161
+ ownKeys(_target) {
162
+ // Can't synchronously get Python keys; return empty
163
+ return [];
164
+ },
165
+ getOwnPropertyDescriptor(_target, prop) {
166
+ if (typeof prop === 'symbol') {
167
+ return undefined;
168
+ }
169
+ return {
170
+ enumerable: false,
171
+ configurable: true,
172
+ writable: false,
173
+ value: undefined,
174
+ };
175
+ },
176
+ };
177
+ // ─── Resolution (await) ────────────────────────────────────────────────────
178
+ async _resolve(internal) {
179
+ try {
180
+ const addon = internal.addon;
181
+ if (internal.path.length === 0) {
182
+ // Resolve the object itself
183
+ const result = await addon.getObjectValue(internal.objectId);
184
+ return PyProxy._deserializeAddonResult(result, internal);
185
+ }
186
+ // Resolve attribute path
187
+ const result = await addon.getAttributePath(internal.objectId, internal.path);
188
+ return PyProxy._deserializeAddonResult(result, internal);
189
+ }
190
+ catch (err) {
191
+ if (err && typeof err === 'object' && 'pythonType' in err) {
192
+ throw (0, ErrorTranslator_1.translatePythonError)({
193
+ type: err.pythonType,
194
+ message: err.message,
195
+ traceback: err.pythonTraceback || '',
196
+ });
197
+ }
198
+ throw err;
199
+ }
200
+ }
201
+ // ─── Function Call ─────────────────────────────────────────────────────────
202
+ async _call(internal, args) {
203
+ try {
204
+ const addon = internal.addon;
205
+ // Serialize arguments
206
+ const serializedArgs = await Promise.all(args.map(arg => PyProxy._serializeArg(arg)));
207
+ const callOptions = {
208
+ args: serializedArgs,
209
+ kwargs: {},
210
+ timeout: internal.callTimeout,
211
+ };
212
+ // If last arg is a plain object (not PyProxy/Array), treat as kwargs
213
+ if (args.length > 0) {
214
+ const lastArg = args[args.length - 1];
215
+ if (lastArg !== null &&
216
+ typeof lastArg === 'object' &&
217
+ !Array.isArray(lastArg) &&
218
+ !(lastArg instanceof PyProxy) &&
219
+ !(lastArg instanceof ArrayBuffer) &&
220
+ !ArrayBuffer.isView(lastArg) &&
221
+ !('__pyref__' in lastArg) &&
222
+ PyProxy._isPlainObject(lastArg)) {
223
+ // Treat as kwargs
224
+ callOptions.args = serializedArgs.slice(0, -1);
225
+ const kwargsEntries = await Promise.all(Object.entries(lastArg).map(async ([k, v]) => [k, await PyProxy._serializeArg(v)]));
226
+ callOptions.kwargs = Object.fromEntries(kwargsEntries);
227
+ }
228
+ }
229
+ const result = await addon.callFunction(internal.objectId, internal.path, callOptions);
230
+ return PyProxy._deserializeAddonResult(result, internal);
231
+ }
232
+ catch (err) {
233
+ if (err && typeof err === 'object' && 'pythonType' in err) {
234
+ throw (0, ErrorTranslator_1.translatePythonError)({
235
+ type: err.pythonType,
236
+ message: err.message,
237
+ traceback: err.pythonTraceback || '',
238
+ });
239
+ }
240
+ throw err;
241
+ }
242
+ }
243
+ // ─── Async Iterator (for await...of) ──────────────────────────────────────
244
+ async *_makeAsyncIterator(internal) {
245
+ const addon = internal.addon;
246
+ // Create Python iterator
247
+ const iterResult = await addon.createIterator(internal.objectId, internal.path);
248
+ const iteratorResult = iterResult;
249
+ if (!iteratorResult.success) {
250
+ const err = iteratorResult.error;
251
+ if (err) {
252
+ throw (0, ErrorTranslator_1.translatePythonError)({
253
+ type: err.type,
254
+ message: err.message,
255
+ traceback: err.traceback || '',
256
+ });
257
+ }
258
+ throw new Error('Failed to create Python iterator');
259
+ }
260
+ // Parse iteratorId from resultJson
261
+ let iteratorId;
262
+ try {
263
+ const parsed = JSON.parse(iterResult.resultJson || '{}');
264
+ iteratorId = parsed.iteratorId;
265
+ }
266
+ catch {
267
+ throw new Error('Failed to parse iterator ID');
268
+ }
269
+ if (!iteratorId) {
270
+ throw new Error('Iterator ID not returned from Python');
271
+ }
272
+ try {
273
+ while (true) {
274
+ const next = await addon.iteratorNext(iteratorId);
275
+ const nextResult = next;
276
+ if (!nextResult.success) {
277
+ break;
278
+ }
279
+ let parsed;
280
+ try {
281
+ parsed = JSON.parse(nextResult.resultJson || '{"done":true}');
282
+ }
283
+ catch {
284
+ break;
285
+ }
286
+ if (parsed.done) {
287
+ break;
288
+ }
289
+ // Deserialize the value
290
+ const value = parsed.value;
291
+ if (value && typeof value === 'object' && '__pyref__' in value) {
292
+ const refId = value.__pyref__;
293
+ yield PyProxy._createFromObjectId(refId, [], addon, internal.callTimeout);
294
+ }
295
+ else {
296
+ yield value;
297
+ }
298
+ }
299
+ }
300
+ finally {
301
+ // Always destroy the iterator
302
+ await addon.destroyIterator(iteratorId).catch(() => { });
303
+ }
304
+ }
305
+ // ─── Set Attribute ────────────────────────────────────────────────────────
306
+ async _setAttr(internal, propName, value) {
307
+ const serialized = await PyProxy._serializeArg(value);
308
+ await internal.addon.setAttribute(internal.objectId, propName, serialized);
309
+ // Invalidate cache
310
+ internal.childCache.delete(propName);
311
+ }
312
+ // ─── Static Helpers ────────────────────────────────────────────────────────
313
+ static _createFromObjectId(objectId, path, addon, callTimeout) {
314
+ return new PyProxy({
315
+ objectId,
316
+ path,
317
+ addon,
318
+ isResolved: false,
319
+ callTimeout,
320
+ childCache: new Map(),
321
+ });
322
+ }
323
+ static _deserializeAddonResult(result, internal) {
324
+ const r = result;
325
+ if (!r.success) {
326
+ if (r.error) {
327
+ throw (0, ErrorTranslator_1.translatePythonError)({
328
+ type: r.error.type,
329
+ message: r.error.message,
330
+ traceback: r.error.traceback || '',
331
+ });
332
+ }
333
+ throw new Error('Python call failed without error details');
334
+ }
335
+ if (r.isObject && r.objectId) {
336
+ // Result is a Python object — wrap in PyProxy
337
+ return PyProxy._createFromObjectId(r.objectId, [], internal.addon, internal.callTimeout);
338
+ }
339
+ // Deserialize JSON result
340
+ if (r.resultJson !== undefined && r.resultJson !== null) {
341
+ try {
342
+ const parsed = JSON.parse(r.resultJson);
343
+ if (parsed && typeof parsed === 'object' && '__pyref__' in parsed) {
344
+ return PyProxy._createFromObjectId(parsed.__pyref__, [], internal.addon, internal.callTimeout);
345
+ }
346
+ return parsed;
347
+ }
348
+ catch {
349
+ return r.resultJson;
350
+ }
351
+ }
352
+ return null;
353
+ }
354
+ static async _serializeArg(value) {
355
+ // Already a SerializedValue
356
+ if (value !== null &&
357
+ typeof value === 'object' &&
358
+ 'format' in value) {
359
+ return value;
360
+ }
361
+ // PyProxy → pass as Python reference
362
+ if (value instanceof PyProxy) {
363
+ const internal = value[exports.PYPROXY_INTERNAL];
364
+ // If proxy has a path, resolve it first to get the objectId
365
+ if (internal.path.length > 0) {
366
+ // We need to resolve it — for now, keep as reference
367
+ // Production: could pre-resolve path to objectId
368
+ }
369
+ return {
370
+ format: 6, // PYTHON_REF
371
+ data: null,
372
+ metadata: { objectId: internal.objectId },
373
+ };
374
+ }
375
+ // null / undefined
376
+ if (value === null || value === undefined) {
377
+ return { format: 0, data: 'null', metadata: {} };
378
+ }
379
+ // TypedArrays → numpy-compatible binary
380
+ if (value instanceof Float32Array ||
381
+ value instanceof Float64Array ||
382
+ value instanceof Int8Array ||
383
+ value instanceof Int16Array ||
384
+ value instanceof Int32Array ||
385
+ value instanceof Uint8Array ||
386
+ value instanceof Uint16Array ||
387
+ value instanceof Uint32Array ||
388
+ value instanceof BigInt64Array ||
389
+ value instanceof BigUint64Array) {
390
+ const ta = value;
391
+ const dtype = PyProxy._getTypedArrayDtype(ta);
392
+ return {
393
+ format: 2, // NUMPY_ARRAY
394
+ data: new Uint8Array(ta.buffer, ta.byteOffset, ta.byteLength),
395
+ metadata: {
396
+ dtype,
397
+ shape: [ta.length],
398
+ },
399
+ };
400
+ }
401
+ // ArrayBuffer
402
+ if (value instanceof ArrayBuffer) {
403
+ return {
404
+ format: 7, // BYTES
405
+ data: new Uint8Array(value),
406
+ metadata: {},
407
+ };
408
+ }
409
+ // Primitive types
410
+ if (typeof value === 'number' ||
411
+ typeof value === 'string' ||
412
+ typeof value === 'boolean') {
413
+ return {
414
+ format: 0, // JSON
415
+ data: JSON.stringify(value),
416
+ metadata: {},
417
+ };
418
+ }
419
+ // Array or object — use JSON
420
+ try {
421
+ return {
422
+ format: 0, // JSON
423
+ data: JSON.stringify(value),
424
+ metadata: {},
425
+ };
426
+ }
427
+ catch {
428
+ // Can't serialize — this shouldn't happen for plain objects
429
+ return { format: 8, data: null, metadata: {} }; // NONE
430
+ }
431
+ }
432
+ static _getTypedArrayDtype(arr) {
433
+ if (arr instanceof Float32Array) {
434
+ return 'float32';
435
+ }
436
+ if (arr instanceof Float64Array) {
437
+ return 'float64';
438
+ }
439
+ if (arr instanceof Int8Array) {
440
+ return 'int8';
441
+ }
442
+ if (arr instanceof Int16Array) {
443
+ return 'int16';
444
+ }
445
+ if (arr instanceof Int32Array) {
446
+ return 'int32';
447
+ }
448
+ if (arr instanceof BigInt64Array) {
449
+ return 'int64';
450
+ }
451
+ if (arr instanceof Uint8Array) {
452
+ return 'uint8';
453
+ }
454
+ if (arr instanceof Uint16Array) {
455
+ return 'uint16';
456
+ }
457
+ if (arr instanceof Uint32Array) {
458
+ return 'uint32';
459
+ }
460
+ if (arr instanceof BigUint64Array) {
461
+ return 'uint64';
462
+ }
463
+ return 'uint8';
464
+ }
465
+ static _isPlainObject(obj) {
466
+ if (!obj || typeof obj !== 'object') {
467
+ return false;
468
+ }
469
+ const proto = Object.getPrototypeOf(obj);
470
+ return proto === null || proto === Object.prototype;
471
+ }
472
+ }
473
+ exports.PyProxy = PyProxy;
474
+ /**
475
+ * Check if a value is a PyProxy.
476
+ */
477
+ function isPyProxy(value) {
478
+ return (value instanceof PyProxy ||
479
+ (value !== null &&
480
+ typeof value === 'object' &&
481
+ exports.PYPROXY_INTERNAL in value));
482
+ }
483
+ //# sourceMappingURL=PyProxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PyProxy.js","sourceRoot":"","sources":["../../src/core/PyProxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * nodepyx — PyRuntime
3
+ * The central manager for the Python interpreter lifecycle.
4
+ * Creates, configures, and shuts down the embedded CPython instance.
5
+ */
6
+ import type { NativeAddon } from '../types/addon';
7
+ import type { nodepyxConfig, ResolvednodepyxConfig } from '../types/config';
8
+ import { PyModule } from './PyModule';
9
+ import { PyContext } from './PyContext';
10
+ /**
11
+ * PyRuntime — manages the lifecycle of the embedded Python interpreter.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const runtime = await PyRuntime.create({
16
+ * virtualenv: { path: '.venv', packages: ['pandas'], autoInstall: true },
17
+ * });
18
+ *
19
+ * const pd = await runtime.import('pandas');
20
+ * const df = await pd.read_csv('data.csv');
21
+ * const result = await df.to_dict('records');
22
+ *
23
+ * await runtime.shutdown();
24
+ * ```
25
+ */
26
+ export declare class PyRuntime {
27
+ private readonly _config;
28
+ private readonly _addon;
29
+ private readonly _serializer;
30
+ private readonly _typeGenerator;
31
+ private readonly _pluginManager;
32
+ private readonly _memoryMonitor;
33
+ private readonly _moduleCache;
34
+ private _running;
35
+ private constructor();
36
+ /**
37
+ * Create and initialize a PyRuntime instance.
38
+ */
39
+ static create(config?: nodepyxConfig): Promise<PyRuntime>;
40
+ private _initialize;
41
+ private _setupPythonEnvironment;
42
+ private _bootstrapPythonRuntime;
43
+ /**
44
+ * Import a Python module and return a PyProxy.
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * const pd = await runtime.import('pandas');
49
+ * const df = await pd.read_csv('data.csv');
50
+ * ```
51
+ */
52
+ import(moduleName: string): Promise<PyModule>;
53
+ /**
54
+ * Import multiple modules at once (concurrent).
55
+ */
56
+ importAll(moduleNames: string[]): Promise<Record<string, PyModule>>;
57
+ /**
58
+ * Evaluate a Python expression.
59
+ */
60
+ eval(expression: string): Promise<unknown>;
61
+ /**
62
+ * Execute Python statements.
63
+ */
64
+ exec(code: string): Promise<void>;
65
+ /**
66
+ * Run a Python script file.
67
+ */
68
+ runFile(filePath: string): Promise<unknown>;
69
+ /**
70
+ * Create an isolated Python execution context.
71
+ */
72
+ createContext(): Promise<PyContext>;
73
+ /**
74
+ * Install Python packages into the active environment.
75
+ */
76
+ installPackages(packages: string[]): Promise<void>;
77
+ /**
78
+ * Get current memory statistics.
79
+ */
80
+ getMemoryStats(): ReturnType<NativeAddon['getMemoryStats']>;
81
+ /**
82
+ * Trigger Python garbage collection.
83
+ */
84
+ collectGarbage(): Promise<void>;
85
+ /**
86
+ * Get the underlying native addon.
87
+ * Advanced use only.
88
+ */
89
+ getAddon(): NativeAddon;
90
+ isRunning(): boolean;
91
+ getConfig(): ResolvednodepyxConfig;
92
+ /**
93
+ * Gracefully shut down the Python runtime.
94
+ * Releases all Python objects and finalizes the interpreter.
95
+ */
96
+ shutdown(): Promise<void>;
97
+ /**
98
+ * Synchronous shutdown (for process.on('exit') handler).
99
+ * Best-effort only — may not complete all cleanup.
100
+ */
101
+ shutdownSync(): void;
102
+ private _ensureRunning;
103
+ private _parseBytes;
104
+ }
105
+ //# sourceMappingURL=PyRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PyRuntime.d.ts","sourceRoot":"","sources":["../../src/core/PyRuntime.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAG5E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAkBxC;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+B;IAC5D,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO;IAYP;;OAEG;WACU,MAAM,CAAC,MAAM,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;YA4BrD,WAAW;YAyCX,uBAAuB;YAkCvB,uBAAuB;IA8BrC;;;;;;;;OAQG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IA0DnD;;OAEG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IASzE;;OAEG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0ChD;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBvC;;OAEG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BjD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC;IAOzC;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxD;;OAEG;IACH,cAAc,IAAI,UAAU,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAK3D;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrC;;;OAGG;IACH,QAAQ,IAAI,WAAW;IAMvB,SAAS,IAAI,OAAO;IAIpB,SAAS,IAAI,qBAAqB;IAMlC;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB/B;;;OAGG;IACH,YAAY,IAAI,IAAI;IAWpB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,WAAW;CAUpB"}