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.
Files changed (85) hide show
  1. package/README.md +276 -47
  2. package/dist/commands/share.d.ts +25 -0
  3. package/dist/commands/share.d.ts.map +1 -0
  4. package/dist/commands/share.js +108 -0
  5. package/dist/commands/share.js.map +1 -0
  6. package/dist/config/state-store.d.ts +9 -1
  7. package/dist/config/state-store.d.ts.map +1 -1
  8. package/dist/config/state-store.js +30 -2
  9. package/dist/config/state-store.js.map +1 -1
  10. package/dist/config/state.d.ts +9 -1
  11. package/dist/config/state.d.ts.map +1 -1
  12. package/dist/config/state.js +67 -1
  13. package/dist/config/state.js.map +1 -1
  14. package/dist/config/types.d.ts +52 -0
  15. package/dist/config/types.d.ts.map +1 -1
  16. package/dist/config/types.js +23 -1
  17. package/dist/config/types.js.map +1 -1
  18. package/dist/daemon/api-handler.d.ts.map +1 -1
  19. package/dist/daemon/api-handler.js +180 -2
  20. package/dist/daemon/api-handler.js.map +1 -1
  21. package/dist/daemon/http-proxy.d.ts +3 -2
  22. package/dist/daemon/http-proxy.d.ts.map +1 -1
  23. package/dist/daemon/http-proxy.js +7 -4
  24. package/dist/daemon/http-proxy.js.map +1 -1
  25. package/dist/daemon/index.d.ts.map +1 -1
  26. package/dist/daemon/index.js +22 -2
  27. package/dist/daemon/index.js.map +1 -1
  28. package/dist/daemon/notification/index.d.ts +42 -0
  29. package/dist/daemon/notification/index.d.ts.map +1 -0
  30. package/dist/daemon/notification/index.js +83 -0
  31. package/dist/daemon/notification/index.js.map +1 -0
  32. package/dist/daemon/notification/matcher.d.ts +30 -0
  33. package/dist/daemon/notification/matcher.d.ts.map +1 -0
  34. package/dist/daemon/notification/matcher.js +72 -0
  35. package/dist/daemon/notification/matcher.js.map +1 -0
  36. package/dist/daemon/notification/sender.d.ts +38 -0
  37. package/dist/daemon/notification/sender.d.ts.map +1 -0
  38. package/dist/daemon/notification/sender.js +74 -0
  39. package/dist/daemon/notification/sender.js.map +1 -0
  40. package/dist/daemon/notification/subscription.d.ts +35 -0
  41. package/dist/daemon/notification/subscription.d.ts.map +1 -0
  42. package/dist/daemon/notification/subscription.js +52 -0
  43. package/dist/daemon/notification/subscription.js.map +1 -0
  44. package/dist/daemon/notification/types.d.ts +70 -0
  45. package/dist/daemon/notification/types.d.ts.map +1 -0
  46. package/dist/daemon/notification/types.js +5 -0
  47. package/dist/daemon/notification/types.js.map +1 -0
  48. package/dist/daemon/notification/vapid.d.ts +25 -0
  49. package/dist/daemon/notification/vapid.d.ts.map +1 -0
  50. package/dist/daemon/notification/vapid.js +56 -0
  51. package/dist/daemon/notification/vapid.js.map +1 -0
  52. package/dist/daemon/pwa.d.ts +2 -1
  53. package/dist/daemon/pwa.d.ts.map +1 -1
  54. package/dist/daemon/pwa.js +51 -0
  55. package/dist/daemon/pwa.js.map +1 -1
  56. package/dist/daemon/router.d.ts +10 -0
  57. package/dist/daemon/router.d.ts.map +1 -1
  58. package/dist/daemon/router.js +122 -10
  59. package/dist/daemon/router.js.map +1 -1
  60. package/dist/daemon/share-manager.d.ts +55 -0
  61. package/dist/daemon/share-manager.d.ts.map +1 -0
  62. package/dist/daemon/share-manager.js +115 -0
  63. package/dist/daemon/share-manager.js.map +1 -0
  64. package/dist/daemon/toolbar/index.d.ts +4 -12
  65. package/dist/daemon/toolbar/index.d.ts.map +1 -1
  66. package/dist/daemon/toolbar/index.js +6 -794
  67. package/dist/daemon/toolbar/index.js.map +1 -1
  68. package/dist/daemon/toolbar/styles.d.ts +1 -1
  69. package/dist/daemon/toolbar/styles.d.ts.map +1 -1
  70. package/dist/daemon/toolbar/styles.js +106 -0
  71. package/dist/daemon/toolbar/styles.js.map +1 -1
  72. package/dist/daemon/toolbar/template.d.ts +1 -1
  73. package/dist/daemon/toolbar/template.d.ts.map +1 -1
  74. package/dist/daemon/toolbar/template.js +11 -0
  75. package/dist/daemon/toolbar/template.js.map +1 -1
  76. package/dist/daemon/ws-proxy.d.ts +21 -1
  77. package/dist/daemon/ws-proxy.d.ts.map +1 -1
  78. package/dist/daemon/ws-proxy.js +107 -5
  79. package/dist/daemon/ws-proxy.js.map +1 -1
  80. package/dist/index.js +18 -0
  81. package/dist/index.js.map +1 -1
  82. package/dist/toolbar.js +2 -0
  83. package/dist/version.d.ts +1 -1
  84. package/dist/version.js +1 -1
  85. package/package.json +6 -2
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Notification system types
3
+ */
4
+ /**
5
+ * Pattern configuration for notification triggers
6
+ */
7
+ export interface PatternConfig {
8
+ /** Regular expression pattern to match */
9
+ regex: string;
10
+ /** Message to include in notification */
11
+ message: string;
12
+ /** Cooldown in seconds (optional, uses default if not set) */
13
+ cooldown?: number;
14
+ }
15
+ /**
16
+ * Push subscription from browser
17
+ */
18
+ export interface PushSubscription {
19
+ /** Unique subscription ID */
20
+ id: string;
21
+ /** Browser push endpoint URL */
22
+ endpoint: string;
23
+ /** Subscription keys */
24
+ keys: {
25
+ p256dh: string;
26
+ auth: string;
27
+ };
28
+ /** Session name this subscription is for (optional, null = all sessions) */
29
+ sessionName?: string;
30
+ /** Created timestamp */
31
+ createdAt: string;
32
+ }
33
+ /**
34
+ * VAPID keys for Web Push
35
+ */
36
+ export interface VapidKeys {
37
+ publicKey: string;
38
+ privateKey: string;
39
+ }
40
+ /**
41
+ * Notification configuration in config.yaml
42
+ */
43
+ export interface NotificationConfig {
44
+ /** Enable/disable notifications */
45
+ enabled?: boolean;
46
+ /** VAPID contact email */
47
+ contact_email?: string;
48
+ /** Enable bell notification (default: true) */
49
+ bell_notification?: boolean;
50
+ /** Bell notification cooldown in seconds (default: 10) */
51
+ bell_cooldown?: number;
52
+ /** Patterns to match */
53
+ patterns?: PatternConfig[];
54
+ /** Default cooldown in seconds */
55
+ default_cooldown?: number;
56
+ }
57
+ /**
58
+ * Match result when a pattern matches
59
+ */
60
+ export interface MatchResult {
61
+ /** The matched pattern configuration */
62
+ pattern: PatternConfig;
63
+ /** The text that matched */
64
+ matchedText: string;
65
+ /** Session name where match occurred */
66
+ sessionName: string;
67
+ /** Timestamp of match */
68
+ timestamp: string;
69
+ }
70
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/daemon/notification/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,mCAAmC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,kCAAkC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,OAAO,EAAE,aAAa,CAAC;IACvB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Notification system types
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/daemon/notification/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * VAPID key management for Web Push
3
+ */
4
+ import type { VapidKeys } from './types.js';
5
+ /**
6
+ * Get VAPID keys file path
7
+ */
8
+ export declare function getVapidKeysPath(stateDir: string): string;
9
+ /**
10
+ * Generate new VAPID keys
11
+ */
12
+ export declare function generateVapidKeys(): VapidKeys;
13
+ /**
14
+ * Load VAPID keys from file, or generate if not exists
15
+ */
16
+ export declare function loadOrGenerateVapidKeys(stateDir: string): VapidKeys;
17
+ /**
18
+ * Save VAPID keys to file
19
+ */
20
+ export declare function saveVapidKeys(stateDir: string, keys: VapidKeys): void;
21
+ /**
22
+ * Get public VAPID key (safe to share with clients)
23
+ */
24
+ export declare function getPublicVapidKey(stateDir: string): string;
25
+ //# sourceMappingURL=vapid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vapid.d.ts","sourceRoot":"","sources":["../../../src/daemon/notification/vapid.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,SAAS,CAM7C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAgBnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAGrE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG1D"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * VAPID key management for Web Push
3
+ */
4
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ import webpush from 'web-push';
7
+ /**
8
+ * Get VAPID keys file path
9
+ */
10
+ export function getVapidKeysPath(stateDir) {
11
+ return join(stateDir, 'vapid-keys.json');
12
+ }
13
+ /**
14
+ * Generate new VAPID keys
15
+ */
16
+ export function generateVapidKeys() {
17
+ const keys = webpush.generateVAPIDKeys();
18
+ return {
19
+ publicKey: keys.publicKey,
20
+ privateKey: keys.privateKey
21
+ };
22
+ }
23
+ /**
24
+ * Load VAPID keys from file, or generate if not exists
25
+ */
26
+ export function loadOrGenerateVapidKeys(stateDir) {
27
+ const keysPath = getVapidKeysPath(stateDir);
28
+ if (existsSync(keysPath)) {
29
+ try {
30
+ const content = readFileSync(keysPath, 'utf-8');
31
+ return JSON.parse(content);
32
+ }
33
+ catch {
34
+ // Fall through to generate new keys
35
+ }
36
+ }
37
+ // Generate new keys
38
+ const keys = generateVapidKeys();
39
+ saveVapidKeys(stateDir, keys);
40
+ return keys;
41
+ }
42
+ /**
43
+ * Save VAPID keys to file
44
+ */
45
+ export function saveVapidKeys(stateDir, keys) {
46
+ const keysPath = getVapidKeysPath(stateDir);
47
+ writeFileSync(keysPath, JSON.stringify(keys, null, 2), { mode: 0o600 });
48
+ }
49
+ /**
50
+ * Get public VAPID key (safe to share with clients)
51
+ */
52
+ export function getPublicVapidKey(stateDir) {
53
+ const keys = loadOrGenerateVapidKeys(stateDir);
54
+ return keys.publicKey;
55
+ }
56
+ //# sourceMappingURL=vapid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vapid.js","sourceRoot":"","sources":["../../../src/daemon/notification/vapid.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,OAAO,MAAM,UAAU,CAAC;AAG/B;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IACzC,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAe;IAC7D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC5C,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,IAAI,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,SAAS,CAAC;AACxB,CAAC"}
@@ -15,8 +15,9 @@ export declare function generateManifest(basePath: string): object;
15
15
  *
