nterminal 1.2.72 → 1.2.74

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 (41) hide show
  1. package/assets/brand/vscode.png +0 -0
  2. package/dist/client/assets/MarkdownPreview-CBeK-BXz.js +1 -0
  3. package/dist/client/assets/{TranscriptMarkdownBody-D39ylGl_.js → TranscriptMarkdownBody-DGwLuoPV.js} +1 -1
  4. package/dist/client/assets/{index-DO9sCZ_P.js → index-CQcvJBTH.js} +1 -1
  5. package/dist/client/assets/index-Cf49B48Z.js +57 -0
  6. package/dist/client/assets/index-DwmyYdjx.css +1 -0
  7. package/dist/client/brand/vscode.png +0 -0
  8. package/dist/client/index.html +2 -2
  9. package/dist/server/agent/agentProxy.d.ts +1 -0
  10. package/dist/server/agent/agentProxy.js +3 -2
  11. package/dist/server/agent/agentProxy.js.map +1 -1
  12. package/dist/server/code/codeServerManager.d.ts +81 -0
  13. package/dist/server/code/codeServerManager.js +764 -0
  14. package/dist/server/code/codeServerManager.js.map +1 -0
  15. package/dist/server/http.d.ts +2 -0
  16. package/dist/server/http.js +12 -0
  17. package/dist/server/http.js.map +1 -1
  18. package/dist/server/index.js +4 -0
  19. package/dist/server/index.js.map +1 -1
  20. package/dist/server/routes/agentManagementRoutes.js +397 -0
  21. package/dist/server/routes/agentManagementRoutes.js.map +1 -1
  22. package/dist/server/routes/codeServerRoutes.d.ts +13 -0
  23. package/dist/server/routes/codeServerRoutes.js +541 -0
  24. package/dist/server/routes/codeServerRoutes.js.map +1 -0
  25. package/dist/server/routes/webSocketRelay.d.ts +12 -0
  26. package/dist/server/routes/webSocketRelay.js +121 -0
  27. package/dist/server/routes/webSocketRelay.js.map +1 -0
  28. package/dist/server/terminal/TerminalManager.d.ts +1 -1
  29. package/dist/server/terminal/TerminalManager.js +30 -7
  30. package/dist/server/terminal/TerminalManager.js.map +1 -1
  31. package/dist/server/terminal/agentTranscriptStatus.d.ts +7 -0
  32. package/dist/server/terminal/agentTranscriptStatus.js +141 -44
  33. package/dist/server/terminal/agentTranscriptStatus.js.map +1 -1
  34. package/dist/shared/protocol.d.ts +49 -0
  35. package/dist/shared/protocol.js.map +1 -1
  36. package/dist/shared/types.d.ts +11 -0
  37. package/package.json +1 -1
  38. package/public/brand/vscode.png +0 -0
  39. package/dist/client/assets/MarkdownPreview-CLmBLNLL.js +0 -1
  40. package/dist/client/assets/index-C6Bpyyau.css +0 -1
  41. package/dist/client/assets/index-qz7KPVpf.js +0 -55
