@jingyi0605/codingns 0.9.7 → 0.9.9

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 (202) hide show
  1. package/dist/public/assets/{AdaptiveButlerPage-DclGPzEx.js → AdaptiveButlerPage-CqBM1XiC.js} +2 -2
  2. package/dist/public/assets/{App-CcDXqFl1.css → App-7zrCMhE-.css} +1 -1
  3. package/dist/public/assets/App-Pe30N_Dy.js +30 -0
  4. package/dist/public/assets/{BootstrapPage-Bl21SsuW.js → BootstrapPage-D9ai1XhC.js} +1 -1
  5. package/dist/public/assets/ConversationPage-C8aU99KN.js +9 -0
  6. package/dist/public/assets/{DesktopDetachPreviewPage-uaOHVsjV.js → DesktopDetachPreviewPage-BJVPVFf2.js} +1 -1
  7. package/dist/public/assets/{DesktopModal-BxsogpLf.js → DesktopModal-DyC_e0eF.js} +1 -1
  8. package/dist/public/assets/DesktopWindowPage-BZleww0T.js +2 -0
  9. package/dist/public/assets/FileContextPanel-BklQRQXj.js +1 -0
  10. package/dist/public/assets/GitSidebar-D0tb3W87.js +6 -0
  11. package/dist/public/assets/MobileCreateSessionSheet-BS881Agk.js +1 -0
  12. package/dist/public/assets/{MobileSheet-C5IVmUsO.js → MobileSheet-C32hwIFd.js} +1 -1
  13. package/dist/public/assets/PluginAccessOverview-BDiz6fV8.js +1 -0
  14. package/dist/public/assets/{PluginContainerPage-_2u-9thM.js → PluginContainerPage-BMT6J0YS.js} +1 -1
  15. package/dist/public/assets/{PluginDetailPage-F9cKjSCp.js → PluginDetailPage-ztNhvCWP.js} +1 -1
  16. package/dist/public/assets/{PluginsListPage-BOhcua_4.js → PluginsListPage-Cuk2-U6E.js} +1 -1
  17. package/dist/public/assets/PureConversationPage-ShluI2En.js +1 -0
  18. package/dist/public/assets/{RelayConnectEntryPage-Ck_uZLzj.js → RelayConnectEntryPage-CMbjlD0k.js} +1 -1
  19. package/dist/public/assets/{ServerSettingsModal-ICd82a_x.js → ServerSettingsModal-CLSWyHu6.js} +1 -1
  20. package/dist/public/assets/SessionIndexPage-dqfauVAj.js +1 -0
  21. package/dist/public/assets/SettingsPage-PUga-wwJ.js +2 -0
  22. package/dist/public/assets/TerminalManagerPanel-75khWhRz.js +1 -0
  23. package/dist/public/assets/ToolFilesPage-S3eWxO_D.js +1 -0
  24. package/dist/public/assets/ToolGitPage-8RAMpope.js +1 -0
  25. package/dist/public/assets/ToolProcessesPage-TZACKEoH.js +1 -0
  26. package/dist/public/assets/ToolsHomePage-Whgu6Tyf.js +1 -0
  27. package/dist/public/assets/WorkbenchLandingPage-CC24vHza.js +1 -0
  28. package/dist/public/assets/{WorkbenchLayout-BksVkkFF.css → WorkbenchLayout-BZdfVest.css} +32 -1
  29. package/dist/public/assets/WorkbenchLayout-CoYxMzzR.js +1081 -0
  30. package/dist/public/assets/{WorkbenchModal-CsZeLArg.js → WorkbenchModal-2PaCY_Gj.js} +1 -1
  31. package/dist/public/assets/WorkbenchShellRoute-DLVRpGzb.css +1 -0
  32. package/dist/public/assets/WorkbenchShellRoute-QXztW_Ny.js +1 -0
  33. package/dist/public/assets/WorkspaceDebugDetailPage-Ce_oMmJ8.js +1 -0
  34. package/dist/public/assets/WorkspaceDetailPage-aX6w4Q7S.js +1 -0
  35. package/dist/public/assets/WorkspaceHomePage-DQttgj2w.js +1 -0
  36. package/dist/public/assets/{client-runtime-manager-BgGugw8T.js → client-runtime-manager-CGVLChqs.js} +1 -1
  37. package/dist/public/assets/host-alias-CeDJeL0T.js +1 -0
  38. package/dist/public/assets/index-BehUkul4.css +1 -0
  39. package/dist/public/assets/index-Bp1FnRo_.js +50 -0
  40. package/dist/public/assets/{login-direct-candidate-resolver-ty2uOY5y.js → login-direct-candidate-resolver-Bvs5uPix.js} +1 -1
  41. package/dist/public/assets/peer-host-config-sync-oelf2T0_.js +1 -0
  42. package/dist/public/assets/{plugin-permission-copy-iK3faI3n.js → plugin-permission-copy-Do028HzJ.js} +1 -1
  43. package/dist/public/assets/{plugins-api-CmV7aDGA.js → plugins-api-BOugklJ-.js} +1 -1
  44. package/dist/public/assets/{preferences-service-BoSmT_ny.js → preferences-service-Dys1mbBy.js} +1 -1
  45. package/dist/public/assets/relay-entry-B6UDc5cD.js +1 -0
  46. package/dist/public/assets/useRegisteredDebugTemplates-BafVuBvE.js +1 -0
  47. package/dist/public/assets/workbench-navigation-Bs4OQYD3.js +1 -0
  48. package/dist/public/index.html +2 -2
  49. package/dist/server/middlewares/auth-guard.js +1 -0
  50. package/dist/server/middlewares/auth-guard.js.map +1 -1
  51. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +3 -0
  52. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +9 -0
  53. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
  54. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +3 -0
  55. package/dist/server/modules/assistant-capability/assistant-capability-service.js +4 -1
  56. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  57. package/dist/server/modules/peer-host/host-api-proxy-service.d.ts +9 -0
  58. package/dist/server/modules/peer-host/host-api-proxy-service.js +174 -0
  59. package/dist/server/modules/peer-host/host-api-proxy-service.js.map +1 -0
  60. package/dist/server/modules/peer-host/host-handshake-controller.d.ts +7 -0
  61. package/dist/server/modules/peer-host/host-handshake-controller.js +10 -0
  62. package/dist/server/modules/peer-host/host-handshake-controller.js.map +1 -0
  63. package/dist/server/modules/peer-host/host-handshake.d.ts +15 -0
  64. package/dist/server/modules/peer-host/host-handshake.js +20 -0
  65. package/dist/server/modules/peer-host/host-handshake.js.map +1 -0
  66. package/dist/server/modules/peer-host/host-ws-proxy-service.d.ts +14 -0
  67. package/dist/server/modules/peer-host/host-ws-proxy-service.js +256 -0
  68. package/dist/server/modules/peer-host/host-ws-proxy-service.js.map +1 -0
  69. package/dist/server/modules/peer-host/peer-host-controller.d.ts +55 -0
  70. package/dist/server/modules/peer-host/peer-host-controller.js +62 -0
  71. package/dist/server/modules/peer-host/peer-host-controller.js.map +1 -0
  72. package/dist/server/modules/peer-host/peer-host-service.d.ts +77 -0
  73. package/dist/server/modules/peer-host/peer-host-service.js +529 -0
  74. package/dist/server/modules/peer-host/peer-host-service.js.map +1 -0
  75. package/dist/server/modules/sessions/codex-session-title-generator.js +18 -5
  76. package/dist/server/modules/sessions/codex-session-title-generator.js.map +1 -1
  77. package/dist/server/modules/sessions/session-controller.d.ts +10 -0
  78. package/dist/server/modules/sessions/session-controller.js +11 -0
  79. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  80. package/dist/server/modules/sessions/session-history-service.d.ts +54 -2
  81. package/dist/server/modules/sessions/session-history-service.js +407 -63
  82. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  83. package/dist/server/modules/sessions/session-live-runtime-service.d.ts +6 -0
  84. package/dist/server/modules/sessions/session-live-runtime-service.js +181 -80
  85. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  86. package/dist/server/modules/sessions/session-title-utils.d.ts +3 -0
  87. package/dist/server/modules/sessions/session-title-utils.js +25 -0
  88. package/dist/server/modules/sessions/session-title-utils.js.map +1 -0
  89. package/dist/server/modules/sessions/workspace-office-mcp-config.d.ts +2 -1
  90. package/dist/server/modules/sessions/workspace-office-mcp-config.js +44 -3
  91. package/dist/server/modules/sessions/workspace-office-mcp-config.js.map +1 -1
  92. package/dist/server/modules/tasks/observability-controller.d.ts +2 -0
  93. package/dist/server/modules/tasks/observability-controller.js +16 -1
  94. package/dist/server/modules/tasks/observability-controller.js.map +1 -1
  95. package/dist/server/modules/tasks/observability-service.d.ts +12 -2
  96. package/dist/server/modules/tasks/observability-service.js +16 -3
  97. package/dist/server/modules/tasks/observability-service.js.map +1 -1
  98. package/dist/server/modules/tasks/task-manager.d.ts +2 -1
  99. package/dist/server/modules/tasks/task-manager.js +3 -0
  100. package/dist/server/modules/tasks/task-manager.js.map +1 -1
  101. package/dist/server/modules/tasks/task-scheduler.d.ts +2 -1
  102. package/dist/server/modules/tasks/task-scheduler.js +21 -0
  103. package/dist/server/modules/tasks/task-scheduler.js.map +1 -1
  104. package/dist/server/modules/tasks/task-types.d.ts +5 -0
  105. package/dist/server/modules/tasks/task-types.js.map +1 -1
  106. package/dist/server/modules/workbench/workbench-controller.js +3 -2
  107. package/dist/server/modules/workbench/workbench-controller.js.map +1 -1
  108. package/dist/server/modules/workbench/workbench-service.d.ts +2 -0
  109. package/dist/server/modules/workbench/workbench-service.js +162 -19
  110. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  111. package/dist/server/modules/workspace/affairs-library-controller.d.ts +1 -0
  112. package/dist/server/modules/workspace/affairs-library-controller.js +3 -0
  113. package/dist/server/modules/workspace/affairs-library-controller.js.map +1 -1
  114. package/dist/server/modules/workspace/affairs-library-service.d.ts +5 -0
  115. package/dist/server/modules/workspace/affairs-library-service.js +103 -4
  116. package/dist/server/modules/workspace/affairs-library-service.js.map +1 -1
  117. package/dist/server/modules/workspace/workspace-controller.d.ts +7 -1
  118. package/dist/server/modules/workspace/workspace-controller.js +11 -1
  119. package/dist/server/modules/workspace/workspace-controller.js.map +1 -1
  120. package/dist/server/modules/workspace/workspace-service.d.ts +9 -2
  121. package/dist/server/modules/workspace/workspace-service.js +45 -10
  122. package/dist/server/modules/workspace/workspace-service.js.map +1 -1
  123. package/dist/server/routes/affairs.js +4 -0
  124. package/dist/server/routes/affairs.js.map +1 -1
  125. package/dist/server/routes/peer-hosts.d.ts +3 -0
  126. package/dist/server/routes/peer-hosts.js +18 -0
  127. package/dist/server/routes/peer-hosts.js.map +1 -0
  128. package/dist/server/routes/public.d.ts +2 -1
  129. package/dist/server/routes/public.js +2 -1
  130. package/dist/server/routes/public.js.map +1 -1
  131. package/dist/server/routes/sessions.js +2 -0
  132. package/dist/server/routes/sessions.js.map +1 -1
  133. package/dist/server/server/create-server.d.ts +4 -0
  134. package/dist/server/server/create-server.js +31 -3
  135. package/dist/server/server/create-server.js.map +1 -1
  136. package/dist/server/shared/http/error-handler.js +12 -0
  137. package/dist/server/shared/http/error-handler.js.map +1 -1
  138. package/dist/server/storage/repositories/peer-host-repository.d.ts +44 -0
  139. package/dist/server/storage/repositories/peer-host-repository.js +271 -0
  140. package/dist/server/storage/repositories/peer-host-repository.js.map +1 -0
  141. package/dist/server/storage/repositories/session-discovery-diagnostics-repository.d.ts +10 -0
  142. package/dist/server/storage/repositories/session-discovery-diagnostics-repository.js +68 -0
  143. package/dist/server/storage/repositories/session-discovery-diagnostics-repository.js.map +1 -0
  144. package/dist/server/storage/repositories/session-source-index-repository.d.ts +14 -0
  145. package/dist/server/storage/repositories/session-source-index-repository.js +164 -0
  146. package/dist/server/storage/repositories/session-source-index-repository.js.map +1 -0
  147. package/dist/server/storage/repositories/workspace-navigation-state-repository.js +16 -7
  148. package/dist/server/storage/repositories/workspace-navigation-state-repository.js.map +1 -1
  149. package/dist/server/storage/sqlite/client.js +107 -0
  150. package/dist/server/storage/sqlite/client.js.map +1 -1
  151. package/dist/server/storage/sqlite/schema.sql +121 -0
  152. package/dist/server/types/domain.d.ts +88 -0
  153. package/dist/server/ws/workbench-ws-hub.js +5 -14
  154. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  155. package/dist/server/ws/ws-server.d.ts +2 -1
  156. package/dist/server/ws/ws-server.js +5 -1
  157. package/dist/server/ws/ws-server.js.map +1 -1
  158. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.js +19 -2
  159. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.js.map +1 -1
  160. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +1 -0
  161. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +74 -6
  162. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  163. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +11 -4
  164. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  165. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js +8 -1
  166. package/node_modules/@codingns/session-sync-core/dist/runtime/active-run-registry.js.map +1 -1
  167. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +3 -0
  168. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +144 -27
  169. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  170. package/package.json +1 -1
  171. package/dist/public/assets/App-BxX5mm9o.js +0 -30
  172. package/dist/public/assets/ConversationPage-CmiVCV0q.js +0 -9
  173. package/dist/public/assets/DesktopWindowPage-Bubfw1nC.js +0 -2
  174. package/dist/public/assets/FileContextPanel-DrYWcTkp.js +0 -1
  175. package/dist/public/assets/GitSidebar-CQsfJqun.js +0 -6
  176. package/dist/public/assets/MobileCreateSessionSheet-CqtmfVNo.js +0 -1
  177. package/dist/public/assets/MobileTopHeaderFrame-EoBm3-X0.js +0 -1
  178. package/dist/public/assets/MobileWorkspaceSwitcherHeader-BC8MMQs_.js +0 -1
  179. package/dist/public/assets/PluginAccessOverview-CrQiQxxZ.js +0 -1
  180. package/dist/public/assets/SessionIndexPage-Cox6P6dw.js +0 -1
  181. package/dist/public/assets/SettingsPage-BI5cM3j5.js +0 -2
  182. package/dist/public/assets/TerminalManagerPanel-DiVhBQhf.js +0 -1
  183. package/dist/public/assets/TerminalPage-6GBZ9nXN.css +0 -32
  184. package/dist/public/assets/TerminalPage-DUMUO7Ng.js +0 -55
  185. package/dist/public/assets/TerminalRuntimeFallbackModal-DGPR_CMh.js +0 -1
  186. package/dist/public/assets/ToolFilesPage-m88CAp-r.js +0 -1
  187. package/dist/public/assets/ToolGitPage-DCYpfTsb.js +0 -1
  188. package/dist/public/assets/ToolProcessesPage-Bk5ulsyq.js +0 -1
  189. package/dist/public/assets/ToolsHomePage-BrTwfjI7.js +0 -1
  190. package/dist/public/assets/WorkbenchLandingPage-q4AAmdMV.js +0 -1
  191. package/dist/public/assets/WorkbenchLayout-DD8b-m2G.js +0 -1027
  192. package/dist/public/assets/WorkbenchShellRoute-BaiW_vfb.js +0 -1
  193. package/dist/public/assets/WorkbenchShellRoute-CxKYZ6uF.css +0 -1
  194. package/dist/public/assets/WorkspaceDebugDetailPage-BcUUDEyw.js +0 -1
  195. package/dist/public/assets/WorkspaceDetailPage-zEZ1VARA.js +0 -1
  196. package/dist/public/assets/WorkspaceHomePage-CR0rqS4e.js +0 -1
  197. package/dist/public/assets/index-CFyk1rgJ.js +0 -50
  198. package/dist/public/assets/index-CrU73EIV.css +0 -1
  199. package/dist/public/assets/relay-entry-C8k5qsl5.js +0 -1
  200. package/dist/public/assets/terminal-runtime-meta-okQIDzfA.js +0 -1
  201. package/dist/public/assets/useRegisteredDebugTemplates-B_vXUtSe.js +0 -1
  202. package/dist/public/assets/workbench-navigation-DoDaQR4z.js +0 -1