16
16
  * Minimal implementation for PWA installability.
17
17
  * Uses network-first strategy since terminal requires online connectivity.
18
+ * Also handles push notifications.
18
19
  */
19
- export declare const serviceWorkerScript = "// ttyd-mux Service Worker\nself.addEventListener('install', (event) => {\n // Skip waiting to activate immediately\n self.skipWaiting();\n});\n\nself.addEventListener('activate', (event) => {\n // Claim all clients immediately\n event.waitUntil(clients.claim());\n});\n\nself.addEventListener('fetch', (event) => {\n // Network-first strategy - terminal requires online connectivity\n event.respondWith(fetch(event.request));\n});\n";
20
+ export declare const serviceWorkerScript = "// ttyd-mux Service Worker\nself.addEventListener('install', (event) => {\n // Skip waiting to activate immediately\n self.skipWaiting();\n});\n\nself.addEventListener('activate', (event) => {\n // Claim all clients immediately\n event.waitUntil(clients.claim());\n});\n\nself.addEventListener('fetch', (event) => {\n // Network-first strategy - terminal requires online connectivity\n event.respondWith(fetch(event.request));\n});\n\n// Push notification handler\nself.addEventListener('push', (event) => {\n if (!event.data) return;\n\n try {\n const data = event.data.json();\n const options = {\n body: data.body || 'Terminal notification',\n icon: '/ttyd-mux/icon-192.png',\n badge: '/ttyd-mux/icon-192.png',\n tag: data.tag || 'ttyd-mux-notification',\n requireInteraction: true,\n data: {\n sessionName: data.sessionName,\n timestamp: data.timestamp,\n url: data.sessionName ? '/ttyd-mux/' + data.sessionName : '/ttyd-mux/'\n }\n };\n\n event.waitUntil(\n self.registration.showNotification(data.title || 'ttyd-mux', options)\n );\n } catch (e) {\n console.error('[SW] Push notification error:', e);\n }\n});\n\n// Notification click handler\nself.addEventListener('notificationclick', (event) => {\n event.notification.close();\n\n const url = event.notification.data?.url || '/ttyd-mux/';\n\n event.waitUntil(\n clients.matchAll({ type: 'window', includeUncontrolled: true })\n .then((clientList) => {\n // Try to focus existing window\n for (const client of clientList) {\n if (client.url.includes('/ttyd-mux/') && 'focus' in client) {\n return client.focus();\n }\n }\n // Open new window if none exists\n if (clients.openWindow) {\n return clients.openWindow(url);\n }\n })\n );\n});\n";
20
21
  /**
21
22
  * SVG icon for ttyd-mux
22
23
  *
@@ -1 +1 @@
1
- {"version":3,"file":"pwa.d.ts","sourceRoot":"","sources":["../../src/daemon/pwa.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6BzD;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,4bAe/B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,OAAO,qSAGb,CAAC;AAER;;;;;;;GAOG;AAIH,eAAO,MAAM,aAAa,QAA6B,CAAC;AAGxD,eAAO,MAAM,aAAa,QAA6B,CAAC;AAsJxD;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,CAGlD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD"}
1
+ {"version":3,"file":"pwa.d.ts","sourceRoot":"","sources":["../../src/daemon/pwa.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6BzD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,g2DAiE/B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,OAAO,qSAGb,CAAC;AAER;;;;;;;GAOG;AAIH,eAAO,MAAM,aAAa,QAA6B,CAAC;AAGxD,eAAO,MAAM,aAAa,QAA6B,CAAC;AAsJxD;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,CAGlD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExD"}
@@ -45,6 +45,7 @@ export function generateManifest(basePath) {
45
45
  *
46
46
  * Minimal implementation for PWA installability.
47
47
  * Uses network-first strategy since terminal requires online connectivity.
48
+ * Also handles push notifications.
48
49
  */
