@myrialabs/ptykit 0.0.1

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 (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +260 -0
  3. package/dist/client/fit.d.ts +29 -0
  4. package/dist/client/fit.d.ts.map +1 -0
  5. package/dist/client/fit.js +45 -0
  6. package/dist/client/fit.js.map +1 -0
  7. package/dist/client/index.d.ts +10 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +9 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/client/persistence.d.ts +15 -0
  12. package/dist/client/persistence.d.ts.map +1 -0
  13. package/dist/client/persistence.js +47 -0
  14. package/dist/client/persistence.js.map +1 -0
  15. package/dist/client/pty-kit-client.d.ts +122 -0
  16. package/dist/client/pty-kit-client.d.ts.map +1 -0
  17. package/dist/client/pty-kit-client.js +245 -0
  18. package/dist/client/pty-kit-client.js.map +1 -0
  19. package/dist/client/terminal.d.ts +77 -0
  20. package/dist/client/terminal.d.ts.map +1 -0
  21. package/dist/client/terminal.js +112 -0
  22. package/dist/client/terminal.js.map +1 -0
  23. package/dist/client/ws-core.d.ts +88 -0
  24. package/dist/client/ws-core.d.ts.map +1 -0
  25. package/dist/client/ws-core.js +324 -0
  26. package/dist/client/ws-core.js.map +1 -0
  27. package/dist/core/backend.d.ts +52 -0
  28. package/dist/core/backend.d.ts.map +1 -0
  29. package/dist/core/backend.js +11 -0
  30. package/dist/core/backend.js.map +1 -0
  31. package/dist/core/detect.d.ts +21 -0
  32. package/dist/core/detect.d.ts.map +1 -0
  33. package/dist/core/detect.js +82 -0
  34. package/dist/core/detect.js.map +1 -0
  35. package/dist/core/env.d.ts +30 -0
  36. package/dist/core/env.d.ts.map +1 -0
  37. package/dist/core/env.js +68 -0
  38. package/dist/core/env.js.map +1 -0
  39. package/dist/core/index.d.ts +11 -0
  40. package/dist/core/index.d.ts.map +1 -0
  41. package/dist/core/index.js +10 -0
  42. package/dist/core/index.js.map +1 -0
  43. package/dist/core/pty-kit.d.ts +90 -0
  44. package/dist/core/pty-kit.d.ts.map +1 -0
  45. package/dist/core/pty-kit.js +187 -0
  46. package/dist/core/pty-kit.js.map +1 -0
  47. package/dist/core/scrollback.d.ts +43 -0
  48. package/dist/core/scrollback.d.ts.map +1 -0
  49. package/dist/core/scrollback.js +79 -0
  50. package/dist/core/scrollback.js.map +1 -0
  51. package/dist/core/session.d.ts +100 -0
  52. package/dist/core/session.d.ts.map +1 -0
  53. package/dist/core/session.js +264 -0
  54. package/dist/core/session.js.map +1 -0
  55. package/dist/core/shell.d.ts +24 -0
  56. package/dist/core/shell.d.ts.map +1 -0
  57. package/dist/core/shell.js +55 -0
  58. package/dist/core/shell.js.map +1 -0
  59. package/dist/index.d.ts +11 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +11 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/server/connection.d.ts +38 -0
  64. package/dist/server/connection.d.ts.map +1 -0
  65. package/dist/server/connection.js +67 -0
  66. package/dist/server/connection.js.map +1 -0
  67. package/dist/server/ids.d.ts +2 -0
  68. package/dist/server/ids.d.ts.map +1 -0
  69. package/dist/server/ids.js +7 -0
  70. package/dist/server/ids.js.map +1 -0
  71. package/dist/server/index.d.ts +6 -0
  72. package/dist/server/index.d.ts.map +1 -0
  73. package/dist/server/index.js +6 -0
  74. package/dist/server/index.js.map +1 -0
  75. package/dist/server/pty-kit-server.d.ts +101 -0
  76. package/dist/server/pty-kit-server.d.ts.map +1 -0
  77. package/dist/server/pty-kit-server.js +361 -0
  78. package/dist/server/pty-kit-server.js.map +1 -0
  79. package/dist/server/transport-bun.d.ts +26 -0
  80. package/dist/server/transport-bun.d.ts.map +1 -0
  81. package/dist/server/transport-bun.js +79 -0
  82. package/dist/server/transport-bun.js.map +1 -0
  83. package/dist/server/transport-node.d.ts +20 -0
  84. package/dist/server/transport-node.d.ts.map +1 -0
  85. package/dist/server/transport-node.js +77 -0
  86. package/dist/server/transport-node.js.map +1 -0
  87. package/dist/shared/index.d.ts +260 -0
  88. package/dist/shared/index.d.ts.map +1 -0
  89. package/dist/shared/index.js +85 -0
  90. package/dist/shared/index.js.map +1 -0
  91. package/package.json +108 -0
  92. package/src/client/svelte/PtyTerminal.svelte +146 -0
  93. package/src/client/svelte/index.d.ts +84 -0
  94. package/src/client/svelte/index.js +4 -0
  95. package/src/client/svelte/svelte-compile.test.ts +11 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty-kit-server.d.ts","sourceRoot":"","sources":["../../src/server/pty-kit-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,361 @@
1
+ /**
2
+ * `createPtyKitServer` — the WebSocket transport over a `PtyKit` manager.
3
+ *
4
+ * WebSocket only (R9). Control plane = RPC request/response keyed by
5
+ * `requestId`; data plane = events broadcast to a collaborative room (R11) and
6
+ * filtered client-side by `sessionId`. Access is enforced by the `authorize`
7
+ * hook with anti-hijack ownership checks (R10).
8
+ */
9
+ import { checkShell } from '../core/shell.js';
10
+ import { CLIENT_EVENTS, RPC_ACTIONS, silentLogger, } from '../shared/index.js';
11
+ import { RoomRegistry } from './connection.js';
12
+ import { BunTransport } from './transport-bun.js';
13
+ import { NodeTransport } from './transport-node.js';
14
+ function iso() {
15
+ return new Date().toISOString();
16
+ }
17
+ export class PtyKitServer {
18
+ manager;
19
+ path;
20
+ rooms = new RoomRegistry();
21
+ options;
22
+ logger;
23
+ resolveRoom;
24
+ bunTransport;
25
+ nodeTransport;
26
+ constructor(manager, options = {}) {
27
+ this.manager = manager;
28
+ this.options = options;
29
+ this.logger = options.logger ?? silentLogger;
30
+ this.path = options.path ?? '/';
31
+ this.resolveRoom = options.room ?? ((ctx) => ctx.namespace);
32
+ }
33
+ // ---- Identity / lifecycle ----------------------------------------------
34
+ /** Resolve connection identity at upgrade. Returns `false` to reject. */
35
+ async resolveUpgrade(request) {
36
+ if (!this.options.onUpgrade)
37
+ return {};
38
+ try {
39
+ return await this.options.onUpgrade(request);
40
+ }
41
+ catch (err) {
42
+ this.logger.error('server', 'onUpgrade threw', err);
43
+ return false;
44
+ }
45
+ }
46
+ handleOpen(_conn) {
47
+ // no-op; rooms are joined lazily on create/attach
48
+ }
49
+ handleClose(conn) {
50
+ this.rooms.leaveAll(conn);
51
+ }
52
+ /** Process one inbound raw message (string or bytes) from a connection. */
53
+ async handleMessage(conn, raw) {
54
+ let frame;
55
+ try {
56
+ const text = typeof raw === 'string'
57
+ ? raw
58
+ : new TextDecoder().decode(raw instanceof Uint8Array ? raw : new Uint8Array(raw));
59
+ frame = JSON.parse(text);
60
+ }
61
+ catch {
62
+ this.logger.warn('server', 'dropping unparseable frame');
63
+ return;
64
+ }
65
+ if (!frame || typeof frame.action !== 'string')
66
+ return;
67
+ await this.dispatch(conn, frame.action, frame.payload);
68
+ }
69
+ // ---- Dispatch -----------------------------------------------------------
70
+ async dispatch(conn, action, payload) {
71
+ if (CLIENT_EVENTS.includes(action)) {
72
+ await this.handleEvent(conn, action, payload);
73
+ return;
74
+ }
75
+ if (RPC_ACTIONS.includes(action)) {
76
+ const requestId = payload?.requestId;
77
+ const data = payload?.data ?? {};
78
+ try {
79
+ const result = await this.handleRpc(conn, action, data);
80
+ this.respond(conn, action, requestId, result);
81
+ }
82
+ catch (err) {
83
+ this.respondError(conn, action, requestId, err);
84
+ }
85
+ return;
86
+ }
87
+ this.logger.warn('server', `unknown action: ${action}`);
88
+ }
89
+ respond(conn, action, requestId, data) {
90
+ conn.send({ action: `${action}:response`, payload: { requestId, success: true, data } });
91
+ }
92
+ respondError(conn, action, requestId, err) {
93
+ const error = err instanceof Error ? err.message : 'Unknown error';
94
+ conn.send({ action: `${action}:response`, payload: { requestId, success: false, error } });
95
+ }
96
+ async authorize(operation, namespace, conn, sessionId) {
97
+ const hook = this.options.authorize;
98
+ if (!hook)
99
+ return; // allow-all (documented production footgun)
100
+ const ok = await hook({ operation, namespace, sessionId, conn });
101
+ if (!ok)
102
+ throw new Error('Access denied');
103
+ }
104
+ /** Look up a session, deriving the namespace for an ownership check. */
105
+ requireSession(sessionId) {
106
+ const session = this.manager.getSession(sessionId);
107
+ if (!session)
108
+ throw new Error('Session not found');
109
+ return session;
110
+ }
111
+ broadcast(room, action, payload) {
112
+ this.rooms.broadcast(room, { action, payload });
113
+ }
114
+ /**
115
+ * Install the single room-broadcast listener pair for a session, after
116
+ * clearing any previous listeners (R7c) so switching/returning clients never
117
+ * double up output. Output broadcasts to the whole room (collaborative);
118
+ * clients filter by `sessionId`.
119
+ */
120
+ wireBroadcast(session, room) {
121
+ session.clearListeners();
122
+ session.addDataListener((content, seq) => {
123
+ this.broadcast(room, 'output', {
124
+ sessionId: session.sessionId,
125
+ content,
126
+ seq,
127
+ timestamp: iso(),
128
+ });
129
+ });
130
+ session.addExitListener((event) => {
131
+ this.broadcast(room, 'exit', { sessionId: session.sessionId, exitCode: event.exitCode });
132
+ });
133
+ }
134
+ async handleEvent(conn, action, payload) {
135
+ if (action === 'input') {
136
+ const { sessionId, data } = payload ?? {};
137
+ let session;
138
+ try {
139
+ session = this.requireSession(sessionId);
140
+ await this.authorize('write', session.namespace, conn, sessionId);
141
+ }
142
+ catch (err) {
143
+ // Input is fire-and-forget; surface failures as a room error event.
144
+ this.logger.warn('server', 'input rejected', err);
145
+ return;
146
+ }
147
+ const ok = this.manager.write(sessionId, data);
148
+ if (!ok) {
149
+ const room = this.resolveRoom({ namespace: session.namespace, sessionId, conn });
150
+ this.broadcast(room, 'error', {
151
+ sessionId,
152
+ error: 'Session not found or PTY not available',
153
+ });
154
+ }
155
+ }
156
+ }
157
+ async handleRpc(conn, action, data) {
158
+ switch (action) {
159
+ case 'create-session':
160
+ return this.opCreateSession(conn, data);
161
+ case 'resize':
162
+ return this.opResize(conn, data);
163
+ case 'cancel':
164
+ return this.opCancel(conn, data);
165
+ case 'kill-session':
166
+ return this.opKill(conn, data);
167
+ case 'clear':
168
+ return this.opClear(conn, data);
169
+ case 'check-shell':
170
+ return checkShell();
171
+ case 'pty-status':
172
+ return this.opPtyStatus(conn, data);
173
+ case 'list-sessions':
174
+ return this.opListSessions(conn, data);
175
+ case 'stream-status':
176
+ return this.opStreamStatus(conn, data);
177
+ case 'missed-output':
178
+ return this.opMissedOutput(conn, data);
179
+ case 'reconnect':
180
+ return this.opReconnect(conn, data);
181
+ default:
182
+ throw new Error(`Unsupported operation: ${action}`);
183
+ }
184
+ }
185
+ async opCreateSession(conn, data) {
186
+ await this.authorize('create', data.namespace, conn, data.sessionId);
187
+ const room = this.resolveRoom({ namespace: data.namespace, sessionId: data.sessionId, conn });
188
+ const session = await this.manager.createSession({
189
+ sessionId: data.sessionId,
190
+ namespace: data.namespace,
191
+ streamId: data.streamId,
192
+ shell: data.shell,
193
+ cwd: data.cwd,
194
+ cols: data.cols ?? 80,
195
+ rows: data.rows ?? 24,
196
+ });
197
+ this.rooms.join(conn, room);
198
+ this.wireBroadcast(session, room);
199
+ const cols = session.cols;
200
+ const rows = session.rows;
201
+ // Collaborative awareness events to the whole room.
202
+ this.broadcast(room, 'ready', {
203
+ sessionId: session.sessionId,
204
+ streamId: session.streamId,
205
+ pid: session.pid,
206
+ cols,
207
+ rows,
208
+ });
209
+ this.broadcast(room, 'directory', {
210
+ sessionId: session.sessionId,
211
+ newDirectory: session.cwd,
212
+ });
213
+ // Replay serialized scrollback to the JOINING client only — re-sending it
214
+ // to the whole room would repaint already-attached viewers (R7).
215
+ const replay = session.serialize();
216
+ if (replay) {
217
+ conn.send({
218
+ action: 'output',
219
+ payload: { sessionId: session.sessionId, content: replay, timestamp: iso() },
220
+ });
221
+ }
222
+ this.broadcast(room, 'tab-created', {
223
+ sessionId: session.sessionId,
224
+ streamId: session.streamId,
225
+ pid: session.pid,
226
+ currentDirectory: session.cwd,
227
+ cols,
228
+ rows,
229
+ });
230
+ return {
231
+ sessionId: session.sessionId,
232
+ streamId: session.streamId,
233
+ pid: session.pid,
234
+ currentDirectory: session.cwd,
235
+ cols,
236
+ rows,
237
+ };
238
+ }
239
+ async opResize(conn, data) {
240
+ const session = this.requireSession(data.sessionId);
241
+ await this.authorize('resize', session.namespace, conn, data.sessionId);
242
+ if (!this.manager.resize(data.sessionId, data.cols, data.rows)) {
243
+ throw new Error('No active PTY session found');
244
+ }
245
+ return { sessionId: data.sessionId, cols: data.cols, rows: data.rows };
246
+ }
247
+ async opCancel(conn, data) {
248
+ const session = this.requireSession(data.sessionId);
249
+ await this.authorize('write', session.namespace, conn, data.sessionId);
250
+ const pid = session.pid;
251
+ session.cancel();
252
+ return { sessionId: data.sessionId, pid };
253
+ }
254
+ async opKill(conn, data) {
255
+ const session = this.manager.getSession(data.sessionId);
256
+ if (!session)
257
+ return { sessionId: data.sessionId };
258
+ await this.authorize('kill', session.namespace, conn, data.sessionId);
259
+ const pid = session.pid;
260
+ const room = this.resolveRoom({ namespace: session.namespace, sessionId: data.sessionId, conn });
261
+ this.manager.killSession(data.sessionId);
262
+ this.broadcast(room, 'tab-closed', { sessionId: data.sessionId });
263
+ return { sessionId: data.sessionId, pid };
264
+ }
265
+ async opClear(conn, data) {
266
+ const session = this.requireSession(data.sessionId);
267
+ await this.authorize('write', session.namespace, conn, data.sessionId);
268
+ this.manager.clear(data.sessionId);
269
+ return { sessionId: data.sessionId };
270
+ }
271
+ async opPtyStatus(conn, data) {
272
+ const session = this.manager.getSession(data.sessionId);
273
+ if (!session) {
274
+ return { isActive: false, sessionId: data.sessionId, message: 'PTY not found' };
275
+ }
276
+ await this.authorize('attach', session.namespace, conn, data.sessionId);
277
+ return {
278
+ isActive: session.status === 'active',
279
+ sessionId: data.sessionId,
280
+ pid: session.pid,
281
+ };
282
+ }
283
+ async opListSessions(conn, data) {
284
+ await this.authorize('attach', data.namespace, conn);
285
+ const sessions = this.manager.list(data.namespace).map((s) => {
286
+ const info = s.info();
287
+ return {
288
+ sessionId: info.sessionId,
289
+ pid: info.pid,
290
+ cwd: info.cwd,
291
+ createdAt: info.createdAt.toISOString(),
292
+ lastActivityAt: info.lastActivityAt.toISOString(),
293
+ };
294
+ });
295
+ return { sessions };
296
+ }
297
+ async opStreamStatus(conn, data) {
298
+ const session = this.requireSession(data.sessionId);
299
+ await this.authorize('attach', session.namespace, conn, data.sessionId);
300
+ return {
301
+ status: session.status,
302
+ bufferLength: session.bufferLength(),
303
+ startedAt: session.createdAt.toISOString(),
304
+ processId: session.pid,
305
+ };
306
+ }
307
+ async opMissedOutput(conn, data) {
308
+ const session = this.requireSession(data.sessionId);
309
+ await this.authorize('attach', session.namespace, conn, data.sessionId);
310
+ return {
311
+ sessionId: data.sessionId,
312
+ output: session.serialize(),
313
+ status: session.status,
314
+ timestamp: iso(),
315
+ };
316
+ }
317
+ async opReconnect(conn, data) {
318
+ const session = this.requireSession(data.sessionId);
319
+ await this.authorize('attach', session.namespace, conn, data.sessionId);
320
+ const room = this.resolveRoom({ namespace: session.namespace, sessionId: data.sessionId, conn });
321
+ this.rooms.join(conn, room);
322
+ const output = session.serialize();
323
+ if (output) {
324
+ conn.send({
325
+ action: 'output',
326
+ payload: { sessionId: data.sessionId, content: output, timestamp: iso() },
327
+ });
328
+ }
329
+ if (session.status === 'active') {
330
+ // Ensure ongoing output reaches the room even if create-session hasn't
331
+ // (re)installed listeners yet.
332
+ if (session.dataListenerCount === 0)
333
+ this.wireBroadcast(session, room);
334
+ }
335
+ else {
336
+ this.broadcast(room, 'exit', { sessionId: data.sessionId, exitCode: session.exitCode ?? 0 });
337
+ }
338
+ return { sessionId: data.sessionId, output, status: session.status };
339
+ }
340
+ // ---- Transport mounting -------------------------------------------------
341
+ /** Mount onto a Node `http.Server` (uses the optional `ws` package). */
342
+ async attach(httpServer) {
343
+ this.nodeTransport = new NodeTransport(this, this.logger);
344
+ await this.nodeTransport.attach(httpServer);
345
+ }
346
+ /** Bun `fetch` handler — upgrades matching requests; returns undefined otherwise. */
347
+ get fetch() {
348
+ this.bunTransport ??= new BunTransport(this, this.logger);
349
+ return this.bunTransport.fetch;
350
+ }
351
+ /** Bun `websocket` handlers object to pass to `Bun.serve`. */
352
+ get websocket() {
353
+ this.bunTransport ??= new BunTransport(this, this.logger);
354
+ return this.bunTransport.websocket;
355
+ }
356
+ }
357
+ /** Create a WebSocket server over a `PtyKit` manager. */
358
+ export function createPtyKitServer(manager, options = {}) {
359
+ return new PtyKitServer(manager, options);
360
+ }
361
+ //# sourceMappingURL=pty-kit-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty-kit-server.js","sourceRoot":"","sources":["../../src/server/pty-kit-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Bun transport. Bun's HTTP server IS `Bun.serve`, so there is no external
3
+ * `http.Server` to attach to — instead the integrator wires our `fetch` and
4
+ * `websocket` handlers into their `Bun.serve` call:
5
+ *
6
+ * ```ts
7
+ * Bun.serve({ port, fetch: server.fetch, websocket: server.websocket });
8
+ * ```
9
+ */
10
+ import type { Logger } from '../shared/index.js';
11
+ import type { PtyKitServer } from './pty-kit-server.js';
12
+ export declare class BunTransport {
13
+ private readonly server;
14
+ private readonly logger;
15
+ constructor(server: PtyKitServer, logger: Logger);
16
+ private matchesPath;
17
+ /** Bun `fetch` handler. Returns `undefined` after a successful upgrade. */
18
+ readonly fetch: (request: Request, bunServer: any) => Promise<Response | undefined>;
19
+ /** Bun `websocket` handlers. */
20
+ readonly websocket: {
21
+ open: (ws: any) => void;
22
+ message: (ws: any, message: string | ArrayBuffer | Uint8Array) => void;
23
+ close: (ws: any) => void;
24
+ };
25
+ }
26
+ //# sourceMappingURL=transport-bun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-bun.d.ts","sourceRoot":"","sources":["../../src/server/transport-bun.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,oBAAoB,CAAC;AAE5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQxD,qBAAa,YAAY;IAEvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM;IAGhC,OAAO,CAAC,WAAW;IAQnB,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,GAAU,SAAS,OAAO,EAAE,WAAW,GAAG,KAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAYtF;IAEF,gCAAgC;IAChC,QAAQ,CAAC,SAAS;mBACN,GAAG;sBAuBA,GAAG,WAAW,MAAM,GAAG,WAAW,GAAG,UAAU;oBAIjD,GAAG;MAId;CACF"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Bun transport. Bun's HTTP server IS `Bun.serve`, so there is no external
3
+ * `http.Server` to attach to — instead the integrator wires our `fetch` and
4
+ * `websocket` handlers into their `Bun.serve` call:
5
+ *
6
+ * ```ts
7
+ * Bun.serve({ port, fetch: server.fetch, websocket: server.websocket });
8
+ * ```
9
+ */
10
+ import { nextConnectionId } from './ids.js';
11
+ export class BunTransport {
12
+ server;
13
+ logger;
14
+ constructor(server, logger) {
15
+ this.server = server;
16
+ this.logger = logger;
17
+ }
18
+ matchesPath(request) {
19
+ try {
20
+ return new URL(request.url).pathname === this.server.path;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
26
+ /** Bun `fetch` handler. Returns `undefined` after a successful upgrade. */
27
+ fetch = async (request, bunServer) => {
28
+ if (!this.matchesPath(request))
29
+ return undefined;
30
+ const identity = await this.server.resolveUpgrade(request);
31
+ if (identity === false) {
32
+ return new Response('Unauthorized', { status: 401 });
33
+ }
34
+ const data = { identity, conn: null };
35
+ const ok = bunServer.upgrade(request, { data });
36
+ if (ok)
37
+ return undefined;
38
+ return new Response('Expected a WebSocket upgrade', { status: 426 });
39
+ };
40
+ /** Bun `websocket` handlers. */
41
+ websocket = {
42
+ open: (ws) => {
43
+ const sockData = ws.data;
44
+ const conn = {
45
+ id: nextConnectionId(),
46
+ data: sockData.identity,
47
+ send: (frame) => {
48
+ try {
49
+ ws.send(JSON.stringify(frame));
50
+ }
51
+ catch (err) {
52
+ this.logger.error('server', 'bun send failed', err);
53
+ }
54
+ },
55
+ close: () => {
56
+ try {
57
+ ws.close();
58
+ }
59
+ catch {
60
+ /* already closed */
61
+ }
62
+ },
63
+ };
64
+ sockData.conn = conn;
65
+ this.server.handleOpen(conn);
66
+ },
67
+ message: (ws, message) => {
68
+ const conn = ws.data.conn;
69
+ if (conn)
70
+ void this.server.handleMessage(conn, message);
71
+ },
72
+ close: (ws) => {
73
+ const conn = ws.data.conn;
74
+ if (conn)
75
+ this.server.handleClose(conn);
76
+ },
77
+ };
78
+ }
79
+ //# sourceMappingURL=transport-bun.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-bun.js","sourceRoot":"","sources":["../../src/server/transport-bun.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Node transport. Node's `http.Server` has no built-in WebSocket server, so the
3
+ * Node path uses the optional `ws` package, loaded lazily — a Bun consumer never
4
+ * installs it.
5
+ *
6
+ * ```ts
7
+ * const httpServer = http.createServer(app);
8
+ * await server.attach(httpServer);
9
+ * httpServer.listen(3000);
10
+ * ```
11
+ */
12
+ import type { Logger } from '../shared/index.js';
13
+ import type { PtyKitServer } from './pty-kit-server.js';
14
+ export declare class NodeTransport {
15
+ private readonly server;
16
+ private readonly logger;
17
+ constructor(server: PtyKitServer, logger: Logger);
18
+ attach(httpServer: any): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=transport-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-node.d.ts","sourceRoot":"","sources":["../../src/server/transport-node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,oBAAoB,CAAC;AAE5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD,qBAAa,aAAa;IAExB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM;IAG1B,MAAM,CAAC,UAAU,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CA0D5C"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Node transport. Node's `http.Server` has no built-in WebSocket server, so the
3
+ * Node path uses the optional `ws` package, loaded lazily — a Bun consumer never
4
+ * installs it.
5
+ *
6
+ * ```ts
7
+ * const httpServer = http.createServer(app);
8
+ * await server.attach(httpServer);
9
+ * httpServer.listen(3000);
10
+ * ```
11
+ */
12
+ import { nextConnectionId } from './ids.js';
13
+ export class NodeTransport {
14
+ server;
15
+ logger;
16
+ constructor(server, logger) {
17
+ this.server = server;
18
+ this.logger = logger;
19
+ }
20
+ async attach(httpServer) {
21
+ let WebSocketServer;
22
+ try {
23
+ ({ WebSocketServer } = await import(/* @vite-ignore */ 'ws'));
24
+ }
25
+ catch (err) {
26
+ throw new Error('ptykit: the Node WebSocket transport requires the "ws" package. Install it ' +
27
+ `(\`npm install ws\`). Underlying error: ${err instanceof Error ? err.message : String(err)}`);
28
+ }
29
+ const wss = new WebSocketServer({ noServer: true });
30
+ httpServer.on('upgrade', async (request, socket, head) => {
31
+ let pathname;
32
+ try {
33
+ pathname = new URL(request.url, 'http://localhost').pathname;
34
+ }
35
+ catch {
36
+ return;
37
+ }
38
+ if (pathname !== this.server.path)
39
+ return; // not ours — leave for others
40
+ const identity = await this.server.resolveUpgrade(request);
41
+ if (identity === false) {
42
+ socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
43
+ socket.destroy();
44
+ return;
45
+ }
46
+ wss.handleUpgrade(request, socket, head, (ws) => {
47
+ const conn = {
48
+ id: nextConnectionId(),
49
+ data: identity,
50
+ send: (frame) => {
51
+ try {
52
+ ws.send(JSON.stringify(frame));
53
+ }
54
+ catch (err) {
55
+ this.logger.error('server', 'node send failed', err);
56
+ }
57
+ },
58
+ close: () => {
59
+ try {
60
+ ws.close();
61
+ }
62
+ catch {
63
+ /* already closed */
64
+ }
65
+ },
66
+ };
67
+ this.server.handleOpen(conn);
68
+ ws.on('message', (data, isBinary) => {
69
+ void this.server.handleMessage(conn, isBinary ? new Uint8Array(data) : data.toString());
70
+ });
71
+ ws.on('close', () => this.server.handleClose(conn));
72
+ ws.on('error', (err) => this.logger.error('server', 'node socket error', err));
73
+ });
74
+ });
75
+ }
76
+ }
77
+ //# sourceMappingURL=transport-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-node.js","sourceRoot":"","sources":["../../src/server/transport-node.ts"],"names":[],"mappings":"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"}