arcane-os 0.81.0 → 0.83.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.
@@ -0,0 +1,109 @@
1
+ import {createConnection} from 'node:net';
2
+ import {createCoreClient} from '../../browser-runtime/core/client.mjs';
3
+ import {CoreError} from '../../browser-runtime/core/contracts.mjs';
4
+ import {createCoreFrameDecoder, encodeCoreFrame} from './stdio.mjs';
5
+
6
+ function failure(code, message) { return new CoreError({code, message}); }
7
+ function reportSocketError(error) { console.error('Arcane Core connection failed:', error); }
8
+ function report(observer, error) {
9
+ try {
10
+ Promise.resolve(observer(error)).catch(function observerFailed(cause) { console.error(cause, error); });
11
+ } catch (cause) { console.error(cause, error); }
12
+ }
13
+
14
+ // Terminal events settle writes even when a destroyed stream omits its callback.
15
+ export function writeCoreSocket(output, content) {
16
+ return new Promise(function writeFrame(resolve, reject) {
17
+ let settled = false;
18
+ function finish(error) {
19
+ if (settled) return;
20
+ settled = true;
21
+ output.off('error', finish);
22
+ output.off('close', closed);
23
+ output.off('finish', closed);
24
+ if (error) reject(error);
25
+ else resolve();
26
+ }
27
+ function closed() { finish(failure('CORE_CONNECTION_CLOSED', 'The Core output closed during a write.')); }
28
+ output.once('error', finish);
29
+ output.once('close', closed);
30
+ output.once('finish', closed);
31
+ if (output.destroyed || output.writableEnded) { closed(); return; }
32
+ try { output.write(content, finish); } catch (error) { finish(error); }
33
+ });
34
+ }
35
+
36
+ /** Connect once and pause incoming frames until their owner is attached. */
37
+ export function connectCoreSocket(endpoint, signal, onError = reportSocketError) {
38
+ signal?.throwIfAborted();
39
+ if (typeof endpoint !== 'string' || !endpoint) throw new TypeError('A shared Core endpoint must be a nonempty local pipe/socket path.');
40
+ return new Promise(function connect(resolve, reject) {
41
+ const socket = createConnection({path: endpoint});
42
+ socket.pause();
43
+ function cleanup() {
44
+ signal?.removeEventListener('abort', abort);
45
+ socket.off('connect', connected);
46
+ socket.off('error', failed);
47
+ }
48
+ function failed(error) {
49
+ cleanup();
50
+ socket.on('error', function connectionFailed(error) { report(onError, error); });
51
+ socket.destroy();
52
+ reject(error);
53
+ }
54
+ function abort() { failed(signal.reason); }
55
+ function connected() { cleanup(); resolve(socket); }
56
+ socket.once('connect', connected);
57
+ socket.once('error', failed);
58
+ signal?.addEventListener('abort', abort, {once: true});
59
+ if (signal?.aborted) abort();
60
+ });
61
+ }
62
+
63
+ /** Own one connected socket; the caller decides which RPC methods to expose. */
64
+ export function createCoreSocketConnection({socket, endpoint, signal, onError = reportSocketError,
65
+ replayRuntimeState = false, name = 'core', closedMessage = 'The Core connection closed.'}) {
66
+ let client;
67
+ let receive;
68
+ let closing = false;
69
+ let writes = Promise.resolve();
70
+ let resolveClosed;
71
+ let rejectClosed;
72
+ const closed = new Promise(function ownConnection(resolve, reject) { resolveClosed = resolve; rejectClosed = reject; });
73
+ closed.catch(function observeConnectionFailure() {});
74
+ function diagnostic(error) { report(onError, error); }
75
+ function failed(error) { client?.failTransport(error); socket.destroy(); rejectClosed(error); }
76
+ const decoder = createCoreFrameDecoder(function frame(value) { receive(value); });
77
+ socket.on('data', function data(chunk) { try { decoder.push(chunk); } catch (error) { failed(error); } });
78
+ socket.on('error', failed);
79
+ socket.on('end', function ended() {
80
+ try { decoder.finish(); } catch (error) { failed(error); }
81
+ });
82
+ socket.on('close', function disconnected() {
83
+ signal?.removeEventListener('abort', abort);
84
+ if (!closing) client?.failTransport(failure('CORE_CONNECTION_CLOSED', closedMessage));
85
+ resolveClosed();
86
+ });
87
+ const transport = {
88
+ name,
89
+ subscribe(listener) {
90
+ receive = listener;
91
+ return function disconnect() {
92
+ closing = true;
93
+ writes.finally(function retireSocket() { socket.end(); }).catch(diagnostic);
94
+ };
95
+ },
96
+ send(frame) {
97
+ const content = encodeCoreFrame(frame);
98
+ writes = writes.then(function sendFrame() { return writeCoreSocket(socket, content); });
99
+ writes.catch(failed);
100
+ return writes;
101
+ }
102
+ };
103
+ client = createCoreClient({transport, replayRuntimeState, onError: diagnostic});
104
+ function abort() { client.close(); }
105
+ signal?.addEventListener('abort', abort, {once: true});
106
+ if (signal?.aborted) abort();
107
+ socket.resume();
108
+ return {client, endpoint, closed, close: function close() { client.close(); return closed; }};
109
+ }