49
50
  export const serviceWorkerScript = `// ttyd-mux Service Worker
50
51
  self.addEventListener('install', (event) => {
@@ -61,6 +62,56 @@ self.addEventListener('fetch', (event) => {
61
62
  // Network-first strategy - terminal requires online connectivity
62
63
  event.respondWith(fetch(event.request));
63
64
  });
65
+
66
+ // Push notification handler
67
+ self.addEventListener('push', (event) => {
68
+ if (!event.data) return;
69
+
70
+ try {
71
+ const data = event.data.json();
72
+ const options = {
73
+ body: data.body || 'Terminal notification',
74
+ icon: '/ttyd-mux/icon-192.png',
75
+ badge: '/ttyd-mux/icon-192.png',
76
+ tag: data.tag || 'ttyd-mux-notification',
77
+ requireInteraction: true,
78
+ data: {
79
+ sessionName: data.sessionName,
80
+ timestamp: data.timestamp,
81
+ url: data.sessionName ? '/ttyd-mux/' + data.sessionName : '/ttyd-mux/'
82
+ }
83
+ };
84
+
85
+ event.waitUntil(
86
+ self.registration.showNotification(data.title || 'ttyd-mux', options)
87
+ );
88
+ } catch (e) {
89
+ console.error('[SW] Push notification error:', e);
90
+ }
91
+ });
92
+
93
+ // Notification click handler
94
+ self.addEventListener('notificationclick', (event) => {
95
+ event.notification.close();
96
+
97
+ const url = event.notification.data?.url || '/ttyd-mux/';
98
+
99
+ event.waitUntil(
100
+ clients.matchAll({ type: 'window', includeUncontrolled: true })
101
+ .then((clientList) => {
102
+ // Try to focus existing window
103
+ for (const client of clientList) {
104
+ if (client.url.includes('/ttyd-mux/') && 'focus' in client) {
105
+ return client.focus();
106
+ }
107
+ }
108
+ // Open new window if none exists
109
+ if (clients.openWindow) {
110
+ return clients.openWindow(url);
111
+ }
112
+ })
113
+ );
114
+ });
64
115
  `;
