@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.
Files changed (52) hide show
  1. package/LICENSE +21 -0
  2. package/dist/broker/broker.d.ts +53 -0
  3. package/dist/broker/broker.d.ts.map +1 -0
  4. package/dist/broker/broker.js +346 -0
  5. package/dist/broker/broker.js.map +1 -0
  6. package/dist/bundle-lifecycle.d.ts +75 -0
  7. package/dist/bundle-lifecycle.d.ts.map +1 -0
  8. package/dist/bundle-lifecycle.js +247 -0
  9. package/dist/bundle-lifecycle.js.map +1 -0
  10. package/dist/index.d.ts +10 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +10 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/ipc/control-transport.d.ts +59 -0
  15. package/dist/ipc/control-transport.d.ts.map +1 -0
  16. package/dist/ipc/control-transport.js +389 -0
  17. package/dist/ipc/control-transport.js.map +1 -0
  18. package/dist/ipc/endpoint.d.ts +15 -0
  19. package/dist/ipc/endpoint.d.ts.map +1 -0
  20. package/dist/ipc/endpoint.js +16 -0
  21. package/dist/ipc/endpoint.js.map +1 -0
  22. package/dist/ipc/framing.d.ts +4 -0
  23. package/dist/ipc/framing.d.ts.map +1 -0
  24. package/dist/ipc/framing.js +32 -0
  25. package/dist/ipc/framing.js.map +1 -0
  26. package/dist/ipc/unix.d.ts +17 -0
  27. package/dist/ipc/unix.d.ts.map +1 -0
  28. package/dist/ipc/unix.js +106 -0
  29. package/dist/ipc/unix.js.map +1 -0
  30. package/dist/ipc/windows.d.ts +13 -0
  31. package/dist/ipc/windows.d.ts.map +1 -0
  32. package/dist/ipc/windows.js +10 -0
  33. package/dist/ipc/windows.js.map +1 -0
  34. package/dist/policy/policy.d.ts +23 -0
  35. package/dist/policy/policy.d.ts.map +1 -0
  36. package/dist/policy/policy.js +53 -0
  37. package/dist/policy/policy.js.map +1 -0
  38. package/dist/providers/supervisor.d.ts +17 -0
  39. package/dist/providers/supervisor.d.ts.map +1 -0
  40. package/dist/providers/supervisor.js +122 -0
  41. package/dist/providers/supervisor.js.map +1 -0
  42. package/package.json +37 -0
  43. package/src/broker/broker.ts +439 -0
  44. package/src/bundle-lifecycle.ts +385 -0
  45. package/src/index.ts +9 -0
  46. package/src/ipc/control-transport.ts +517 -0
  47. package/src/ipc/endpoint.ts +27 -0
  48. package/src/ipc/framing.ts +31 -0
  49. package/src/ipc/unix.ts +110 -0
  50. package/src/ipc/windows.ts +26 -0
  51. package/src/policy/policy.ts +73 -0
  52. package/src/providers/supervisor.ts +140 -0
