@sealant/runtime-client 0.2.0 → 0.4.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,84 @@
1
+ import type { StreamEnd, StreamWindowUpdate } from "@sealant/runtime-protocol";
2
+ /** How a `Channel` writes a frame back to the daemon over the shared connection. The client wires
3
+ * this to its framed-socket writer; the channel never touches the socket directly. */
4
+ export interface ChannelTransport {
5
+ /** Send a `StreamFrame::Data` for this channel. */
6
+ sendData(channelId: string, data: Uint8Array): void;
7
+ /** Send a `StreamFrame::WindowUpdate` (flow-control credits) for this channel. */
8
+ sendWindowUpdate(channelId: string, credits: bigint): void;
9
+ /** Send a `StreamFrame::End` for this channel (half-close from the client side). */
10
+ sendEnd(channelId: string, end?: StreamEnd): void;
11
+ /** Detach this channel from the client's demux table once it is fully closed. */
12
+ release(channelId: string): void;
13
+ }
14
+ /** Why a channel fully closed: a daemon `StreamEnd`, a local `destroy()` teardown, or the
15
+ * connection dying. Note that a half-close via `end()` does NOT resolve `closed` — only the *full*
16
+ * close does, and for a well-behaved peer that arrives as `remote` (the daemon's `StreamEnd`). */
17
+ export type ChannelClose = {
18
+ kind: "remote";
19
+ end: StreamEnd;
20
+ } | {
21
+ kind: "local";
22
+ } | {
23
+ kind: "error";
24
+ error: Error;
25
+ };
26
+ /**
27
+ * One demultiplexed byte channel. It is an async-iterable of inbound `Uint8Array` chunks (the bytes
28
+ * the daemon wrote on this `channelId`) and exposes `write`/`windowUpdate`/`end` for outbound bytes.
29
+ *
30
+ * Backpressure-friendly: inbound chunks queue until consumed; `closed` resolves with the close cause.
31
+ */
32
+ export declare class Channel implements AsyncIterable<Uint8Array> {
33
+ #private;
34
+ /** The daemon-assigned channel id this conduit is bound to. */
35
+ readonly channelId: string;
36
+ /** Resolves with the cause when the channel is *fully* closed (remote End, local `destroy()`, or
37
+ * error). A half-close via `end()` does NOT resolve this — inbound keeps flowing until the remote
38
+ * `StreamEnd`, at which point it resolves as `remote`. */
39
+ readonly closed: Promise<ChannelClose>;
40
+ constructor(channelId: string, transport: ChannelTransport);
41
+ /** True once the channel has been *fully* closed (both halves done). */
42
+ get isClosed(): boolean;
43
+ /** True once the outbound half has been closed via `end()` (or a full close). Inbound may still
44
+ * be flowing while this is true. */
45
+ get isOutboundClosed(): boolean;
46
+ /** The close cause, if the channel is closed; otherwise `undefined`. */
47
+ get closeCause(): ChannelClose | undefined;
48
+ /** Route an inbound `StreamFrame::Data` payload into this channel's byte stream. */
49
+ pushData(data: Uint8Array): void;
50
+ /** Route an inbound `StreamFrame::WindowUpdate`: release outbound writers waiting on credits. */
51
+ pushWindowUpdate(update: StreamWindowUpdate): void;
52
+ /** Route an inbound `StreamFrame::End`: drain queued bytes, then close the iterator. */
53
+ pushEnd(end: StreamEnd): void;
54
+ /** The connection died under us; fail the channel. */
55
+ fail(error: Error): void;
56
+ /** Write bytes to the daemon as a `StreamFrame::Data` on this channel. Throws once the outbound
57
+ * half has been closed (via `end()`/`destroy()`) or the channel is fully closed. */
58
+ write(data: Uint8Array): void;
59
+ /** Grant the daemon `credits` more bytes of send window (`StreamFrame::WindowUpdate`). Throws once
60
+ * the outbound half is closed. (Credits flow with outbound frames; once we have half-closed we no
61
+ * longer issue them.) */
62
+ windowUpdate(credits: bigint): void;
63
+ /** Await the next inbound `WindowUpdate`'s credit count (for outbound flow control). */
64
+ awaitWindow(): Promise<bigint>;
65
+ /**
66
+ * Half-close the outbound direction: send a `StreamFrame::End` to the daemon (our EOF) and reject
67
+ * further `write`/`windowUpdate`. Crucially this does NOT tear down inbound — the channel keeps
68
+ * delivering the daemon's output and stays open until the remote `StreamEnd` arrives (which then
69
+ * resolves `closed` as `remote`). This is the SSH semantics `ssh host cmd` relies on: stdin can
70
+ * hit EOF immediately while stdout/stderr and the exit status are still in flight.
71
+ *
72
+ * Idempotent; a no-op if the outbound half is already closed or the channel is fully closed.
73
+ */
74
+ end(end?: StreamEnd): void;
75
+ /**
76
+ * Full local teardown: half-close the outbound direction if it is still open, then close inbound
77
+ * too and resolve `closed` as `local`. Use this for a real abort/teardown where you do not intend
78
+ * to keep reading the daemon's remaining output. For normal completion prefer `end()` and let the
79
+ * remote `StreamEnd` close the channel.
80
+ */
81
+ destroy(end?: StreamEnd): void;
82
+ [Symbol.asyncIterator](): AsyncIterator<Uint8Array>;
83
+ }
84
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/E;sFACsF;AACtF,MAAM,WAAW,gBAAgB;IAC/B,mDAAmD;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACpD,kFAAkF;IAClF,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3D,oFAAoF;IACpF,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAClD,iFAAiF;IACjF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED;;kGAEkG;AAClG,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,SAAS,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpC;;;;;GAKG;AACH,qBAAa,OAAQ,YAAW,aAAa,CAAC,UAAU,CAAC;;IACvD,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAc3B;;8DAE0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;gBAE3B,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB;IAQ1D,wEAAwE;IACxE,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;wCACoC;IACpC,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,wEAAwE;IACxE,IAAI,UAAU,IAAI,YAAY,GAAG,SAAS,CAEzC;IAID,oFAAoF;IACpF,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAUhC,iGAAiG;IACjG,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAKlD,wFAAwF;IACxF,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAI7B,sDAAsD;IACtD,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAMxB;wFACoF;IACpF,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAK7B;;6BAEyB;IACzB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKnC,wFAAwF;IACxF,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAI9B;;;;;;;;OAQG;IACH,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI;IAM1B;;;;;OAKG;IACH,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI;IAW9B,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,UAAU,CAAC;CA+BpD"}
@@ -0,0 +1,166 @@
1
+ // @sealant/runtime-client — channel multiplexing.
2
+ //
3
+ // A `Channel` is one logical byte conduit inside the single length-prefixed control connection
4
+ // (ADR-0012). The daemon addresses frames by `channelId`; the client demuxes inbound
5
+ // `ServerMessage::Stream` frames into the matching `Channel` and the `Channel` muxes outbound bytes
6
+ // back out as `ClientMessage::Stream` frames. This is the substrate the gateway builds SSH channels
7
+ // (session attach, direct-tcpip forwards, SFTP subsystem) on top of.
8
+ /**
9
+ * One demultiplexed byte channel. It is an async-iterable of inbound `Uint8Array` chunks (the bytes
10
+ * the daemon wrote on this `channelId`) and exposes `write`/`windowUpdate`/`end` for outbound bytes.
11
+ *
12
+ * Backpressure-friendly: inbound chunks queue until consumed; `closed` resolves with the close cause.
13
+ */
14
+ export class Channel {
15
+ /** The daemon-assigned channel id this conduit is bound to. */
16
+ channelId;
17
+ #transport;
18
+ #inbound = [];
19
+ #waiters = [];
20
+ #windowWaiters = [];
21
+ /** Outbound half-closed: we have sent our `StreamEnd`; `write`/`windowUpdate` are now rejected.
22
+ * Inbound delivery is unaffected — this is the SSH-style half-close. */
23
+ #outboundClosed = false;
24
+ /** Fully closed: both halves are done. Inbound iterator completes and `closed` resolves. */
25
+ #closed = false;
26
+ #close;
27
+ #resolveClosed;
28
+ /** Resolves with the cause when the channel is *fully* closed (remote End, local `destroy()`, or
29
+ * error). A half-close via `end()` does NOT resolve this — inbound keeps flowing until the remote
30
+ * `StreamEnd`, at which point it resolves as `remote`. */
31
+ closed;
32
+ constructor(channelId, transport) {
33
+ this.channelId = channelId;
34
+ this.#transport = transport;
35
+ this.closed = new Promise((resolve) => {
36
+ this.#resolveClosed = resolve;
37
+ });
38
+ }
39
+ /** True once the channel has been *fully* closed (both halves done). */
40
+ get isClosed() {
41
+ return this.#closed;
42
+ }
43
+ /** True once the outbound half has been closed via `end()` (or a full close). Inbound may still
44
+ * be flowing while this is true. */
45
+ get isOutboundClosed() {
46
+ return this.#outboundClosed;
47
+ }
48
+ /** The close cause, if the channel is closed; otherwise `undefined`. */
49
+ get closeCause() {
50
+ return this.#close;
51
+ }
52
+ // --- inbound (demux target; called by the client) -------------------------------------------
53
+ /** Route an inbound `StreamFrame::Data` payload into this channel's byte stream. */
54
+ pushData(data) {
55
+ if (this.#closed)
56
+ return;
57
+ const waiter = this.#waiters.shift();
58
+ if (waiter) {
59
+ waiter({ value: data, done: false });
60
+ }
61
+ else {
62
+ this.#inbound.push(data);
63
+ }
64
+ }
65
+ /** Route an inbound `StreamFrame::WindowUpdate`: release outbound writers waiting on credits. */
66
+ pushWindowUpdate(update) {
67
+ if (this.#closed)
68
+ return;
69
+ for (const w of this.#windowWaiters.splice(0))
70
+ w(update.credits);
71
+ }
72
+ /** Route an inbound `StreamFrame::End`: drain queued bytes, then close the iterator. */
73
+ pushEnd(end) {
74
+ this.#finish({ kind: "remote", end });
75
+ }
76
+ /** The connection died under us; fail the channel. */
77
+ fail(error) {
78
+ this.#finish({ kind: "error", error });
79
+ }
80
+ // --- outbound (mux source; called by the consumer) ------------------------------------------
81
+ /** Write bytes to the daemon as a `StreamFrame::Data` on this channel. Throws once the outbound
82
+ * half has been closed (via `end()`/`destroy()`) or the channel is fully closed. */
83
+ write(data) {
84
+ if (this.#outboundClosed)
85
+ throw new Error(`channel ${this.channelId} outbound is closed`);
86
+ this.#transport.sendData(this.channelId, data);
87
+ }
88
+ /** Grant the daemon `credits` more bytes of send window (`StreamFrame::WindowUpdate`). Throws once
89
+ * the outbound half is closed. (Credits flow with outbound frames; once we have half-closed we no
90
+ * longer issue them.) */
91
+ windowUpdate(credits) {
92
+ if (this.#outboundClosed)
93
+ throw new Error(`channel ${this.channelId} outbound is closed`);
94
+ this.#transport.sendWindowUpdate(this.channelId, credits);
95
+ }
96
+ /** Await the next inbound `WindowUpdate`'s credit count (for outbound flow control). */
97
+ awaitWindow() {
98
+ return new Promise((resolve) => this.#windowWaiters.push(resolve));
99
+ }
100
+ /**
101
+ * Half-close the outbound direction: send a `StreamFrame::End` to the daemon (our EOF) and reject
102
+ * further `write`/`windowUpdate`. Crucially this does NOT tear down inbound — the channel keeps
103
+ * delivering the daemon's output and stays open until the remote `StreamEnd` arrives (which then
104
+ * resolves `closed` as `remote`). This is the SSH semantics `ssh host cmd` relies on: stdin can
105
+ * hit EOF immediately while stdout/stderr and the exit status are still in flight.
106
+ *
107
+ * Idempotent; a no-op if the outbound half is already closed or the channel is fully closed.
108
+ */
109
+ end(end) {
110
+ if (this.#outboundClosed || this.#closed)
111
+ return;
112
+ this.#outboundClosed = true;
113
+ this.#transport.sendEnd(this.channelId, end);
114
+ }
115
+ /**
116
+ * Full local teardown: half-close the outbound direction if it is still open, then close inbound
117
+ * too and resolve `closed` as `local`. Use this for a real abort/teardown where you do not intend
118
+ * to keep reading the daemon's remaining output. For normal completion prefer `end()` and let the
119
+ * remote `StreamEnd` close the channel.
120
+ */
121
+ destroy(end) {
122
+ if (this.#closed)
123
+ return;
124
+ if (!this.#outboundClosed) {
125
+ this.#outboundClosed = true;
126
+ this.#transport.sendEnd(this.channelId, end);
127
+ }
128
+ this.#finish({ kind: "local" });
129
+ }
130
+ // --- async iteration --------------------------------------------------------------------------
131
+ [Symbol.asyncIterator]() {
132
+ return {
133
+ next: () => {
134
+ const queued = this.#inbound.shift();
135
+ if (queued !== undefined)
136
+ return Promise.resolve({ value: queued, done: false });
137
+ if (this.#closed)
138
+ return Promise.resolve({ value: undefined, done: true });
139
+ return new Promise((resolve) => this.#waiters.push(resolve));
140
+ },
141
+ // The consumer stopped iterating (e.g. `break`): they will read no more inbound bytes, so this
142
+ // is a real teardown, not a half-close. Destroy fully.
143
+ return: () => {
144
+ this.destroy();
145
+ return Promise.resolve({ value: undefined, done: true });
146
+ },
147
+ };
148
+ }
149
+ /** Internal: mark closed once, drain waiters, resolve `closed`, and detach from the demux table. */
150
+ #finish(cause) {
151
+ if (this.#closed)
152
+ return;
153
+ this.#closed = true;
154
+ // A full close implies the outbound half is closed too (block any late writes).
155
+ this.#outboundClosed = true;
156
+ this.#close = cause;
157
+ for (const waiter of this.#waiters.splice(0)) {
158
+ waiter({ value: undefined, done: true });
159
+ }
160
+ for (const w of this.#windowWaiters.splice(0))
161
+ w(0n);
162
+ this.#transport.release(this.channelId);
163
+ this.#resolveClosed(cause);
164
+ }
165
+ }
166
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,EAAE;AACF,+FAA+F;AAC/F,qFAAqF;AACrF,oGAAoG;AACpG,oGAAoG;AACpG,qEAAqE;AAyBrE;;;;;GAKG;AACH,MAAM,OAAO,OAAO;IAClB,+DAA+D;IACtD,SAAS,CAAS;IAE3B,UAAU,CAAmB;IAC7B,QAAQ,GAAiB,EAAE,CAAC;IAC5B,QAAQ,GAAwD,EAAE,CAAC;IACnE,cAAc,GAAqC,EAAE,CAAC;IACtD;4EACwE;IACxE,eAAe,GAAG,KAAK,CAAC;IACxB,4FAA4F;IAC5F,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,CAAgB;IACtB,cAAc,CAAiC;IAE/C;;8DAE0D;IACjD,MAAM,CAAwB;IAEvC,YAAY,SAAiB,EAAE,SAA2B;QACxD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACpC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,wEAAwE;IACxE,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;wCACoC;IACpC,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,wEAAwE;IACxE,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,+FAA+F;IAE/F,oFAAoF;IACpF,QAAQ,CAAC,IAAgB;QACvB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,iGAAiG;IACjG,gBAAgB,CAAC,MAA0B;QACzC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC;IAED,wFAAwF;IACxF,OAAO,CAAC,GAAc;QACpB,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,sDAAsD;IACtD,IAAI,CAAC,KAAY;QACf,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,+FAA+F;IAE/F;wFACoF;IACpF,KAAK,CAAC,IAAgB;QACpB,IAAI,IAAI,CAAC,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,SAAS,qBAAqB,CAAC,CAAC;QAC1F,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED;;6BAEyB;IACzB,YAAY,CAAC,OAAe;QAC1B,IAAI,IAAI,CAAC,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,SAAS,qBAAqB,CAAC,CAAC;QAC1F,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,wFAAwF;IACxF,WAAW;QACT,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;;;OAQG;IACH,GAAG,CAAC,GAAe;QACjB,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACjD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,GAAe;QACrB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,iGAAiG;IAEjG,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,OAAO;YACL,IAAI,EAAE,GAAwC,EAAE;gBAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACrC,IAAI,MAAM,KAAK,SAAS;oBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACjF,IAAI,IAAI,CAAC,OAAO;oBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/D,CAAC;YACD,+FAA+F;YAC/F,uDAAuD;YACvD,MAAM,EAAE,GAAwC,EAAE;gBAChD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,CAAC;SACF,CAAC;IACJ,CAAC;IAED,oGAAoG;IACpG,OAAO,CAAC,KAAmB;QACzB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,gFAAgF;QAChF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF"}
package/dist/client.d.ts CHANGED
@@ -1,7 +1,10 @@
1
1
  import type { ChildProcess } from "node:child_process";
2
2
  import type { Duplex } from "node:stream";
3
3
  import type { MessageInitShape } from "@bufbuild/protobuf";
4
- import { CommandSchema, ControlErrorCode, type Capabilities, type ControlError, type ControlResponse, type EventEnvelope, type ExecAccepted, type HealthReport, type ProcessList, type RuntimeMetrics } from "@sealant/runtime-protocol";
4
+ import { CommandSchema, ControlErrorCode, AttachMode, type Capabilities, type ControlError, type ControlResponse, type EventEnvelope, type ExecAccepted, type ForwardOpened, type HealthReport, type ProcessAttached, type ProcessList, type RuntimeMetrics, type SftpOpened, type StreamAttached } from "@sealant/runtime-protocol";
5
+ import { Channel } from "./channel.js";
6
+ export { Channel } from "./channel.js";
7
+ export type { ChannelTransport, ChannelClose } from "./channel.js";
5
8
  /** Error raised when the daemon returns a typed control error. */
6
9
  export declare class SealantError extends Error {
7
10
  /** Stable error code (e.g. `ControlErrorCode.PROCESS_START_FAILED`). */
@@ -53,17 +56,76 @@ export declare class SealantClient {
53
56
  }>;
54
57
  /** Send a command oneof case and await its single (typed) response. */
55
58
  request(command: CommandInit): Promise<ControlResponse>;
59
+ /**
60
+ * Register a {@link Channel} for `channelId` so inbound `ServerMessage::Stream` frames demux into
61
+ * it and writes mux back out. Low-level: the high-level openers ({@link SealantClient.attachSession},
62
+ * {@link SealantClient.openForward}, {@link SealantClient.openSftp}, {@link SealantClient.execAttached})
63
+ * call this with the daemon-allocated id from their result. A multiplexing consumer (the gateway)
64
+ * can also call it directly when it already holds a channel id.
65
+ */
66
+ openChannel(channelId: string): Channel;
56
67
  health(): Promise<HealthReport>;
57
68
  getCapabilities(): Promise<Capabilities>;
58
69
  getMetrics(): Promise<RuntimeMetrics>;
59
70
  listProcesses(executionId?: string): Promise<ProcessList>;
60
71
  exec(options: ExecOptions): Promise<ExecAccepted>;
61
- writeStdin(processId: string, data: Uint8Array): Promise<void>;
72
+ /**
73
+ * Write input bytes to a process's stdin or an interactive PTY session's input.
74
+ *
75
+ * The daemon's `WriteStdinArgs` carries an exclusive choice of `processId` (non-PTY stdin) OR
76
+ * `sessionId` (PTY input); it routes by whichever is set (see runtime dispatch). The gateway needs
77
+ * the `sessionId` path to deliver SSH PTY keystrokes to a live session.
78
+ *
79
+ * Backward compatible: a bare string `target` is treated as a `processId` (the original signature).
80
+ * Pass `{ sessionId }` to target a session, or `{ processId }` to be explicit.
81
+ */
82
+ writeStdin(target: string | {
83
+ processId: string;
84
+ } | {
85
+ sessionId: string;
86
+ }, data: Uint8Array): Promise<void>;
87
+ /**
88
+ * Convenience for the gateway's interactive path: deliver `data` to a PTY session's input by
89
+ * `sessionId`. Equivalent to `writeStdin({ sessionId }, data)`.
90
+ */
91
+ writeSessionInput(sessionId: string, data: Uint8Array): Promise<void>;
62
92
  signalProcess(processId: string, signal: number): Promise<void>;
63
93
  shutdown(graceMillis?: number): Promise<void>;
94
+ /** Attach to an existing PTY session as a multiplexed channel (interactive by default). */
95
+ attachSession(sessionId: string, mode?: AttachMode): Promise<{
96
+ result: StreamAttached;
97
+ channel: Channel;
98
+ }>;
99
+ /** Detach a previously attached session channel and tear down its local {@link Channel}. */
100
+ detachSession(channelId: string): Promise<void>;
101
+ /** Open a direct-TCP forward to `host:port` as a multiplexed byte channel. */
102
+ openForward(host: string, port: number, executionId?: string): Promise<{
103
+ result: ForwardOpened;
104
+ channel: Channel;
105
+ }>;
106
+ /** Close a forward channel and tear down its local {@link Channel}. */
107
+ closeForward(channelId: string): Promise<void>;
108
+ /** Open an SFTP subsystem channel as a multiplexed byte channel. */
109
+ openSftp(options?: {
110
+ executionId?: string;
111
+ cwd?: string;
112
+ }): Promise<{
113
+ result: SftpOpened;
114
+ channel: Channel;
115
+ }>;
116
+ /** Close an SFTP channel and tear down its local {@link Channel}. */
117
+ closeSftp(channelId: string): Promise<void>;
118
+ /**
119
+ * Exec with `attach=true`: the daemon allocates a byte channel bound to the process's stdio and
120
+ * returns {@link ProcessAttached} with its `channelId`. Returns the typed result plus the open
121
+ * {@link Channel} (stdout/stderr ride inbound frames; stdin rides outbound `write`).
122
+ */
123
+ execAttached(options: ExecOptions): Promise<{
124
+ result: ProcessAttached;
125
+ channel: Channel;
126
+ }>;
64
127
  /** Async iterator over telemetry events (typed `EventEnvelope`; `payload` is a discriminated union). */
65
128
  events(): AsyncIterableIterator<EventEnvelope>;
66
129
  close(): void;
67
130
  }
68
- export {};
69
131
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -8,7 +8,9 @@ import net from "node:net";
8
8
  import { spawn } from "node:child_process";
9
9
  import { Buffer } from "node:buffer";
10
10
  import { setTimeout as delay } from "node:timers/promises";
11
- import { create, encodeClient, encodeFrame, FrameDecoder, SCHEMA_VERSION, ClientMessageSchema, CommandSchema, ControlErrorCode, } from "@sealant/runtime-protocol";
11
+ import { create, encodeClient, encodeFrame, FrameDecoder, SCHEMA_VERSION, ClientMessageSchema, CommandSchema, StreamFrameSchema, ControlErrorCode, AttachMode, } from "@sealant/runtime-protocol";
12
+ import { Channel } from "./channel.js";
13
+ export { Channel } from "./channel.js";
12
14
  /** Error raised when the daemon returns a typed control error. */
13
15
  export class SealantError extends Error {
14
16
  /** Stable error code (e.g. `ControlErrorCode.PROCESS_START_FAILED`). */
@@ -51,8 +53,18 @@ export class SealantClient {
51
53
  #closed = false;
52
54
  #eventQueue = [];
53
55
  #eventWaiters = [];
56
+ /** Demux table: channel_id → open `Channel`. Inbound `ServerMessage::Stream` frames route here. */
57
+ #channels = new Map();
58
+ #transport;
54
59
  constructor(stream) {
55
60
  this.#stream = stream;
61
+ // The transport every Channel uses to mux outbound frames back over this one connection.
62
+ this.#transport = {
63
+ sendData: (channelId, data) => this.#sendStream(channelId, { case: "data", value: data }),
64
+ sendWindowUpdate: (channelId, credits) => this.#sendStream(channelId, { case: "windowUpdate", value: { credits } }),
65
+ sendEnd: (channelId, end) => this.#sendStream(channelId, { case: "end", value: end ?? {} }),
66
+ release: (channelId) => this.#channels.delete(channelId),
67
+ };
56
68
  this.#attach(stream);
57
69
  }
58
70
  /** Wire a transport stream's data/close/end/error events into the client. */
@@ -132,6 +144,30 @@ export class SealantClient {
132
144
  });
133
145
  });
134
146
  }
147
+ /** Mux one outbound `ClientMessage::Stream` frame onto the shared connection. */
148
+ #sendStream(channelId, payload) {
149
+ if (this.#closed)
150
+ throw new Error("client is closed");
151
+ const message = create(ClientMessageSchema, {
152
+ message: { case: "stream", value: { channelId, seq: 0n, payload } },
153
+ });
154
+ this.#stream.write(encodeFrame(encodeClient(message)));
155
+ }
156
+ /**
157
+ * Register a {@link Channel} for `channelId` so inbound `ServerMessage::Stream` frames demux into
158
+ * it and writes mux back out. Low-level: the high-level openers ({@link SealantClient.attachSession},
159
+ * {@link SealantClient.openForward}, {@link SealantClient.openSftp}, {@link SealantClient.execAttached})
160
+ * call this with the daemon-allocated id from their result. A multiplexing consumer (the gateway)
161
+ * can also call it directly when it already holds a channel id.
162
+ */
163
+ openChannel(channelId) {
164
+ const existing = this.#channels.get(channelId);
165
+ if (existing)
166
+ return existing;
167
+ const channel = new Channel(channelId, this.#transport);
168
+ this.#channels.set(channelId, channel);
169
+ return channel;
170
+ }
135
171
  async health() {
136
172
  return resultValue(okResult(await this.request({ case: "runtimeHealth", value: {} })), "health");
137
173
  }
@@ -162,8 +198,30 @@ export class SealantClient {
162
198
  }));
163
199
  return resultValue(result, "execAccepted");
164
200
  }
165
- async writeStdin(processId, data) {
166
- okResult(await this.request({ case: "writeStdin", value: { processId, data } }));
201
+ /**
202
+ * Write input bytes to a process's stdin or an interactive PTY session's input.
203
+ *
204
+ * The daemon's `WriteStdinArgs` carries an exclusive choice of `processId` (non-PTY stdin) OR
205
+ * `sessionId` (PTY input); it routes by whichever is set (see runtime dispatch). The gateway needs
206
+ * the `sessionId` path to deliver SSH PTY keystrokes to a live session.
207
+ *
208
+ * Backward compatible: a bare string `target` is treated as a `processId` (the original signature).
209
+ * Pass `{ sessionId }` to target a session, or `{ processId }` to be explicit.
210
+ */
211
+ async writeStdin(target, data) {
212
+ const value = typeof target === "string"
213
+ ? { processId: target, data }
214
+ : "sessionId" in target
215
+ ? { sessionId: target.sessionId, data }
216
+ : { processId: target.processId, data };
217
+ okResult(await this.request({ case: "writeStdin", value }));
218
+ }
219
+ /**
220
+ * Convenience for the gateway's interactive path: deliver `data` to a PTY session's input by
221
+ * `sessionId`. Equivalent to `writeStdin({ sessionId }, data)`.
222
+ */
223
+ async writeSessionInput(sessionId, data) {
224
+ okResult(await this.request({ case: "writeStdin", value: { sessionId, data } }));
167
225
  }
168
226
  async signalProcess(processId, signal) {
169
227
  okResult(await this.request({ case: "signalProcess", value: { processId, signal } }));
@@ -172,6 +230,69 @@ export class SealantClient {
172
230
  const value = graceMillis === undefined ? {} : { graceMillis: BigInt(graceMillis) };
173
231
  okResult(await this.request({ case: "runtimeGracefulShutdown", value }));
174
232
  }
233
+ // ===================== channel multiplexing =====================
234
+ //
235
+ // Each opener sends its command, reads the daemon-allocated channel_id out of the typed result, and
236
+ // returns an open {@link Channel} already wired into the demux table — an async-iterable of that
237
+ // channel's inbound bytes plus `write`/`windowUpdate`/`end` for outbound bytes.
238
+ /** Attach to an existing PTY session as a multiplexed channel (interactive by default). */
239
+ async attachSession(sessionId, mode = AttachMode.INTERACTIVE) {
240
+ const result = resultValue(okResult(await this.request({ case: "attachSession", value: { sessionId, mode } })), "streamAttached");
241
+ return { result, channel: this.openChannel(result.channelId) };
242
+ }
243
+ /** Detach a previously attached session channel and tear down its local {@link Channel}. */
244
+ async detachSession(channelId) {
245
+ okResult(await this.request({ case: "detachSession", value: { channelId } }));
246
+ // Explicit teardown command: fully close the local channel, don't leave inbound half-open.
247
+ this.#channels.get(channelId)?.destroy();
248
+ }
249
+ /** Open a direct-TCP forward to `host:port` as a multiplexed byte channel. */
250
+ async openForward(host, port, executionId) {
251
+ const result = resultValue(okResult(await this.request({ case: "openForward", value: { host, port, executionId } })), "forwardOpened");
252
+ return { result, channel: this.openChannel(result.channelId) };
253
+ }
254
+ /** Close a forward channel and tear down its local {@link Channel}. */
255
+ async closeForward(channelId) {
256
+ okResult(await this.request({ case: "closeForward", value: { channelId } }));
257
+ // Explicit teardown command: fully close the local channel, don't leave inbound half-open.
258
+ this.#channels.get(channelId)?.destroy();
259
+ }
260
+ /** Open an SFTP subsystem channel as a multiplexed byte channel. */
261
+ async openSftp(options = {}) {
262
+ const result = resultValue(okResult(await this.request({
263
+ case: "openSftp",
264
+ value: { executionId: options.executionId, cwd: options.cwd },
265
+ })), "sftpOpened");
266
+ return { result, channel: this.openChannel(result.channelId) };
267
+ }
268
+ /** Close an SFTP channel and tear down its local {@link Channel}. */
269
+ async closeSftp(channelId) {
270
+ okResult(await this.request({ case: "closeSftp", value: { channelId } }));
271
+ // Explicit teardown command: fully close the local channel, don't leave inbound half-open.
272
+ this.#channels.get(channelId)?.destroy();
273
+ }
274
+ /**
275
+ * Exec with `attach=true`: the daemon allocates a byte channel bound to the process's stdio and
276
+ * returns {@link ProcessAttached} with its `channelId`. Returns the typed result plus the open
277
+ * {@link Channel} (stdout/stderr ride inbound frames; stdin rides outbound `write`).
278
+ */
279
+ async execAttached(options) {
280
+ const result = resultValue(okResult(await this.request({
281
+ case: "exec",
282
+ value: {
283
+ executable: options.executable,
284
+ args: options.args ?? [],
285
+ executionId: options.executionId,
286
+ sessionId: options.sessionId,
287
+ cwd: options.cwd,
288
+ stdin: options.stdin ?? false,
289
+ timeoutMillis: options.timeoutMillis === undefined ? undefined : BigInt(options.timeoutMillis),
290
+ background: options.background ?? false,
291
+ attach: true,
292
+ },
293
+ })), "processAttached");
294
+ return { result, channel: this.openChannel(result.channelId) };
295
+ }
175
296
  /** Async iterator over telemetry events (typed `EventEnvelope`; `payload` is a discriminated union). */
176
297
  events() {
177
298
  const self = this;
@@ -218,6 +339,30 @@ export class SealantClient {
218
339
  else if (message.message.case === "event") {
219
340
  this.#emitEvent(message.message.value);
220
341
  }
342
+ else if (message.message.case === "stream") {
343
+ this.#routeStream(message.message.value);
344
+ }
345
+ }
346
+ }
347
+ /** Demultiplex one inbound `ServerMessage::Stream` frame into its `Channel` by `channelId`. */
348
+ #routeStream(frame) {
349
+ const channel = this.#channels.get(frame.channelId);
350
+ if (!channel) {
351
+ // Frame for an unknown/already-closed channel: nothing to deliver to. Drop it.
352
+ return;
353
+ }
354
+ switch (frame.payload.case) {
355
+ case "data":
356
+ channel.pushData(frame.payload.value);
357
+ break;
358
+ case "windowUpdate":
359
+ channel.pushWindowUpdate(frame.payload.value);
360
+ break;
361
+ case "end":
362
+ channel.pushEnd(frame.payload.value);
363
+ break;
364
+ default:
365
+ break;
221
366
  }
222
367
  }
223
368
  #emitEvent(event) {
@@ -238,6 +383,11 @@ export class SealantClient {
238
383
  pending.reject(new Error("connection closed"));
239
384
  }
240
385
  this.#pending.clear();
386
+ // Fail every open channel so consumers iterating their bytes/`closed` promise unblock.
387
+ for (const channel of [...this.#channels.values()]) {
388
+ channel.fail(new Error("connection closed"));
389
+ }
390
+ this.#channels.clear();
241
391
  }
242
392
  }
243
393
  function connectOnce(socketPath) {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sealant/runtime-client",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Ergonomic, typed TypeScript client for the sealantd runtime daemon.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -26,7 +26,7 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "@bufbuild/protobuf": "^2.12.0",
29
- "@sealant/runtime-protocol": "^0.2.0"
29
+ "@sealant/runtime-protocol": "^0.4.0"
30
30
  },
31
31
  "scripts": {
32
32
  "build": "tsc -p tsconfig.json",