@@ -0,0 +1,541 @@
1
+ import http from 'node:http';
2
+ import WebSocket from 'ws';
3
+ import { isAllowedOrigin } from '../config.js';
4
+ import { requireAllowedOrigin } from './authRoutes.js';
5
+ import { authenticateTerminalRequest } from './terminalRoutes.js';
6
+ import { extractBearerToken, verifyAgentToken } from '../agent/agentAuth.js';
7
+ import { CodeServerError, instanceUrlPrefix } from '../code/codeServerManager.js';
8
+ import { relayWebSocketPair } from './webSocketRelay.js';
9
+ const codeServerProxyRoute = '/code/instances/:instanceId/*';
10
+ const agentCodeServerProxyRoute = '/api/agent/code-server/instances/:instanceId/*';
11
+ const httpProxyMethods = ['HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'];
12
+ const codeServerProxyBodyLimitBytes = 128 * 1024 * 1024;
13
+ const hopByHopHeaders = new Set([
14
+ 'connection',
15
+ 'keep-alive',
16
+ 'proxy-authenticate',
17
+ 'proxy-authorization',
18
+ 'te',
19
+ 'trailer',
20
+ 'transfer-encoding',
21
+ 'upgrade'
22
+ ]);
23
+ export async function registerCodeServerRoutes(app, config, services) {
24
+ if (config.role !== 'main') {
25
+ return;
26
+ }
27
+ app.get('/api/code-server/status', async (request, reply) => {
28
+ const auth = await authenticateTerminalRequest(services.authService, request, reply);
29
+ if (!auth)
30
+ return reply;
31
+ const query = request.query;
32
+ const checkLatest = query?.checkLatest === 'true';
33
+ return services.codeServerManager.status({ checkLatest });
34
+ });
35
+ app.post('/api/code-server/install', { preHandler: (request, reply) => requireAllowedOrigin(config, request, reply) }, async (request, reply) => {
36
+ const auth = await authenticateTerminalRequest(services.authService, request, reply);
37
+ if (!auth)
38
+ return reply;
39
+ return handleCodeServerError(reply, () => services.codeServerManager.startInstall({ action: 'install' }));
40
+ });
41
+ app.post('/api/code-server/update', { preHandler: (request, reply) => requireAllowedOrigin(config, request, reply) }, async (request, reply) => {
42
+ const auth = await authenticateTerminalRequest(services.authService, request, reply);
43
+ if (!auth)
44
+ return reply;
45
+ return handleCodeServerError(reply, () => services.codeServerManager.startInstall({ action: 'update', force: true }));
46
+ });
47
+ app.post('/api/code-server/open', { preHandler: (request, reply) => requireAllowedOrigin(config, request, reply) }, async (request, reply) => {
48
+ const auth = await authenticateTerminalRequest(services.authService, request, reply);
49
+ if (!auth)
50
+ return reply;
51
+ if (typeof request.body?.terminalId !== 'string' || !request.body.terminalId.trim()) {
52
+ return reply.code(400).send({ error: 'terminal_id_required' });
53
+ }
54
+ const serverName = sanitizeTitleInput(request.body.serverName);
55
+ const tabName = sanitizeTitleInput(request.body.tabName);
56
+ return handleCodeServerError(reply, () => services.codeServerManager.openForTerminal(request.body.terminalId, {
57
+ ...(serverName ? { serverName } : {}),
58
+ ...(tabName ? { tabName } : {})
59
+ }));
60
+ });
61
+ app.post('/api/code-server/stop', { preHandler: (request, reply) => requireAllowedOrigin(config, request, reply) }, async (request, reply) => {
62
+ const auth = await authenticateTerminalRequest(services.authService, request, reply);
63
+ if (!auth)
64
+ return reply;
65
+ const instanceId = typeof request.body?.instanceId === 'string' && request.body.instanceId ? request.body.instanceId : undefined;
66
+ return services.codeServerManager.stop(instanceId);
67
+ });
68
+ app.post('/api/code-server/uninstall', { preHandler: (request, reply) => requireAllowedOrigin(config, request, reply) }, async (request, reply) => {
69
+ const auth = await authenticateTerminalRequest(services.authService, request, reply);
70
+ if (!auth)
71
+ return reply;
72
+ return handleCodeServerError(reply, () => services.codeServerManager.startUninstall());
73
+ });
74
+ app.get('/code/instances/:instanceId', async (request, reply) => {
75
+ const auth = await authenticateTerminalRequest(services.authService, request, reply);
76
+ if (!auth)
77
+ return reply;
78
+ return reply.redirect(`/code/instances/${encodeURIComponent(request.params.instanceId)}/`, 302);
79
+ });
80
+ app.get('/code/instances/:instanceId/__nterminal-title.js', async (request, reply) => {
81
+ const auth = await authenticateTerminalRequest(services.authService, request, reply);
82
+ if (!auth)
83
+ return reply;
84
+ const title = services.codeServerManager.getTitleForInstance(request.params.instanceId, titleTokenFromRequest(request));
85
+ if (!title) {
86
+ return reply.code(404).send('/* code-server instance not found */');
87
+ }
88
+ return reply
89
+ .type('application/javascript; charset=utf-8')
90
+ .header('Cache-Control', 'no-store')
91
+ .send(codeServerTitleLockScript(title));
92
+ });
93
+ await registerCodeServerProxyRoutes(app, config, {
94
+ codeServerManager: services.codeServerManager,
95
+ authenticateHttp: async (request, reply) => {
96
+ const auth = await authenticateTerminalRequest(services.authService, request, reply);
97
+ if (!auth)
98
+ return false;
99
+ if (!isProxyOriginAcceptable(config, request)) {
100
+ await reply.code(403).send({ error: 'origin_not_allowed' });
101
+ return false;
102
+ }
103
+ return true;
104
+ },
105
+ authenticateWebSocket: async (_socket, request) => {
106
+ if (!request.headers.origin || !isAllowedOrigin(config, request.headers.origin)) {
107
+ return false;
108
+ }
109
+ return Boolean(await authenticateTerminalRequest(services.authService, request));
110
+ },
111
+ route: codeServerProxyRoute,
112
+ routePrefix: instanceUrlPrefix
113
+ });
114
+ }
115
+ export async function registerAgentCodeServerRoutes(app, config, services) {
116
+ const authenticateAgentHttp = async (request, reply) => {
117
+ if (!verifyAgentToken(config, extractBearerToken(request))) {
118
+ await reply.code(401).send({ error: 'unauthorized' });
119
+ return false;
120
+ }
121
+ return true;
122
+ };
123
+ app.get('/api/agent/code-server/status', async (request, reply) => {
124
+ if (!await authenticateAgentHttp(request, reply))
125
+ return reply;
126
+ const query = request.query;
127
+ const checkLatest = query?.checkLatest === 'true';
128
+ return services.codeServerManager.status({ checkLatest });
129
+ });
130
+ app.post('/api/agent/code-server/install', async (request, reply) => {
131
+ if (!await authenticateAgentHttp(request, reply))
132
+ return reply;
133
+ return handleCodeServerError(reply, () => services.codeServerManager.startInstall({ action: 'install' }));
134
+ });
135
+ app.post('/api/agent/code-server/update', async (request, reply) => {
136
+ if (!await authenticateAgentHttp(request, reply))
137
+ return reply;
138
+ return handleCodeServerError(reply, () => services.codeServerManager.startInstall({ action: 'update', force: true }));
139
+ });
140
+ app.post('/api/agent/code-server/open', async (request, reply) => {
141
+ if (!await authenticateAgentHttp(request, reply))
142
+ return reply;
143
+ if (typeof request.body?.terminalId !== 'string' || !request.body.terminalId.trim()) {
144
+ return reply.code(400).send({ error: 'terminal_id_required' });
145
+ }
146
+ const serverName = sanitizeTitleInput(request.body.serverName);
147
+ const tabName = sanitizeTitleInput(request.body.tabName);
148
+ const publicBasePathTemplate = typeof request.body.publicBasePathTemplate === 'string'
149
+ ? request.body.publicBasePathTemplate
150
+ : undefined;
151
+ return handleCodeServerError(reply, () => services.codeServerManager.openForTerminal(request.body.terminalId, {
152
+ ...(serverName ? { serverName } : {}),
153
+ ...(tabName ? { tabName } : {}),
154
+ ...(publicBasePathTemplate ? { publicBasePathTemplate } : {})
155
+ }));
156
+ });
157
+ app.post('/api/agent/code-server/stop', async (request, reply) => {
158
+ if (!await authenticateAgentHttp(request, reply))
159
+ return reply;
160
+ const instanceId = typeof request.body?.instanceId === 'string' && request.body.instanceId ? request.body.instanceId : undefined;
161
+ return services.codeServerManager.stop(instanceId);
162
+ });
163
+ app.post('/api/agent/code-server/uninstall', async (request, reply) => {
164
+ if (!await authenticateAgentHttp(request, reply))
165
+ return reply;
166
+ return handleCodeServerError(reply, () => services.codeServerManager.startUninstall());
167
+ });
168
+ app.get('/api/agent/code-server/instances/:instanceId', async (request, reply) => {
169
+ if (!await authenticateAgentHttp(request, reply))
170
+ return reply;
171
+ return reply.redirect(`/api/agent/code-server/instances/${encodeURIComponent(request.params.instanceId)}/`, 302);
172
+ });
173
+ app.get('/api/agent/code-server/instances/:instanceId/__nterminal-title.js', async (request, reply) => {
174
+ if (!await authenticateAgentHttp(request, reply))
175
+ return reply;
176
+ const title = services.codeServerManager.getTitleForInstance(request.params.instanceId, titleTokenFromRequest(request));
177
+ if (!title) {
178
+ return reply.code(404).send('/* code-server instance not found */');
179
+ }
180
+ return reply
181
+ .type('application/javascript; charset=utf-8')
182
+ .header('Cache-Control', 'no-store')
183
+ .send(codeServerTitleLockScript(title));
184
+ });
185
+ await registerCodeServerProxyRoutes(app, config, {
186
+ codeServerManager: services.codeServerManager,
187
+ authenticateHttp: authenticateAgentHttp,
188
+ authenticateWebSocket: async (_socket, request) => verifyAgentToken(config, extractBearerToken(request)),
189
+ route: agentCodeServerProxyRoute,
190
+ routePrefix: (instanceId) => `/api/agent/code-server/instances/${encodeURIComponent(instanceId)}`
191
+ });
192
+ }
193
+ async function handleCodeServerError(reply, handler) {
194
+ try {
195
+ return await handler();
196
+ }
197
+ catch (error) {
198
+ if (error instanceof CodeServerError) {
199
+ return reply.code(error.statusCode).send({ error: error.code, message: error.message });
200
+ }
201
+ throw error;
202
+ }
203
+ }
204
+ async function registerCodeServerProxyRoutes(_app, _config, services) {
205
+ await _app.register(async (proxyApp) => {
206
+ proxyApp.removeAllContentTypeParsers();
207
+ proxyApp.addContentTypeParser('*', { parseAs: 'buffer', bodyLimit: codeServerProxyBodyLimitBytes }, (_request, body, done) => {
208
+ done(null, body);
209
+ });
210
+ proxyApp.route({
211
+ method: 'GET',
212
+ url: services.route,
213
+ exposeHeadRoute: false,
214
+ handler: async (request, reply) => {
215
+ if (!await services.authenticateHttp(request, reply))
216
+ return reply;
217
+ void proxyCodeServerHttp(services.codeServerManager, request, reply, services.routePrefix);
218
+ return reply;
219
+ },
220
+ wsHandler: async (socket, request) => {
221
+ if (!await services.authenticateWebSocket(socket, request)) {
222
+ socket.close(1008, 'unauthorized');
223
+ return;
224
+ }
225
+ proxyCodeServerWebSocket(services.codeServerManager, socket, request, services.routePrefix);
226
+ }
227
+ });
228
+ for (const method of httpProxyMethods) {
229
+ proxyApp.route({
230
+ method,
231
+ url: services.route,
232
+ bodyLimit: codeServerProxyBodyLimitBytes,
233
+ handler: async (request, reply) => {
234
+ if (!await services.authenticateHttp(request, reply))
235
+ return reply;
236
+ void proxyCodeServerHttp(services.codeServerManager, request, reply, services.routePrefix);
237
+ return reply;
238
+ }
239
+ });
240
+ }
241
+ });
242
+ }
243
+ function isProxyOriginAcceptable(config, request) {
244
+ const origin = request.headers.origin;
245
+ if (!origin) {
246
+ return request.method === 'GET' || request.method === 'HEAD';
247
+ }
248
+ return isAllowedOrigin(config, origin);
249
+ }
250
+ function sanitizeTitleInput(value) {
251
+ if (typeof value !== 'string') {
252
+ return undefined;
253
+ }
254
+ const trimmed = value.replace(/\s+/g, ' ').trim();
255
+ return trimmed ? trimmed.slice(0, 80) : undefined;
256
+ }
257
+ function proxyCodeServerHttp(manager, request, reply, routePrefix) {
258
+ const instance = manager.getInstance(request.params.instanceId);
259
+ if (!instance) {
260
+ void reply.code(404).send({ error: 'code_server_instance_not_found' });
261
+ return;
262
+ }
263
+ const publicPrefix = codeServerPublicPrefix(instance);
264
+ const targetPath = proxyTargetPath(request, instance.id, routePrefix);
265
+ const body = serializedBody(request);
266
+ const headers = proxyRequestHeaders(request, instance, body, publicPrefix);
267
+ reply.hijack();
268
+ const upstream = http.request({
269
+ hostname: '127.0.0.1',
270
+ port: instance.port,
271
+ path: targetPath,
272
+ method: request.method,
273
+ headers
274
+ }, (upstreamResponse) => {
275
+ if (request.method === 'HEAD') {
276
+ const responseHeaders = proxyResponseHeaders(upstreamResponse.headers, instance, { publicPrefix });
277
+ reply.raw.writeHead(upstreamResponse.statusCode ?? 502, responseHeaders);
278
+ reply.raw.end();
279
+ upstreamResponse.resume();
280
+ return;
281
+ }
282
+ if (shouldInjectTitleScript(upstreamResponse.headers)) {
283
+ const titleToken = titleTokenFromRequest(request);
284
+ const chunks = [];
285
+ upstreamResponse.on('data', (chunk) => chunks.push(chunk));
286
+ upstreamResponse.on('end', () => {
287
+ const body = injectTitleScript(Buffer.concat(chunks), instance, titleToken);
288
+ const responseHeaders = proxyResponseHeaders(upstreamResponse.headers, instance, { publicPrefix, contentLength: body.byteLength, mutated: true });
289
+ reply.raw.writeHead(upstreamResponse.statusCode ?? 502, responseHeaders);
290
+ reply.raw.end(body);
291
+ });
292
+ upstreamResponse.on('error', () => reply.raw.destroy());
293
+ return;
294
+ }
295
+ const responseHeaders = proxyResponseHeaders(upstreamResponse.headers, instance, { publicPrefix });
296
+ reply.raw.writeHead(upstreamResponse.statusCode ?? 502, responseHeaders);
297
+ upstreamResponse.pipe(reply.raw);
298
+ });
299
+ upstream.on('error', () => {
300
+ if (!reply.raw.headersSent) {
301
+ reply.raw.writeHead(502, { 'content-type': 'application/json' });
302
+ reply.raw.end(JSON.stringify({ error: 'code_server_proxy_failed' }));
303
+ return;
304
+ }
305
+ reply.raw.destroy();
306
+ });
307
+ if (body) {
308
+ upstream.write(body);
309
+ }
310
+ upstream.end();
311
+ }
312
+ function proxyCodeServerWebSocket(manager, socket, request, routePrefix) {
313
+ const instance = manager.getInstance(request.params.instanceId);
314
+ if (!instance) {
315
+ socket.close(1008, 'code-server instance not found');
316
+ return;
317
+ }
318
+ const publicPrefix = codeServerPublicPrefix(instance);
319
+ const targetPath = proxyTargetPath(request, instance.id, routePrefix);
320
+ const protocols = websocketProtocols(request.headers['sec-websocket-protocol']);
321
+ const upstream = new WebSocket(`ws://127.0.0.1:${instance.port}${targetPath}`, protocols, {
322
+ headers: websocketProxyHeaders(request, instance, publicPrefix)
323
+ });
324
+ relayWebSocketPair(socket, upstream, {
325
+ onClientMessage: () => manager.touchInstance(instance.id),
326
+ onUpstreamMessage: () => manager.touchInstance(instance.id)
327
+ });
328
+ }
329
+ function proxyTargetPath(request, instanceId, routePrefix) {
330
+ const rawUrl = request.raw.url ?? request.url;
331
+ const parsed = new URL(rawUrl, 'http://nterminal.local');
332
+ const prefix = routePrefix(instanceId);
333
+ const rest = parsed.pathname.startsWith(prefix) ? parsed.pathname.slice(prefix.length) : parsed.pathname;
334
+ const queryStart = rawUrl.indexOf('?');
335
+ const rawSearch = queryStart >= 0 ? rawUrl.slice(queryStart) : '';
336
+ return `${rest.startsWith('/') ? rest : `/${rest}`}${stripTitleTokenFromSearch(rawSearch)}`;
337
+ }
338
+ function serializedBody(request) {
339
+ if (request.method === 'GET' || request.method === 'HEAD') {
340
+ return undefined;
341
+ }
342
+ if (request.body === undefined || request.body === null) {
343
+ return undefined;
344
+ }
345
+ if (Buffer.isBuffer(request.body) || typeof request.body === 'string') {
346
+ return request.body;
347
+ }
348
+ return JSON.stringify(request.body);
349
+ }
350
+ function proxyRequestHeaders(request, instance, body, publicPrefix) {
351
+ const headers = request.headers;
352
+ const next = {};
353
+ for (const [name, value] of Object.entries(headers)) {
354
+ const lower = name.toLowerCase();
355
+ if (hopByHopHeaders.has(lower) || lower === 'host' || lower === 'cookie' || lower === 'authorization' || lower === 'content-length') {
356
+ continue;
357
+ }
358
+ if (lower === 'accept-encoding') {
359
+ continue;
360
+ }
361
+ next[name] = value;
362
+ }
363
+ next.host = `127.0.0.1:${instance.port}`;
364
+ next['x-forwarded-host'] = headers['x-forwarded-host'] ?? headers.host;
365
+ next['x-forwarded-proto'] = headers['x-forwarded-proto'] ?? request.protocol;
366
+ next['x-forwarded-prefix'] = publicPrefix;
367
+ if (body !== undefined) {
368
+ next['content-length'] = Buffer.byteLength(body);
369
+ }
370
+ return next;
371
+ }
372
+ function websocketProxyHeaders(request, instance, publicPrefix) {
373
+ const headers = request.headers;
374
+ const next = {};
375
+ for (const [name, value] of Object.entries(headers)) {
376
+ const lower = name.toLowerCase();
377
+ if (hopByHopHeaders.has(lower) ||
378
+ lower === 'host' ||
379
+ lower === 'cookie' ||
380
+ lower === 'authorization' ||
381
+ lower === 'sec-websocket-key' ||
382
+ lower === 'sec-websocket-version' ||
383
+ lower === 'sec-websocket-protocol' ||
384
+ lower === 'sec-websocket-extensions') {
385
+ continue;
386
+ }
387
+ next[name] = value;
388
+ }
389
+ next.host = `127.0.0.1:${instance.port}`;
390
+ next['x-forwarded-host'] = headers['x-forwarded-host'] ?? headers.host;
391
+ next['x-forwarded-proto'] = headers['x-forwarded-proto'] ?? request.protocol;
392
+ next['x-forwarded-prefix'] = publicPrefix;
393
+ return next;
394
+ }
395
+ function proxyResponseHeaders(headers, instance, options) {
396
+ const next = {};
397
+ const mutated = options.mutated === true || options.contentLength !== undefined;
398
+ for (const [name, value] of Object.entries(headers)) {
399
+ const lower = name.toLowerCase();
400
+ if (hopByHopHeaders.has(lower) || lower === 'set-cookie') {
401
+ continue;
402
+ }
403
+ if (lower === 'content-length' && options.contentLength !== undefined) {
404
+ continue;
405
+ }
406
+ if (mutated && (lower === 'etag' || lower === 'content-md5' || lower === 'digest')) {
407
+ continue;
408
+ }
409
+ if (lower === 'location' && typeof value === 'string') {
410
+ next[name] = rewriteProxyLocation(value, instance, options.publicPrefix);
411
+ continue;
412
+ }
413
+ next[name] = value;
414
+ }
415
+ if (options.contentLength !== undefined) {
416
+ next['content-length'] = options.contentLength;
417
+ }
418
+ if (mutated) {
419
+ next['cache-control'] = 'no-store';
420
+ }
421
+ return next;
422
+ }
423
+ function rewriteProxyLocation(value, instance, prefix) {
424
+ if (value === prefix || value.startsWith(`${prefix}/`) || value.startsWith(`${prefix}?`) || value.startsWith(`${prefix}#`)) {
425
+ return value;
426
+ }
427
+ if (value.startsWith('/')) {
428
+ return `${prefix}${value}`;
429
+ }
430
+ try {
431
+ const parsed = new URL(value);
432
+ if ((parsed.hostname === '127.0.0.1' || parsed.hostname === 'localhost') &&
433
+ parsed.port === String(instance.port)) {
434
+ return `${prefix}${parsed.pathname}${parsed.search}${parsed.hash}`;
435
+ }
436
+ }
437
+ catch {
438
+ // Keep non-URL Location headers unchanged.
439
+ }
440
+ return value;
441
+ }
442
+ function websocketProtocols(value) {
443
+ const raw = Array.isArray(value) ? value.join(',') : value;
444
+ const protocols = raw
445
+ ?.split(',')
446
+ .map((part) => part.trim())
447
+ .filter(Boolean);
448
+ return protocols && protocols.length > 0 ? protocols : undefined;
449
+ }
450
+ function shouldInjectTitleScript(headers) {
451
+ const contentType = headerString(headers['content-type']).toLowerCase();
452
+ if (!contentType.includes('text/html')) {
453
+ return false;
454
+ }
455
+ return !headerString(headers['content-encoding']);
456
+ }
457
+ function injectTitleScript(body, instance, titleToken) {
458
+ const html = body.toString('utf8');
459
+ const tokenQuery = titleToken ? `?token=${encodeURIComponent(titleToken)}` : '';
460
+ const tag = `<script src="${codeServerPublicPrefix(instance)}/__nterminal-title.js${tokenQuery}" defer></script>`;
461
+ const headCloseIndex = html.search(/<\/head\s*>/i);
462
+ if (headCloseIndex >= 0) {
463
+ return Buffer.from(`${html.slice(0, headCloseIndex)}${tag}${html.slice(headCloseIndex)}`, 'utf8');
464
+ }
465
+ const bodyCloseIndex = html.search(/<\/body\s*>/i);
466
+ if (bodyCloseIndex >= 0) {
467
+ return Buffer.from(`${html.slice(0, bodyCloseIndex)}${tag}${html.slice(bodyCloseIndex)}`, 'utf8');
468
+ }
469
+ return Buffer.from(`${html}${tag}`, 'utf8');
470
+ }
471
+ function codeServerPublicPrefix(instance) {
472
+ try {
473
+ const parsed = new URL(instance.url, 'http://nterminal.local');
474
+ return parsed.pathname.endsWith('/') ? parsed.pathname.slice(0, -1) : parsed.pathname;
475
+ }
476
+ catch {
477
+ return instanceUrlPrefix(instance.id);
478
+ }
479
+ }
480
+ function titleTokenFromRequest(request) {
481
+ const token = request.query?.token ??
482
+ request.query?.nterminalTitle;
483
+ return typeof token === 'string' && token.trim() ? token.trim() : undefined;
484
+ }
485
+ function stripTitleTokenFromSearch(search) {
486
+ if (!search || !search.includes('nterminalTitle')) {
487
+ return search;
488
+ }
489
+ const kept = search
490
+ .slice(1)
491
+ .split('&')
492
+ .filter((part) => part.split('=', 1)[0] !== 'nterminalTitle');
493
+ return kept.length > 0 ? `?${kept.join('&')}` : '';
494
+ }
495
+ function codeServerTitleLockScript(title) {
496
+ const serializedTitle = JSON.stringify(title);
497
+ const serializedIconHref = JSON.stringify('/brand/vscode.png');
498
+ return `
499
+ (() => {
500
+ const desiredTitle = ${serializedTitle};
501
+ const desiredIconHref = ${serializedIconHref};
502
+ const ensureTitle = () => {
503
+ let titleElement = document.querySelector('title');
504
+ if (!titleElement) {
505
+ titleElement = document.createElement('title');
506
+ document.head.appendChild(titleElement);
507
+ }
508
+ if (document.title !== desiredTitle) {
509
+ document.title = desiredTitle;
510
+ }
511
+ };
512
+ const ensureIcon = () => {
513
+ let iconElement = document.querySelector('link[data-nterminal-code-favicon="true"]');
514
+ if (!iconElement) {
515
+ iconElement = document.createElement('link');
516
+ iconElement.setAttribute('data-nterminal-code-favicon', 'true');
517
+ iconElement.setAttribute('rel', 'icon');
518
+ iconElement.setAttribute('type', 'image/png');
519
+ }
520
+ if (iconElement.getAttribute('href') !== desiredIconHref) {
521
+ iconElement.setAttribute('href', desiredIconHref);
522
+ }
523
+ const iconLinks = Array.from(document.head.querySelectorAll('link[rel~="icon"]'));
524
+ if (iconLinks[iconLinks.length - 1] !== iconElement) {
525
+ document.head.appendChild(iconElement);
526
+ }
527
+ };
528
+ ensureTitle();
529
+ ensureIcon();
530
+ const target = document.querySelector('title') || document.head;
531
+ new MutationObserver(ensureTitle).observe(target, { childList: true, characterData: true, subtree: true });
532
+ new MutationObserver(ensureIcon).observe(document.head, { childList: true, subtree: true, attributes: true, attributeFilter: ['href', 'rel'] });
533
+ window.addEventListener('focus', ensureTitle, { passive: true });
534
+ window.addEventListener('focus', ensureIcon, { passive: true });
535
+ })();
536
+ `;
537
+ }
538
+ function headerString(value) {
539
+ return Array.isArray(value) ? value.join(',') : value ?? '';
540
+ }
541
+ //# sourceMappingURL=codeServerRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeServerRoutes.js","sourceRoot":"","sources":["../../../src/server/routes/codeServerRoutes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import WebSocket from 'ws';
2
+ interface WebSocketRelayOptions {
3
+ maxPendingMessages?: number;
4
+ maxPendingBytes?: number;
5
+ pendingMessageOverflowCode?: number;
6
+ pendingByteOverflowCode?: number;
7
+ pendingOverflowReason?: string;
8
+ onClientMessage?: () => void;
9
+ onUpstreamMessage?: () => void;
10
+ }
11
+ export declare function relayWebSocketPair(clientSocket: WebSocket, upstreamSocket: WebSocket, options?: WebSocketRelayOptions): void;
12
+ export {};