@push.rocks/smartrust 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/.gitea/workflows/default_nottags.yaml +66 -0
  2. package/.gitea/workflows/default_tags.yaml +124 -0
  3. package/.vscode/launch.json +11 -0
  4. package/.vscode/settings.json +26 -0
  5. package/changelog.md +22 -0
  6. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  7. package/dist_ts/00_commitinfo_data.js +9 -0
  8. package/dist_ts/classes.rustbinarylocator.d.ts +28 -0
  9. package/dist_ts/classes.rustbinarylocator.js +126 -0
  10. package/dist_ts/classes.rustbridge.d.ts +39 -0
  11. package/dist_ts/classes.rustbridge.js +231 -0
  12. package/dist_ts/index.d.ts +3 -0
  13. package/dist_ts/index.js +4 -0
  14. package/dist_ts/interfaces/config.d.ts +40 -0
  15. package/dist_ts/interfaces/config.js +2 -0
  16. package/dist_ts/interfaces/index.d.ts +2 -0
  17. package/dist_ts/interfaces/index.js +3 -0
  18. package/dist_ts/interfaces/ipc.d.ts +36 -0
  19. package/dist_ts/interfaces/ipc.js +2 -0
  20. package/dist_ts/paths.d.ts +1 -0
  21. package/dist_ts/paths.js +3 -0
  22. package/dist_ts/plugins.d.ts +8 -0
  23. package/dist_ts/plugins.js +11 -0
  24. package/npmextra.json +24 -0
  25. package/package.json +25 -0
  26. package/readme.md +5 -0
  27. package/test/helpers/mock-rust-binary.mjs +62 -0
  28. package/test/test.rustbinarylocator.node.ts +98 -0
  29. package/test/test.rustbridge.node.ts +191 -0
  30. package/test/test.ts +12 -0
  31. package/ts/00_commitinfo_data.ts +8 -0
  32. package/ts/classes.rustbinarylocator.ts +140 -0
  33. package/ts/classes.rustbridge.ts +256 -0
  34. package/ts/index.ts +3 -0
  35. package/ts/interfaces/config.ts +42 -0
  36. package/ts/interfaces/index.ts +2 -0
  37. package/ts/interfaces/ipc.ts +40 -0
  38. package/ts/paths.ts +5 -0
  39. package/ts/plugins.ts +13 -0
  40. package/tsconfig.json +12 -0
