dsh-multi-chat 0.6.8 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +88 -30
  2. package/README.zh.md +54 -30
  3. package/bin/dsh-multi-chat.mjs +5 -9
  4. package/lib/client.js +778 -0
  5. package/lib/client.js.map +1 -0
  6. package/{plugin/dsh-client-ui-multi-wall/lib → lib}/index.js +58 -70
  7. package/lib/tsconfig.tsbuildinfo +1 -0
  8. package/lib/types/client/WallToggle.d.ts.map +1 -0
  9. package/lib/types/client/WallToggle.js +36 -0
  10. package/lib/types/client/WallToggle.js.map +1 -0
  11. package/lib/types/client/WallView.d.ts.map +1 -0
  12. package/lib/types/client/WallView.js +218 -0
  13. package/lib/types/client/WallView.js.map +1 -0
  14. package/lib/types/client/index.d.ts.map +1 -0
  15. package/lib/types/client/index.js +59 -0
  16. package/lib/types/client/index.js.map +1 -0
  17. package/lib/types/client/locales.d.ts.map +1 -0
  18. package/lib/types/client/locales.js +96 -0
  19. package/lib/types/client/locales.js.map +1 -0
  20. package/lib/types/client/store.d.ts.map +1 -0
  21. package/lib/types/client/store.js +27 -0
  22. package/lib/types/client/store.js.map +1 -0
  23. package/lib/types/client/wall-injected.d.ts.map +1 -0
  24. package/lib/types/client/wall-injected.js +76 -0
  25. package/lib/types/client/wall-injected.js.map +1 -0
  26. package/lib/types/gateway.d.ts +57 -0
  27. package/lib/types/gateway.d.ts.map +1 -0
  28. package/lib/types/gateway.js +566 -0
  29. package/lib/types/gateway.js.map +1 -0
  30. package/{plugin/dsh-client-ui-multi-wall/lib → lib}/types/index.d.ts +80 -80
  31. package/lib/types/index.d.ts.map +1 -0
  32. package/lib/types/index.js +550 -0
  33. package/lib/types/index.js.map +1 -0
  34. package/{plugin/dsh-client-ui-multi-wall/lib → lib}/types/invariant.d.ts +3 -4
  35. package/lib/types/invariant.d.ts.map +1 -0
  36. package/lib/types/invariant.js +25 -0
  37. package/lib/types/invariant.js.map +1 -0
  38. package/package.json +49 -17
  39. package/patches/multi-wall.yml +1 -1
  40. package/scripts/install-plugin.ps1 +6 -9
  41. package/scripts/start-multi.ps1 +1 -1
  42. package/scripts/sync-vitest-paths.mjs +63 -0
  43. package/src/client/WallToggle.module.css +26 -0
  44. package/src/client/WallToggle.tsx +52 -0
  45. package/src/client/WallView.module.css +190 -0
  46. package/src/client/WallView.tsx +406 -0
  47. package/src/client/index.ts +103 -0
  48. package/src/client/locales.ts +100 -0
  49. package/src/client/store.ts +40 -0
  50. package/src/client/wall-injected.ts +123 -0
  51. package/src/css-modules.d.ts +5 -0
  52. package/src/gateway.ts +627 -0
  53. package/src/index.ts +618 -0
  54. package/src/invariant.ts +33 -0
  55. package/plugin/dsh-client-ui-multi-wall/README.md +0 -26
  56. package/plugin/dsh-client-ui-multi-wall/README.zh.md +0 -26
  57. package/plugin/dsh-client-ui-multi-wall/cordis.patch.yml +0 -7
  58. package/plugin/dsh-client-ui-multi-wall/lib/client.js +0 -781
  59. package/plugin/dsh-client-ui-multi-wall/lib/invariant.js +0 -27
  60. package/plugin/dsh-client-ui-multi-wall/package.json +0 -88
  61. /package/{plugin/dsh-client-ui-multi-wall/lib → lib}/types/client/WallToggle.d.ts +0 -0
  62. /package/{plugin/dsh-client-ui-multi-wall/lib → lib}/types/client/WallView.d.ts +0 -0
  63. /package/{plugin/dsh-client-ui-multi-wall/lib → lib}/types/client/index.d.ts +0 -0
  64. /package/{plugin/dsh-client-ui-multi-wall/lib → lib}/types/client/locales.d.ts +0 -0
  65. /package/{plugin/dsh-client-ui-multi-wall/lib → lib}/types/client/store.d.ts +0 -0
  66. /package/{plugin/dsh-client-ui-multi-wall/lib → lib}/types/client/wall-injected.d.ts +0 -0
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Injected probe face for the wall view: same-origin fetches to the node
3
+ * half's /multi/api routes. Callbacks only — components never see ctx.
4
+ */
5
+
6
+ /** One liveness row from /multi/api/status. */
7
+ export interface ProbeRow {
8
+ port: number
9
+ alive: boolean
10
+ status: number
11
+ }
12
+
13
+ /** One stop result row from /multi/api/stop. */
14
+ export interface StopRow {
15
+ port: number
16
+ ok: boolean
17
+ error?: string
18
+ }
19
+
20
+ /** One create result row from /multi/api/create. */
21
+ export interface CreateRow {
22
+ ok: boolean
23
+ port?: number
24
+ error?: string
25
+ }
26
+
27
+ /** The phone-reachable link info from /multi/api/link. */
28
+ export interface LinkRow {
29
+ port: number
30
+ host: string
31
+ /** LAN URLs (`http://<lan-ip>:<gateway-port>/`), possibly empty. */
32
+ lan: string[]
33
+ /** Whether the instance is reachable off-loopback (gateway running). */
34
+ reachable: boolean
35
+ /** The inline gateway's listen port (when started). */
36
+ gatewayPort?: number
37
+ /** The login token (generated or configured). */
38
+ token?: string
39
+ /** Human hint when not reachable. */
40
+ hint?: string
41
+ }
42
+
43
+ /** The inject face delivered to the wall view registration. */
44
+ export interface WallInjected {
45
+ /** Discover live DSH instances (same-origin /multi/api/ports). */
46
+ discover: () => Promise<number[]>
47
+ /** Probe liveness of specific ports (same-origin /multi/api/status). */
48
+ probe: (ports: number[]) => Promise<ProbeRow[]>
49
+ /** Terminate the DSH instance on one port (same-origin /multi/api/stop). */
50
+ stop: (port: number) => Promise<StopRow>
51
+ /** Start a new DSH instance and return its port (same-origin /multi/api/create). */
52
+ create: () => Promise<CreateRow>
53
+ /** The phone-reachable link for this instance (same-origin /multi/api/link). */
54
+ link: () => Promise<LinkRow>
55
+ }
56
+
57
+ /**
58
+ * Build the probe face bound to this origin's /multi/api routes.
59
+ * @param mount - the API base path ('' at the root, '/multi' when mounted).
60
+ * @returns the injected callbacks.
61
+ */
62
+ export function createWallInjected(mount = ''): WallInjected {
63
+ const base = mount.replace(/\/+$/, '')
64
+ return {
65
+ discover: async () => {
66
+ const res = await fetch(`${base}/multi/api/ports`)
67
+ if (!res.ok) return []
68
+ const data = (await res.json()) as { ports?: { port: number; alive: boolean }[] }
69
+ return (data.ports ?? []).filter(p => p.alive).map(p => p.port)
70
+ },
71
+ probe: async (ports: number[]) => {
72
+ const res = await fetch(`${base}/multi/api/status?ports=${ports.join(',')}`)
73
+ if (!res.ok) return []
74
+ const data = (await res.json()) as { ports?: ProbeRow[] }
75
+ return data.ports ?? []
76
+ },
77
+ stop: async (port: number) => {
78
+ const res = await fetch(`${base}/multi/api/stop?port=${port}`, { method: 'POST' })
79
+ if (!res.ok) return { port, ok: false, error: `HTTP ${res.status}` }
80
+ const data = (await res.json()) as { ports?: StopRow[] }
81
+ return data.ports?.[0] ?? { port, ok: false, error: 'no result' }
82
+ },
83
+ create: async () => {
84
+ // Harden the failure surface: a non-2xx answer, an HTML fallback page
85
+ // (route missing) or a truncated body must never degrade into the bare
86
+ // "unknown" the UI shows for a missing error field.
87
+ const res = await fetch(`${base}/multi/api/create`, { method: 'POST' })
88
+ if (!res.ok) {
89
+ return { ok: false, error: `HTTP ${res.status}` }
90
+ }
91
+ const text = await res.text()
92
+ let data: Partial<CreateRow>
93
+ try {
94
+ data = JSON.parse(text) as Partial<CreateRow>
95
+ } catch {
96
+ const snippet = text.trim().slice(0, 120)
97
+ return { ok: false, error: `invalid response: ${snippet === '' ? '<empty body>' : snippet}` }
98
+ }
99
+ if (data.ok === true) {
100
+ return data.port !== undefined
101
+ ? { ok: true, port: data.port }
102
+ : { ok: false, error: 'no port in response' }
103
+ }
104
+ return {
105
+ ok: false,
106
+ ...(typeof data.error === 'string' ? { error: data.error } : { error: 'server returned no reason' }),
107
+ }
108
+ },
109
+ link: async () => {
110
+ const res = await fetch(`${base}/multi/api/link`)
111
+ const data = (await res.json().catch(() => ({}))) as Partial<LinkRow>
112
+ return {
113
+ port: data.port ?? 0,
114
+ host: data.host ?? 'unknown',
115
+ lan: data.lan ?? [],
116
+ reachable: data.reachable === true,
117
+ ...(typeof data.gatewayPort === 'number' ? { gatewayPort: data.gatewayPort } : {}),
118
+ ...(typeof data.token === 'string' ? { token: data.token } : {}),
119
+ ...(typeof data.hint === 'string' ? { hint: data.hint } : {}),
120
+ }
121
+ },
122
+ }
123
+ }
@@ -0,0 +1,5 @@
1
+ /** CSS Modules ambient declaration (client bundle). */
2
+ declare module '*.module.css' {
3
+ const classes: Record<string, string>
4
+ export default classes
5
+ }