pynect 0.0.0 → 0.2.1
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 +1 -1
- package/README.md +503 -2
- package/SECURITY.md +34 -0
- package/binding.gyp +67 -0
- package/dist/cli/codegen.d.ts +3 -0
- package/dist/cli/codegen.d.ts.map +1 -0
- package/dist/cli/codegen.js +543 -0
- package/dist/cli/codegen.js.map +1 -0
- package/dist/cli/sync.d.ts +3 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +47 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/config/project.d.ts +113 -0
- package/dist/config/project.d.ts.map +1 -0
- package/dist/config/project.js +344 -0
- package/dist/config/project.js.map +1 -0
- package/dist/core/isolated-worker.d.ts +39 -0
- package/dist/core/isolated-worker.d.ts.map +1 -0
- package/dist/core/isolated-worker.js +178 -0
- package/dist/core/isolated-worker.js.map +1 -0
- package/dist/core/py-callable.d.ts +67 -0
- package/dist/core/py-callable.d.ts.map +1 -0
- package/dist/core/py-callable.js +104 -0
- package/dist/core/py-callable.js.map +1 -0
- package/dist/core/py-context.d.ts +76 -0
- package/dist/core/py-context.d.ts.map +1 -0
- package/dist/core/py-context.js +239 -0
- package/dist/core/py-context.js.map +1 -0
- package/dist/core/py-iterator.d.ts +84 -0
- package/dist/core/py-iterator.d.ts.map +1 -0
- package/dist/core/py-iterator.js +243 -0
- package/dist/core/py-iterator.js.map +1 -0
- package/dist/core/py-module.d.ts +53 -0
- package/dist/core/py-module.d.ts.map +1 -0
- package/dist/core/py-module.js +162 -0
- package/dist/core/py-module.js.map +1 -0
- package/dist/core/py-proxy.d.ts +75 -0
- package/dist/core/py-proxy.d.ts.map +1 -0
- package/dist/core/py-proxy.js +563 -0
- package/dist/core/py-proxy.js.map +1 -0
- package/dist/core/py-runtime.d.ts +113 -0
- package/dist/core/py-runtime.d.ts.map +1 -0
- package/dist/core/py-runtime.js +528 -0
- package/dist/core/py-runtime.js.map +1 -0
- package/dist/env/executables.d.ts +3 -0
- package/dist/env/executables.d.ts.map +1 -0
- package/dist/env/executables.js +14 -0
- package/dist/env/executables.js.map +1 -0
- package/dist/env/package-installer.d.ts +232 -0
- package/dist/env/package-installer.d.ts.map +1 -0
- package/dist/env/package-installer.js +615 -0
- package/dist/env/package-installer.js.map +1 -0
- package/dist/env/project-environment.d.ts +64 -0
- package/dist/env/project-environment.d.ts.map +1 -0
- package/dist/env/project-environment.js +388 -0
- package/dist/env/project-environment.js.map +1 -0
- package/dist/env/pyfig-adapter.d.ts +38 -0
- package/dist/env/pyfig-adapter.d.ts.map +1 -0
- package/dist/env/pyfig-adapter.js +10 -0
- package/dist/env/pyfig-adapter.js.map +1 -0
- package/dist/env/python-detector.d.ts +48 -0
- package/dist/env/python-detector.d.ts.map +1 -0
- package/dist/env/python-detector.js +182 -0
- package/dist/env/python-detector.js.map +1 -0
- package/dist/env/python-provisioner.d.ts +16 -0
- package/dist/env/python-provisioner.d.ts.map +1 -0
- package/dist/env/python-provisioner.js +42 -0
- package/dist/env/python-provisioner.js.map +1 -0
- package/dist/env/venv-manager.d.ts +56 -0
- package/dist/env/venv-manager.d.ts.map +1 -0
- package/dist/env/venv-manager.js +160 -0
- package/dist/env/venv-manager.js.map +1 -0
- package/dist/index.d.ts +182 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +394 -0
- package/dist/index.js.map +1 -0
- package/dist/native/native-addon-loader.d.ts +13 -0
- package/dist/native/native-addon-loader.d.ts.map +1 -0
- package/dist/native/native-addon-loader.js +171 -0
- package/dist/native/native-addon-loader.js.map +1 -0
- package/dist/plugins/builtin/numpy-plugin.d.ts +17 -0
- package/dist/plugins/builtin/numpy-plugin.d.ts.map +1 -0
- package/dist/plugins/builtin/numpy-plugin.js +41 -0
- package/dist/plugins/builtin/numpy-plugin.js.map +1 -0
- package/dist/plugins/builtin/pandas-plugin.d.ts +19 -0
- package/dist/plugins/builtin/pandas-plugin.d.ts.map +1 -0
- package/dist/plugins/builtin/pandas-plugin.js +57 -0
- package/dist/plugins/builtin/pandas-plugin.js.map +1 -0
- package/dist/plugins/builtin/torch-plugin.d.ts +23 -0
- package/dist/plugins/builtin/torch-plugin.d.ts.map +1 -0
- package/dist/plugins/builtin/torch-plugin.js +50 -0
- package/dist/plugins/builtin/torch-plugin.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/plugins/plugin-manager.d.ts +26 -0
- package/dist/plugins/plugin-manager.d.ts.map +1 -0
- package/dist/plugins/plugin-manager.js +174 -0
- package/dist/plugins/plugin-manager.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/serialization/data-frame-bridge.d.ts +141 -0
- package/dist/serialization/data-frame-bridge.d.ts.map +1 -0
- package/dist/serialization/data-frame-bridge.js +355 -0
- package/dist/serialization/data-frame-bridge.js.map +1 -0
- package/dist/serialization/msg-pack-serializer.d.ts +45 -0
- package/dist/serialization/msg-pack-serializer.d.ts.map +1 -0
- package/dist/serialization/msg-pack-serializer.js +242 -0
- package/dist/serialization/msg-pack-serializer.js.map +1 -0
- package/dist/serialization/numpy-bridge.d.ts +96 -0
- package/dist/serialization/numpy-bridge.d.ts.map +1 -0
- package/dist/serialization/numpy-bridge.js +323 -0
- package/dist/serialization/numpy-bridge.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/addon.d.ts +131 -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 +236 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +61 -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/error-translator.d.ts +83 -0
- package/dist/utils/error-translator.d.ts.map +1 -0
- package/dist/utils/error-translator.js +210 -0
- package/dist/utils/error-translator.js.map +1 -0
- package/dist/utils/locking.d.ts +3 -0
- package/dist/utils/locking.d.ts.map +1 -0
- package/dist/utils/locking.js +10 -0
- package/dist/utils/locking.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/memory-monitor.d.ts +43 -0
- package/dist/utils/memory-monitor.d.ts.map +1 -0
- package/dist/utils/memory-monitor.js +143 -0
- package/dist/utils/memory-monitor.js.map +1 -0
- package/package.json +93 -17
- package/prebuilds/darwin-arm64/pynect-prebuild.json +8 -0
- package/prebuilds/darwin-arm64/pynect_addon.node +0 -0
- package/prebuilds/darwin-x64/pynect-prebuild.json +8 -0
- package/prebuilds/darwin-x64/pynect_addon.node +0 -0
- package/prebuilds/linux-arm64/pynect-prebuild.json +9 -0
- package/prebuilds/linux-arm64/pynect_addon.node +0 -0
- package/prebuilds/linux-x64/pynect-prebuild.json +9 -0
- package/prebuilds/linux-x64/pynect_addon.node +0 -0
- package/prebuilds/win32-arm64/pynect-prebuild.json +8 -0
- package/prebuilds/win32-arm64/pynect_addon.node +0 -0
- package/prebuilds/win32-x64/pynect-prebuild.json +8 -0
- package/prebuilds/win32-x64/pynect_addon.node +0 -0
- package/python/ast_inspector.py +248 -0
- package/python/error_handler.py +432 -0
- package/python/isolated_worker.py +94 -0
- package/python/pynect_dispatcher.py +382 -0
- package/python/pynect_runtime.py +574 -0
- package/python/serializer.py +373 -0
- package/python/type_inspector.py +315 -0
- package/scripts/build-native.js +50 -0
- package/scripts/cli.js +21 -0
- package/scripts/ensure-native.js +85 -0
- package/scripts/postinstall.js +40 -0
- package/scripts/pyfig.js +128 -0
- package/scripts/python-provisioner.js +23 -0
- package/scripts/smoke-python-boundary.js +103 -0
- package/src/native/gil_guard.cpp +25 -0
- package/src/native/gil_guard.h +174 -0
- package/src/native/native-addon-loader.ts +218 -0
- package/src/native/pynect_addon.cpp +942 -0
- package/src/native/python_bridge.cpp +904 -0
- package/src/native/python_bridge.h +263 -0
- package/src/native/thread_pool.cpp +375 -0
- package/src/native/thread_pool.h +185 -0
- package/src/native/type_converter.cpp +906 -0
- package/src/native/type_converter.h +271 -0
- package/index.d.ts +0 -3
- package/index.js +0 -3
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* pynect - PyProxy
|
|
4
|
+
*
|
|
5
|
+
* The heart of pynect'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.PYNECT_WITH_OPTIONS = exports.PYPROXY_PATH = exports.PYPROXY_OBJECTID = exports.PYPROXY_INTERNAL = void 0;
|
|
22
|
+
exports.isPyProxy = isPyProxy;
|
|
23
|
+
const error_translator_1 = require("../utils/error-translator");
|
|
24
|
+
const logger_1 = require("../utils/logger");
|
|
25
|
+
const logger = new logger_1.Logger('PyProxy');
|
|
26
|
+
let nextRequestId = 0;
|
|
27
|
+
// Internal symbols used to brand PyProxy and access internals
|
|
28
|
+
exports.PYPROXY_INTERNAL = Symbol('pynect.internal');
|
|
29
|
+
exports.PYPROXY_OBJECTID = Symbol('pynect.objectId');
|
|
30
|
+
exports.PYPROXY_PATH = Symbol('pynect.path');
|
|
31
|
+
exports.PYNECT_WITH_OPTIONS = Symbol.for('pynect.withOptions');
|
|
32
|
+
/**
|
|
33
|
+
* PyProxy - wraps any Python object in JavaScript.
|
|
34
|
+
*
|
|
35
|
+
* Usage:
|
|
36
|
+
* ```typescript
|
|
37
|
+
* const pd = await py.import('pandas');
|
|
38
|
+
* const df = await pd.read_csv('data.csv'); // df is a PyProxy
|
|
39
|
+
* const rows = await df.describe().to_dict('records'); // chained calls
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
class PyProxy {
|
|
43
|
+
/** Internal state - do not access directly from outside */
|
|
44
|
+
[exports.PYPROXY_INTERNAL];
|
|
45
|
+
constructor(internal) {
|
|
46
|
+
this[exports.PYPROXY_INTERNAL] = internal;
|
|
47
|
+
// A Proxy apply trap only works when its target is callable. Use a
|
|
48
|
+
// function target while preserving the concrete PyProxy/PyModule
|
|
49
|
+
// prototype and local state.
|
|
50
|
+
const callable = function pyProxyTarget() { };
|
|
51
|
+
Object.setPrototypeOf(callable, new.target.prototype);
|
|
52
|
+
Object.defineProperty(callable, exports.PYPROXY_INTERNAL, {
|
|
53
|
+
configurable: false,
|
|
54
|
+
enumerable: false,
|
|
55
|
+
value: internal,
|
|
56
|
+
writable: false,
|
|
57
|
+
});
|
|
58
|
+
return new Proxy(callable, PyProxy.handler);
|
|
59
|
+
}
|
|
60
|
+
// Proxy Handler
|
|
61
|
+
static handler = {
|
|
62
|
+
get(target, prop, receiver) {
|
|
63
|
+
const internal = target[exports.PYPROXY_INTERNAL];
|
|
64
|
+
// Internal Symbol Access
|
|
65
|
+
if (prop === exports.PYPROXY_INTERNAL || prop === exports.PYPROXY_OBJECTID || prop === exports.PYPROXY_PATH) {
|
|
66
|
+
return Reflect.get(target, prop, receiver);
|
|
67
|
+
}
|
|
68
|
+
// JavaScript built-in symbols
|
|
69
|
+
if (typeof prop === 'symbol') {
|
|
70
|
+
// Make for...of work (synchronous iteration via async iterator)
|
|
71
|
+
if (prop === Symbol.asyncIterator) {
|
|
72
|
+
return () => target._makeAsyncIterator(internal);
|
|
73
|
+
}
|
|
74
|
+
// Symbol.iterator - not directly supported for Python objects
|
|
75
|
+
if (prop === Symbol.iterator) {
|
|
76
|
+
return () => {
|
|
77
|
+
throw new Error('Python objects are not synchronously iterable from JavaScript. ' +
|
|
78
|
+
'Use "for await...of" instead.');
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Symbol.toPrimitive - for coercion
|
|
82
|
+
if (prop === Symbol.toPrimitive) {
|
|
83
|
+
return (hint) => {
|
|
84
|
+
if (hint === 'string') {
|
|
85
|
+
return `[PyProxy id=${internal.objectId}]`;
|
|
86
|
+
}
|
|
87
|
+
return NaN;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// Symbol.toStringTag
|
|
91
|
+
if (prop === Symbol.toStringTag) {
|
|
92
|
+
return 'PyProxy';
|
|
93
|
+
}
|
|
94
|
+
return Reflect.get(target, prop, receiver);
|
|
95
|
+
}
|
|
96
|
+
const prototype = Object.getPrototypeOf(target);
|
|
97
|
+
const isLocal = Object.prototype.hasOwnProperty.call(target, prop) ||
|
|
98
|
+
(prototype !== null && prop in prototype && !(prop in Function.prototype));
|
|
99
|
+
if (isLocal) {
|
|
100
|
+
return Reflect.get(target, prop, receiver);
|
|
101
|
+
}
|
|
102
|
+
// toString / valueOf
|
|
103
|
+
if (prop === 'toString') {
|
|
104
|
+
return () => `[PyProxy id=${internal.objectId} path=${internal.path.join('.')}]`;
|
|
105
|
+
}
|
|
106
|
+
if (prop === 'valueOf') {
|
|
107
|
+
return () => target;
|
|
108
|
+
}
|
|
109
|
+
// then (Thenable - makes it work with await)
|
|
110
|
+
if (prop === 'then') {
|
|
111
|
+
// Root proxies are stable object handles. Marking them as thenables
|
|
112
|
+
// makes Promise resolution recursively unwrap the same Python object.
|
|
113
|
+
if (internal.path.length === 0) {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
return (onfulfilled, onrejected) => {
|
|
117
|
+
return target._resolve(internal).then(onfulfilled, onrejected);
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// catch / finally (Promise chain support)
|
|
121
|
+
if (prop === 'catch') {
|
|
122
|
+
if (internal.path.length === 0) {
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
return (onrejected) => target._resolve(internal).catch(onrejected);
|
|
126
|
+
}
|
|
127
|
+
if (prop === 'finally') {
|
|
128
|
+
if (internal.path.length === 0) {
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
return (onfinally) => target._resolve(internal).finally(onfinally);
|
|
132
|
+
}
|
|
133
|
+
// Internal pynect methods
|
|
134
|
+
if (prop.startsWith('__pynect_')) {
|
|
135
|
+
return Reflect.get(target, prop, receiver);
|
|
136
|
+
}
|
|
137
|
+
// Create lazy child PyProxy
|
|
138
|
+
const childInternal = {
|
|
139
|
+
objectId: internal.objectId,
|
|
140
|
+
path: [...internal.path, prop],
|
|
141
|
+
addon: internal.addon,
|
|
142
|
+
callTimeout: internal.callTimeout,
|
|
143
|
+
executionTimeout: internal.executionTimeout,
|
|
144
|
+
};
|
|
145
|
+
return new PyProxy(childInternal);
|
|
146
|
+
},
|
|
147
|
+
// Function call (proxy() or proxy.method())
|
|
148
|
+
apply(target, _thisArg, args) {
|
|
149
|
+
const internal = target[exports.PYPROXY_INTERNAL];
|
|
150
|
+
return target._call(internal, args);
|
|
151
|
+
},
|
|
152
|
+
// Property assignment
|
|
153
|
+
set(target, prop, value) {
|
|
154
|
+
const internal = target[exports.PYPROXY_INTERNAL];
|
|
155
|
+
if (typeof prop === 'symbol') {
|
|
156
|
+
return Reflect.set(target, prop, value);
|
|
157
|
+
}
|
|
158
|
+
const prototype = Object.getPrototypeOf(target);
|
|
159
|
+
const isLocal = prop.startsWith('_') ||
|
|
160
|
+
Object.prototype.hasOwnProperty.call(target, prop) ||
|
|
161
|
+
(prototype !== null && prop in prototype && !(prop in Function.prototype));
|
|
162
|
+
if (isLocal || prop.startsWith('__pynect_')) {
|
|
163
|
+
return Reflect.set(target, prop, value);
|
|
164
|
+
}
|
|
165
|
+
// Schedule async setAttribute (best-effort, no await)
|
|
166
|
+
target._setAttr(internal, String(prop), value).catch(err => {
|
|
167
|
+
logger.error(`Failed to set Python attribute '${String(prop)}'`, err);
|
|
168
|
+
});
|
|
169
|
+
return true;
|
|
170
|
+
},
|
|
171
|
+
// has() - needed for 'in' operator
|
|
172
|
+
has(_target, _prop) {
|
|
173
|
+
// We can't know without checking Python; return true for everything
|
|
174
|
+
return true;
|
|
175
|
+
},
|
|
176
|
+
// deleteProperty
|
|
177
|
+
deleteProperty(target, prop) {
|
|
178
|
+
if (typeof prop === 'string') {
|
|
179
|
+
const internal = target[exports.PYPROXY_INTERNAL];
|
|
180
|
+
internal.addon.deleteAttribute(internal.objectId, prop).catch(err => {
|
|
181
|
+
logger.error(`Failed to delete Python attribute '${prop}'`, err);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
return true;
|
|
185
|
+
},
|
|
186
|
+
// ownKeys - for Object.keys()
|
|
187
|
+
ownKeys(_target) {
|
|
188
|
+
// Can't synchronously get Python keys; return empty
|
|
189
|
+
return [];
|
|
190
|
+
},
|
|
191
|
+
getOwnPropertyDescriptor(_target, prop) {
|
|
192
|
+
if (typeof prop === 'symbol') {
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
enumerable: false,
|
|
197
|
+
configurable: true,
|
|
198
|
+
writable: false,
|
|
199
|
+
value: undefined,
|
|
200
|
+
};
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
// Resolution (await)
|
|
204
|
+
async _resolve(internal) {
|
|
205
|
+
try {
|
|
206
|
+
const addon = internal.addon;
|
|
207
|
+
if (internal.path.length === 0) {
|
|
208
|
+
// Resolve the object itself
|
|
209
|
+
const result = await addon.getObjectValue(internal.objectId);
|
|
210
|
+
return PyProxy._deserializeAddonResult(result, internal);
|
|
211
|
+
}
|
|
212
|
+
// Resolve attribute path
|
|
213
|
+
const result = await addon.getAttributePath(internal.objectId, internal.path);
|
|
214
|
+
return PyProxy._deserializeAddonResult(result, internal);
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
if (err && typeof err === 'object' && 'pythonType' in err) {
|
|
218
|
+
throw (0, error_translator_1.translatePythonError)({
|
|
219
|
+
type: err.pythonType,
|
|
220
|
+
message: err.message,
|
|
221
|
+
traceback: err.pythonTraceback || '',
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
throw err;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Function Call
|
|
228
|
+
async callWithOptions(args, options = {}, kwargs) {
|
|
229
|
+
const combined = kwargs ? [...args, kwargs] : args;
|
|
230
|
+
return this._call(this[exports.PYPROXY_INTERNAL], combined, options);
|
|
231
|
+
}
|
|
232
|
+
/** Call this Python function with cancellation or timeout overrides. */
|
|
233
|
+
async withOptions(options, ...args) {
|
|
234
|
+
return this._call(this[exports.PYPROXY_INTERNAL], args, options);
|
|
235
|
+
}
|
|
236
|
+
/** Collision-free form of withOptions(). */
|
|
237
|
+
async [exports.PYNECT_WITH_OPTIONS](options, ...args) {
|
|
238
|
+
return this._call(this[exports.PYPROXY_INTERNAL], args, options);
|
|
239
|
+
}
|
|
240
|
+
async _call(internal, args, controls = {}) {
|
|
241
|
+
try {
|
|
242
|
+
const addon = internal.addon;
|
|
243
|
+
if (controls.signal?.aborted) {
|
|
244
|
+
throw PyProxy._abortError();
|
|
245
|
+
}
|
|
246
|
+
// Serialize arguments
|
|
247
|
+
const serializedArgs = await Promise.all(args.map(arg => PyProxy._serializeArg(arg)));
|
|
248
|
+
const callOptions = {
|
|
249
|
+
args: serializedArgs,
|
|
250
|
+
kwargs: {},
|
|
251
|
+
timeout: controls.queueTimeout ?? internal.callTimeout,
|
|
252
|
+
executionTimeout: controls.executionTimeout ?? internal.executionTimeout,
|
|
253
|
+
requestId: `pynect-${process.pid}-${Date.now()}-${++nextRequestId}`,
|
|
254
|
+
};
|
|
255
|
+
// If last arg is a plain object (not PyProxy/Array), treat as kwargs
|
|
256
|
+
if (args.length > 0) {
|
|
257
|
+
const lastArg = args[args.length - 1];
|
|
258
|
+
if (lastArg !== null &&
|
|
259
|
+
typeof lastArg === 'object' &&
|
|
260
|
+
!Array.isArray(lastArg) &&
|
|
261
|
+
!(lastArg instanceof PyProxy) &&
|
|
262
|
+
!(lastArg instanceof ArrayBuffer) &&
|
|
263
|
+
!ArrayBuffer.isView(lastArg) &&
|
|
264
|
+
!('__pyref__' in lastArg) &&
|
|
265
|
+
PyProxy._isPlainObject(lastArg)) {
|
|
266
|
+
// Treat as kwargs
|
|
267
|
+
callOptions.args = serializedArgs.slice(0, -1);
|
|
268
|
+
const kwargsEntries = await Promise.all(Object.entries(lastArg).map(async ([k, v]) => [k, await PyProxy._serializeArg(v)]));
|
|
269
|
+
callOptions.kwargs = Object.fromEntries(kwargsEntries);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
const pending = addon.callFunction(internal.objectId, internal.path, callOptions);
|
|
273
|
+
const result = controls.signal
|
|
274
|
+
? await PyProxy._withAbort(pending, controls.signal, addon, callOptions.requestId)
|
|
275
|
+
: await pending;
|
|
276
|
+
return PyProxy._deserializeAddonResult(result, internal);
|
|
277
|
+
}
|
|
278
|
+
catch (err) {
|
|
279
|
+
if (err && typeof err === 'object' && 'pythonType' in err) {
|
|
280
|
+
throw (0, error_translator_1.translatePythonError)({
|
|
281
|
+
type: err.pythonType,
|
|
282
|
+
message: err.message,
|
|
283
|
+
traceback: err.pythonTraceback || '',
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
throw err;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// Async Iterator (for await...of)
|
|
290
|
+
async *_makeAsyncIterator(internal) {
|
|
291
|
+
const addon = internal.addon;
|
|
292
|
+
// Create Python iterator
|
|
293
|
+
const iterResult = await addon.createIterator(internal.objectId, internal.path);
|
|
294
|
+
const iteratorResult = iterResult;
|
|
295
|
+
if (!iteratorResult.success) {
|
|
296
|
+
const err = iteratorResult.error;
|
|
297
|
+
if (err) {
|
|
298
|
+
throw (0, error_translator_1.translatePythonError)({
|
|
299
|
+
type: err.type,
|
|
300
|
+
message: err.message,
|
|
301
|
+
traceback: err.traceback || '',
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
throw new Error('Failed to create Python iterator');
|
|
305
|
+
}
|
|
306
|
+
// Parse iteratorId from resultJson
|
|
307
|
+
let iteratorId;
|
|
308
|
+
try {
|
|
309
|
+
const parsed = JSON.parse(iterResult.resultJson || '{}');
|
|
310
|
+
iteratorId = parsed.iteratorId;
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
throw new Error('Failed to parse iterator ID');
|
|
314
|
+
}
|
|
315
|
+
if (!iteratorId) {
|
|
316
|
+
throw new Error('Iterator ID not returned from Python');
|
|
317
|
+
}
|
|
318
|
+
try {
|
|
319
|
+
while (true) {
|
|
320
|
+
const next = await addon.iteratorNext(iteratorId);
|
|
321
|
+
const nextResult = next;
|
|
322
|
+
if (!nextResult.success) {
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
let parsed;
|
|
326
|
+
try {
|
|
327
|
+
parsed = JSON.parse(nextResult.resultJson || '{"done":true}');
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
if (parsed.done) {
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
// Deserialize the value
|
|
336
|
+
const value = parsed.value;
|
|
337
|
+
if (value && typeof value === 'object' && '__pyref__' in value) {
|
|
338
|
+
const refId = value.__pyref__;
|
|
339
|
+
yield PyProxy._createFromObjectId(refId, [], addon, internal.callTimeout, internal.executionTimeout);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
yield value;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
finally {
|
|
347
|
+
// Always destroy the iterator
|
|
348
|
+
await addon.destroyIterator(iteratorId).catch(() => { });
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// Set Attribute
|
|
352
|
+
async _setAttr(internal, propName, value) {
|
|
353
|
+
const serialized = await PyProxy._serializeArg(value);
|
|
354
|
+
await internal.addon.setAttribute(internal.objectId, propName, serialized);
|
|
355
|
+
}
|
|
356
|
+
// Static Helpers
|
|
357
|
+
static _createFromObjectId(objectId, path, addon, callTimeout, executionTimeout) {
|
|
358
|
+
return new PyProxy({
|
|
359
|
+
objectId,
|
|
360
|
+
path,
|
|
361
|
+
addon,
|
|
362
|
+
callTimeout,
|
|
363
|
+
executionTimeout,
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
static _deserializeAddonResult(result, internal) {
|
|
367
|
+
const r = result;
|
|
368
|
+
if (!r.success) {
|
|
369
|
+
if (r.error) {
|
|
370
|
+
throw (0, error_translator_1.translatePythonError)({
|
|
371
|
+
type: r.error.type,
|
|
372
|
+
message: r.error.message,
|
|
373
|
+
traceback: r.error.traceback || '',
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
throw new Error('Python call failed without error details');
|
|
377
|
+
}
|
|
378
|
+
if (r.isObject && r.objectId) {
|
|
379
|
+
// Result is a Python object - wrap in PyProxy
|
|
380
|
+
return PyProxy._createFromObjectId(r.objectId, [], internal.addon, internal.callTimeout, internal.executionTimeout);
|
|
381
|
+
}
|
|
382
|
+
// Deserialize JSON result
|
|
383
|
+
if (r.resultJson !== undefined && r.resultJson !== null) {
|
|
384
|
+
try {
|
|
385
|
+
const parsed = JSON.parse(r.resultJson);
|
|
386
|
+
if (parsed && typeof parsed === 'object' && '__pyref__' in parsed) {
|
|
387
|
+
return PyProxy._createFromObjectId(parsed.__pyref__, [], internal.addon, internal.callTimeout, internal.executionTimeout);
|
|
388
|
+
}
|
|
389
|
+
return parsed;
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
return r.resultJson;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
static _abortError() {
|
|
398
|
+
const error = new Error('Python call was aborted');
|
|
399
|
+
error.name = 'AbortError';
|
|
400
|
+
return error;
|
|
401
|
+
}
|
|
402
|
+
static _withAbort(pending, signal, addon, requestId) {
|
|
403
|
+
return new Promise((resolve, reject) => {
|
|
404
|
+
let settled = false;
|
|
405
|
+
const cleanup = () => signal.removeEventListener('abort', onAbort);
|
|
406
|
+
const onAbort = () => {
|
|
407
|
+
if (settled)
|
|
408
|
+
return;
|
|
409
|
+
settled = true;
|
|
410
|
+
cleanup();
|
|
411
|
+
if (requestId)
|
|
412
|
+
void addon.cancelCall(requestId).catch(() => undefined);
|
|
413
|
+
pending.catch(() => undefined);
|
|
414
|
+
reject(PyProxy._abortError());
|
|
415
|
+
};
|
|
416
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
417
|
+
pending.then(value => {
|
|
418
|
+
if (settled)
|
|
419
|
+
return;
|
|
420
|
+
settled = true;
|
|
421
|
+
cleanup();
|
|
422
|
+
resolve(value);
|
|
423
|
+
}, error => {
|
|
424
|
+
if (settled)
|
|
425
|
+
return;
|
|
426
|
+
settled = true;
|
|
427
|
+
cleanup();
|
|
428
|
+
reject(error);
|
|
429
|
+
});
|
|
430
|
+
if (signal.aborted)
|
|
431
|
+
onAbort();
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
static async _serializeArg(value) {
|
|
435
|
+
// Already a SerializedValue
|
|
436
|
+
if (value !== null &&
|
|
437
|
+
typeof value === 'object' &&
|
|
438
|
+
'format' in value) {
|
|
439
|
+
return value;
|
|
440
|
+
}
|
|
441
|
+
// PyProxy -> pass as Python reference
|
|
442
|
+
if (value instanceof PyProxy) {
|
|
443
|
+
const internal = value[exports.PYPROXY_INTERNAL];
|
|
444
|
+
// If proxy has a path, resolve it first to get the objectId
|
|
445
|
+
if (internal.path.length > 0) {
|
|
446
|
+
// We need to resolve it - for now, keep as reference
|
|
447
|
+
// Production: could pre-resolve path to objectId
|
|
448
|
+
}
|
|
449
|
+
return {
|
|
450
|
+
format: 6, // PYTHON_REF
|
|
451
|
+
data: null,
|
|
452
|
+
metadata: { objectId: internal.objectId },
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
// null / undefined
|
|
456
|
+
if (value === null || value === undefined) {
|
|
457
|
+
return { format: 0, data: 'null', metadata: {} };
|
|
458
|
+
}
|
|
459
|
+
// TypedArrays -> numpy-compatible binary
|
|
460
|
+
if (value instanceof Float32Array ||
|
|
461
|
+
value instanceof Float64Array ||
|
|
462
|
+
value instanceof Int8Array ||
|
|
463
|
+
value instanceof Int16Array ||
|
|
464
|
+
value instanceof Int32Array ||
|
|
465
|
+
value instanceof Uint8Array ||
|
|
466
|
+
value instanceof Uint16Array ||
|
|
467
|
+
value instanceof Uint32Array ||
|
|
468
|
+
value instanceof BigInt64Array ||
|
|
469
|
+
value instanceof BigUint64Array) {
|
|
470
|
+
const ta = value;
|
|
471
|
+
const dtype = PyProxy._getTypedArrayDtype(ta);
|
|
472
|
+
return {
|
|
473
|
+
format: 2, // NUMPY_ARRAY
|
|
474
|
+
data: new Uint8Array(ta.buffer, ta.byteOffset, ta.byteLength),
|
|
475
|
+
metadata: {
|
|
476
|
+
dtype,
|
|
477
|
+
shape: [ta.length],
|
|
478
|
+
},
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
// ArrayBuffer
|
|
482
|
+
if (value instanceof ArrayBuffer) {
|
|
483
|
+
return {
|
|
484
|
+
format: 7, // BYTES
|
|
485
|
+
data: new Uint8Array(value),
|
|
486
|
+
metadata: {},
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
// Primitive types
|
|
490
|
+
if (typeof value === 'number' ||
|
|
491
|
+
typeof value === 'string' ||
|
|
492
|
+
typeof value === 'boolean') {
|
|
493
|
+
return {
|
|
494
|
+
format: 0, // JSON
|
|
495
|
+
data: JSON.stringify(value),
|
|
496
|
+
metadata: {},
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
// Array or object - use JSON
|
|
500
|
+
try {
|
|
501
|
+
return {
|
|
502
|
+
format: 0, // JSON
|
|
503
|
+
data: JSON.stringify(value),
|
|
504
|
+
metadata: {},
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
catch {
|
|
508
|
+
// Can't serialize - this shouldn't happen for plain objects
|
|
509
|
+
return { format: 8, data: null, metadata: {} }; // NONE
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
static _getTypedArrayDtype(arr) {
|
|
513
|
+
if (arr instanceof Float32Array) {
|
|
514
|
+
return 'float32';
|
|
515
|
+
}
|
|
516
|
+
if (arr instanceof Float64Array) {
|
|
517
|
+
return 'float64';
|
|
518
|
+
}
|
|
519
|
+
if (arr instanceof Int8Array) {
|
|
520
|
+
return 'int8';
|
|
521
|
+
}
|
|
522
|
+
if (arr instanceof Int16Array) {
|
|
523
|
+
return 'int16';
|
|
524
|
+
}
|
|
525
|
+
if (arr instanceof Int32Array) {
|
|
526
|
+
return 'int32';
|
|
527
|
+
}
|
|
528
|
+
if (arr instanceof BigInt64Array) {
|
|
529
|
+
return 'int64';
|
|
530
|
+
}
|
|
531
|
+
if (arr instanceof Uint8Array) {
|
|
532
|
+
return 'uint8';
|
|
533
|
+
}
|
|
534
|
+
if (arr instanceof Uint16Array) {
|
|
535
|
+
return 'uint16';
|
|
536
|
+
}
|
|
537
|
+
if (arr instanceof Uint32Array) {
|
|
538
|
+
return 'uint32';
|
|
539
|
+
}
|
|
540
|
+
if (arr instanceof BigUint64Array) {
|
|
541
|
+
return 'uint64';
|
|
542
|
+
}
|
|
543
|
+
return 'uint8';
|
|
544
|
+
}
|
|
545
|
+
static _isPlainObject(obj) {
|
|
546
|
+
if (!obj || typeof obj !== 'object') {
|
|
547
|
+
return false;
|
|
548
|
+
}
|
|
549
|
+
const proto = Object.getPrototypeOf(obj);
|
|
550
|
+
return proto === null || proto === Object.prototype;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
exports.PyProxy = PyProxy;
|
|
554
|
+
/**
|
|
555
|
+
* Check if a value is a PyProxy.
|
|
556
|
+
*/
|
|
557
|
+
function isPyProxy(value) {
|
|
558
|
+
return (value instanceof PyProxy ||
|
|
559
|
+
(value !== null &&
|
|
560
|
+
typeof value === 'object' &&
|
|
561
|
+
exports.PYPROXY_INTERNAL in value));
|
|
562
|
+
}
|
|
563
|
+
//# sourceMappingURL=py-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"py-proxy.js","sourceRoot":"","sources":["../../src/core/py-proxy.ts"],"names":[],"mappings":"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"}
|