@@ -0,0 +1,256 @@
1
+ import WebSocket, { WebSocketServer } from "ws";
2
+ import { AppError } from "../../shared/errors/app-error.js";
3
+ const PROXY_WS_PATH_PATTERN = /^\/api\/host-proxy\/hosts\/([^/]+)\/ws$/;
4
+ const ALLOWED_CLIENT_MESSAGE_TYPES = new Set([
5
+ "workbench.subscribe",
6
+ "workbench.refresh",
7
+ "fileTree.subscribe",
8
+ "fileTree.refresh",
9
+ "git.subscribe",
10
+ "git.refresh",
11
+ "workspaceManagement.subscribe",
12
+ "workspaceManagement.refresh",
13
+ "terminalManager.subscribe",
14
+ "terminalManager.refresh",
15
+ "terminal.subscribe",
16
+ "terminal.input",
17
+ "terminal.resize",
18
+ "session.subscribe",
19
+ "session.load_older",
20
+ ]);
21
+ const ALLOWED_REMOTE_MESSAGE_TYPES = new Set([
22
+ "system.connected",
23
+ "workbench.snapshot",
24
+ "workbench.delta",
25
+ "fileTree.snapshot",
26
+ "git.snapshot",
27
+ "workspaceManagement.snapshot",
28
+ "terminalManager.snapshot",
29
+ "terminal.subscribed",
30
+ "terminal.backfill",
31
+ "terminal.output",
32
+ "terminal.status",
33
+ "terminal.exit",
34
+ "terminal.error",
35
+ "terminal.input.accepted",
36
+ "terminal.resize.accepted",
37
+ "session.subscribed",
38
+ "session.backfill",
39
+ "session.delta",
40
+ "session.history_older",
41
+ "session.runtime_message",
42
+ "session.runtime_status",
43
+ "session.activity",
44
+ "session.runtime_error",
45
+ "session.interrupted",
46
+ "session.permission_request",
47
+ "session.permission_request_resolved",
48
+ "session.error",
49
+ ]);
50
+ export class HostWsProxyService {
51
+ wsAuthGuard;
52
+ peerHostService;
53
+ clientWss = new WebSocketServer({ noServer: true });
54
+ constructor(wsAuthGuard, peerHostService) {
55
+ this.wsAuthGuard = wsAuthGuard;
56
+ this.peerHostService = peerHostService;
57
+ }
58
+ canHandleUpgrade(request) {
59
+ return Boolean(parseProxyWsRequest(request));
60
+ }
61
+ handleUpgrade(request, socket, head) {
62
+ const parsed = parseProxyWsRequest(request);
63
+ if (!parsed) {
64
+ return false;
65
+ }
66
+ void this.openProxy(request, socket, head, parsed.peerHostId);
67
+ return true;
68
+ }
69
+ async openProxy(request, socket, head, peerHostId) {
70
+ let authContext;
71
+ let remoteSocket = null;
72
+ try {
73
+ authContext = this.wsAuthGuard.authenticate(request);
74
+ const peerHost = this.peerHostService.ensureProxyReady(authContext.user.userId, peerHostId);
75
+ const accessToken = await this.peerHostService.getAccessTokenForProxy(authContext.user.userId, peerHost);
76
+ remoteSocket = await connectRemoteWorkbenchSocket(peerHost.baseUrl, accessToken);
77
+ }
78
+ catch (error) {
79
+ writeUpgradeError(socket, error);
80
+ return;
81
+ }
82
+ this.clientWss.handleUpgrade(request, socket, head, (client) => {
83
+ this.bindSockets(client, remoteSocket, peerHostId, authContext);
84
+ this.clientWss.emit("connection", client, request);
85
+ });
86
+ }
87
+ bindSockets(client, remoteSocket, peerHostId, authContext) {
88
+ let closed = false;
89
+ const closeBoth = (code, reason) => {
90
+ if (closed) {
91
+ return;
92
+ }
93
+ closed = true;
94
+ if (remoteSocket.readyState === WebSocket.OPEN || remoteSocket.readyState === WebSocket.CONNECTING) {
95
+ remoteSocket.close(code, reason);
96
+ }
97
+ if (client.readyState === WebSocket.OPEN || client.readyState === WebSocket.CONNECTING) {
98
+ client.close(code, reason);
99
+ }
100
+ };
101
+ client.on("message", (data, isBinary) => {
102
+ if (isBinary) {
103
+ sendWsError(client, "HOST_PROXY_WS_BINARY_NOT_ALLOWED", "Peer HOST 代理不支持二进制 WebSocket 消息");
104
+ return;
105
+ }
106
+ const raw = data.toString("utf8");
107
+ const messageType = readMessageType(raw);
108
+ if (!messageType || !ALLOWED_CLIENT_MESSAGE_TYPES.has(messageType)) {
109
+ sendWsError(client, "HOST_PROXY_WS_MESSAGE_NOT_ALLOWED", "这个 WebSocket 消息没有加入 Peer HOST 代理白名单");
110
+ return;
111
+ }
112
+ if (remoteSocket.readyState !== WebSocket.OPEN) {
113
+ sendWsError(client, "HOST_PROXY_WS_UPSTREAM_CLOSED", "目标 HOST 实时连接已经断开");
114
+ return;
115
+ }
116
+ remoteSocket.send(raw);
117
+ });
118
+ remoteSocket.on("message", (data, isBinary) => {
119
+ if (isBinary) {
120
+ return;
121
+ }
122
+ const raw = data.toString("utf8");
123
+ const messageType = readMessageType(raw);
124
+ if (!messageType || !ALLOWED_REMOTE_MESSAGE_TYPES.has(messageType)) {
125
+ return;
126
+ }
127
+ if (client.readyState === WebSocket.OPEN) {
128
+ client.send(raw);
129
+ }
130
+ });
131
+ remoteSocket.on("close", (code, reason) => {
132
+ if (code === 1008 || code === 4001 || code === 4401) {
133
+ this.peerHostService.clearSession(authContext.user.userId, peerHostId);
134
+ }
135
+ closeBoth(code, reason.length > 0 ? reason.toString("utf8") : undefined);
136
+ });
137
+ remoteSocket.on("error", () => {
138
+ sendWsError(client, "HOST_PROXY_WS_UPSTREAM_FAILED", "目标 HOST 实时连接失败");
139
+ closeBoth(1011, "upstream failed");
140
+ });
141
+ client.on("close", () => closeBoth());
142
+ client.on("error", () => closeBoth(1011, "client failed"));
143
+ }
144
+ }
145
+ function parseProxyWsRequest(request) {
146
+ const pathname = new URL(request.url ?? "/", "http://127.0.0.1").pathname;
147
+ const match = PROXY_WS_PATH_PATTERN.exec(pathname);
148
+ if (!match?.[1]) {
149
+ return null;
150
+ }
151
+ return { peerHostId: decodeURIComponent(match[1]) };
152
+ }
153
+ function buildRemoteWsUrl(baseUrl, accessToken) {
154
+ const url = new URL("/ws", baseUrl);
155
+ url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
156
+ url.searchParams.set("access_token", accessToken);
157
+ return url.toString();
158
+ }
159
+ function connectRemoteWorkbenchSocket(baseUrl, accessToken) {
160
+ const remoteSocket = new WebSocket(buildRemoteWsUrl(baseUrl, accessToken));
161
+ return new Promise((resolve, reject) => {
162
+ const timer = setTimeout(() => {
163
+ cleanup();
164
+ remoteSocket.terminate();
165
+ reject(new AppError({
166
+ statusCode: 504,
167
+ errorCode: "HOST_PROXY_WS_CONNECT_TIMEOUT",
168
+ detail: "连接目标 HOST 实时通道超时",
169
+ }));
170
+ }, 5_000);
171
+ const cleanup = () => {
172
+ clearTimeout(timer);
173
+ remoteSocket.off("open", handleOpen);
174
+ remoteSocket.off("error", handleError);
175
+ remoteSocket.off("close", handleClose);
176
+ };
177
+ const handleOpen = () => {
178
+ cleanup();
179
+ resolve(remoteSocket);
180
+ };
181
+ const handleError = (error) => {
182
+ cleanup();
183
+ reject(new AppError({
184
+ statusCode: 502,
185
+ errorCode: "HOST_PROXY_WS_UPSTREAM_FAILED",
186
+ detail: error.message || "目标 HOST 实时通道连接失败",
187
+ }));
188
+ };
189
+ const handleClose = () => {
190
+ cleanup();
191
+ reject(new AppError({
192
+ statusCode: 502,
193
+ errorCode: "HOST_PROXY_WS_UPSTREAM_CLOSED",
194
+ detail: "目标 HOST 实时通道已关闭",
195
+ }));
196
+ };
197
+ remoteSocket.once("open", handleOpen);
198
+ remoteSocket.once("error", handleError);
199
+ remoteSocket.once("close", handleClose);
200
+ });
201
+ }
202
+ function readMessageType(raw) {
203
+ try {
204
+ const parsed = JSON.parse(raw);
205
+ return typeof parsed.type === "string" ? parsed.type : null;
206
+ }
207
+ catch {
208
+ return null;
209
+ }
210
+ }
211
+ function sendWsError(client, errorCode, detail) {
212
+ if (client.readyState !== WebSocket.OPEN) {
213
+ return;
214
+ }
215
+ client.send(JSON.stringify({
216
+ type: "session.error",
217
+ sessionId: null,
218
+ error_code: errorCode,
219
+ detail,
220
+ timestamp: new Date().toISOString(),
221
+ }));
222
+ }
223
+ function writeUpgradeError(socket, error) {
224
+ const appError = error instanceof AppError
225
+ ? error
226
+ : new AppError({
227
+ statusCode: 500,
228
+ errorCode: "HOST_PROXY_WS_FAILED",
229
+ detail: error instanceof Error ? error.message : "Peer HOST 实时代理失败",
230
+ });
231
+ const statusCode = appError.statusCode === 401
232
+ ? 401
233
+ : appError.statusCode === 403
234
+ ? 403
235
+ : appError.statusCode === 409
236
+ ? 409
237
+ : 502;
238
+ socket.write(`HTTP/1.1 ${statusCode} ${statusText(statusCode)}\r\nConnection: close\r\nContent-Type: application/json\r\n\r\n${JSON.stringify({
239
+ detail: appError.message,
240
+ error_code: appError.errorCode,
241
+ })}`);
242
+ socket.destroy();
243
+ }
244
+ function statusText(statusCode) {
245
+ switch (statusCode) {
246
+ case 401:
247
+ return "Unauthorized";
248
+ case 403:
249
+ return "Forbidden";
250
+ case 409:
251
+ return "Conflict";
252
+ default:
253
+ return "Bad Gateway";
254
+ }
255
+ }
256
+ //# sourceMappingURL=host-ws-proxy-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-ws-proxy-service.js","sourceRoot":"","sources":["../../../../src/modules/peer-host/host-ws-proxy-service.ts"],"names":[],"mappings":"AAGA,OAAO,SAAS,EAAE,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAK5D,MAAM,qBAAqB,GAAG,yCAAyC,CAAC;AAExE,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAAC;IAC3C,qBAAqB;IACrB,mBAAmB;IACnB,oBAAoB;IACpB,kBAAkB;IAClB,eAAe;IACf,aAAa;IACb,+BAA+B;IAC/B,6BAA6B;IAC7B,2BAA2B;IAC3B,yBAAyB;IACzB,oBAAoB;IACpB,gBAAgB;IAChB,iBAAiB;IACjB,mBAAmB;IACnB,oBAAoB;CACrB,CAAC,CAAC;AAEH,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAAC;IAC3C,kBAAkB;IAClB,oBAAoB;IACpB,iBAAiB;IACjB,mBAAmB;IACnB,cAAc;IACd,8BAA8B;IAC9B,0BAA0B;IAC1B,qBAAqB;IACrB,mBAAmB;IACnB,iBAAiB;IACjB,iBAAiB;IACjB,eAAe;IACf,gBAAgB;IAChB,yBAAyB;IACzB,0BAA0B;IAC1B,oBAAoB;IACpB,kBAAkB;IAClB,eAAe;IACf,uBAAuB;IACvB,yBAAyB;IACzB,wBAAwB;IACxB,kBAAkB;IAClB,uBAAuB;IACvB,qBAAqB;IACrB,4BAA4B;IAC5B,qCAAqC;IACrC,eAAe;CAChB,CAAC,CAAC;AAEH,MAAM,OAAO,kBAAkB;IAIV;IACA;IAJF,SAAS,GAAG,IAAI,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAErE,YACmB,WAAwB,EACxB,eAAgC;QADhC,gBAAW,GAAX,WAAW,CAAa;QACxB,oBAAe,GAAf,eAAe,CAAiB;IAChD,CAAC;IAEJ,gBAAgB,CAAC,OAAwB;QACvC,OAAO,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,aAAa,CACX,OAAwB,EACxB,MAAc,EACd,IAAY;QAEZ,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAE5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC;QACf,CAAC;QAED,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,SAAS,CACrB,OAAwB,EACxB,MAAc,EACd,IAAY,EACZ,UAAkB;QAElB,IAAI,WAAwB,CAAC;QAC7B,IAAI,YAAY,GAAqB,IAAI,CAAC;QAE1C,IAAI,CAAC;YACH,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,CACpD,WAAW,CAAC,IAAI,CAAC,MAAM,EACvB,UAAU,CACX,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,sBAAsB,CACnE,WAAW,CAAC,IAAI,CAAC,MAAM,EACvB,QAAQ,CACT,CAAC;YACF,YAAY,GAAG,MAAM,4BAA4B,CAC/C,QAAQ,CAAC,OAAO,EAChB,WAAW,CACZ,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YAC7D,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;YAChE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,WAAW,CACjB,MAAiB,EACjB,YAAuB,EACvB,UAAkB,EAClB,WAAwB;QAExB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,MAAM,SAAS,GAAG,CAAC,IAAa,EAAE,MAAe,EAAE,EAAE;YACnD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YAED,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;gBACnG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACnC,CAAC;YACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;gBACvF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;YACtC,IAAI,QAAQ,EAAE,CAAC;gBACb,WAAW,CAAC,MAAM,EAAE,kCAAkC,EAAE,iCAAiC,CAAC,CAAC;gBAC3F,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;YAEzC,IAAI,CAAC,WAAW,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gBACnE,WAAW,CAAC,MAAM,EAAE,mCAAmC,EAAE,qCAAqC,CAAC,CAAC;gBAChG,OAAO;YACT,CAAC;YAED,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC/C,WAAW,CAAC,MAAM,EAAE,+BAA+B,EAAE,kBAAkB,CAAC,CAAC;gBACzE,OAAO;YACT,CAAC;YAED,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC5C,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;YAEzC,IAAI,CAAC,WAAW,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gBACnE,OAAO;YACT,CAAC;YAED,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACzC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACxC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACpD,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACzE,CAAC;YAED,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QACH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC5B,WAAW,CAAC,MAAM,EAAE,+BAA+B,EAAE,gBAAgB,CAAC,CAAC;YACvE,SAAS,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;IAC7D,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,OAAwB;IACnD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;IAC1E,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEnD,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,WAAmB;IAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpC,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAClD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,4BAA4B,CACnC,OAAe,EACf,WAAmB;IAEnB,MAAM,YAAY,GAAG,IAAI,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IAE3E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,OAAO,EAAE,CAAC;YACV,YAAY,CAAC,SAAS,EAAE,CAAC;YACzB,MAAM,CACJ,IAAI,QAAQ,CAAC;gBACX,UAAU,EAAE,GAAG;gBACf,SAAS,EAAE,+BAA+B;gBAC1C,MAAM,EAAE,kBAAkB;aAC3B,CAAC,CACH,CAAC;QACJ,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACrC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACvC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACzC,CAAC,CAAC;QACF,MAAM,UAAU,GAAG,GAAG,EAAE;YACtB,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,YAAY,CAAC,CAAC;QACxB,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,CAAC,KAAY,EAAE,EAAE;YACnC,OAAO,EAAE,CAAC;YACV,MAAM,CACJ,IAAI,QAAQ,CAAC;gBACX,UAAU,EAAE,GAAG;gBACf,SAAS,EAAE,+BAA+B;gBAC1C,MAAM,EAAE,KAAK,CAAC,OAAO,IAAI,kBAAkB;aAC5C,CAAC,CACH,CAAC;QACJ,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,OAAO,EAAE,CAAC;YACV,MAAM,CACJ,IAAI,QAAQ,CAAC;gBACX,UAAU,EAAE,GAAG;gBACf,SAAS,EAAE,+BAA+B;gBAC1C,MAAM,EAAE,iBAAiB;aAC1B,CAAC,CACH,CAAC;QACJ,CAAC,CAAC;QAEF,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACtC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACxC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;QACrD,OAAO,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAiB,EAAE,SAAiB,EAAE,MAAc;IACvE,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;QACzC,OAAO;IACT,CAAC;IAED,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,SAAS,CAAC;QACb,IAAI,EAAE,eAAe;QACrB,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,SAAS;QACrB,MAAM;QACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc,EAAE,KAAc;IACvD,MAAM,QAAQ,GACZ,KAAK,YAAY,QAAQ;QACvB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,IAAI,QAAQ,CAAC;YACX,UAAU,EAAE,GAAG;YACf,SAAS,EAAE,sBAAsB;YACjC,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB;SACpE,CAAC,CAAC;IACT,MAAM,UAAU,GACd,QAAQ,CAAC,UAAU,KAAK,GAAG;QACzB,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,QAAQ,CAAC,UAAU,KAAK,GAAG;YAC3B,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,QAAQ,CAAC,UAAU,KAAK,GAAG;gBAC3B,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,GAAG,CAAC;IAEd,MAAM,CAAC,KAAK,CACV,YAAY,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,kEAAkE,IAAI,CAAC,SAAS,CAAC;QAC/H,MAAM,EAAE,QAAQ,CAAC,OAAO;QACxB,UAAU,EAAE,QAAQ,CAAC,SAAS;KAC/B,CAAC,EAAE,CACL,CAAC;IACF,MAAM,CAAC,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,UAAkB;IACpC,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,GAAG;YACN,OAAO,cAAc,CAAC;QACxB,KAAK,GAAG;YACN,OAAO,WAAW,CAAC;QACrB,KAAK,GAAG;YACN,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,aAAa,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { FastifyReply, FastifyRequest } from "fastify";
2
+ import type { PeerHostCreateInput, PeerHostLoginInput, PeerHostService, PeerHostUpdateInput, PeerHostWorkspaceBindingUpdateInput } from "./peer-host-service.js";
3
+ import type { HostApiProxyService } from "./host-api-proxy-service.js";
4
+ export declare class PeerHostController {
5
+ private readonly peerHostService;
6
+ constructor(peerHostService: PeerHostService);
7
+ readonly list: (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
8
+ readonly create: (request: FastifyRequest<{
9
+ Body: PeerHostCreateInput;
10
+ }>, reply: FastifyReply) => Promise<void>;
11
+ readonly listWorkspaceBindings: (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
12
+ readonly saveWorkspaceBinding: (request: FastifyRequest<{
13
+ Params: {
14
+ workspaceKey: string;
15
+ };
16
+ Body: PeerHostWorkspaceBindingUpdateInput;
17
+ }>, reply: FastifyReply) => Promise<void>;
18
+ readonly get: (request: FastifyRequest<{
19
+ Params: {
20
+ peerHostId: string;
21
+ };
22
+ }>, reply: FastifyReply) => Promise<void>;
23
+ readonly update: (request: FastifyRequest<{
24
+ Params: {
25
+ peerHostId: string;
26
+ };
27
+ Body: PeerHostUpdateInput;
28
+ }>, reply: FastifyReply) => Promise<void>;
29
+ readonly delete: (request: FastifyRequest<{
30
+ Params: {
31
+ peerHostId: string;
32
+ };
33
+ }>, reply: FastifyReply) => Promise<void>;
34
+ readonly check: (request: FastifyRequest<{
35
+ Params: {
36
+ peerHostId: string;
37
+ };
38
+ }>, reply: FastifyReply) => Promise<void>;
39
+ readonly login: (request: FastifyRequest<{
40
+ Params: {
41
+ peerHostId: string;
42
+ };
43
+ Body: PeerHostLoginInput;
44
+ }>, reply: FastifyReply) => Promise<void>;
45
+ readonly deleteSession: (request: FastifyRequest<{
46
+ Params: {
47
+ peerHostId: string;
48
+ };
49
+ }>, reply: FastifyReply) => Promise<void>;
50
+ }
51
+ export declare class HostApiProxyController {
52
+ private readonly hostApiProxyService;
53
+ constructor(hostApiProxyService: HostApiProxyService);
54
+ readonly proxy: (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
55
+ }
@@ -0,0 +1,62 @@
1
+ import { AppError } from "../../shared/errors/app-error.js";
2
+ export class PeerHostController {
3
+ peerHostService;
4
+ constructor(peerHostService) {
5
+ this.peerHostService = peerHostService;
6
+ }
7
+ list = async (request, reply) => {
8
+ reply.send({ items: this.peerHostService.list(requireUserId(request)) });
9
+ };
10
+ create = async (request, reply) => {
11
+ reply
12
+ .status(201)
13
+ .send(this.peerHostService.create(requireUserId(request), request.body ?? {}));
14
+ };
15
+ listWorkspaceBindings = async (request, reply) => {
16
+ reply.send({
17
+ items: this.peerHostService.listWorkspaceBindings(requireUserId(request)),
18
+ });
19
+ };
20
+ saveWorkspaceBinding = async (request, reply) => {
21
+ reply.send(this.peerHostService.saveWorkspaceBinding(requireUserId(request), request.params.workspaceKey, request.body ?? {}));
22
+ };
23
+ get = async (request, reply) => {
24
+ reply.send(this.peerHostService.get(requireUserId(request), request.params.peerHostId));
25
+ };
26
+ update = async (request, reply) => {
27
+ reply.send(this.peerHostService.update(requireUserId(request), request.params.peerHostId, request.body ?? {}));
28
+ };
29
+ delete = async (request, reply) => {
30
+ reply.send(this.peerHostService.delete(requireUserId(request), request.params.peerHostId));
31
+ };
32
+ check = async (request, reply) => {
33
+ reply.send(await this.peerHostService.check(requireUserId(request), request.params.peerHostId));
34
+ };
35
+ login = async (request, reply) => {
36
+ reply.send(await this.peerHostService.login(requireUserId(request), request.params.peerHostId, request.body ?? {}));
37
+ };
38
+ deleteSession = async (request, reply) => {
39
+ reply.send(this.peerHostService.deleteSession(requireUserId(request), request.params.peerHostId));
40
+ };
41
+ }
42
+ export class HostApiProxyController {
43
+ hostApiProxyService;
44
+ constructor(hostApiProxyService) {
45
+ this.hostApiProxyService = hostApiProxyService;
46
+ }
47
+ proxy = async (request, reply) => {
48
+ await this.hostApiProxyService.proxy(request, reply);
49
+ };
50
+ }
51
+ function requireUserId(request) {
52
+ const userId = request.auth?.user.userId;
53
+ if (userId) {
54
+ return userId;
55
+ }
56
+ throw new AppError({
57
+ statusCode: 401,
58
+ errorCode: "UNAUTHORIZED",
59
+ detail: "当前请求缺少有效登录态",
60
+ });
61
+ }
62
+ //# sourceMappingURL=peer-host-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peer-host-controller.js","sourceRoot":"","sources":["../../../../src/modules/peer-host/peer-host-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import type { PeerHostRecord } from "../../types/domain.js";
2
+ import type { PeerHostRepository, PeerHostSessionRepository, PeerHostWorkspaceBindingRepository } from "../../storage/repositories/peer-host-repository.js";
3
+ export interface PeerHostCreateInput {
4
+ name?: string;
5
+ alias?: string;
6
+ baseUrl?: string;
7
+ }
8
+ export interface PeerHostUpdateInput {
9
+ name?: string;
10
+ alias?: string | null;
11
+ baseUrl?: string;
12
+ }
13
+ export interface PeerHostWorkspaceBindingUpdateInput {
14
+ activeHostId?: string;
15
+ selectedHostId?: string;
16
+ remoteWorkspaceId?: string | null;
17
+ remoteWorkspacePath?: string | null;
18
+ remoteWorkspaceName?: string | null;
19
+ }
20
+ export interface PeerHostWorkspaceBindingView {
21
+ activeHostId: string;
22
+ workspaceKey: string;
23
+ selectedHostId: string;
24
+ remoteWorkspaceId: string | null;
25
+ remoteWorkspacePath: string | null;
26
+ remoteWorkspaceName: string | null;
27
+ updatedAt: string;
28
+ }
29
+ export interface PeerHostLoginInput {
30
+ username?: string;
31
+ password?: string;
32
+ }
33
+ export interface PeerHostSessionView {
34
+ exists: true;
35
+ username: string;
36
+ remoteUserId: string;
37
+ remoteUsername: string;
38
+ expiresAt: string | null;
39
+ savedAt: string;
40
+ updatedAt: string;
41
+ }
42
+ export declare class PeerHostService {
43
+ private readonly peerHostRepository;
44
+ private readonly peerHostSessionRepository;
45
+ private readonly peerHostWorkspaceBindingRepository;
46
+ private readonly credentialSecret;
47
+ private readonly fetchImpl;
48
+ constructor(peerHostRepository: PeerHostRepository, peerHostSessionRepository: PeerHostSessionRepository, peerHostWorkspaceBindingRepositoryOrCredentialSecret: PeerHostWorkspaceBindingRepository | string, credentialSecretOrFetch?: string | typeof fetch, fetchImpl?: typeof fetch);
49
+ list(ownerUserId: string): PeerHostRecord[];
50
+ create(ownerUserId: string, input: PeerHostCreateInput): PeerHostRecord;
51
+ get(ownerUserId: string, peerHostId: string): PeerHostRecord;
52
+ update(ownerUserId: string, peerHostId: string, input: PeerHostUpdateInput): PeerHostRecord;
53
+ listWorkspaceBindings(ownerUserId: string): PeerHostWorkspaceBindingView[];
54
+ saveWorkspaceBinding(ownerUserId: string, workspaceKeyInput: unknown, input: PeerHostWorkspaceBindingUpdateInput): PeerHostWorkspaceBindingView;
55
+ delete(ownerUserId: string, peerHostId: string): {
56
+ success: true;
57
+ peerHostId: string;
58
+ };
59
+ check(ownerUserId: string, peerHostId: string): Promise<PeerHostRecord>;
60
+ login(ownerUserId: string, peerHostId: string, input: PeerHostLoginInput): Promise<PeerHostSessionView>;
61
+ deleteSession(ownerUserId: string, peerHostId: string): {
62
+ success: true;
63
+ peerHostId: string;
64
+ };
65
+ ensureProxyReady(ownerUserId: string, peerHostId: string): PeerHostRecord;
66
+ getAccessTokenForProxy(ownerUserId: string, peerHost: PeerHostRecord): Promise<string>;
67
+ clearSession(ownerUserId: string, peerHostId: string): void;
68
+ private fetchHandshake;
69
+ private resolveCheckStatus;
70
+ private persistCheckResult;
71
+ private fetchJson;
72
+ private refreshPeerHostSession;
73
+ private requirePeerHost;
74
+ private ensureBaseUrlUnused;
75
+ private requireWorkspaceBindingRepository;
76
+ }
77
+ export declare function normalizeBaseUrl(value: unknown): string;