65
116
  /**
66
117
  * SVG icon for ttyd-mux
@@ -1 +1 @@
1
- {"version":3,"file":"pwa.js","sourceRoot":"","sources":["../../src/daemon/pwa.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pwa.js","sourceRoot":"","sources":["../../src/daemon/pwa.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,15 @@
1
1
  import type { IncomingMessage, ServerResponse } from 'node:http';
2
2
  import type { Config, SessionState } from '../config/types.js';
3
+ /**
4
+ * Generate ETag from content using MD5 hash
5
+ * @param content - Content to hash
6
+ * @returns ETag string with quotes (e.g., '"abc123..."')
7
+ */
8
+ export declare function generateEtag(content: string): string;
9
+ /**
10
+ * Reset toolbar.js cache (for testing)
11
+ */
12
+ export declare function resetToolbarCache(): void;
3
13
  /**
4
14
  * Set security headers on response
5
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/daemon/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAW9D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAK5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAYpF;AA+ED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAgE7F"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/daemon/router.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAKjE,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAiB9D;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AAeD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAK5D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAYpF;AAyHD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CA4G7F"}
@@ -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 { getToolbarJs } from './toolbar/index.js';
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
- * Serve toolbar JavaScript
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(config, res) {
96
- const script = getToolbarJs(config.toolbar);
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(script),
100
- 'Cache-Control': 'public, max-age=3600'
170
+ 'Content-Length': Buffer.byteLength(content),
171
+ ETag: etag,
172
+ 'Cache-Control': 'public, max-age=0, must-revalidate'
101
173
  });
102
- res.end(script);
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(config, res);
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":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAEnC;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAmB;IACpD,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;IACnD,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;IAC/C,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;IACnD,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,iCAAiC,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,IAAY;IAC7D,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAErD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,eAAe,GAAG,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,eAAe,GAAG,CAAC,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YACvE,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,MAAc,EAAE,GAAmB;IACtD,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAClD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,0BAA0B;QAC1C,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;KAC1C,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAmB,EAAE,QAAgB;IAC7D,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACvC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,2BAA2B;QAC3C,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;KAC1C,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,GAAmB;IAChD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,wBAAwB;QACxC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;QAC3C,wBAAwB,EAAE,GAAG;KAC9B,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,GAAmB;IAC1C,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,eAAe;QAC/B,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QACxC,eAAe,EAAE,uBAAuB;KACzC,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,GAAmB,EAAE,IAAe;IAC3D,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,WAAW;QAC3B,gBAAgB,EAAE,GAAG,CAAC,MAAM;QAC5B,eAAe,EAAE,uBAAuB;KACzC,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,MAAc,EAAE,GAAmB;IACzD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,wBAAwB;QACxC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;QAC3C,eAAe,EAAE,sBAAsB;KACxC,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,GAAoB,EAAE,GAAmB;IACrF,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;IAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;IACnC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAErD,0CAA0C;IAC1C,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAExB,GAAG,CAAC,KAAK,CAAC,YAAY,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;IAEvC,aAAa;IACb,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE,CAAC;QACvC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IAED,aAAa;IACb,IAAI,GAAG,KAAK,GAAG,QAAQ,gBAAgB,EAAE,CAAC;QACxC,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,GAAG,QAAQ,QAAQ,EAAE,CAAC;QAChC,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,GAAG,QAAQ,WAAW,EAAE,CAAC;QACnC,eAAe,CAAC,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,GAAG,QAAQ,eAAe,EAAE,CAAC;QACvC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,GAAG,QAAQ,eAAe,EAAE,CAAC;QACvC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,qBAAqB;IACrB,IAAI,GAAG,KAAK,GAAG,QAAQ,aAAa,EAAE,CAAC;QACrC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,cAAc;IACd,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,GAAG,QAAQ,GAAG,EAAE,CAAC;QAC/C,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACjC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChD,IAAI,OAAO,EAAE,CAAC;QACZ,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,YAAY;IACZ,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;IAC/B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;IACrD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACvB,CAAC"}
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"}