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,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* pynect - PluginManager
|
|
4
|
+
*
|
|
5
|
+
* Manages registration, lifecycle, and dispatch of pynect plugins.
|
|
6
|
+
* PyRuntime holds a single PluginManager instance.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.PluginManager = void 0;
|
|
43
|
+
const logger_1 = require("../utils/logger");
|
|
44
|
+
const logger = new logger_1.Logger('PluginManager');
|
|
45
|
+
class PluginManager {
|
|
46
|
+
_plugins = new Map();
|
|
47
|
+
_typeMap = new Map();
|
|
48
|
+
_moduleMap = new Map();
|
|
49
|
+
// Registration
|
|
50
|
+
register(plugin) {
|
|
51
|
+
if (this._plugins.has(plugin.name)) {
|
|
52
|
+
logger.debug(`Plugin already registered: ${plugin.name}; skipping`);
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
const entry = {
|
|
56
|
+
plugin,
|
|
57
|
+
active: false,
|
|
58
|
+
loadedAt: Date.now(),
|
|
59
|
+
modulesBound: new Set(),
|
|
60
|
+
};
|
|
61
|
+
this._plugins.set(plugin.name, entry);
|
|
62
|
+
for (const typeName of plugin.handledTypes ?? []) {
|
|
63
|
+
const handlers = this._typeMap.get(typeName) ?? [];
|
|
64
|
+
if (plugin.transformResult) {
|
|
65
|
+
handlers.push(plugin.transformResult.bind(plugin));
|
|
66
|
+
}
|
|
67
|
+
this._typeMap.set(typeName, handlers);
|
|
68
|
+
}
|
|
69
|
+
for (const mod of plugin.supportedModules) {
|
|
70
|
+
const list = this._moduleMap.get(mod) ?? [];
|
|
71
|
+
list.push(plugin);
|
|
72
|
+
this._moduleMap.set(mod, list);
|
|
73
|
+
}
|
|
74
|
+
logger.debug(`Registered plugin: ${plugin.name} v${plugin.version}`);
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
async registerBuiltins() {
|
|
78
|
+
const [{ PandasPlugin }, { NumpyPlugin }, { TorchPlugin }] = await Promise.all([
|
|
79
|
+
Promise.resolve().then(() => __importStar(require('./builtin/pandas-plugin'))),
|
|
80
|
+
Promise.resolve().then(() => __importStar(require('./builtin/numpy-plugin'))),
|
|
81
|
+
Promise.resolve().then(() => __importStar(require('./builtin/torch-plugin'))),
|
|
82
|
+
]);
|
|
83
|
+
this.register(new PandasPlugin());
|
|
84
|
+
this.register(new NumpyPlugin());
|
|
85
|
+
this.register(new TorchPlugin());
|
|
86
|
+
}
|
|
87
|
+
// Lifecycle
|
|
88
|
+
async initAll(ctx) {
|
|
89
|
+
const extCtx = {
|
|
90
|
+
...ctx,
|
|
91
|
+
registerTypeHandler: (typeName, handler) => {
|
|
92
|
+
const handlers = this._typeMap.get(typeName) ?? [];
|
|
93
|
+
handlers.push(handler);
|
|
94
|
+
this._typeMap.set(typeName, handlers);
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
for (const [name, entry] of this._plugins) {
|
|
98
|
+
try {
|
|
99
|
+
await entry.plugin.onInit?.(extCtx);
|
|
100
|
+
entry.active = true;
|
|
101
|
+
logger.debug(`Initialised plugin: ${name}`);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
logger.warn(`Plugin ${name} init failed (non-fatal): ${err}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async shutdownAll() {
|
|
109
|
+
for (const [name, entry] of this._plugins) {
|
|
110
|
+
if (!entry.active) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
await entry.plugin.onShutdown?.();
|
|
115
|
+
entry.active = false;
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
logger.warn(`Plugin ${name} shutdown error (non-fatal): ${err}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async onModuleImported(moduleName, moduleOid) {
|
|
123
|
+
const plugins = this._moduleMap.get(moduleName) ?? [];
|
|
124
|
+
for (const plugin of plugins) {
|
|
125
|
+
try {
|
|
126
|
+
await plugin.onModuleImported?.(moduleName, moduleOid);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
logger.warn(`Plugin ${plugin.name} onModuleImported error: ${err}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Transform chain
|
|
134
|
+
transformResult(value, typeName, metadata = {}) {
|
|
135
|
+
const handlers = this._typeMap.get(typeName) ?? [];
|
|
136
|
+
for (const handler of handlers) {
|
|
137
|
+
try {
|
|
138
|
+
const result = handler(value, typeName, metadata);
|
|
139
|
+
if (result !== null) {
|
|
140
|
+
return result;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
logger.warn(`Type transform error for ${typeName}: ${err}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
serializeValue(value, targetTypeName) {
|
|
150
|
+
for (const [, entry] of this._plugins) {
|
|
151
|
+
if (!entry.active || !entry.plugin.serializeValue) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
const result = entry.plugin.serializeValue(value, targetTypeName);
|
|
156
|
+
if (result !== null) {
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
logger.warn(`Plugin serialize error: ${err}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
// Introspection
|
|
167
|
+
get names() { return [...this._plugins.keys()]; }
|
|
168
|
+
getPlugin(name) { return this._plugins.get(name); }
|
|
169
|
+
get active() { return [...this._plugins.values()].filter((e) => e.active); }
|
|
170
|
+
get all() { return [...this._plugins.values()]; }
|
|
171
|
+
isActive(name) { return this._plugins.get(name)?.active === true; }
|
|
172
|
+
}
|
|
173
|
+
exports.PluginManager = PluginManager;
|
|
174
|
+
//# sourceMappingURL=plugin-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-manager.js","sourceRoot":"","sources":["../../src/plugins/plugin-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pynect - Plugin Interface
|
|
3
|
+
*
|
|
4
|
+
* Every pynect plugin must implement this interface. Plugins can:
|
|
5
|
+
* - Transform Python object values as they cross the JS boundary
|
|
6
|
+
* - Register custom type mappings
|
|
7
|
+
* - Hook into lifecycle events (init, shutdown)
|
|
8
|
+
* - Add convenience methods to PyProxy instances
|
|
9
|
+
*/
|
|
10
|
+
import type { SerializedValue } from '../types/python';
|
|
11
|
+
export type PythonTypeName = string;
|
|
12
|
+
export interface PluginInitContext {
|
|
13
|
+
runtimeVersion: string;
|
|
14
|
+
pythonVersion: {
|
|
15
|
+
major: number;
|
|
16
|
+
minor: number;
|
|
17
|
+
patch: number;
|
|
18
|
+
};
|
|
19
|
+
registerTypeHandler(typeName: PythonTypeName, handler: TypeTransformHandler): void;
|
|
20
|
+
}
|
|
21
|
+
export type TypeTransformHandler = (raw: SerializedValue, typeHint: string, metadata: Record<string, unknown>) => unknown | null;
|
|
22
|
+
export interface PynectPlugin {
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly version: string;
|
|
25
|
+
readonly supportedModules: readonly string[];
|
|
26
|
+
readonly handledTypes?: readonly PythonTypeName[];
|
|
27
|
+
readonly description?: string;
|
|
28
|
+
readonly homepage?: string;
|
|
29
|
+
onInit?(ctx: PluginInitContext): Promise<void> | void;
|
|
30
|
+
onShutdown?(): Promise<void> | void;
|
|
31
|
+
onModuleImported?(moduleName: string, moduleOid: number): Promise<void> | void;
|
|
32
|
+
transformResult?: TypeTransformHandler;
|
|
33
|
+
serializeValue?(value: unknown, targetTypeName?: string): SerializedValue | null;
|
|
34
|
+
}
|
|
35
|
+
export interface PluginRegistration {
|
|
36
|
+
plugin: PynectPlugin;
|
|
37
|
+
active: boolean;
|
|
38
|
+
loadedAt: number;
|
|
39
|
+
modulesBound: Set<string>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=plugin.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.interface.d.ts","sourceRoot":"","sources":["../../src/plugins/plugin.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIvD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACpF;AAED,MAAM,MAAM,oBAAoB,GAAG,CACjC,GAAG,EAAO,eAAe,EACzB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9B,OAAO,GAAG,IAAI,CAAC;AAEpB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAc,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAW,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAK,SAAS,cAAc,EAAE,CAAC;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAM,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAS,MAAM,CAAC;IAElC,MAAM,CAAC,CAAC,GAAG,EAAE,iBAAiB,GAAwB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3E,UAAU,CAAC,IAA2C,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3E,gBAAgB,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAE/E,eAAe,CAAC,EAAE,oBAAoB,CAAC;IACvC,cAAc,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;CAClF;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAQ,YAAY,CAAC;IAC3B,MAAM,EAAQ,OAAO,CAAC;IACtB,QAAQ,EAAM,MAAM,CAAC;IACrB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC3B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* pynect - Plugin Interface
|
|
4
|
+
*
|
|
5
|
+
* Every pynect plugin must implement this interface. Plugins can:
|
|
6
|
+
* - Transform Python object values as they cross the JS boundary
|
|
7
|
+
* - Register custom type mappings
|
|
8
|
+
* - Hook into lifecycle events (init, shutdown)
|
|
9
|
+
* - Add convenience methods to PyProxy instances
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
//# sourceMappingURL=plugin.interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.interface.js","sourceRoot":"","sources":["../../src/plugins/plugin.interface.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pynect - DataFrameBridge
|
|
3
|
+
* Converts Pandas DataFrames and Series to/from JavaScript objects.
|
|
4
|
+
*
|
|
5
|
+
* Wire Protocol
|
|
6
|
+
*
|
|
7
|
+
* DataFrames use the "split" orientation of pandas JSON:
|
|
8
|
+
* {
|
|
9
|
+
* "columns": ["col1", "col2", ...],
|
|
10
|
+
* "data": [[row0_val0, row0_val1], [row1_val0, row1_val1], ...],
|
|
11
|
+
* "index": [0, 1, 2, ...],
|
|
12
|
+
* "dtypes": {"col1": "int64", "col2": "object", ...},
|
|
13
|
+
* "shape": [nrows, ncols]
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* For large DataFrames (>64KB) the JSON is embedded in a MessagePack
|
|
17
|
+
* binary to reduce parse overhead. The format field in SerializedValue
|
|
18
|
+
* tells the bridge which path to take:
|
|
19
|
+
* format === 'pandas_dataframe' -> DataFrame decode
|
|
20
|
+
* format === 'pandas_series' -> Series decode
|
|
21
|
+
*
|
|
22
|
+
* Series wire format:
|
|
23
|
+
* {
|
|
24
|
+
* "name": "my_series",
|
|
25
|
+
* "data": [1, 2, 3, 4],
|
|
26
|
+
* "index": [0, 1, 2, 3],
|
|
27
|
+
* "dtype": "int64",
|
|
28
|
+
* "length": 4
|
|
29
|
+
* }
|
|
30
|
+
*
|
|
31
|
+
* JavaScript representation
|
|
32
|
+
*
|
|
33
|
+
* DataFrameResult (records orientation is built client-side):
|
|
34
|
+
* {
|
|
35
|
+
* columns: string[],
|
|
36
|
+
* data: Record<string, unknown>[], <- row objects
|
|
37
|
+
* index: unknown[],
|
|
38
|
+
* dtypes: Record<string, string>,
|
|
39
|
+
* shape: [number, number]
|
|
40
|
+
* }
|
|
41
|
+
*
|
|
42
|
+
* SeriesResult:
|
|
43
|
+
* {
|
|
44
|
+
* name: string,
|
|
45
|
+
* data: unknown[],
|
|
46
|
+
* index: unknown[],
|
|
47
|
+
* dtype: string,
|
|
48
|
+
* length: number
|
|
49
|
+
* }
|
|
50
|
+
*/
|
|
51
|
+
import type { SerializedValue, DataFrameResult, SeriesResult } from '../types/python';
|
|
52
|
+
interface DataFrameSerializeOptions {
|
|
53
|
+
/**
|
|
54
|
+
* Row limit when serializing JS -> Python.
|
|
55
|
+
* Excess rows are truncated. Default: unlimited.
|
|
56
|
+
*/
|
|
57
|
+
maxRows?: number;
|
|
58
|
+
/**
|
|
59
|
+
* Use MessagePack instead of JSON for the wire format.
|
|
60
|
+
* Default: true when data size > 64 KB.
|
|
61
|
+
*/
|
|
62
|
+
forceMsgPack?: boolean;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* DataFrameBridge - bidirectional conversion for Pandas DataFrames and Series.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* const bridge = new DataFrameBridge();
|
|
70
|
+
*
|
|
71
|
+
* // Deserialize a DataFrame received from Python
|
|
72
|
+
* const df: DataFrameResult = bridge.deserializeDataFrame(sv);
|
|
73
|
+
* console.log(df.columns); // ['city', 'population']
|
|
74
|
+
* console.log(df.data[0]); // { city: 'Algiers', population: 3500000 }
|
|
75
|
+
*
|
|
76
|
+
* // Serialize a records-array back to Python
|
|
77
|
+
* const sv2 = bridge.serializeDataFrame(df.data, df.columns);
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare class DataFrameBridge {
|
|
81
|
+
/**
|
|
82
|
+
* Deserialize a PANDAS_DATAFRAME SerializedValue -> DataFrameResult.
|
|
83
|
+
*/
|
|
84
|
+
deserializeDataFrame(sv: SerializedValue): DataFrameResult;
|
|
85
|
+
/**
|
|
86
|
+
* Deserialize a PANDAS_SERIES SerializedValue -> SeriesResult.
|
|
87
|
+
*/
|
|
88
|
+
deserializeSeries(sv: SerializedValue): SeriesResult;
|
|
89
|
+
/**
|
|
90
|
+
* Serialize a records-array (array of row objects) into a PANDAS_DATAFRAME
|
|
91
|
+
* SerializedValue that Python can reconstruct with pd.DataFrame(wire).
|
|
92
|
+
*
|
|
93
|
+
* @param records - array of row objects (e.g. [{col1: val1, col2: val2}, ...])
|
|
94
|
+
* @param columns - explicit column order; inferred from first record if omitted
|
|
95
|
+
*/
|
|
96
|
+
serializeDataFrame(records: Record<string, unknown>[], columns?: string[], options?: DataFrameSerializeOptions): SerializedValue;
|
|
97
|
+
/**
|
|
98
|
+
* Serialize a plain array of values into a PANDAS_SERIES SerializedValue.
|
|
99
|
+
*
|
|
100
|
+
* @param data - the series values
|
|
101
|
+
* @param name - series name
|
|
102
|
+
* @param index - optional explicit index
|
|
103
|
+
*/
|
|
104
|
+
serializeSeries(data: unknown[], name?: string, index?: unknown[]): SerializedValue;
|
|
105
|
+
/**
|
|
106
|
+
* Convert a DataFrameResult to a 2-D array (column-major).
|
|
107
|
+
* Useful for charting libraries.
|
|
108
|
+
*/
|
|
109
|
+
static toColumnArrays(df: DataFrameResult): Record<string, unknown[]>;
|
|
110
|
+
/**
|
|
111
|
+
* Convert a DataFrameResult to a 2-D raw array (no column keys).
|
|
112
|
+
* Row-major: result[row][colIndex].
|
|
113
|
+
*/
|
|
114
|
+
static toMatrix(df: DataFrameResult): unknown[][];
|
|
115
|
+
/**
|
|
116
|
+
* Filter rows of a DataFrameResult.
|
|
117
|
+
*/
|
|
118
|
+
static filterRows(df: DataFrameResult, predicate: (row: Record<string, unknown>, index: unknown) => boolean): DataFrameResult;
|
|
119
|
+
/**
|
|
120
|
+
* Select specific columns from a DataFrameResult.
|
|
121
|
+
*/
|
|
122
|
+
static selectColumns(df: DataFrameResult, cols: string[]): DataFrameResult;
|
|
123
|
+
/**
|
|
124
|
+
* Compute basic descriptive stats for a numeric column in a DataFrameResult.
|
|
125
|
+
*/
|
|
126
|
+
static describeColumn(df: DataFrameResult, col: string): {
|
|
127
|
+
count: number;
|
|
128
|
+
mean: number;
|
|
129
|
+
std: number;
|
|
130
|
+
min: number;
|
|
131
|
+
max: number;
|
|
132
|
+
sum: number;
|
|
133
|
+
};
|
|
134
|
+
private _decodeWire;
|
|
135
|
+
private _encodeWire;
|
|
136
|
+
private _buildDataFrameResult;
|
|
137
|
+
private _buildSeriesResult;
|
|
138
|
+
private _inferDtype;
|
|
139
|
+
}
|
|
140
|
+
export {};
|
|
141
|
+
//# sourceMappingURL=data-frame-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-frame-bridge.d.ts","sourceRoot":"","sources":["../../src/serialization/data-frame-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAGH,OAAO,KAAK,EACV,eAAe,EAEf,eAAe,EACf,YAAY,EACb,MAAM,iBAAiB,CAAC;AAyBzB,UAAU,yBAAyB;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,eAAe;IAI1B;;OAEG;IACH,oBAAoB,CAAC,EAAE,EAAE,eAAe,GAAG,eAAe;IAU1D;;OAEG;IACH,iBAAiB,CAAC,EAAE,EAAE,eAAe,GAAG,YAAY;IAYpD;;;;;;OAMG;IACH,kBAAkB,CAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAClC,OAAO,CAAC,EAAE,MAAM,EAAE,EAClB,OAAO,GAAE,yBAA8B,GACtC,eAAe;IAiBlB;;;;;;OAMG;IACH,eAAe,CACb,IAAI,EAAE,OAAO,EAAE,EACf,IAAI,GAAE,MAAW,EACjB,KAAK,CAAC,EAAE,OAAO,EAAE,GAChB,eAAe;IAclB;;;OAGG;IACH,MAAM,CAAC,cAAc,CACnB,EAAE,EAAE,eAAe,GAClB,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAQ5B;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,eAAe,GAAG,OAAO,EAAE,EAAE;IAIjD;;OAEG;IACH,MAAM,CAAC,UAAU,CACf,EAAE,EAAE,eAAe,EACnB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,GACnE,eAAe;IAsBlB;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe;IAa1E;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG;QACvD,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;KACb;IAoBD,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,WAAW;CAYpB"}
|