@@ -0,0 +1,247 @@
1
+ export class BundleLifecycleError extends Error {
2
+ code;
3
+ constructor(code, message) {
4
+ super(message);
5
+ this.code = code;
6
+ this.name = 'BundleLifecycleError';
7
+ }
8
+ }
9
+ const REMOVABLE_CROSSHANDS_RESOURCES = new Set([
10
+ 'broker-registration',
11
+ 'ipc',
12
+ 'cache',
13
+ 'log',
14
+ 'temporary-capture'
15
+ ]);
16
+ export function planUninstall(resources) {
17
+ const remove = [];
18
+ const preserve = [];
19
+ const manual = [];
20
+ for (const resource of resources) {
21
+ if (resource.kind === 'permission') {
22
+ manual.push(resource);
23
+ }
24
+ else if (resource.owner === 'crosshands' &&
25
+ REMOVABLE_CROSSHANDS_RESOURCES.has(resource.kind)) {
26
+ remove.push(resource);
27
+ }
28
+ else {
29
+ preserve.push(resource);
30
+ }
31
+ }
32
+ return { remove, preserve, manual };
33
+ }
34
+ function validateCandidate(candidate) {
35
+ if (candidate.version.length === 0 ||
36
+ !Number.isSafeInteger(candidate.release) ||
37
+ candidate.release < 0) {
38
+ throw new BundleLifecycleError('bundle_version_mismatch', 'Bundle version is invalid');
39
+ }
40
+ if (candidate.manifestDigest.length === 0) {
41
+ throw new BundleLifecycleError('bundle_integrity', 'Bundle manifest digest is missing');
42
+ }
43
+ const required = new Set(candidate.requiredArtifacts);
44
+ const artifacts = new Map();
45
+ if (required.size !== candidate.requiredArtifacts.length) {
46
+ throw new BundleLifecycleError('bundle_incomplete', 'Required artifact names must be unique');
47
+ }
48
+ for (const artifact of candidate.artifacts) {
49
+ if (artifacts.has(artifact.name)) {
50
+ throw new BundleLifecycleError('bundle_incomplete', 'Bundle artifact names must be unique');
51
+ }
52
+ if (artifact.version !== candidate.version) {
53
+ throw new BundleLifecycleError('bundle_version_mismatch', `Artifact ${artifact.name} does not match bundle ${candidate.version}`);
54
+ }
55
+ if (artifact.expectedDigest.length === 0 ||
56
+ artifact.actualDigest !== artifact.expectedDigest ||
57
+ !artifact.trustVerified) {
58
+ throw new BundleLifecycleError('bundle_integrity', `Artifact ${artifact.name} failed integrity verification`);
59
+ }
60
+ artifacts.set(artifact.name, artifact);
61
+ }
62
+ const missing = [...required].filter((name) => !artifacts.has(name));
63
+ if (missing.length > 0) {
64
+ throw new BundleLifecycleError('bundle_incomplete', `Bundle is missing required artifacts: ${missing.join(', ')}`);
65
+ }
66
+ return Object.freeze({
67
+ ...candidate,
68
+ requiredArtifacts: Object.freeze([...candidate.requiredArtifacts]),
69
+ artifacts: Object.freeze(candidate.artifacts.map((artifact) => Object.freeze({ ...artifact })))
70
+ });
71
+ }
72
+ /**
73
+ * Coordinates installed bundle state. Filesystem/package-manager work is deliberately
74
+ * supplied by callers; this class owns only verification gates and atomic state changes.
75
+ */
76
+ export class BundleLifecycle {
77
+ #bundles = new Map();
78
+ #clients = new Map();
79
+ #drainWaiters = new Set();
80
+ #phase = 'idle';
81
+ #activeVersion;
82
+ #mutationCount = 0;
83
+ #contextGeneration = 0;
84
+ get phase() {
85
+ return this.#phase;
86
+ }
87
+ get activeVersion() {
88
+ return this.#activeVersion;
89
+ }
90
+ get inFlightMutations() {
91
+ return this.#mutationCount;
92
+ }
93
+ stage(candidate) {
94
+ this.#assertNotBusy();
95
+ const verified = validateCandidate(candidate);
96
+ const existing = this.#bundles.get(verified.version);
97
+ if (existing !== undefined && existing.manifestDigest !== verified.manifestDigest) {
98
+ throw new BundleLifecycleError('bundle_integrity', `Version ${verified.version} is already staged with a different manifest`);
99
+ }
100
+ this.#bundles.set(verified.version, verified);
101
+ if (this.#phase === 'uninstalled')
102
+ this.#phase = 'idle';
103
+ }
104
+ bundle(version) {
105
+ return this.#bundles.get(version);
106
+ }
107
+ beginMutation() {
108
+ if (this.#phase !== 'running' || this.#activeVersion === undefined) {
109
+ throw new BundleLifecycleError('mutation_rejected', `Mutations are unavailable while lifecycle is ${this.#phase}`);
110
+ }
111
+ this.#mutationCount += 1;
112
+ let completed = false;
113
+ return () => {
114
+ if (completed)
115
+ return;
116
+ completed = true;
117
+ this.#mutationCount -= 1;
118
+ if (this.#mutationCount === 0) {
119
+ for (const resolve of this.#drainWaiters)
120
+ resolve();
121
+ this.#drainWaiters.clear();
122
+ }
123
+ };
124
+ }
125
+ async activate(version, hooks = {}) {
126
+ this.#assertNotBusy();
127
+ const target = this.#requireBundle(version);
128
+ this.#assertAdjacentToActive(target);
129
+ this.#phase = 'draining';
130
+ await this.#waitForMutations();
131
+ try {
132
+ await hooks.beforeCommit?.();
133
+ this.#phase = 'activating';
134
+ // This synchronous assignment is the state-machine commit point. Callers map it
135
+ // to an atomic pointer/rename and must not mutate a bundle in place.
136
+ this.#activeVersion = target.version;
137
+ this.#contextGeneration += 1;
138
+ for (const [id, client] of this.#clients) {
139
+ this.#clients.set(id, { ...client, reconnectRequired: true });
140
+ }
141
+ await hooks.afterCommit?.();
142
+ }
143
+ finally {
144
+ this.#phase = this.#activeVersion === undefined ? 'idle' : 'running';
145
+ }
146
+ }
147
+ async rollback(version, hooks = {}) {
148
+ await this.activate(version, hooks);
149
+ }
150
+ connectClient(id, version) {
151
+ this.#assertClientCompatible(version);
152
+ const client = { id, version, reconnectRequired: false };
153
+ this.#clients.set(id, client);
154
+ return { ...client };
155
+ }
156
+ reconnectClient(id, version) {
157
+ if (!this.#clients.has(id)) {
158
+ throw new BundleLifecycleError('version_incompatible', `Client ${id} is not connected`);
159
+ }
160
+ return this.connectClient(id, version);
161
+ }
162
+ client(id) {
163
+ const client = this.#clients.get(id);
164
+ return client === undefined ? undefined : { ...client };
165
+ }
166
+ assertDispatchCompatible(versions) {
167
+ const active = this.#requireActive();
168
+ for (const [role, version] of [
169
+ ['broker', versions.broker],
170
+ ['provider', versions.provider],
171
+ ['payload', versions.payload]
172
+ ]) {
173
+ if (version !== active.version) {
174
+ throw new BundleLifecycleError('version_incompatible', `${role} ${version} must match active bundle ${active.version}`);
175
+ }
176
+ }
177
+ this.#assertClientCompatible(versions.client);
178
+ }
179
+ issueContext() {
180
+ this.#requireActive();
181
+ return { generation: this.#contextGeneration };
182
+ }
183
+ isContextCurrent(context) {
184
+ return this.#activeVersion !== undefined && context.generation === this.#contextGeneration;
185
+ }
186
+ async uninstall(resources, remove) {
187
+ this.#assertNotBusy();
188
+ const plan = planUninstall(resources);
189
+ this.#phase = 'draining';
190
+ await this.#waitForMutations();
191
+ this.#phase = 'uninstalling';
192
+ try {
193
+ await Promise.all(plan.remove.map((resource) => remove(resource)));
194
+ }
195
+ catch (error) {
196
+ this.#phase = this.#activeVersion === undefined ? 'idle' : 'running';
197
+ throw error;
198
+ }
199
+ this.#bundles.clear();
200
+ this.#clients.clear();
201
+ this.#activeVersion = undefined;
202
+ this.#contextGeneration += 1;
203
+ this.#phase = 'uninstalled';
204
+ return plan;
205
+ }
206
+ #assertNotBusy() {
207
+ if (this.#phase === 'draining' ||
208
+ this.#phase === 'activating' ||
209
+ this.#phase === 'uninstalling') {
210
+ throw new BundleLifecycleError('lifecycle_busy', `Lifecycle is already ${this.#phase}`);
211
+ }
212
+ }
213
+ #requireBundle(version) {
214
+ const bundle = this.#bundles.get(version);
215
+ if (bundle === undefined) {
216
+ throw new BundleLifecycleError('bundle_incomplete', `Bundle ${version} is not staged`);
217
+ }
218
+ return bundle;
219
+ }
220
+ #requireActive() {
221
+ if (this.#activeVersion === undefined) {
222
+ throw new BundleLifecycleError('bundle_incomplete', 'No bundle is active');
223
+ }
224
+ return this.#requireBundle(this.#activeVersion);
225
+ }
226
+ #assertAdjacentToActive(target) {
227
+ if (this.#activeVersion === undefined)
228
+ return;
229
+ const active = this.#requireActive();
230
+ if (Math.abs(target.release - active.release) > 1) {
231
+ throw new BundleLifecycleError('version_incompatible', `Bundle ${target.version} is outside the one-release compatibility window of ${active.version}`);
232
+ }
233
+ }
234
+ #assertClientCompatible(version) {
235
+ const active = this.#requireActive();
236
+ const client = this.#requireBundle(version);
237
+ if (Math.abs(client.release - active.release) > 1) {
238
+ throw new BundleLifecycleError('version_incompatible', `Client ${version} is outside the one-release compatibility window of ${active.version}`);
239
+ }
240
+ }
241
+ async #waitForMutations() {
242
+ if (this.#mutationCount === 0)
243
+ return;
244
+ await new Promise((resolve) => this.#drainWaiters.add(resolve));
245
+ }
246
+ }
247
+ //# sourceMappingURL=bundle-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle-lifecycle.js","sourceRoot":"","sources":["../src/bundle-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export * from './broker/broker.js';
2
+ export * from './bundle-lifecycle.js';
3
+ export * from './ipc/endpoint.js';
4
+ export * from './ipc/control-transport.js';
5
+ export * from './ipc/framing.js';
6
+ export * from './ipc/unix.js';
7
+ export * from './ipc/windows.js';
8
+ export * from './policy/policy.js';
9
+ export * from './providers/supervisor.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,2BAA2B,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export * from './broker/broker.js';
2
+ export * from './bundle-lifecycle.js';
3
+ export * from './ipc/endpoint.js';
4
+ export * from './ipc/control-transport.js';
5
+ export * from './ipc/framing.js';
6
+ export * from './ipc/unix.js';
7
+ export * from './ipc/windows.js';
8
+ export * from './policy/policy.js';
9
+ export * from './providers/supervisor.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,mBAAmB,CAAA;AACjC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,2BAA2B,CAAA"}
@@ -0,0 +1,59 @@
1
+ import { type Socket } from 'node:net';
2
+ import { type ContractVersions } from '@crosshands/contract';
3
+ import type { BrokerEndpoint } from './endpoint.js';
4
+ import { type WindowsPipeSecurityBackend } from './windows.js';
5
+ export type LocalControlIdentity = {
6
+ osIdentity: string;
7
+ graphicalSessionId: string;
8
+ };
9
+ export type LocalControlHandshake = {
10
+ type: 'handshake';
11
+ requestId: string;
12
+ token: string;
13
+ versions: ContractVersions;
14
+ identity: LocalControlIdentity;
15
+ };
16
+ export interface LocalPeerAuthenticator {
17
+ authenticate(handshake: LocalControlHandshake, socket: Socket): Promise<boolean>;
18
+ }
19
+ export type LocalControlRequest = {
20
+ requestId: string;
21
+ payload: unknown;
22
+ deadlineAt: number;
23
+ };
24
+ export type LocalControlServerOptions = {
25
+ endpoint: BrokerEndpoint;
26
+ runtimeDirectory?: string;
27
+ tokenFile?: string;
28
+ identity: LocalControlIdentity;
29
+ handler: (request: LocalControlRequest) => Promise<unknown>;
30
+ authenticator?: LocalPeerAuthenticator;
31
+ windowsSecurity?: WindowsPipeSecurityBackend;
32
+ maxFrameBytes?: number;
33
+ maxFramesPerConnection?: number;
34
+ now?: () => number;
35
+ };
36
+ export declare class LocalControlServer {
37
+ #private;
38
+ constructor(options: LocalControlServerOptions);
39
+ get requestCount(): number;
40
+ start(): Promise<void>;
41
+ close(): Promise<void>;
42
+ }
43
+ export type LocalControlClientOptions = {
44
+ endpoint: BrokerEndpoint;
45
+ token: string;
46
+ versions: ContractVersions;
47
+ identity: LocalControlIdentity;
48
+ maxFrameBytes?: number;
49
+ };
50
+ export declare class LocalControlClient {
51
+ #private;
52
+ private constructor();
53
+ static connect(options: LocalControlClientOptions): Promise<LocalControlClient>;
54
+ request(payload: unknown, options: {
55
+ deadlineMs: number;
56
+ }): Promise<unknown>;
57
+ close(): Promise<void>;
58
+ }
59
+ //# sourceMappingURL=control-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-transport.d.ts","sourceRoot":"","sources":["../../src/ipc/control-transport.ts"],"names":[],"mappings":"AAEA,OAAY,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAA;AAE3C,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAGnD,OAAO,EAEL,KAAK,0BAA0B,EAEhC,MAAM,cAAc,CAAA;AAErB,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,kBAAkB,EAAE,MAAM,CAAA;CAC3B,CAAA;AAID,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,WAAW,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,QAAQ,EAAE,oBAAoB,CAAA;CAC/B,CAAA;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,SAAS,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACjF;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,cAAc,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,oBAAoB,CAAA;IAC9B,OAAO,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3D,aAAa,CAAC,EAAE,sBAAsB,CAAA;IACtC,eAAe,CAAC,EAAE,0BAA0B,CAAA;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB,CAAA;AA6ED,qBAAa,kBAAkB;;gBAWjB,OAAO,EAAE,yBAAyB;IAO9C,IAAI,YAAY,IAAI,MAAM,CAEzB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiNtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAkB7B;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,cAAc,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,QAAQ,EAAE,oBAAoB,CAAA;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,qBAAa,kBAAkB;;IAa7B,OAAO;WAgBM,OAAO,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA0BrF,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAkEtE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}