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,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* pynect - PyContext
|
|
4
|
+
* Manages an isolated Python execution context (namespace).
|
|
5
|
+
* Useful for running code in isolation without polluting the global namespace.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.PyContext = void 0;
|
|
9
|
+
const py_proxy_1 = require("./py-proxy");
|
|
10
|
+
const error_translator_1 = require("../utils/error-translator");
|
|
11
|
+
const logger_1 = require("../utils/logger");
|
|
12
|
+
const logger = new logger_1.Logger('PyContext');
|
|
13
|
+
/**
|
|
14
|
+
* PyContext - an isolated Python execution environment.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const ctx = await PyContext.create(addon);
|
|
19
|
+
*
|
|
20
|
+
* // Run code in isolation
|
|
21
|
+
* await ctx.exec('x = 42');
|
|
22
|
+
* await ctx.exec('y = x * 2');
|
|
23
|
+
* const result = await ctx.eval('x + y');
|
|
24
|
+
* console.log(result); // 126
|
|
25
|
+
*
|
|
26
|
+
* // Import into context
|
|
27
|
+
* const pd = await ctx.import('pandas');
|
|
28
|
+
* await ctx.exec("df = pd.DataFrame({'a': [1,2,3]})");
|
|
29
|
+
* const df = await ctx.get('df');
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
class PyContext {
|
|
33
|
+
_addon;
|
|
34
|
+
_namespacePyId;
|
|
35
|
+
_variables;
|
|
36
|
+
_destroyed = false;
|
|
37
|
+
constructor(addon, namespacePyId) {
|
|
38
|
+
this._addon = addon;
|
|
39
|
+
this._namespacePyId = namespacePyId;
|
|
40
|
+
this._variables = new Map();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create a new isolated Python context.
|
|
44
|
+
*/
|
|
45
|
+
static async create(addon) {
|
|
46
|
+
// Create a fresh namespace dict in Python
|
|
47
|
+
const result = await addon.evalPython('{}');
|
|
48
|
+
if (!result.success) {
|
|
49
|
+
if (result.error) {
|
|
50
|
+
throw (0, error_translator_1.translatePythonError)({
|
|
51
|
+
type: result.error.type,
|
|
52
|
+
message: result.error.message,
|
|
53
|
+
traceback: result.error.traceback || '',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
throw new Error('Failed to create Python context');
|
|
57
|
+
}
|
|
58
|
+
if (!result.objectId) {
|
|
59
|
+
throw new Error('Context namespace object ID not returned');
|
|
60
|
+
}
|
|
61
|
+
return new PyContext(addon, result.objectId);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Execute Python code in this context.
|
|
65
|
+
*/
|
|
66
|
+
async exec(code) {
|
|
67
|
+
this._ensureNotDestroyed();
|
|
68
|
+
const result = await this._addon.runPythonCode(code);
|
|
69
|
+
if (!result.success && result.error) {
|
|
70
|
+
throw (0, error_translator_1.translatePythonError)({
|
|
71
|
+
type: result.error.type,
|
|
72
|
+
message: result.error.message,
|
|
73
|
+
traceback: result.error.traceback || '',
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Evaluate a Python expression in this context and return the result.
|
|
79
|
+
*/
|
|
80
|
+
async eval(expression) {
|
|
81
|
+
this._ensureNotDestroyed();
|
|
82
|
+
const result = await this._addon.evalPython(expression);
|
|
83
|
+
if (!result.success) {
|
|
84
|
+
if (result.error) {
|
|
85
|
+
throw (0, error_translator_1.translatePythonError)({
|
|
86
|
+
type: result.error.type,
|
|
87
|
+
message: result.error.message,
|
|
88
|
+
traceback: result.error.traceback || '',
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
throw new Error('Evaluation failed');
|
|
92
|
+
}
|
|
93
|
+
if (result.isObject && result.objectId) {
|
|
94
|
+
return py_proxy_1.PyProxy._createFromObjectId(result.objectId, [], this._addon);
|
|
95
|
+
}
|
|
96
|
+
if (result.resultJson !== undefined) {
|
|
97
|
+
try {
|
|
98
|
+
return JSON.parse(result.resultJson);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return result.resultJson;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Import a module into this context.
|
|
108
|
+
*/
|
|
109
|
+
async import(moduleName) {
|
|
110
|
+
this._ensureNotDestroyed();
|
|
111
|
+
const result = await this._addon.importModule(moduleName);
|
|
112
|
+
if (!result.success) {
|
|
113
|
+
if (result.error) {
|
|
114
|
+
throw (0, error_translator_1.translatePythonError)({
|
|
115
|
+
type: result.error.type,
|
|
116
|
+
message: result.error.message,
|
|
117
|
+
traceback: result.error.traceback || '',
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
throw new Error(`Failed to import module '${moduleName}'`);
|
|
121
|
+
}
|
|
122
|
+
if (!result.objectId) {
|
|
123
|
+
throw new Error('Module object ID not returned');
|
|
124
|
+
}
|
|
125
|
+
return py_proxy_1.PyProxy._createFromObjectId(result.objectId, [], this._addon);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get a variable from the context namespace.
|
|
129
|
+
*/
|
|
130
|
+
async get(name) {
|
|
131
|
+
this._ensureNotDestroyed();
|
|
132
|
+
const pyId = this._variables.get(name);
|
|
133
|
+
if (pyId) {
|
|
134
|
+
return py_proxy_1.PyProxy._createFromObjectId(pyId, [], this._addon);
|
|
135
|
+
}
|
|
136
|
+
// Try to get from Python global namespace
|
|
137
|
+
const result = await this._addon.evalPython(name);
|
|
138
|
+
if (!result.success) {
|
|
139
|
+
if (result.error?.type === 'NameError') {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
if (result.error) {
|
|
143
|
+
throw (0, error_translator_1.translatePythonError)({
|
|
144
|
+
type: result.error.type,
|
|
145
|
+
message: result.error.message,
|
|
146
|
+
traceback: result.error.traceback || '',
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
if (result.isObject && result.objectId) {
|
|
152
|
+
return py_proxy_1.PyProxy._createFromObjectId(result.objectId, [], this._addon);
|
|
153
|
+
}
|
|
154
|
+
if (result.resultJson !== undefined) {
|
|
155
|
+
try {
|
|
156
|
+
return JSON.parse(result.resultJson);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return result.resultJson;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Set a variable in the context namespace.
|
|
166
|
+
*/
|
|
167
|
+
async set(name, value) {
|
|
168
|
+
this._ensureNotDestroyed();
|
|
169
|
+
assertPythonIdentifier(name);
|
|
170
|
+
if (value instanceof py_proxy_1.PyProxy) {
|
|
171
|
+
const internal = value[py_proxy_1.PYPROXY_INTERNAL];
|
|
172
|
+
this._variables.set(name, internal.objectId);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
// For primitives and serializable values: set via exec
|
|
176
|
+
const serialized = JSON.stringify(value);
|
|
177
|
+
if (serialized === undefined) {
|
|
178
|
+
throw new TypeError(`Value for '${name}' is not JSON serializable`);
|
|
179
|
+
}
|
|
180
|
+
const encoded = Buffer.from(serialized, 'utf8').toString('base64');
|
|
181
|
+
await this.exec(`${name} = __import__('json').loads(__import__('base64').b64decode('${encoded}'))`);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Check if a name is defined in the context.
|
|
185
|
+
*/
|
|
186
|
+
async has(name) {
|
|
187
|
+
this._ensureNotDestroyed();
|
|
188
|
+
try {
|
|
189
|
+
const val = await this.get(name);
|
|
190
|
+
return val !== undefined;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Delete a variable from the context.
|
|
198
|
+
*/
|
|
199
|
+
async delete(name) {
|
|
200
|
+
this._ensureNotDestroyed();
|
|
201
|
+
assertPythonIdentifier(name);
|
|
202
|
+
this._variables.delete(name);
|
|
203
|
+
await this.exec(`del ${name}`).catch(() => { }); // ignore if not defined
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Clear all variables in the context.
|
|
207
|
+
*/
|
|
208
|
+
async clear() {
|
|
209
|
+
this._ensureNotDestroyed();
|
|
210
|
+
this._variables.clear();
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Destroy the context and free resources.
|
|
214
|
+
*/
|
|
215
|
+
async destroy() {
|
|
216
|
+
if (this._destroyed) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
this._destroyed = true;
|
|
220
|
+
this._variables.clear();
|
|
221
|
+
this._addon.decRef(this._namespacePyId);
|
|
222
|
+
logger.debug('PyContext destroyed');
|
|
223
|
+
}
|
|
224
|
+
_ensureNotDestroyed() {
|
|
225
|
+
if (this._destroyed) {
|
|
226
|
+
throw new Error('PyContext has been destroyed');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
[Symbol.asyncDispose]() {
|
|
230
|
+
return this.destroy();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
exports.PyContext = PyContext;
|
|
234
|
+
function assertPythonIdentifier(name) {
|
|
235
|
+
if (!/^[A-Za-z_]\w*$/u.test(name)) {
|
|
236
|
+
throw new TypeError(`Invalid Python identifier: ${JSON.stringify(name)}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=py-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"py-context.js","sourceRoot":"","sources":["../../src/core/py-context.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAIH,yCAAuD;AACvD,gEAAiE;AACjE,4CAAyC;AAEzC,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,WAAW,CAAC,CAAC;AAEvC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAa,SAAS;IACH,MAAM,CAAc;IACpB,cAAc,CAAa;IACpC,UAAU,CAA0B;IACpC,UAAU,GAAG,KAAK,CAAC;IAE3B,YAAoB,KAAkB,EAAE,aAAyB;QAC/D,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAkB;QACpC,0CAA0C;QAC1C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,IAAI,CAKzC,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,MAAM,IAAA,uCAAoB,EAAC;oBACzB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;oBACvB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;oBAC7B,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE;iBACxC,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,QAAsB,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAGlD,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,IAAA,uCAAoB,EAAC;gBACzB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;gBACvB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;gBAC7B,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE;aACxC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,UAAkB;QAC3B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAMrD,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,MAAM,IAAA,uCAAoB,EAAC;oBACzB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;oBACvB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;oBAC7B,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE;iBACxC,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvC,OAAO,kBAAO,CAAC,mBAAmB,CAChC,MAAM,CAAC,QAAsB,EAC7B,EAAE,EACF,IAAI,CAAC,MAAM,CACZ,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,MAAM,CAAC,UAAU,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,UAAkB;QAC7B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAIvD,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,MAAM,IAAA,uCAAoB,EAAC;oBACzB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;oBACvB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;oBAC7B,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE;iBACxC,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,GAAG,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,kBAAO,CAAC,mBAAmB,CAChC,MAAM,CAAC,QAAsB,EAC7B,EAAE,EACF,IAAI,CAAC,MAAM,CACZ,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEvC,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,kBAAO,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,CAAC;QAED,0CAA0C;QAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAM/C,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;gBACvC,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,MAAM,IAAA,uCAAoB,EAAC;oBACzB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;oBACvB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;oBAC7B,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE;iBACxC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvC,OAAO,kBAAO,CAAC,mBAAmB,CAChC,MAAM,CAAC,QAAsB,EAC7B,EAAE,EACF,IAAI,CAAC,MAAM,CACZ,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,MAAM,CAAC,UAAU,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,KAAc;QACpC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,KAAK,YAAY,kBAAO,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,KAAK,CAAC,2BAAgB,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,uDAAuD;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,SAAS,CAAC,cAAc,IAAI,4BAA4B,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnE,MAAM,IAAI,CAAC,IAAI,CACb,GAAG,IAAI,+DAA+D,OAAO,KAAK,CACnF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,OAAO,GAAG,KAAK,SAAS,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,wBAAwB;IAC1E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAAA,OAAO;QAAA,CAAC;QAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAwB,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACtC,CAAC;IAEO,mBAAmB;QACzB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,CAAC,MAAM,CAAC,YAAY,CAAC;QACnB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;CACF;AA7QD,8BA6QC;AAED,SAAS,sBAAsB,CAAC,IAAY;IAC1C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,8BAA8B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pynect - PyIterator
|
|
3
|
+
* Wraps a Python iterator for use with JavaScript's for await...of.
|
|
4
|
+
* Provides both async iteration and manual .next() calls.
|
|
5
|
+
*/
|
|
6
|
+
import type { NativeAddon } from '../types/addon';
|
|
7
|
+
import type { PyObjectId } from '../types/python';
|
|
8
|
+
import { PyProxy } from './py-proxy';
|
|
9
|
+
export interface PyIteratorOptions {
|
|
10
|
+
/** Maximum number of items to yield (0 = no limit) */
|
|
11
|
+
limit?: number;
|
|
12
|
+
/** Whether to wrap Python objects in PyProxy */
|
|
13
|
+
wrapObjects?: boolean;
|
|
14
|
+
/** Timeout per .next() call (ms) */
|
|
15
|
+
timeout?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* PyIterator - manages a Python iterator lifecycle.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const iterator = await PyIterator.create(pyList, addon);
|
|
23
|
+
*
|
|
24
|
+
* for await (const item of iterator) {
|
|
25
|
+
* console.log(item);
|
|
26
|
+
* }
|
|
27
|
+
*
|
|
28
|
+
* // Or manually:
|
|
29
|
+
* const { value, done } = await iterator.next();
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare class PyIterator<T = unknown> implements AsyncIterable<T>, AsyncIterator<T> {
|
|
33
|
+
private readonly _iteratorId;
|
|
34
|
+
private readonly _addon;
|
|
35
|
+
private readonly _objectId;
|
|
36
|
+
private readonly _options;
|
|
37
|
+
private _done;
|
|
38
|
+
private _position;
|
|
39
|
+
private _destroyed;
|
|
40
|
+
private constructor();
|
|
41
|
+
/**
|
|
42
|
+
* Create a PyIterator from a PyProxy.
|
|
43
|
+
*/
|
|
44
|
+
static create(source: PyProxy, options?: PyIteratorOptions): Promise<PyIterator>;
|
|
45
|
+
/**
|
|
46
|
+
* Create a PyIterator from an object ID and iterator ID directly.
|
|
47
|
+
*/
|
|
48
|
+
static fromIds(iteratorId: number, objectId: PyObjectId, addon: NativeAddon, options?: PyIteratorOptions): PyIterator;
|
|
49
|
+
/** Current position in iteration */
|
|
50
|
+
get position(): number;
|
|
51
|
+
/** Whether iteration is complete */
|
|
52
|
+
get isDone(): boolean;
|
|
53
|
+
next(): Promise<IteratorResult<T>>;
|
|
54
|
+
return(value?: T): Promise<IteratorResult<T>>;
|
|
55
|
+
throw(error?: unknown): Promise<IteratorResult<T>>;
|
|
56
|
+
[Symbol.asyncIterator](): AsyncIterator<T>;
|
|
57
|
+
/**
|
|
58
|
+
* Collect all items into an array.
|
|
59
|
+
* Use with care for large iterators!
|
|
60
|
+
*/
|
|
61
|
+
toArray(maxItems?: number): Promise<T[]>;
|
|
62
|
+
/**
|
|
63
|
+
* Process items in batches.
|
|
64
|
+
*/
|
|
65
|
+
batch(batchSize: number): AsyncGenerator<T[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Map items through a transform function.
|
|
68
|
+
*/
|
|
69
|
+
map<U>(fn: (item: T, index: number) => U | Promise<U>): AsyncGenerator<U>;
|
|
70
|
+
/**
|
|
71
|
+
* Filter items.
|
|
72
|
+
*/
|
|
73
|
+
filter(fn: (item: T, index: number) => boolean | Promise<boolean>): AsyncGenerator<T>;
|
|
74
|
+
/**
|
|
75
|
+
* Take first N items.
|
|
76
|
+
*/
|
|
77
|
+
take(n: number): Promise<T[]>;
|
|
78
|
+
/**
|
|
79
|
+
* Destroy the underlying Python iterator (frees resources).
|
|
80
|
+
* Called automatically when iteration completes.
|
|
81
|
+
*/
|
|
82
|
+
destroy(): Promise<void>;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=py-iterator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"py-iterator.d.ts","sourceRoot":"","sources":["../../src/core/py-iterator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,OAAO,EAAoB,MAAM,YAAY,CAAC;AAKvD,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,UAAU,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;IAChF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO;IAYP;;OAEG;WACU,MAAM,CACjB,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,UAAU,CAAC;IAgCtB;;OAEG;IACH,MAAM,CAAC,OAAO,CACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,UAAU,EACpB,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,UAAU;IAIb,oCAAoC;IACpC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,oCAAoC;IACpC,IAAI,MAAM,IAAI,OAAO,CAEpB;IAIK,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IA4ElC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAK7C,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAOxD,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;IAM1C;;;OAGG;IACG,OAAO,CAAC,QAAQ,SAAS,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAS9C;;OAEG;IACI,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC;IAcpD;;OAEG;IACI,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;IAOhF;;OAEG;IACI,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;IAO5F;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAUnC;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAU/B"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* pynect - PyIterator
|
|
4
|
+
* Wraps a Python iterator for use with JavaScript's for await...of.
|
|
5
|
+
* Provides both async iteration and manual .next() calls.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.PyIterator = void 0;
|
|
9
|
+
const error_translator_1 = require("../utils/error-translator");
|
|
10
|
+
const py_proxy_1 = require("./py-proxy");
|
|
11
|
+
const logger_1 = require("../utils/logger");
|
|
12
|
+
const logger = new logger_1.Logger('PyIterator');
|
|
13
|
+
/**
|
|
14
|
+
* PyIterator - manages a Python iterator lifecycle.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const iterator = await PyIterator.create(pyList, addon);
|
|
19
|
+
*
|
|
20
|
+
* for await (const item of iterator) {
|
|
21
|
+
* console.log(item);
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* // Or manually:
|
|
25
|
+
* const { value, done } = await iterator.next();
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
class PyIterator {
|
|
29
|
+
_iteratorId;
|
|
30
|
+
_addon;
|
|
31
|
+
_objectId;
|
|
32
|
+
_options;
|
|
33
|
+
_done = false;
|
|
34
|
+
_position = 0;
|
|
35
|
+
_destroyed = false;
|
|
36
|
+
constructor(iteratorId, objectId, addon, options = {}) {
|
|
37
|
+
this._iteratorId = iteratorId;
|
|
38
|
+
this._objectId = objectId;
|
|
39
|
+
this._addon = addon;
|
|
40
|
+
this._options = options;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create a PyIterator from a PyProxy.
|
|
44
|
+
*/
|
|
45
|
+
static async create(source, options) {
|
|
46
|
+
const internal = source[py_proxy_1.PYPROXY_INTERNAL];
|
|
47
|
+
const addon = internal.addon;
|
|
48
|
+
const result = await addon.createIterator(internal.objectId, internal.path);
|
|
49
|
+
if (!result.success) {
|
|
50
|
+
if (result.error) {
|
|
51
|
+
throw (0, error_translator_1.translatePythonError)({
|
|
52
|
+
type: result.error.type,
|
|
53
|
+
message: result.error.message,
|
|
54
|
+
traceback: result.error.traceback || '',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
throw new Error('Failed to create Python iterator');
|
|
58
|
+
}
|
|
59
|
+
let iteratorId;
|
|
60
|
+
try {
|
|
61
|
+
const parsed = JSON.parse(result.resultJson || '{}');
|
|
62
|
+
if (!parsed.iteratorId) {
|
|
63
|
+
throw new Error('no iteratorId');
|
|
64
|
+
}
|
|
65
|
+
iteratorId = parsed.iteratorId;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
throw new Error('Failed to parse iterator ID from: ' + result.resultJson);
|
|
69
|
+
}
|
|
70
|
+
return new PyIterator(iteratorId, internal.objectId, addon, options);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a PyIterator from an object ID and iterator ID directly.
|
|
74
|
+
*/
|
|
75
|
+
static fromIds(iteratorId, objectId, addon, options) {
|
|
76
|
+
return new PyIterator(iteratorId, objectId, addon, options);
|
|
77
|
+
}
|
|
78
|
+
/** Current position in iteration */
|
|
79
|
+
get position() {
|
|
80
|
+
return this._position;
|
|
81
|
+
}
|
|
82
|
+
/** Whether iteration is complete */
|
|
83
|
+
get isDone() {
|
|
84
|
+
return this._done;
|
|
85
|
+
}
|
|
86
|
+
// AsyncIterator Protocol
|
|
87
|
+
async next() {
|
|
88
|
+
if (this._done || this._destroyed) {
|
|
89
|
+
return { value: undefined, done: true };
|
|
90
|
+
}
|
|
91
|
+
// Check limit
|
|
92
|
+
if (this._options.limit && this._position >= this._options.limit) {
|
|
93
|
+
await this.destroy();
|
|
94
|
+
return { value: undefined, done: true };
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const result = await this._addon.iteratorNext(this._iteratorId);
|
|
98
|
+
if (!result.success) {
|
|
99
|
+
if (result.error) {
|
|
100
|
+
throw (0, error_translator_1.translatePythonError)({
|
|
101
|
+
type: result.error.type,
|
|
102
|
+
message: result.error.message,
|
|
103
|
+
traceback: result.error.traceback || '',
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
this._done = true;
|
|
107
|
+
return { value: undefined, done: true };
|
|
108
|
+
}
|
|
109
|
+
let parsed;
|
|
110
|
+
try {
|
|
111
|
+
parsed = JSON.parse(result.resultJson || '{"done":true}');
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
this._done = true;
|
|
115
|
+
return { value: undefined, done: true };
|
|
116
|
+
}
|
|
117
|
+
if (parsed.done) {
|
|
118
|
+
this._done = true;
|
|
119
|
+
return { value: undefined, done: true };
|
|
120
|
+
}
|
|
121
|
+
this._position++;
|
|
122
|
+
// Deserialize the value
|
|
123
|
+
const rawValue = parsed.value;
|
|
124
|
+
let value;
|
|
125
|
+
if (rawValue !== null &&
|
|
126
|
+
typeof rawValue === 'object' &&
|
|
127
|
+
'__pyref__' in rawValue) {
|
|
128
|
+
// It's a Python object reference
|
|
129
|
+
if (this._options.wrapObjects !== false) {
|
|
130
|
+
const refId = rawValue.__pyref__;
|
|
131
|
+
value = py_proxy_1.PyProxy._createFromObjectId(refId, [], this._addon);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
value = rawValue;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
value = rawValue;
|
|
139
|
+
}
|
|
140
|
+
return { value, done: false };
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
this._done = true;
|
|
144
|
+
throw err;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async return(value) {
|
|
148
|
+
await this.destroy();
|
|
149
|
+
return { value: value, done: true };
|
|
150
|
+
}
|
|
151
|
+
async throw(error) {
|
|
152
|
+
await this.destroy();
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
// AsyncIterable Protocol
|
|
156
|
+
[Symbol.asyncIterator]() {
|
|
157
|
+
return this;
|
|
158
|
+
}
|
|
159
|
+
// Utilities
|
|
160
|
+
/**
|
|
161
|
+
* Collect all items into an array.
|
|
162
|
+
* Use with care for large iterators!
|
|
163
|
+
*/
|
|
164
|
+
async toArray(maxItems = 100000) {
|
|
165
|
+
const items = [];
|
|
166
|
+
for await (const item of this) {
|
|
167
|
+
items.push(item);
|
|
168
|
+
if (items.length >= maxItems) {
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return items;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Process items in batches.
|
|
176
|
+
*/
|
|
177
|
+
async *batch(batchSize) {
|
|
178
|
+
let current = [];
|
|
179
|
+
for await (const item of this) {
|
|
180
|
+
current.push(item);
|
|
181
|
+
if (current.length >= batchSize) {
|
|
182
|
+
yield current;
|
|
183
|
+
current = [];
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (current.length > 0) {
|
|
187
|
+
yield current;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Map items through a transform function.
|
|
192
|
+
*/
|
|
193
|
+
async *map(fn) {
|
|
194
|
+
let i = 0;
|
|
195
|
+
for await (const item of this) {
|
|
196
|
+
yield await fn(item, i++);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Filter items.
|
|
201
|
+
*/
|
|
202
|
+
async *filter(fn) {
|
|
203
|
+
let i = 0;
|
|
204
|
+
for await (const item of this) {
|
|
205
|
+
if (await fn(item, i++)) {
|
|
206
|
+
yield item;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Take first N items.
|
|
212
|
+
*/
|
|
213
|
+
async take(n) {
|
|
214
|
+
const items = [];
|
|
215
|
+
for await (const item of this) {
|
|
216
|
+
items.push(item);
|
|
217
|
+
if (items.length >= n) {
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
await this.destroy();
|
|
222
|
+
return items;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Destroy the underlying Python iterator (frees resources).
|
|
226
|
+
* Called automatically when iteration completes.
|
|
227
|
+
*/
|
|
228
|
+
async destroy() {
|
|
229
|
+
if (this._destroyed) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
this._destroyed = true;
|
|
233
|
+
this._done = true;
|
|
234
|
+
try {
|
|
235
|
+
await this._addon.destroyIterator(this._iteratorId);
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
logger.debug('Error destroying iterator', err);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
exports.PyIterator = PyIterator;
|
|
243
|
+
//# sourceMappingURL=py-iterator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"py-iterator.js","sourceRoot":"","sources":["../../src/core/py-iterator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pynect - PyModule
|
|
3
|
+
* Represents a Python module with its full namespace.
|
|
4
|
+
* Inherits from PyProxy but adds module-specific introspection.
|
|
5
|
+
*/
|
|
6
|
+
import { PyProxy } from './py-proxy';
|
|
7
|
+
import type { NativeAddon } from '../types/addon';
|
|
8
|
+
import type { PyObjectId, PyModuleInspection } from '../types/python';
|
|
9
|
+
/**
|
|
10
|
+
* PyModule extends PyProxy with module-specific utilities.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const pd = await py.import('pandas');
|
|
15
|
+
* // pd is a PyModule
|
|
16
|
+
* const df = await pd.read_csv('data.csv'); // access module attribute
|
|
17
|
+
* const info = await pd.__pynect_inspect__(); // get module metadata
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare class PyModule extends PyProxy {
|
|
21
|
+
private readonly _moduleName;
|
|
22
|
+
constructor(objectId: PyObjectId, moduleName: string, addon: NativeAddon, callTimeout?: number, executionTimeout?: number);
|
|
23
|
+
/** The Python module name */
|
|
24
|
+
get moduleName(): string;
|
|
25
|
+
/** Object ID in Python heap */
|
|
26
|
+
get objectId(): PyObjectId;
|
|
27
|
+
/**
|
|
28
|
+
* Inspect the module and return detailed type information.
|
|
29
|
+
*/
|
|
30
|
+
inspect(): Promise<PyModuleInspection>;
|
|
31
|
+
/**
|
|
32
|
+
* Get list of public names in the module (dir() equivalent).
|
|
33
|
+
*/
|
|
34
|
+
getNames(): Promise<string[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Check if the module has a specific attribute.
|
|
37
|
+
*/
|
|
38
|
+
has(name: string): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Get module version string.
|
|
41
|
+
*/
|
|
42
|
+
getVersion(): Promise<string | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Reload the module (re-imports from Python).
|
|
45
|
+
*/
|
|
46
|
+
reload(): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Create a PyModule from an existing addon import result.
|
|
49
|
+
*/
|
|
50
|
+
static fromRef(objectId: PyObjectId, moduleName: string, addon: NativeAddon, callTimeout?: number, executionTimeout?: number): PyModule;
|
|
51
|
+
toString(): string;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=py-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"py-module.d.ts","sourceRoot":"","sources":["../../src/core/py-module.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAoB,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAKtE;;;;;;;;;;GAUG;AACH,qBAAa,QAAS,SAAQ,OAAO;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAGnC,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,WAAW,EAClB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,MAAM;IAY3B,6BAA6B;IAC7B,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,+BAA+B;IAC/B,IAAI,QAAQ,IAAI,UAAU,CAEzB;IAED;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAqE5C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAcnC;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKzC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAK1C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAM7B;;OAEG;IACH,MAAM,CAAC,OAAO,CACZ,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,WAAW,EAClB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,MAAM,GACxB,QAAQ;IAIF,QAAQ,IAAI,MAAM;CAG5B"}
|