@@ -0,0 +1,66 @@
1
+ name: Default (not tags)
2
+
3
+ on:
4
+ push:
5
+ tags-ignore:
6
+ - '**'
7
+
8
+ env:
9
+ IMAGE: code.foss.global/host.today/ht-docker-node:npmci
10
+ NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@code.foss.global/${{gitea.repository}}.git
11
+ NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
12
+ NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
13
+ NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
14
+ NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}}
15
+
16
+ jobs:
17
+ security:
18
+ runs-on: ubuntu-latest
19
+ continue-on-error: true
20
+ container:
21
+ image: ${{ env.IMAGE }}
22
+
23
+ steps:
24
+ - uses: actions/checkout@v3
25
+
26
+ - name: Install pnpm and npmci
27
+ run: |
28
+ pnpm install -g pnpm
29
+ pnpm install -g @ship.zone/npmci
30
+
31
+ - name: Run npm prepare
32
+ run: npmci npm prepare
33
+
34
+ - name: Audit production dependencies
35
+ run: |
36
+ npmci command npm config set registry https://registry.npmjs.org
37
+ npmci command pnpm audit --audit-level=high --prod
38
+ continue-on-error: true
39
+
40
+ - name: Audit development dependencies
41
+ run: |
42
+ npmci command npm config set registry https://registry.npmjs.org
43
+ npmci command pnpm audit --audit-level=high --dev
44
+ continue-on-error: true
45
+
46
+ test:
47
+ if: ${{ always() }}
48
+ needs: security
49
+ runs-on: ubuntu-latest
50
+ container:
51
+ image: ${{ env.IMAGE }}
52
+
53
+ steps:
54
+ - uses: actions/checkout@v3
55
+
56
+ - name: Test stable
57
+ run: |
58
+ npmci node install stable
59
+ npmci npm install
60
+ npmci npm test
61
+
62
+ - name: Test build
63
+ run: |
64
+ npmci node install stable
65
+ npmci npm install
66
+ npmci npm build
@@ -0,0 +1,124 @@
1
+ name: Default (tags)
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - '*'
7
+
8
+ env:
9
+ IMAGE: code.foss.global/host.today/ht-docker-node:npmci
10
+ NPMCI_COMPUTED_REPOURL: https://${{gitea.repository_owner}}:${{secrets.GITEA_TOKEN}}@code.foss.global/${{gitea.repository}}.git
11
+ NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
12
+ NPMCI_TOKEN_NPM2: ${{secrets.NPMCI_TOKEN_NPM2}}
13
+ NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
14
+ NPMCI_URL_CLOUDLY: ${{secrets.NPMCI_URL_CLOUDLY}}
15
+
16
+ jobs:
17
+ security:
18
+ runs-on: ubuntu-latest
19
+ continue-on-error: true
20
+ container:
21
+ image: ${{ env.IMAGE }}
22
+
23
+ steps:
24
+ - uses: actions/checkout@v3
25
+
26
+ - name: Prepare
27
+ run: |
28
+ pnpm install -g pnpm
29
+ pnpm install -g @ship.zone/npmci
30
+ npmci npm prepare
31
+
32
+ - name: Audit production dependencies
33
+ run: |
34
+ npmci command npm config set registry https://registry.npmjs.org
35
+ npmci command pnpm audit --audit-level=high --prod
36
+ continue-on-error: true
37
+
38
+ - name: Audit development dependencies
39
+ run: |
40
+ npmci command npm config set registry https://registry.npmjs.org
41
+ npmci command pnpm audit --audit-level=high --dev
42
+ continue-on-error: true
43
+
44
+ test:
45
+ if: ${{ always() }}
46
+ needs: security
47
+ runs-on: ubuntu-latest
48
+ container:
49
+ image: ${{ env.IMAGE }}
50
+
51
+ steps:
52
+ - uses: actions/checkout@v3
53
+
54
+ - name: Prepare
55
+ run: |
56
+ pnpm install -g pnpm
57
+ pnpm install -g @ship.zone/npmci
58
+ npmci npm prepare
59
+
60
+ - name: Test stable
61
+ run: |
62
+ npmci node install stable
63
+ npmci npm install
64
+ npmci npm test
65
+
66
+ - name: Test build
67
+ run: |
68
+ npmci node install stable
69
+ npmci npm install
70
+ npmci npm build
71
+
72
+ release:
73
+ needs: test
74
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
75
+ runs-on: ubuntu-latest
76
+ container:
77
+ image: ${{ env.IMAGE }}
78
+
79
+ steps:
80
+ - uses: actions/checkout@v3
81
+
82
+ - name: Prepare
83
+ run: |
84
+ pnpm install -g pnpm
85
+ pnpm install -g @ship.zone/npmci
86
+ npmci npm prepare
87
+
88
+ - name: Release
89
+ run: |
90
+ npmci node install stable
91
+ npmci npm publish
92
+
93
+ metadata:
94
+ needs: test
95
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
96
+ runs-on: ubuntu-latest
97
+ container:
98
+ image: ${{ env.IMAGE }}
99
+ continue-on-error: true
100
+
101
+ steps:
102
+ - uses: actions/checkout@v3
103
+
104
+ - name: Prepare
105
+ run: |
106
+ pnpm install -g pnpm
107
+ pnpm install -g @ship.zone/npmci
108
+ npmci npm prepare
109
+
110
+ - name: Code quality
111
+ run: |
112
+ npmci command npm install -g typescript
113
+ npmci npm install
114
+
115
+ - name: Trigger
116
+ run: npmci trigger
117
+
118
+ - name: Build docs and upload artifacts
119
+ run: |
120
+ npmci node install stable
121
+ npmci npm install
122
+ pnpm install -g @git.zone/tsdoc
123
+ npmci command tsdoc
124
+ continue-on-error: true
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": "0.2.0",
3
+ "configurations": [
4
+ {
5
+ "command": "npm test",
6
+ "name": "Run npm test",
7
+ "request": "launch",
8
+ "type": "node-terminal"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "json.schemas": [
3
+ {
4
+ "fileMatch": ["/npmextra.json"],
5
+ "schema": {
6
+ "type": "object",
7
+ "properties": {
8
+ "npmci": {
9
+ "type": "object",
10
+ "description": "settings for npmci"
11
+ },
12
+ "gitzone": {
13
+ "type": "object",
14
+ "description": "settings for gitzone",
15
+ "properties": {
16
+ "projectType": {
17
+ "type": "string",
18
+ "enum": ["website", "element", "service", "npm", "wcc"]
19
+ }
20
+ }
21
+ }
22
+ }
23
+ }
24
+ }
25
+ ]
26
+ }
package/changelog.md ADDED
@@ -0,0 +1,22 @@
1
+ # Changelog
2
+
3
+ ## 2026-02-10 - 1.1.0 - feat(rustbridge)
4
+ add RustBridge and RustBinaryLocator with typed IPC interfaces, plugins, tests and mock runner; export from index; add npm registries
5
+
6
+ - Introduce RustBridge: spawn and manage a child binary, JSON-over-stdin/stdout request/response handling, events, timeouts, pending request tracking, kill/cleanup logic.
7
+ - Introduce RustBinaryLocator: multi-strategy binary discovery (explicit path, env var, platform-specific package, local build paths, system PATH) with caching and logger hooks.
8
+ - Add IPC and config TypeScript interfaces (IManagementRequest/Response/Event, ICommandDefinition, IBinaryLocatorOptions, IRustBridgeOptions) and re-export via interfaces/index.ts.
9
+ - Update ts/plugins.ts to export fs, child_process, readline and events for easier native integration.
10
+ - Add tests for RustBridge and RustBinaryLocator plus a test helper mock-rust-binary.mjs to simulate the IPC protocol and exercise commands, events, timeouts and locator behaviors.
11
+ - Update ts/index.ts to export RustBridge and RustBinaryLocator and export interfaces; update npmextra.json to include internal Verdaccio registry alongside npmjs.org.
12
+
13
+ ## 2026-02-08 - 1.0.2 - fix()
14
+ no changes
15
+
16
+ - No changes detected in git diff; no release necessary.
17
+
18
+ ## 2026-02-08 - 1.0.1 - initial release
19
+ Initial release of the project.
20
+
21
+ - Initial commit creating the project repository and baseline files.
22
+ - Tagged as version 1.0.1.
@@ -0,0 +1,8 @@
1
+ /**
2
+ * autocreated commitinfo by @push.rocks/commitinfo
3
+ */
4
+ export declare const commitinfo: {
5
+ name: string;
6
+ version: string;
7
+ description: string;
8
+ };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * autocreated commitinfo by @push.rocks/commitinfo
3
+ */
4
+ export const commitinfo = {
5
+ name: '@push.rocks/smartrust',
6
+ version: '1.1.0',
7
+ description: 'a bridge between JS engines and rust'
8
+ };
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx1QkFBdUI7SUFDN0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHNDQUFzQztDQUNwRCxDQUFBIn0=
@@ -0,0 +1,28 @@
1
+ import type { IBinaryLocatorOptions, IRustBridgeLogger } from './interfaces/index.js';
2
+ /**
3
+ * Locates a Rust binary using a priority-ordered search strategy:
4
+ * 1. Explicit binaryPath override
5
+ * 2. Environment variable
6
+ * 3. Platform-specific npm package
7
+ * 4. Local development build paths
8
+ * 5. System PATH
9
+ */
10
+ export declare class RustBinaryLocator {
11
+ private options;
12
+ private logger;
13
+ private cachedPath;
14
+ constructor(options: IBinaryLocatorOptions, logger?: IRustBridgeLogger);
15
+ /**
16
+ * Find the binary path.
17
+ * Returns null if no binary is available.
18
+ */
19
+ findBinary(): Promise<string | null>;
20
+ /**
21
+ * Clear the cached binary path.
22
+ */
23
+ clearCache(): void;
24
+ private searchBinary;
25
+ private findPlatformPackageBinary;
26
+ private isExecutable;
27
+ private findInPath;
28
+ }
@@ -0,0 +1,126 @@
1
+ import * as plugins from './plugins.js';
2
+ const defaultLogger = {
3
+ log() { },
4
+ };
5
+ /**
6
+ * Locates a Rust binary using a priority-ordered search strategy:
7
+ * 1. Explicit binaryPath override
8
+ * 2. Environment variable
9
+ * 3. Platform-specific npm package
10
+ * 4. Local development build paths
11
+ * 5. System PATH
12
+ */
13
+ export class RustBinaryLocator {
14
+ options;
15
+ logger;
16
+ cachedPath = null;
17
+ constructor(options, logger) {
18
+ this.options = options;
19
+ this.logger = logger || defaultLogger;
20
+ }
21
+ /**
22
+ * Find the binary path.
23
+ * Returns null if no binary is available.
24
+ */
25
+ async findBinary() {
26
+ if (this.cachedPath !== null) {
27
+ return this.cachedPath;
28
+ }
29
+ const path = await this.searchBinary();
30
+ this.cachedPath = path;
31
+ return path;
32
+ }
33
+ /**
34
+ * Clear the cached binary path.
35
+ */
36
+ clearCache() {
37
+ this.cachedPath = null;
38
+ }
39
+ async searchBinary() {
40
+ const { binaryName } = this.options;
41
+ // 1. Explicit binary path override
42
+ if (this.options.binaryPath) {
43
+ if (await this.isExecutable(this.options.binaryPath)) {
44
+ this.logger.log('info', `Binary found via explicit path: ${this.options.binaryPath}`);
45
+ return this.options.binaryPath;
46
+ }
47
+ this.logger.log('warn', `Explicit binary path not executable: ${this.options.binaryPath}`);
48
+ }
49
+ // 2. Environment variable override
50
+ if (this.options.envVarName) {
51
+ const envPath = process.env[this.options.envVarName];
52
+ if (envPath) {
53
+ if (await this.isExecutable(envPath)) {
54
+ this.logger.log('info', `Binary found via ${this.options.envVarName}: ${envPath}`);
55
+ return envPath;
56
+ }
57
+ this.logger.log('warn', `${this.options.envVarName} set but not executable: ${envPath}`);
58
+ }
59
+ }
60
+ // 3. Platform-specific npm package
61
+ if (this.options.platformPackagePrefix) {
62
+ const platformBinary = await this.findPlatformPackageBinary();
63
+ if (platformBinary) {
64
+ this.logger.log('info', `Binary found in platform package: ${platformBinary}`);
65
+ return platformBinary;
66
+ }
67
+ }
68
+ // 4. Local development build paths
69
+ const localPaths = this.options.localPaths || [
70
+ plugins.path.resolve(process.cwd(), `rust/target/release/${binaryName}`),
71
+ plugins.path.resolve(process.cwd(), `rust/target/debug/${binaryName}`),
72
+ ];
73
+ for (const localPath of localPaths) {
74
+ if (await this.isExecutable(localPath)) {
75
+ this.logger.log('info', `Binary found at local path: ${localPath}`);
76
+ return localPath;
77
+ }
78
+ }
79
+ // 5. System PATH
80
+ if (this.options.searchSystemPath !== false) {
81
+ const systemPath = await this.findInPath(binaryName);
82
+ if (systemPath) {
83
+ this.logger.log('info', `Binary found in system PATH: ${systemPath}`);
84
+ return systemPath;
85
+ }
86
+ }
87
+ this.logger.log('error', `No binary '${binaryName}' found. Provide an explicit path, set an env var, install the platform package, or build from source.`);
88
+ return null;
89
+ }
90
+ async findPlatformPackageBinary() {
91
+ const { binaryName, platformPackagePrefix } = this.options;
92
+ const platform = process.platform;
93
+ const arch = process.arch;
94
+ const packageName = `${platformPackagePrefix}-${platform}-${arch}`;
95
+ try {
96
+ const packagePath = require.resolve(`${packageName}/${binaryName}`);
97
+ if (await this.isExecutable(packagePath)) {
98
+ return packagePath;
99
+ }
100
+ }
101
+ catch {
102
+ // Package not installed - expected for development
103
+ }
104
+ return null;
105
+ }
106
+ async isExecutable(filePath) {
107
+ try {
108
+ await plugins.fs.promises.access(filePath, plugins.fs.constants.X_OK);
109
+ return true;
110
+ }
111
+ catch {
112
+ return false;
113
+ }
114
+ }
115
+ async findInPath(binaryName) {
116
+ const pathDirs = (process.env.PATH || '').split(plugins.path.delimiter);
117
+ for (const dir of pathDirs) {
118
+ const fullPath = plugins.path.join(dir, binaryName);
119
+ if (await this.isExecutable(fullPath)) {
120
+ return fullPath;
121
+ }
122
+ }
123
+ return null;
124
+ }
125
+ }
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5ydXN0YmluYXJ5bG9jYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMucnVzdGJpbmFyeWxvY2F0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFHeEMsTUFBTSxhQUFhLEdBQXNCO0lBQ3ZDLEdBQUcsS0FBSSxDQUFDO0NBQ1QsQ0FBQztBQUVGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLE9BQU8sQ0FBd0I7SUFDL0IsTUFBTSxDQUFvQjtJQUMxQixVQUFVLEdBQWtCLElBQUksQ0FBQztJQUV6QyxZQUFZLE9BQThCLEVBQUUsTUFBMEI7UUFDcEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksYUFBYSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVU7UUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVk7UUFDeEIsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFFcEMsbUNBQW1DO1FBQ25DLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM1QixJQUFJLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxtQ0FBbUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO1lBQ2pDLENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsd0NBQXdDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM3RixDQUFDO1FBRUQsbUNBQW1DO1FBQ25DLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM1QixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckQsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixJQUFJLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsb0JBQW9CLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7b0JBQ25GLE9BQU8sT0FBTyxDQUFDO2dCQUNqQixDQUFDO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSw0QkFBNEIsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUMzRixDQUFDO1FBQ0gsQ0FBQztRQUVELG1DQUFtQztRQUNuQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN2QyxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQzlELElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxxQ0FBcUMsY0FBYyxFQUFFLENBQUMsQ0FBQztnQkFDL0UsT0FBTyxjQUFjLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUk7WUFDNUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLHVCQUF1QixVQUFVLEVBQUUsQ0FBQztZQUN4RSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUscUJBQXFCLFVBQVUsRUFBRSxDQUFDO1NBQ3ZFLENBQUM7UUFDRixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLElBQUksTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSwrQkFBK0IsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFFRCxpQkFBaUI7UUFDakIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzVDLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyRCxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxnQ0FBZ0MsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDdEUsT0FBTyxVQUFVLENBQUM7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsY0FBYyxVQUFVLHdHQUF3RyxDQUFDLENBQUM7UUFDM0osT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sS0FBSyxDQUFDLHlCQUF5QjtRQUNyQyxNQUFNLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUMzRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDMUIsTUFBTSxXQUFXLEdBQUcsR0FBRyxxQkFBcUIsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7UUFFbkUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFdBQVcsSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLElBQUksTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLE9BQU8sV0FBVyxDQUFDO1lBQ3JCLENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsbURBQW1EO1FBQ3JELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQWdCO1FBQ3pDLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxVQUFrQjtRQUN6QyxNQUFNLFFBQVEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hFLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7WUFDM0IsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELElBQUksTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLE9BQU8sUUFBUSxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0YifQ==
@@ -0,0 +1,39 @@
1
+ import * as plugins from './plugins.js';
2
+ import type { IRustBridgeOptions, TCommandMap } from './interfaces/index.js';
3
+ /**
4
+ * Generic bridge between TypeScript and a Rust binary.
5
+ * Communicates via JSON-over-stdin/stdout IPC protocol.
6
+ *
7
+ * @typeParam TCommands - Map of command names to their param/result types
8
+ */
9
+ export declare class RustBridge<TCommands extends TCommandMap = TCommandMap> extends plugins.events.EventEmitter {
10
+ private locator;
11
+ private options;
12
+ private logger;
13
+ private childProcess;
14
+ private readlineInterface;
15
+ private pendingRequests;
16
+ private requestCounter;
17
+ private isRunning;
18
+ private binaryPath;
19
+ constructor(options: IRustBridgeOptions);
20
+ /**
21
+ * Spawn the Rust binary and wait for it to signal readiness.
22
+ * Returns true if the binary was found and spawned successfully.
23
+ */
24
+ spawn(): Promise<boolean>;
25
+ /**
26
+ * Send a typed command to the Rust process and wait for the response.
27
+ */
28
+ sendCommand<K extends string & keyof TCommands>(method: K, params: TCommands[K]['params']): Promise<TCommands[K]['result']>;
29
+ /**
30
+ * Kill the Rust process and clean up all resources.
31
+ */
32
+ kill(): void;
33
+ /**
34
+ * Whether the bridge is currently running.
35
+ */
36
+ get running(): boolean;
37
+ private handleLine;
38
+ private cleanup;
39
+ }