ttyd-mux 0.4.1 → 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/README.md +276 -47
- 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
|
@@ -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"}
|