ttyd-mux 0.4.2 → 0.4.3
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.
- package/dist/commands/share.d.ts +25 -0
- package/dist/commands/share.d.ts.map +1 -0
- package/dist/commands/share.js +108 -0
- package/dist/commands/share.js.map +1 -0
- package/dist/config/state-store.d.ts +9 -1
- package/dist/config/state-store.d.ts.map +1 -1
- package/dist/config/state-store.js +30 -2
- package/dist/config/state-store.js.map +1 -1
- package/dist/config/state.d.ts +9 -1
- package/dist/config/state.d.ts.map +1 -1
- package/dist/config/state.js +67 -1
- package/dist/config/state.js.map +1 -1
- package/dist/config/types.d.ts +52 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +23 -1
- package/dist/config/types.js.map +1 -1
- package/dist/daemon/api-handler.d.ts.map +1 -1
- package/dist/daemon/api-handler.js +180 -2
- package/dist/daemon/api-handler.js.map +1 -1
- package/dist/daemon/http-proxy.d.ts +3 -2
- package/dist/daemon/http-proxy.d.ts.map +1 -1
- package/dist/daemon/http-proxy.js +7 -4
- package/dist/daemon/http-proxy.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +22 -2
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/notification/index.d.ts +42 -0
- package/dist/daemon/notification/index.d.ts.map +1 -0
- package/dist/daemon/notification/index.js +83 -0
- package/dist/daemon/notification/index.js.map +1 -0
- package/dist/daemon/notification/matcher.d.ts +30 -0
- package/dist/daemon/notification/matcher.d.ts.map +1 -0
- package/dist/daemon/notification/matcher.js +72 -0
- package/dist/daemon/notification/matcher.js.map +1 -0
- package/dist/daemon/notification/sender.d.ts +38 -0
- package/dist/daemon/notification/sender.d.ts.map +1 -0
- package/dist/daemon/notification/sender.js +74 -0
- package/dist/daemon/notification/sender.js.map +1 -0
- package/dist/daemon/notification/subscription.d.ts +35 -0
- package/dist/daemon/notification/subscription.d.ts.map +1 -0
- package/dist/daemon/notification/subscription.js +52 -0
- package/dist/daemon/notification/subscription.js.map +1 -0
- package/dist/daemon/notification/types.d.ts +70 -0
- package/dist/daemon/notification/types.d.ts.map +1 -0
- package/dist/daemon/notification/types.js +5 -0
- package/dist/daemon/notification/types.js.map +1 -0
- package/dist/daemon/notification/vapid.d.ts +25 -0
- package/dist/daemon/notification/vapid.d.ts.map +1 -0
- package/dist/daemon/notification/vapid.js +56 -0
- package/dist/daemon/notification/vapid.js.map +1 -0
- package/dist/daemon/pwa.d.ts +2 -1
- package/dist/daemon/pwa.d.ts.map +1 -1
- package/dist/daemon/pwa.js +51 -0
- package/dist/daemon/pwa.js.map +1 -1
- package/dist/daemon/router.d.ts +10 -0
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +122 -10
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/share-manager.d.ts +55 -0
- package/dist/daemon/share-manager.d.ts.map +1 -0
- package/dist/daemon/share-manager.js +115 -0
- package/dist/daemon/share-manager.js.map +1 -0
- package/dist/daemon/toolbar/index.d.ts +4 -12
- package/dist/daemon/toolbar/index.d.ts.map +1 -1
- package/dist/daemon/toolbar/index.js +6 -794
- package/dist/daemon/toolbar/index.js.map +1 -1
- package/dist/daemon/toolbar/styles.d.ts +1 -1
- package/dist/daemon/toolbar/styles.d.ts.map +1 -1
- package/dist/daemon/toolbar/styles.js +106 -0
- package/dist/daemon/toolbar/styles.js.map +1 -1
- package/dist/daemon/toolbar/template.d.ts +1 -1
- package/dist/daemon/toolbar/template.d.ts.map +1 -1
- package/dist/daemon/toolbar/template.js +11 -0
- package/dist/daemon/toolbar/template.js.map +1 -1
- package/dist/daemon/ws-proxy.d.ts +21 -1
- package/dist/daemon/ws-proxy.d.ts.map +1 -1
- package/dist/daemon/ws-proxy.js +107 -5
- package/dist/daemon/ws-proxy.js.map +1 -1
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- package/dist/toolbar.js +2 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -2
package/dist/daemon/router.js
CHANGED
|
@@ -1,11 +1,46 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
1
5
|
import { normalizeBasePath } from '../config/config.js';
|
|
6
|
+
import { addShare, getAllShares, getShare, removeShare } from '../config/state.js';
|
|
2
7
|
import { createLogger } from '../utils/logger.js';
|
|
3
8
|
import { handleApiRequest } from './api-handler.js';
|
|
4
9
|
import { proxyToSession } from './http-proxy.js';
|
|
5
10
|
import { generatePortalHtml } from './portal.js';
|
|
6
11
|
import { getIconPng, getIconSvg, getManifestJson, getServiceWorker } from './pwa.js';
|
|
7
12
|
import { sessionManager } from './session-manager.js';
|
|
8
|
-
import {
|
|
13
|
+
import { createShareManager } from './share-manager.js';
|
|
14
|
+
// Get the directory of this module for resolving dist path
|
|
15
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
+
const __dirname = dirname(__filename);
|
|
17
|
+
// Cache for toolbar.js content and ETag
|
|
18
|
+
let toolbarJsCache = null;
|
|
19
|
+
let toolbarJsEtag = null;
|
|
20
|
+
/**
|
|
21
|
+
* Generate ETag from content using MD5 hash
|
|
22
|
+
* @param content - Content to hash
|
|
23
|
+
* @returns ETag string with quotes (e.g., '"abc123..."')
|
|
24
|
+
*/
|
|
25
|
+
export function generateEtag(content) {
|
|
26
|
+
return `"${createHash('md5').update(content).digest('hex')}"`;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Reset toolbar.js cache (for testing)
|
|
30
|
+
*/
|
|
31
|
+
export function resetToolbarCache() {
|
|
32
|
+
toolbarJsCache = null;
|
|
33
|
+
toolbarJsEtag = null;
|
|
34
|
+
}
|
|
35
|
+
// Share manager for validating share tokens
|
|
36
|
+
const shareManager = createShareManager({
|
|
37
|
+
getShares: getAllShares,
|
|
38
|
+
addShare: addShare,
|
|
39
|
+
removeShare: removeShare,
|
|
40
|
+
getShare: (token) => getShare(token)
|
|
41
|
+
});
|
|
42
|
+
/** Regex to extract share token from path */
|
|
43
|
+
const SHARE_PATH_REGEX = /^\/share\/([a-f0-9]+)(\/.*)?$/;
|
|
9
44
|
const log = createLogger('router');
|
|
10
45
|
/**
|
|
11
46
|
* Set security headers on response
|
|
@@ -90,16 +125,53 @@ function servePwaIconPng(res, size) {
|
|
|
90
125
|
res.end(png);
|
|
91
126
|
}
|
|
92
127
|
/**
|
|
93
|
-
*
|
|
128
|
+
* Load toolbar.js from dist directory (cached)
|
|
129
|
+
* Returns { content, etag }
|
|
130
|
+
*/
|
|
131
|
+
function loadToolbarJs() {
|
|
132
|
+
if (toolbarJsCache !== null && toolbarJsEtag !== null) {
|
|
133
|
+
return { content: toolbarJsCache, etag: toolbarJsEtag };
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
// Load from dist directory (relative to compiled output)
|
|
137
|
+
const distPath = join(__dirname, '../../dist/toolbar.js');
|
|
138
|
+
toolbarJsCache = readFileSync(distPath, 'utf-8');
|
|
139
|
+
log.debug('Loaded toolbar.js from dist');
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// Fallback: bundle not available
|
|
143
|
+
log.warn('toolbar.js not found in dist, returning placeholder');
|
|
144
|
+
toolbarJsCache =
|
|
145
|
+
'// toolbar.js not built - run: bun run build:toolbar\nconsole.warn("[Toolbar] Bundle not found");';
|
|
146
|
+
}
|
|
147
|
+
// Calculate ETag from content hash
|
|
148
|
+
toolbarJsEtag = generateEtag(toolbarJsCache);
|
|
149
|
+
return { content: toolbarJsCache, etag: toolbarJsEtag };
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Serve toolbar JavaScript (static file from dist)
|
|
153
|
+
* Supports ETag-based conditional requests for cache revalidation
|
|
94
154
|
*/
|
|
95
|
-
function serveToolbarJs(
|
|
96
|
-
const
|
|
155
|
+
function serveToolbarJs(req, res) {
|
|
156
|
+
const { content, etag } = loadToolbarJs();
|
|
157
|
+
// Check If-None-Match header for conditional request
|
|
158
|
+
const ifNoneMatch = req.headers['if-none-match'];
|
|
159
|
+
if (ifNoneMatch === etag) {
|
|
160
|
+
// Content hasn't changed, return 304 Not Modified
|
|
161
|
+
res.writeHead(304, {
|
|
162
|
+
ETag: etag,
|
|
163
|
+
'Cache-Control': 'public, max-age=0, must-revalidate'
|
|
164
|
+
});
|
|
165
|
+
res.end();
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
97
168
|
res.writeHead(200, {
|
|
98
169
|
'Content-Type': 'application/javascript',
|
|
99
|
-
'Content-Length': Buffer.byteLength(
|
|
100
|
-
|
|
170
|
+
'Content-Length': Buffer.byteLength(content),
|
|
171
|
+
ETag: etag,
|
|
172
|
+
'Cache-Control': 'public, max-age=0, must-revalidate'
|
|
101
173
|
});
|
|
102
|
-
res.end(
|
|
174
|
+
res.end(content);
|
|
103
175
|
}
|
|
104
176
|
/**
|
|
105
177
|
* Handle incoming HTTP request
|
|
@@ -137,9 +209,9 @@ export function handleRequest(config, req, res) {
|
|
|
137
209
|
servePwaIconPng(res, 512);
|
|
138
210
|
return;
|
|
139
211
|
}
|
|
140
|
-
// Toolbar JavaScript
|
|
212
|
+
// Toolbar JavaScript (static file)
|
|
141
213
|
if (url === `${basePath}/toolbar.js`) {
|
|
142
|
-
serveToolbarJs(
|
|
214
|
+
serveToolbarJs(req, res);
|
|
143
215
|
return;
|
|
144
216
|
}
|
|
145
217
|
// Portal page
|
|
@@ -150,10 +222,50 @@ export function handleRequest(config, req, res) {
|
|
|
150
222
|
return;
|
|
151
223
|
}
|
|
152
224
|
}
|
|
225
|
+
// Share links: /ttyd-mux/share/:token
|
|
226
|
+
const sharePath = url.slice(basePath.length);
|
|
227
|
+
const shareMatch = sharePath.match(SHARE_PATH_REGEX);
|
|
228
|
+
if (shareMatch?.[1]) {
|
|
229
|
+
const token = shareMatch[1];
|
|
230
|
+
const share = shareManager.validateShare(token);
|
|
231
|
+
if (!share) {
|
|
232
|
+
log.debug(`Share not found or expired: ${token}`);
|
|
233
|
+
res.writeHead(403, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
234
|
+
res.end(`<!DOCTYPE html>
|
|
235
|
+
<html>
|
|
236
|
+
<head><title>Share Link Expired</title></head>
|
|
237
|
+
<body style="font-family: sans-serif; padding: 2rem; text-align: center;">
|
|
238
|
+
<h1>Share Link Expired</h1>
|
|
239
|
+
<p>This share link has expired or been revoked.</p>
|
|
240
|
+
</body>
|
|
241
|
+
</html>`);
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
// Find the session
|
|
245
|
+
const session = sessionManager.listSessions().find((s) => s.name === share.sessionName);
|
|
246
|
+
if (!session) {
|
|
247
|
+
log.debug(`Session not found for share: ${share.sessionName}`);
|
|
248
|
+
res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
249
|
+
res.end(`<!DOCTYPE html>
|
|
250
|
+
<html>
|
|
251
|
+
<head><title>Session Not Found</title></head>
|
|
252
|
+
<body style="font-family: sans-serif; padding: 2rem; text-align: center;">
|
|
253
|
+
<h1>Session Not Found</h1>
|
|
254
|
+
<p>The shared session is no longer running.</p>
|
|
255
|
+
</body>
|
|
256
|
+
</html>`);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
// Proxy to the session in read-only mode
|
|
260
|
+
// Set a header to indicate read-only mode for WebSocket proxy
|
|
261
|
+
req.headers['x-ttyd-mux-readonly'] = 'true';
|
|
262
|
+
proxyToSession(req, res, session.port, basePath, config.toolbar);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
153
265
|
// Try to proxy to a session
|
|
154
266
|
const session = findSessionForPath(config, url);
|
|
155
267
|
if (session) {
|
|
156
|
-
proxyToSession(req, res, session.port, basePath);
|
|
268
|
+
proxyToSession(req, res, session.port, basePath, config.toolbar);
|
|
157
269
|
return;
|
|
158
270
|
}
|
|
159
271
|
// Not found
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/daemon/router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/daemon/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Share Manager - Manages read-only share links for terminal sessions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Share state stored in state.json
|
|
6
|
+
*/
|
|
7
|
+
export interface ShareState {
|
|
8
|
+
token: string;
|
|
9
|
+
sessionName: string;
|
|
10
|
+
createdAt: string;
|
|
11
|
+
expiresAt: string;
|
|
12
|
+
password?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Options for creating a share
|
|
16
|
+
*/
|
|
17
|
+
export interface CreateShareOptions {
|
|
18
|
+
expiresIn?: string;
|
|
19
|
+
password?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Store interface for share persistence (allows DI for testing)
|
|
23
|
+
*/
|
|
24
|
+
export interface ShareStore {
|
|
25
|
+
getShares(): ShareState[];
|
|
26
|
+
addShare(share: ShareState): void;
|
|
27
|
+
removeShare(token: string): void;
|
|
28
|
+
getShare(token: string): ShareState | undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* ShareManager interface
|
|
32
|
+
*/
|
|
33
|
+
export interface ShareManager {
|
|
34
|
+
createShare(sessionName: string, options?: CreateShareOptions): ShareState;
|
|
35
|
+
validateShare(token: string): ShareState | null;
|
|
36
|
+
revokeShare(token: string): boolean;
|
|
37
|
+
listShares(): ShareState[];
|
|
38
|
+
cleanupExpiredShares(): number;
|
|
39
|
+
getShare(token: string): ShareState | undefined;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Generate a cryptographically secure token
|
|
43
|
+
*/
|
|
44
|
+
export declare function generateSecureToken(): string;
|
|
45
|
+
/**
|
|
46
|
+
* Parse expiration time string to milliseconds
|
|
47
|
+
* Supports: '1h', '30m', '7d'
|
|
48
|
+
* Default: 1 hour
|
|
49
|
+
*/
|
|
50
|
+
export declare function parseExpiresIn(expiresIn: string): number;
|
|
51
|
+
/**
|
|
52
|
+
* Create a ShareManager with the given store
|
|
53
|
+
*/
|
|
54
|
+
export declare function createShareManager(store: ShareStore): ShareManager;
|
|
55
|
+
//# sourceMappingURL=share-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-manager.d.ts","sourceRoot":"","sources":["../../src/daemon/share-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,IAAI,UAAU,EAAE,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,UAAU,CAAC;IAC3E,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IAChD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,UAAU,IAAI,UAAU,EAAE,CAAC;IAC3B,oBAAoB,IAAI,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;CACjD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAwBxD;AASD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAiFlE"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Share Manager - Manages read-only share links for terminal sessions
|
|
3
|
+
*/
|
|
4
|
+
import { randomBytes } from 'node:crypto';
|
|
5
|
+
/**
|
|
6
|
+
* Generate a cryptographically secure token
|
|
7
|
+
*/
|
|
8
|
+
export function generateSecureToken() {
|
|
9
|
+
return randomBytes(16).toString('hex');
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Parse expiration time string to milliseconds
|
|
13
|
+
* Supports: '1h', '30m', '7d'
|
|
14
|
+
* Default: 1 hour
|
|
15
|
+
*/
|
|
16
|
+
export function parseExpiresIn(expiresIn) {
|
|
17
|
+
const DEFAULT_EXPIRY_MS = 3600000; // 1 hour
|
|
18
|
+
if (!expiresIn || expiresIn.length < 2) {
|
|
19
|
+
return DEFAULT_EXPIRY_MS;
|
|
20
|
+
}
|
|
21
|
+
const unit = expiresIn.slice(-1);
|
|
22
|
+
const value = Number.parseInt(expiresIn.slice(0, -1), 10);
|
|
23
|
+
if (Number.isNaN(value)) {
|
|
24
|
+
return DEFAULT_EXPIRY_MS;
|
|
25
|
+
}
|
|
26
|
+
switch (unit) {
|
|
27
|
+
case 'h':
|
|
28
|
+
return value * 60 * 60 * 1000;
|
|
29
|
+
case 'm':
|
|
30
|
+
return value * 60 * 1000;
|
|
31
|
+
case 'd':
|
|
32
|
+
return value * 24 * 60 * 60 * 1000;
|
|
33
|
+
default:
|
|
34
|
+
return DEFAULT_EXPIRY_MS;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if a share is expired
|
|
39
|
+
*/
|
|
40
|
+
function isExpired(share) {
|
|
41
|
+
return new Date(share.expiresAt).getTime() <= Date.now();
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create a ShareManager with the given store
|
|
45
|
+
*/
|
|
46
|
+
export function createShareManager(store) {
|
|
47
|
+
return {
|
|
48
|
+
createShare(sessionName, options = {}) {
|
|
49
|
+
const token = generateSecureToken();
|
|
50
|
+
const now = new Date();
|
|
51
|
+
const expiresInMs = parseExpiresIn(options.expiresIn ?? '1h');
|
|
52
|
+
const expiresAt = new Date(now.getTime() + expiresInMs);
|
|
53
|
+
const share = {
|
|
54
|
+
token,
|
|
55
|
+
sessionName,
|
|
56
|
+
createdAt: now.toISOString(),
|
|
57
|
+
expiresAt: expiresAt.toISOString()
|
|
58
|
+
};
|
|
59
|
+
if (options.password) {
|
|
60
|
+
// For now, store password as-is (TODO: hash in future)
|
|
61
|
+
share.password = options.password;
|
|
62
|
+
}
|
|
63
|
+
store.addShare(share);
|
|
64
|
+
return share;
|
|
65
|
+
},
|
|
66
|
+
validateShare(token) {
|
|
67
|
+
const share = store.getShare(token);
|
|
68
|
+
if (!share) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
if (isExpired(share)) {
|
|
72
|
+
// Remove expired share
|
|
73
|
+
store.removeShare(token);
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return share;
|
|
77
|
+
},
|
|
78
|
+
revokeShare(token) {
|
|
79
|
+
const share = store.getShare(token);
|
|
80
|
+
if (!share) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
store.removeShare(token);
|
|
84
|
+
return true;
|
|
85
|
+
},
|
|
86
|
+
listShares() {
|
|
87
|
+
const shares = store.getShares();
|
|
88
|
+
const validShares = [];
|
|
89
|
+
for (const share of shares) {
|
|
90
|
+
if (isExpired(share)) {
|
|
91
|
+
store.removeShare(share.token);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
validShares.push(share);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return validShares;
|
|
98
|
+
},
|
|
99
|
+
cleanupExpiredShares() {
|
|
100
|
+
const shares = store.getShares();
|
|
101
|
+
let removed = 0;
|
|
102
|
+
for (const share of shares) {
|
|
103
|
+
if (isExpired(share)) {
|
|
104
|
+
store.removeShare(share.token);
|
|
105
|
+
removed++;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return removed;
|
|
109
|
+
},
|
|
110
|
+
getShare(token) {
|
|
111
|
+
return store.getShare(token);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=share-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-manager.js","sourceRoot":"","sources":["../../src/daemon/share-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,16 +16,6 @@ export { AUTO_RUN_KEY, ONBOARDING_SHOWN_KEY, STORAGE_KEY };
|
|
|
16
16
|
export { onboardingHtml, toolbarHtml, toolbarStyles };
|
|
17
17
|
export { DEFAULT_TOOLBAR_CONFIG };
|
|
18
18
|
export type { ToolbarConfig };
|
|
19
|
-
/**
|
|
20
|
-
* Generate the toolbar JavaScript code
|
|
21
|
-
* @param config - Toolbar configuration from config.yaml
|
|
22
|
-
*/
|
|
23
|
-
export declare function getToolbarScript(config?: ToolbarConfig): string;
|
|
24
|
-
/**
|
|
25
|
-
* Get the complete toolbar JavaScript for serving as external file
|
|
26
|
-
* @param config - Toolbar configuration from config.yaml
|
|
27
|
-
*/
|
|
28
|
-
export declare function getToolbarJs(config?: ToolbarConfig): string;
|
|
29
19
|
/**
|
|
30
20
|
* Inject toolbar into HTML response
|
|
31
21
|
*
|
|
@@ -33,11 +23,13 @@ export declare function getToolbarJs(config?: ToolbarConfig): string;
|
|
|
33
23
|
* - CSS styles (inline for FOUC avoidance)
|
|
34
24
|
* - HTML structure
|
|
35
25
|
* - Onboarding tooltip (hidden by default)
|
|
36
|
-
* -
|
|
26
|
+
* - Config as global variable
|
|
27
|
+
* - Script tag referencing external toolbar.js (static file)
|
|
37
28
|
*
|
|
38
29
|
* @param html - Original HTML content
|
|
39
30
|
* @param basePath - Base path for the ttyd-mux routes (e.g., "/ttyd-mux")
|
|
31
|
+
* @param config - Toolbar configuration from config.yaml
|
|
40
32
|
* @returns Modified HTML with toolbar injected
|
|
41
33
|
*/
|
|
42
|
-
export declare function injectToolbar(html: string, basePath: string): string;
|
|
34
|
+
export declare function injectToolbar(html: string, basePath: string, config?: ToolbarConfig): string;
|
|
43
35
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/daemon/toolbar/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,sBAAsB,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5D,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,CAAC;AAG3D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAGtD,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/daemon/toolbar/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,sBAAsB,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5D,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,CAAC;AAG3D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAGtD,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAClC,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,aAAsC,GAC7C,MAAM,CAUR"}
|