@crosshands/runtime 0.1.2
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 +21 -0
- package/dist/broker/broker.d.ts +53 -0
- package/dist/broker/broker.d.ts.map +1 -0
- package/dist/broker/broker.js +346 -0
- package/dist/broker/broker.js.map +1 -0
- package/dist/bundle-lifecycle.d.ts +75 -0
- package/dist/bundle-lifecycle.d.ts.map +1 -0
- package/dist/bundle-lifecycle.js +247 -0
- package/dist/bundle-lifecycle.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc/control-transport.d.ts +59 -0
- package/dist/ipc/control-transport.d.ts.map +1 -0
- package/dist/ipc/control-transport.js +389 -0
- package/dist/ipc/control-transport.js.map +1 -0
- package/dist/ipc/endpoint.d.ts +15 -0
- package/dist/ipc/endpoint.d.ts.map +1 -0
- package/dist/ipc/endpoint.js +16 -0
- package/dist/ipc/endpoint.js.map +1 -0
- package/dist/ipc/framing.d.ts +4 -0
- package/dist/ipc/framing.d.ts.map +1 -0
- package/dist/ipc/framing.js +32 -0
- package/dist/ipc/framing.js.map +1 -0
- package/dist/ipc/unix.d.ts +17 -0
- package/dist/ipc/unix.d.ts.map +1 -0
- package/dist/ipc/unix.js +106 -0
- package/dist/ipc/unix.js.map +1 -0
- package/dist/ipc/windows.d.ts +13 -0
- package/dist/ipc/windows.d.ts.map +1 -0
- package/dist/ipc/windows.js +10 -0
- package/dist/ipc/windows.js.map +1 -0
- package/dist/policy/policy.d.ts +23 -0
- package/dist/policy/policy.d.ts.map +1 -0
- package/dist/policy/policy.js +53 -0
- package/dist/policy/policy.js.map +1 -0
- package/dist/providers/supervisor.d.ts +17 -0
- package/dist/providers/supervisor.d.ts.map +1 -0
- package/dist/providers/supervisor.js +122 -0
- package/dist/providers/supervisor.js.map +1 -0
- package/package.json +37 -0
- package/src/broker/broker.ts +439 -0
- package/src/bundle-lifecycle.ts +385 -0
- package/src/index.ts +9 -0
- package/src/ipc/control-transport.ts +517 -0
- package/src/ipc/endpoint.ts +27 -0
- package/src/ipc/framing.ts +31 -0
- package/src/ipc/unix.ts +110 -0
- package/src/ipc/windows.ts +26 -0
- package/src/policy/policy.ts +73 -0
- package/src/providers/supervisor.ts +140 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows.d.ts","sourceRoot":"","sources":["../../src/ipc/windows.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,WAAW,0BAA0B;IACzC,0BAA0B,IAAI,OAAO,CAAA;IACrC,UAAU,IAAI,eAAe,CAAA;CAC9B;AAED,wBAAgB,mBAAmB,CACjC,OAAO,CAAC,EAAE,0BAA0B,GACnC,0BAA0B,CAU5B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function windowsPipeSecurity(backend) {
|
|
2
|
+
if (process.platform !== 'win32') {
|
|
3
|
+
throw new Error('Windows named-pipe security is only available on Windows');
|
|
4
|
+
}
|
|
5
|
+
if (backend === undefined) {
|
|
6
|
+
throw new Error('Windows named-pipe security requires a native DACL and peer-verification backend');
|
|
7
|
+
}
|
|
8
|
+
return backend;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=windows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows.js","sourceRoot":"","sources":["../../src/ipc/windows.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,mBAAmB,CACjC,OAAoC;IAEpC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;IAC7E,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAA;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ComputerOperationName } from '@crosshands/contract';
|
|
2
|
+
export type StableAppIdentity = {
|
|
3
|
+
appId: string;
|
|
4
|
+
executableId: string;
|
|
5
|
+
publisher?: string;
|
|
6
|
+
};
|
|
7
|
+
export type AppClassification = 'allowed' | 'sensitive';
|
|
8
|
+
export declare function classifyApp(identity: StableAppIdentity): AppClassification;
|
|
9
|
+
export declare function assertAppAllowed(identity: StableAppIdentity): void;
|
|
10
|
+
export declare function redactProtectedContent(value: unknown): unknown;
|
|
11
|
+
export type DiagnosticEntry = {
|
|
12
|
+
event: 'operation';
|
|
13
|
+
operation: ComputerOperationName;
|
|
14
|
+
} | {
|
|
15
|
+
event: 'error';
|
|
16
|
+
message: string;
|
|
17
|
+
};
|
|
18
|
+
export declare class SecretSafeDiagnostics {
|
|
19
|
+
readonly entries: DiagnosticEntry[];
|
|
20
|
+
operation(operation: ComputerOperationName, _input: unknown): void;
|
|
21
|
+
error(message: string, _cause?: unknown): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/policy/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAEjE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,WAAW,CAAA;AAYvD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,iBAAiB,GAAG,iBAAiB,CAM1E;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAUlE;AAID,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAc9D;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,qBAAqB,CAAA;CAAE,GACxD;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAEvC,qBAAa,qBAAqB;IAChC,QAAQ,CAAC,OAAO,EAAE,eAAe,EAAE,CAAK;IAExC,SAAS,CAAC,SAAS,EAAE,qBAAqB,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAIlE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI;CAG/C"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const SENSITIVE_IDENTIFIERS = [
|
|
2
|
+
'1password',
|
|
3
|
+
'bitwarden',
|
|
4
|
+
'keychainaccess',
|
|
5
|
+
'keepass',
|
|
6
|
+
'lastpass',
|
|
7
|
+
'proton.pass',
|
|
8
|
+
'secrets'
|
|
9
|
+
];
|
|
10
|
+
export function classifyApp(identity) {
|
|
11
|
+
const stableIdentity = `${identity.appId}\n${identity.executableId}\n${identity.publisher ?? ''}`.toLowerCase();
|
|
12
|
+
return SENSITIVE_IDENTIFIERS.some((identifier) => stableIdentity.includes(identifier))
|
|
13
|
+
? 'sensitive'
|
|
14
|
+
: 'allowed';
|
|
15
|
+
}
|
|
16
|
+
export function assertAppAllowed(identity) {
|
|
17
|
+
if (classifyApp(identity) === 'sensitive') {
|
|
18
|
+
const error = new Error('Sensitive applications are blocked by default');
|
|
19
|
+
Object.assign(error, {
|
|
20
|
+
code: 'app_blocked',
|
|
21
|
+
retry: false,
|
|
22
|
+
remediation: 'choose_non_sensitive_target'
|
|
23
|
+
});
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const PROTECTED_ROLES = new Set(['password', 'securetext', 'secret', 'credential']);
|
|
28
|
+
export function redactProtectedContent(value) {
|
|
29
|
+
if (Array.isArray(value))
|
|
30
|
+
return value.map(redactProtectedContent);
|
|
31
|
+
if (value === null || typeof value !== 'object')
|
|
32
|
+
return value;
|
|
33
|
+
const record = value;
|
|
34
|
+
if (record.protected === true)
|
|
35
|
+
return '[REDACTED]';
|
|
36
|
+
const protectedRole = typeof record.role === 'string' && PROTECTED_ROLES.has(record.role.toLowerCase());
|
|
37
|
+
const result = {};
|
|
38
|
+
for (const [key, entry] of Object.entries(record)) {
|
|
39
|
+
const sensitiveKey = /^(value|text|password|secret|token|clipboard|data)$/i.test(key);
|
|
40
|
+
result[key] = protectedRole && sensitiveKey ? '[REDACTED]' : redactProtectedContent(entry);
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
export class SecretSafeDiagnostics {
|
|
45
|
+
entries = [];
|
|
46
|
+
operation(operation, _input) {
|
|
47
|
+
this.entries.push({ event: 'operation', operation });
|
|
48
|
+
}
|
|
49
|
+
error(message, _cause) {
|
|
50
|
+
this.entries.push({ event: 'error', message });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/policy/policy.ts"],"names":[],"mappings":"AAUA,MAAM,qBAAqB,GAAG;IAC5B,WAAW;IACX,WAAW;IACX,gBAAgB;IAChB,SAAS;IACT,UAAU;IACV,aAAa;IACb,SAAS;CACD,CAAA;AAEV,MAAM,UAAU,WAAW,CAAC,QAA2B;IACrD,MAAM,cAAc,GAClB,GAAG,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,CAAA;IAC1F,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACpF,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,SAAS,CAAA;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAA2B;IAC1D,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,WAAW,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;QACxE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;YACnB,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,6BAA6B;SAC3C,CAAC,CAAA;QACF,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAA;AAEnF,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;IAClE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAE7D,MAAM,MAAM,GAAG,KAAgC,CAAA;IAC/C,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI;QAAE,OAAO,YAAY,CAAA;IAClD,MAAM,aAAa,GACjB,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;IACnF,MAAM,MAAM,GAA4B,EAAE,CAAA;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,MAAM,YAAY,GAAG,sDAAsD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrF,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,IAAI,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAA;IAC5F,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAMD,MAAM,OAAO,qBAAqB;IACvB,OAAO,GAAsB,EAAE,CAAA;IAExC,SAAS,CAAC,SAAgC,EAAE,MAAe;QACzD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,MAAgB;QACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;IAChD,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ComputerProvider, type ProviderHandshake, type ProviderRequest, type ProviderResponse } from '@crosshands/contract';
|
|
2
|
+
export type ProviderSupervisorOptions = {
|
|
3
|
+
providerFactory: () => ComputerProvider;
|
|
4
|
+
graphicalSessionId: string;
|
|
5
|
+
maxInFlight?: number;
|
|
6
|
+
};
|
|
7
|
+
export declare class ProviderSupervisor {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(options: ProviderSupervisorOptions);
|
|
10
|
+
get generation(): string | undefined;
|
|
11
|
+
start(): Promise<ProviderHandshake>;
|
|
12
|
+
dispatch(request: ProviderRequest): Promise<ProviderResponse>;
|
|
13
|
+
cancel(requestId: string): Promise<void>;
|
|
14
|
+
restart(): Promise<ProviderHandshake>;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=supervisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/providers/supervisor.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAA;AAE7B,MAAM,MAAM,yBAAyB,GAAG;IACtC,eAAe,EAAE,MAAM,gBAAgB,CAAA;IACvC,kBAAkB,EAAE,MAAM,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,qBAAa,kBAAkB;;gBASjB,OAAO,EAAE,yBAAyB;IAO9C,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAEnC;IAEK,KAAK,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAyCnC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmC7D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC,OAAO,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAKrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAiB7B"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { CONTRACT_VERSIONS, ProviderHandshakeSchema, createComputerError } from '@crosshands/contract';
|
|
2
|
+
export class ProviderSupervisor {
|
|
3
|
+
#providerFactory;
|
|
4
|
+
#graphicalSessionId;
|
|
5
|
+
#maxInFlight;
|
|
6
|
+
#inFlight = new Set();
|
|
7
|
+
#provider;
|
|
8
|
+
#handshake;
|
|
9
|
+
#retirement = Promise.resolve();
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.#providerFactory = options.providerFactory;
|
|
12
|
+
this.#graphicalSessionId = options.graphicalSessionId;
|
|
13
|
+
this.#maxInFlight = options.maxInFlight ?? 16;
|
|
14
|
+
if (this.#maxInFlight <= 0)
|
|
15
|
+
throw new RangeError('maxInFlight must be positive');
|
|
16
|
+
}
|
|
17
|
+
get generation() {
|
|
18
|
+
return this.#handshake?.generation;
|
|
19
|
+
}
|
|
20
|
+
async start() {
|
|
21
|
+
await this.#retirement;
|
|
22
|
+
if (this.#handshake !== undefined)
|
|
23
|
+
return this.#handshake;
|
|
24
|
+
const provider = this.#providerFactory();
|
|
25
|
+
let handshake;
|
|
26
|
+
try {
|
|
27
|
+
handshake = ProviderHandshakeSchema.parse(await provider.start());
|
|
28
|
+
}
|
|
29
|
+
catch (cause) {
|
|
30
|
+
await provider.close().catch(() => undefined);
|
|
31
|
+
throw createComputerError('provider_unavailable', 'Provider handshake was malformed', {
|
|
32
|
+
cause: cause instanceof Error ? cause.name : 'unknown'
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
if (handshake.providerProtocol !== CONTRACT_VERSIONS.providerProtocol ||
|
|
36
|
+
handshake.publicContract !== CONTRACT_VERSIONS.publicContract) {
|
|
37
|
+
await provider.close().catch(() => undefined);
|
|
38
|
+
throw createComputerError('version_incompatible', 'Provider protocol is incompatible', {
|
|
39
|
+
expectedProviderProtocol: CONTRACT_VERSIONS.providerProtocol,
|
|
40
|
+
receivedProviderProtocol: handshake.providerProtocol,
|
|
41
|
+
expectedPublicContract: CONTRACT_VERSIONS.publicContract,
|
|
42
|
+
receivedPublicContract: handshake.publicContract
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (handshake.graphicalSessionId !== this.#graphicalSessionId) {
|
|
46
|
+
await provider.close().catch(() => undefined);
|
|
47
|
+
throw createComputerError('session_unavailable', 'Provider is attached to a different graphical session');
|
|
48
|
+
}
|
|
49
|
+
if (handshake.generation !== provider.generation) {
|
|
50
|
+
await provider.close().catch(() => undefined);
|
|
51
|
+
throw createComputerError('provider_unavailable', 'Provider generation handshake mismatch');
|
|
52
|
+
}
|
|
53
|
+
this.#provider = provider;
|
|
54
|
+
this.#handshake = handshake;
|
|
55
|
+
return handshake;
|
|
56
|
+
}
|
|
57
|
+
async dispatch(request) {
|
|
58
|
+
const provider = this.#provider ?? (await this.start(), this.#provider);
|
|
59
|
+
if (provider === undefined)
|
|
60
|
+
throw createComputerError('provider_unavailable', 'Provider failed to start');
|
|
61
|
+
if (this.#inFlight.size >= this.#maxInFlight) {
|
|
62
|
+
throw createComputerError('provider_unavailable', 'Provider backpressure limit reached');
|
|
63
|
+
}
|
|
64
|
+
if (request.deadlineAt <= Date.now()) {
|
|
65
|
+
throw createComputerError('timeout', 'Provider request deadline elapsed before dispatch');
|
|
66
|
+
}
|
|
67
|
+
this.#inFlight.add(request.requestId);
|
|
68
|
+
let timer;
|
|
69
|
+
let timedOut = false;
|
|
70
|
+
try {
|
|
71
|
+
const timeout = new Promise((_, reject) => {
|
|
72
|
+
timer = setTimeout(() => {
|
|
73
|
+
timedOut = true;
|
|
74
|
+
this.#retirement = this.#retire(provider, request.requestId);
|
|
75
|
+
reject(createComputerError('timeout', 'Provider request deadline elapsed'));
|
|
76
|
+
}, request.deadlineAt - Date.now());
|
|
77
|
+
timer.unref();
|
|
78
|
+
});
|
|
79
|
+
return await Promise.race([provider.dispatch(request), timeout]);
|
|
80
|
+
}
|
|
81
|
+
catch (cause) {
|
|
82
|
+
if (timedOut)
|
|
83
|
+
await this.#retirement;
|
|
84
|
+
if (typeof cause === 'object' && cause !== null && 'code' in cause)
|
|
85
|
+
throw cause;
|
|
86
|
+
throw createComputerError('provider_crashed', 'Provider crashed or disconnected', {
|
|
87
|
+
cause: cause instanceof Error ? cause.message : 'unknown'
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
if (timer !== undefined)
|
|
92
|
+
clearTimeout(timer);
|
|
93
|
+
this.#inFlight.delete(request.requestId);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async cancel(requestId) {
|
|
97
|
+
if (!this.#inFlight.has(requestId))
|
|
98
|
+
return;
|
|
99
|
+
await this.#provider?.cancel(requestId);
|
|
100
|
+
}
|
|
101
|
+
async restart() {
|
|
102
|
+
await this.close();
|
|
103
|
+
return this.start();
|
|
104
|
+
}
|
|
105
|
+
async close() {
|
|
106
|
+
await this.#retirement;
|
|
107
|
+
const provider = this.#provider;
|
|
108
|
+
this.#provider = undefined;
|
|
109
|
+
this.#handshake = undefined;
|
|
110
|
+
this.#inFlight.clear();
|
|
111
|
+
await provider?.close();
|
|
112
|
+
}
|
|
113
|
+
async #retire(provider, requestId) {
|
|
114
|
+
if (this.#provider === provider) {
|
|
115
|
+
this.#provider = undefined;
|
|
116
|
+
this.#handshake = undefined;
|
|
117
|
+
}
|
|
118
|
+
await provider.cancel(requestId).catch(() => undefined);
|
|
119
|
+
await provider.close().catch(() => undefined);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=supervisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/providers/supervisor.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@crosshands/runtime",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "Local broker, policy, provider supervision, and protected IPC for CrossHands",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist",
|
|
8
|
+
"src"
|
|
9
|
+
],
|
|
10
|
+
"type": "module",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./src/index.ts",
|
|
14
|
+
"development": "./src/index.ts",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@crosshands/contract": "0.1.2"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "24.10.1",
|
|
26
|
+
"typescript": "5.9.3",
|
|
27
|
+
"vitest": "4.1.5"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=22"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsc -p tsconfig.json",
|
|
34
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
35
|
+
"test": "vitest run test"
|
|
36
|
+
}
|
|
37
|
+
}
|