@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.
- package/.gitea/workflows/default_nottags.yaml +66 -0
- package/.gitea/workflows/default_tags.yaml +124 -0
- package/.vscode/launch.json +11 -0
- package/.vscode/settings.json +26 -0
- package/changelog.md +22 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.rustbinarylocator.d.ts +28 -0
- package/dist_ts/classes.rustbinarylocator.js +126 -0
- package/dist_ts/classes.rustbridge.d.ts +39 -0
- package/dist_ts/classes.rustbridge.js +231 -0
- package/dist_ts/index.d.ts +3 -0
- package/dist_ts/index.js +4 -0
- package/dist_ts/interfaces/config.d.ts +40 -0
- package/dist_ts/interfaces/config.js +2 -0
- package/dist_ts/interfaces/index.d.ts +2 -0
- package/dist_ts/interfaces/index.js +3 -0
- package/dist_ts/interfaces/ipc.d.ts +36 -0
- package/dist_ts/interfaces/ipc.js +2 -0
- package/dist_ts/paths.d.ts +1 -0
- package/dist_ts/paths.js +3 -0
- package/dist_ts/plugins.d.ts +8 -0
- package/dist_ts/plugins.js +11 -0
- package/npmextra.json +24 -0
- package/package.json +25 -0
- package/readme.md +5 -0
- package/test/helpers/mock-rust-binary.mjs +62 -0
- package/test/test.rustbinarylocator.node.ts +98 -0
- package/test/test.rustbridge.node.ts +191 -0
- package/test/test.ts +12 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/classes.rustbinarylocator.ts +140 -0
- package/ts/classes.rustbridge.ts +256 -0
- package/ts/index.ts +3 -0
- package/ts/interfaces/config.ts +42 -0
- package/ts/interfaces/index.ts +2 -0
- package/ts/interfaces/ipc.ts +40 -0
- package/ts/paths.ts +5 -0
- package/ts/plugins.ts +13 -0
- 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,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,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5ydXN0YmluYXJ5bG9jYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMucnVzdGJpbmFyeWxvY2F0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFHeEMsTUFBTSxhQUFhLEdBQXNCO0lBQ3ZDLEdBQUcsS0FBSSxDQUFDO0NBQ1QsQ0FBQztBQUVGOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQ3BCLE9BQU8sQ0FBd0I7SUFDL0IsTUFBTSxDQUFvQjtJQUMxQixVQUFVLEdBQWtCLElBQUksQ0FBQztJQUV6QyxZQUFZLE9BQThCLEVBQUUsTUFBMEI7UUFDcEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksYUFBYSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVU7UUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVk7UUFDeEIsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFFcEMsbUNBQW1DO1FBQ25DLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM1QixJQUFJLE1BQU0sSUFB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
|
|
@@ -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
|
+
}
|