@blue-soda/dsh-remote 0.5.6 → 0.5.8

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 (232) hide show
  1. package/README.md +14 -3
  2. package/cordis.patch.yml +30 -30
  3. package/dist/client.github.js +1 -1
  4. package/dist/client.js +1 -1
  5. package/dist/index.js +1216 -396
  6. package/dist/index.js.map +4 -4
  7. package/dsh-plugin.json +41 -41
  8. package/package.json +165 -165
  9. package/dist/acp.d.ts +0 -75
  10. package/dist/acp.d.ts.map +0 -1
  11. package/dist/acp.js +0 -61
  12. package/dist/acp.js.map +0 -1
  13. package/dist/api-proxy-switch.d.ts +0 -33
  14. package/dist/api-proxy-switch.d.ts.map +0 -1
  15. package/dist/api-proxy-switch.js +0 -109
  16. package/dist/api-proxy-switch.js.map +0 -1
  17. package/dist/atomic-file.d.ts +0 -16
  18. package/dist/atomic-file.d.ts.map +0 -1
  19. package/dist/atomic-file.js +0 -81
  20. package/dist/atomic-file.js.map +0 -1
  21. package/dist/bin/doctor.d.ts +0 -3
  22. package/dist/bin/doctor.d.ts.map +0 -1
  23. package/dist/bin/doctor.js +0 -13
  24. package/dist/bin/doctor.js.map +0 -1
  25. package/dist/cli.d.ts +0 -32
  26. package/dist/cli.d.ts.map +0 -1
  27. package/dist/cli.js +0 -289
  28. package/dist/cli.js.map +0 -1
  29. package/dist/client-runtime.d.ts +0 -375
  30. package/dist/client-runtime.d.ts.map +0 -1
  31. package/dist/client-runtime.js +0 -1768
  32. package/dist/client-runtime.js.map +0 -1
  33. package/dist/client-secure-transport.d.ts +0 -23
  34. package/dist/client-secure-transport.d.ts.map +0 -1
  35. package/dist/client-secure-transport.js +0 -144
  36. package/dist/client-secure-transport.js.map +0 -1
  37. package/dist/client-target-store.d.ts +0 -40
  38. package/dist/client-target-store.d.ts.map +0 -1
  39. package/dist/client-target-store.js +0 -79
  40. package/dist/client-target-store.js.map +0 -1
  41. package/dist/client.d.ts +0 -13
  42. package/dist/client.d.ts.map +0 -1
  43. package/dist/codex/app-server.d.ts +0 -71
  44. package/dist/codex/app-server.d.ts.map +0 -1
  45. package/dist/codex/app-server.js +0 -268
  46. package/dist/codex/app-server.js.map +0 -1
  47. package/dist/codex/codex-image-codec.d.ts +0 -7
  48. package/dist/codex/codex-image-codec.d.ts.map +0 -1
  49. package/dist/codex/codex-image-codec.js +0 -288
  50. package/dist/codex/codex-image-codec.js.map +0 -1
  51. package/dist/codex/domain.d.ts +0 -102
  52. package/dist/codex/domain.d.ts.map +0 -1
  53. package/dist/codex/domain.js +0 -1323
  54. package/dist/codex/domain.js.map +0 -1
  55. package/dist/codex/method-policy.d.ts +0 -338
  56. package/dist/codex/method-policy.d.ts.map +0 -1
  57. package/dist/codex/method-policy.js +0 -141
  58. package/dist/codex/method-policy.js.map +0 -1
  59. package/dist/codex/peer-bridge.d.ts +0 -57
  60. package/dist/codex/peer-bridge.d.ts.map +0 -1
  61. package/dist/codex/peer-bridge.js +0 -299
  62. package/dist/codex/peer-bridge.js.map +0 -1
  63. package/dist/codex/permissions.d.ts +0 -4
  64. package/dist/codex/permissions.d.ts.map +0 -1
  65. package/dist/codex/permissions.js +0 -21
  66. package/dist/codex/permissions.js.map +0 -1
  67. package/dist/codex/session-id.d.ts +0 -10
  68. package/dist/codex/session-id.d.ts.map +0 -1
  69. package/dist/codex/session-id.js +0 -15
  70. package/dist/codex/session-id.js.map +0 -1
  71. package/dist/codex/virtual-harness.d.ts +0 -209
  72. package/dist/codex/virtual-harness.d.ts.map +0 -1
  73. package/dist/codex/virtual-harness.js +0 -2650
  74. package/dist/codex/virtual-harness.js.map +0 -1
  75. package/dist/codex-workspace-bridge.d.ts +0 -108
  76. package/dist/codex-workspace-bridge.d.ts.map +0 -1
  77. package/dist/codex-workspace-bridge.js +0 -502
  78. package/dist/codex-workspace-bridge.js.map +0 -1
  79. package/dist/config.d.ts +0 -99
  80. package/dist/config.d.ts.map +0 -1
  81. package/dist/config.js +0 -127
  82. package/dist/config.js.map +0 -1
  83. package/dist/connection-controller.d.ts +0 -44
  84. package/dist/connection-controller.d.ts.map +0 -1
  85. package/dist/connection-controller.js +0 -185
  86. package/dist/connection-controller.js.map +0 -1
  87. package/dist/control-route.d.ts +0 -34
  88. package/dist/control-route.d.ts.map +0 -1
  89. package/dist/control-route.js +0 -136
  90. package/dist/control-route.js.map +0 -1
  91. package/dist/control-runtime.d.ts +0 -138
  92. package/dist/control-runtime.d.ts.map +0 -1
  93. package/dist/control-runtime.js +0 -543
  94. package/dist/control-runtime.js.map +0 -1
  95. package/dist/control-stream.d.ts +0 -67
  96. package/dist/control-stream.d.ts.map +0 -1
  97. package/dist/control-stream.js +0 -179
  98. package/dist/control-stream.js.map +0 -1
  99. package/dist/defaults.d.ts +0 -9
  100. package/dist/defaults.d.ts.map +0 -1
  101. package/dist/defaults.js +0 -9
  102. package/dist/defaults.js.map +0 -1
  103. package/dist/file-viewer-bridge.d.ts +0 -30
  104. package/dist/file-viewer-bridge.d.ts.map +0 -1
  105. package/dist/file-viewer-bridge.js +0 -128
  106. package/dist/file-viewer-bridge.js.map +0 -1
  107. package/dist/file-viewer-contract.d.ts +0 -5
  108. package/dist/file-viewer-contract.d.ts.map +0 -1
  109. package/dist/file-viewer-contract.js +0 -4
  110. package/dist/file-viewer-contract.js.map +0 -1
  111. package/dist/harness-api-bridge.d.ts +0 -81
  112. package/dist/harness-api-bridge.d.ts.map +0 -1
  113. package/dist/harness-api-bridge.js +0 -862
  114. package/dist/harness-api-bridge.js.map +0 -1
  115. package/dist/harness-api-history.d.ts +0 -3
  116. package/dist/harness-api-history.d.ts.map +0 -1
  117. package/dist/harness-api-history.js +0 -59
  118. package/dist/harness-api-history.js.map +0 -1
  119. package/dist/harness-remote-bridge.d.ts +0 -60
  120. package/dist/harness-remote-bridge.d.ts.map +0 -1
  121. package/dist/harness-remote-bridge.js +0 -540
  122. package/dist/harness-remote-bridge.js.map +0 -1
  123. package/dist/harness-version.d.ts +0 -23
  124. package/dist/harness-version.d.ts.map +0 -1
  125. package/dist/harness-version.js +0 -95
  126. package/dist/harness-version.js.map +0 -1
  127. package/dist/identity-store.d.ts +0 -45
  128. package/dist/identity-store.d.ts.map +0 -1
  129. package/dist/identity-store.js +0 -186
  130. package/dist/identity-store.js.map +0 -1
  131. package/dist/ids.d.ts +0 -2
  132. package/dist/ids.d.ts.map +0 -1
  133. package/dist/ids.js +0 -17
  134. package/dist/ids.js.map +0 -1
  135. package/dist/index.d.ts +0 -78
  136. package/dist/index.d.ts.map +0 -1
  137. package/dist/logging.d.ts +0 -18
  138. package/dist/logging.d.ts.map +0 -1
  139. package/dist/logging.js +0 -30
  140. package/dist/logging.js.map +0 -1
  141. package/dist/loopback-host.d.ts +0 -20
  142. package/dist/loopback-host.d.ts.map +0 -1
  143. package/dist/loopback-host.js +0 -245
  144. package/dist/loopback-host.js.map +0 -1
  145. package/dist/loopback-preview.d.ts +0 -19
  146. package/dist/loopback-preview.d.ts.map +0 -1
  147. package/dist/loopback-preview.js +0 -232
  148. package/dist/loopback-preview.js.map +0 -1
  149. package/dist/native-rtc-helper.d.ts +0 -14
  150. package/dist/native-rtc-helper.d.ts.map +0 -1
  151. package/dist/native-rtc-helper.js +0 -575
  152. package/dist/native-rtc-helper.js.map +0 -1
  153. package/dist/remote-api-proxy.d.ts +0 -17
  154. package/dist/remote-api-proxy.d.ts.map +0 -1
  155. package/dist/remote-api-proxy.js +0 -451
  156. package/dist/remote-api-proxy.js.map +0 -1
  157. package/dist/remote-directory-browser.d.ts +0 -16
  158. package/dist/remote-directory-browser.d.ts.map +0 -1
  159. package/dist/remote-directory-browser.js +0 -48
  160. package/dist/remote-directory-browser.js.map +0 -1
  161. package/dist/remote-file-content-provider.d.ts +0 -48
  162. package/dist/remote-file-content-provider.d.ts.map +0 -1
  163. package/dist/remote-file-content-provider.js +0 -93
  164. package/dist/remote-file-content-provider.js.map +0 -1
  165. package/dist/remote-typert-gateway.d.ts +0 -20
  166. package/dist/remote-typert-gateway.d.ts.map +0 -1
  167. package/dist/remote-typert-gateway.js +0 -334
  168. package/dist/remote-typert-gateway.js.map +0 -1
  169. package/dist/rpc-binary-attachments.d.ts +0 -33
  170. package/dist/rpc-binary-attachments.d.ts.map +0 -1
  171. package/dist/rpc-binary-attachments.js +0 -142
  172. package/dist/rpc-binary-attachments.js.map +0 -1
  173. package/dist/rpc-router.d.ts +0 -31
  174. package/dist/rpc-router.d.ts.map +0 -1
  175. package/dist/rpc-router.js +0 -201
  176. package/dist/rpc-router.js.map +0 -1
  177. package/dist/safe-error.d.ts +0 -8
  178. package/dist/safe-error.d.ts.map +0 -1
  179. package/dist/safe-error.js +0 -20
  180. package/dist/safe-error.js.map +0 -1
  181. package/dist/server-api.d.ts +0 -109
  182. package/dist/server-api.d.ts.map +0 -1
  183. package/dist/server-api.js +0 -520
  184. package/dist/server-api.js.map +0 -1
  185. package/dist/server-connection.d.ts +0 -79
  186. package/dist/server-connection.d.ts.map +0 -1
  187. package/dist/server-connection.js +0 -1023
  188. package/dist/server-connection.js.map +0 -1
  189. package/dist/server-credentials.d.ts +0 -55
  190. package/dist/server-credentials.d.ts.map +0 -1
  191. package/dist/server-credentials.js +0 -108
  192. package/dist/server-credentials.js.map +0 -1
  193. package/dist/service.d.ts +0 -151
  194. package/dist/service.d.ts.map +0 -1
  195. package/dist/service.js +0 -448
  196. package/dist/service.js.map +0 -1
  197. package/dist/session-format-compat.d.ts +0 -3
  198. package/dist/session-format-compat.d.ts.map +0 -1
  199. package/dist/session-format-compat.js +0 -183
  200. package/dist/session-format-compat.js.map +0 -1
  201. package/dist/status-stream.d.ts +0 -48
  202. package/dist/status-stream.d.ts.map +0 -1
  203. package/dist/status-stream.js +0 -133
  204. package/dist/status-stream.js.map +0 -1
  205. package/dist/terminal-policy.d.ts +0 -21
  206. package/dist/terminal-policy.d.ts.map +0 -1
  207. package/dist/terminal-policy.js +0 -68
  208. package/dist/terminal-policy.js.map +0 -1
  209. package/dist/tui-command.d.ts +0 -13
  210. package/dist/tui-command.d.ts.map +0 -1
  211. package/dist/tui-command.js +0 -392
  212. package/dist/tui-command.js.map +0 -1
  213. package/dist/typert-gateway-contract.d.ts +0 -59
  214. package/dist/typert-gateway-contract.d.ts.map +0 -1
  215. package/dist/typert-gateway-contract.js +0 -2
  216. package/dist/typert-gateway-contract.js.map +0 -1
  217. package/dist/typert-gateway-switch.d.ts +0 -85
  218. package/dist/typert-gateway-switch.d.ts.map +0 -1
  219. package/dist/typert-gateway-switch.js +0 -448
  220. package/dist/typert-gateway-switch.js.map +0 -1
  221. package/dist/types.d.ts +0 -20
  222. package/dist/types.d.ts.map +0 -1
  223. package/dist/types.js +0 -2
  224. package/dist/types.js.map +0 -1
  225. package/dist/version.d.ts +0 -12
  226. package/dist/version.d.ts.map +0 -1
  227. package/dist/version.js +0 -12
  228. package/dist/version.js.map +0 -1
  229. package/dist/werift-rtc.d.ts +0 -121
  230. package/dist/werift-rtc.d.ts.map +0 -1
  231. package/dist/werift-rtc.js +0 -490
  232. package/dist/werift-rtc.js.map +0 -1
@@ -1,520 +0,0 @@
1
- import { platform } from 'node:os';
2
- import { fromBase64Url, toBase64Url } from '@dsh-remote/crypto';
3
- import { deviceTokenPairSchema } from '@dsh-remote/protocol';
4
- import { ServerCredentialsBusyError } from './server-credentials.js';
5
- import { normalizeServerUrl } from './config.js';
6
- import { PLUGIN_VERSION } from './version.js';
7
- /**
8
- * QR-login providers this build offers. The self-hosted server implements
9
- * WeChat; Zhihu and GitHub remain implemented for the hosted server but are not
10
- * offered here. This is the one place to enable or retire a provider.
11
- */
12
- export const ENABLED_QR_PROVIDERS = ['github'];
13
- /**
14
- * Whether a caller-supplied string names an offered provider. Narrows the value
15
- * so downstream calls receive a validated `OAuthProvider` rather than `string`.
16
- */
17
- export function isEnabledQrProvider(value) {
18
- return ENABLED_QR_PROVIDERS.includes(value);
19
- }
20
- /** Human-readable provider name for diagnostics and prompts. */
21
- export function oauthProviderName(provider) {
22
- return provider === 'github' ? 'GitHub' : provider === 'zhihu' ? 'Zhihu' : 'WeChat';
23
- }
24
- const TERMINAL_CONTROL_CHARACTERS = /[\u0000-\u001f\u007f-\u009f]/u;
25
- export class HostServerApi {
26
- store;
27
- fetchImplementation;
28
- role;
29
- baseUrl;
30
- identity;
31
- credentials;
32
- credentialsPromise;
33
- harnessVersion;
34
- constructor(serverUrl, store, fetchImplementation = fetch, role = 'host') {
35
- this.store = store;
36
- this.fetchImplementation = fetchImplementation;
37
- this.role = role;
38
- this.baseUrl = normalizeServerUrl(serverUrl);
39
- }
40
- bindIdentity(identity) { this.identity = identity; }
41
- setHarnessVersion(version) { this.harnessVersion = version; }
42
- currentAuthorization() {
43
- if (this.credentials === undefined)
44
- return undefined;
45
- return {
46
- method: this.credentials.authorizationMethod,
47
- ...(this.credentials.account === undefined ? {} : { account: this.credentials.account }),
48
- };
49
- }
50
- /** Check the persisted device credential without issuing or refreshing one. */
51
- async hasStoredAuthorization() {
52
- const identity = this.requireIdentity();
53
- return await this.store.load(this.baseUrl, identity.deviceId) !== undefined;
54
- }
55
- async clearAuthorization() {
56
- this.credentials = undefined;
57
- this.credentialsPromise = undefined;
58
- await this.store.clear();
59
- }
60
- async revokeCurrentDevice() {
61
- const identity = this.requireIdentity();
62
- if (await this.store.load(this.baseUrl, identity.deviceId) === undefined) {
63
- await this.clearAuthorization();
64
- return;
65
- }
66
- try {
67
- await this.request('/api/v1/devices/self', { method: 'DELETE' });
68
- }
69
- finally {
70
- await this.clearAuthorization();
71
- }
72
- }
73
- async authorizeWithAccount(identity, email, password) {
74
- this.bindIdentity(identity);
75
- const account = email.trim();
76
- if (account.length === 0 || password.length === 0) {
77
- throw new ServerApiError('INVALID_MESSAGE', 'Email and password are required.', false);
78
- }
79
- const login = validateWebLogin(await this.publicRequest('/api/v1/auth/login', {
80
- method: 'POST',
81
- body: JSON.stringify({ email: account, password }),
82
- }));
83
- await this.register(identity, {
84
- accountToken: login.token,
85
- account: login.account,
86
- authorizationMethod: 'account',
87
- });
88
- return {
89
- method: 'account',
90
- account: login.account,
91
- expiresAt: login.expiresAt,
92
- isAdmin: login.isAdmin,
93
- };
94
- }
95
- /**
96
- * Authorize this device with the DSH DeepSeek account grant.
97
- *
98
- * The grant is forwarded once so the Server can ask the account platform who
99
- * it belongs to; the Server then discards it and issues its own account
100
- * session, exactly like a password sign-in.
101
- */
102
- async authorizeWithDeepSeek(identity, token) {
103
- this.bindIdentity(identity);
104
- if (token.trim().length === 0) {
105
- throw new ServerApiError('INVALID_MESSAGE', 'A DeepSeek account grant is required.', false);
106
- }
107
- const login = validateWebLogin(await this.publicRequest('/api/v1/auth/deepseek', {
108
- method: 'POST',
109
- body: JSON.stringify({ token }),
110
- }));
111
- await this.register(identity, {
112
- accountToken: login.token,
113
- account: login.account,
114
- authorizationMethod: 'account',
115
- });
116
- return {
117
- method: 'account',
118
- account: login.account,
119
- expiresAt: login.expiresAt,
120
- isAdmin: login.isAdmin,
121
- };
122
- }
123
- async startOAuthQrLogin(provider = 'wechat') {
124
- const value = requireRecord(await this.publicRequest(`/api/v1/auth/oauth/qr/start?provider=${provider}`, {
125
- method: 'POST',
126
- body: '{}',
127
- }), 'QR login');
128
- const scanUrl = normalizeOAuthScanUrl(value.scanUrl, this.baseUrl);
129
- if (typeof value.qrId !== 'string' || value.qrId.length < 20
130
- || scanUrl === undefined
131
- || !Number.isSafeInteger(value.expiresIn)
132
- || (value.provider !== undefined && value.provider !== provider)) {
133
- throw new ServerApiError('INVALID_MESSAGE', 'The Server returned an invalid QR login session.', false);
134
- }
135
- return { qrId: value.qrId, scanUrl, expiresIn: value.expiresIn };
136
- }
137
- async pollOAuthQrLogin(identity, qrId, recoverIdentity) {
138
- this.bindIdentity(identity);
139
- const value = requireRecord(await this.publicRequest(`/api/v1/auth/oauth/qr/${encodeURIComponent(qrId)}`, { method: 'GET' }), 'QR login status');
140
- if (value.status === 'pending' || value.status === 'expired')
141
- return { status: value.status };
142
- if (value.status !== 'complete' || typeof value.token !== 'string' || value.token.length < 16) {
143
- throw new ServerApiError('INVALID_MESSAGE', 'The Server returned an invalid QR login status.', false);
144
- }
145
- const account = requireRecord(await this.publicRequest('/api/v1/auth/me', { method: 'GET' }, value.token), 'account profile');
146
- if (typeof account.account !== 'string' || account.account.length === 0 || typeof account.isAdmin !== 'boolean') {
147
- throw new ServerApiError('INVALID_MESSAGE', 'The Server returned an invalid account profile.', false);
148
- }
149
- const authorization = {
150
- accountToken: value.token,
151
- account: account.account,
152
- authorizationMethod: 'account',
153
- };
154
- try {
155
- await this.register(identity, authorization);
156
- }
157
- catch (error) {
158
- if (!(error instanceof ServerApiError) || error.code !== 'DEVICE_REVOKED' || recoverIdentity === undefined)
159
- throw error;
160
- const nextIdentity = await recoverIdentity();
161
- this.bindIdentity(nextIdentity);
162
- await this.register(nextIdentity, authorization);
163
- }
164
- return {
165
- status: 'complete',
166
- authorization: { method: 'account', account: account.account, isAdmin: account.isAdmin },
167
- };
168
- }
169
- async authorizeHostWithCode(identity, code) {
170
- if (this.role !== 'host') {
171
- throw new ServerApiError('METHOD_NOT_ALLOWED', 'Host registration codes can only authorize a Host device.', false);
172
- }
173
- const registrationCode = code.trim().toUpperCase();
174
- if (registrationCode.length === 0) {
175
- throw new ServerApiError('INVALID_MESSAGE', 'A Host registration code is required.', false);
176
- }
177
- this.bindIdentity(identity);
178
- const tokens = await this.publicRequest('/api/v1/devices/register-with-code', {
179
- method: 'POST',
180
- body: JSON.stringify({ v: 1, code: registrationCode, device: this.deviceDescriptor(identity) }),
181
- });
182
- this.credentials = await this.saveTokens(identity, validateTokens(tokens), {
183
- authorizationMethod: 'host_registration_code',
184
- });
185
- return { method: 'host_registration_code' };
186
- }
187
- async authorizeOwnedRole(identity, authorizingAccessToken, account) {
188
- this.bindIdentity(identity);
189
- const tokens = await this.publicRequest('/api/v1/devices/register-owned-role', {
190
- method: 'POST',
191
- body: JSON.stringify({ v: 1, device: this.deviceDescriptor(identity) }),
192
- }, authorizingAccessToken);
193
- this.credentials = await this.saveTokens(identity, validateTokens(tokens), {
194
- authorizationMethod: 'owned_device',
195
- ...(account === undefined ? {} : { account }),
196
- });
197
- return {
198
- method: 'owned_device',
199
- ...(account === undefined ? {} : { account }),
200
- };
201
- }
202
- async authenticate(identity = this.requireIdentity()) {
203
- this.bindIdentity(identity);
204
- if (this.credentials !== undefined && this.credentials.accessTokenExpiresAt > Date.now() + 30_000) {
205
- return this.credentials;
206
- }
207
- this.credentialsPromise ??= this.loadOrIssue(identity).finally(() => { this.credentialsPromise = undefined; });
208
- this.credentials = await this.credentialsPromise;
209
- return this.credentials;
210
- }
211
- async refreshCredentials(rejectedAccessToken = this.credentials?.accessToken) {
212
- const identity = this.requireIdentity();
213
- this.credentials = await this.withRefreshLock(async () => {
214
- // Another process may have rotated the token while we waited for the lock.
215
- const stored = await this.store.load(this.baseUrl, identity.deviceId);
216
- if (stored === undefined || stored.refreshTokenExpiresAt <= Date.now())
217
- return this.register(identity);
218
- if (stored.accessToken !== rejectedAccessToken && stored.accessTokenExpiresAt > Date.now() + 30_000) {
219
- return stored;
220
- }
221
- return this.rotateCredentials(identity, stored);
222
- });
223
- return this.credentials;
224
- }
225
- async withRefreshLock(operation) {
226
- try {
227
- return await this.store.withRefreshLock(operation);
228
- }
229
- catch (error) {
230
- if (error instanceof ServerCredentialsBusyError) {
231
- throw new ServerApiError(error.code, error.message, false);
232
- }
233
- throw error;
234
- }
235
- }
236
- async rotateCredentials(identity, stored) {
237
- let tokens;
238
- try {
239
- tokens = await this.publicRequest('/api/v1/auth/refresh', {
240
- method: 'POST',
241
- body: JSON.stringify({ deviceId: identity.deviceId, refreshToken: stored.refreshToken }),
242
- });
243
- }
244
- catch (error) {
245
- if (error instanceof ServerApiError) {
246
- throw new ServerApiError(error.code, error.message, error.retryable, error.status, 'credential_refresh');
247
- }
248
- throw error;
249
- }
250
- return this.store.save({
251
- serverUrl: this.baseUrl,
252
- deviceId: identity.deviceId,
253
- authorizationMethod: stored.authorizationMethod,
254
- ...(stored.account === undefined ? {} : { account: stored.account }),
255
- ...validateTokens(tokens),
256
- });
257
- }
258
- async listDevices() {
259
- const result = await this.request('/api/v1/devices');
260
- if (!Array.isArray(result.items))
261
- throw new ServerApiError('INVALID_MESSAGE', 'The Server returned an invalid device list.', false);
262
- return result.items.map(parseHostDevice);
263
- }
264
- async deviceFor(peerDeviceId) {
265
- const result = await this.request(`/api/v1/devices/${encodeURIComponent(peerDeviceId)}`);
266
- return parseAuthorizedPeer(result);
267
- }
268
- async turnCredentials(connectionId) {
269
- const result = await this.request(`/api/v1/turn/credentials?connection_id=${encodeURIComponent(connectionId)}`);
270
- if (!Array.isArray(result.iceServers))
271
- return [];
272
- return result.iceServers.map(parseIceServer);
273
- }
274
- async presenceFor(deviceId) {
275
- const result = await this.request(`/api/v1/devices/${encodeURIComponent(deviceId)}/presence`);
276
- if (typeof result.online !== 'boolean'
277
- || (result.lastSeenAt !== null && result.lastSeenAt !== undefined && !Number.isSafeInteger(result.lastSeenAt))) {
278
- throw new ServerApiError('INVALID_MESSAGE', 'The Server returned invalid device presence.', false);
279
- }
280
- return { online: result.online, ...(typeof result.lastSeenAt === 'number' ? { lastSeenAt: result.lastSeenAt } : {}) };
281
- }
282
- async loadOrIssue(identity) {
283
- return this.withRefreshLock(async () => {
284
- const stored = await this.store.load(this.baseUrl, identity.deviceId);
285
- if (stored === undefined || stored.refreshTokenExpiresAt <= Date.now() + 30_000) {
286
- return this.register(identity);
287
- }
288
- if (stored.accessTokenExpiresAt > Date.now() + 30_000)
289
- return stored;
290
- return this.rotateCredentials(identity, stored);
291
- });
292
- }
293
- async register(identity, authorization) {
294
- const tokens = await this.publicRequest('/api/v1/devices/register', {
295
- method: 'POST',
296
- body: JSON.stringify({
297
- v: 1,
298
- device: this.deviceDescriptor(identity),
299
- }),
300
- }, authorization?.accountToken);
301
- this.credentials = await this.saveTokens(identity, validateTokens(tokens), {
302
- authorizationMethod: authorization?.authorizationMethod ?? 'account',
303
- ...(authorization?.account === undefined ? {} : { account: authorization.account }),
304
- });
305
- return this.credentials;
306
- }
307
- deviceDescriptor(identity) {
308
- return {
309
- deviceId: identity.deviceId,
310
- name: identity.name,
311
- role: this.role,
312
- platform: platform(),
313
- identityKey: identity.publicKey,
314
- clientVersion: PLUGIN_VERSION,
315
- ...(this.role === 'host' && this.harnessVersion !== undefined ? { harnessVersion: this.harnessVersion } : {}),
316
- };
317
- }
318
- saveTokens(identity, tokens, authorization) {
319
- return this.store.save({
320
- serverUrl: this.baseUrl,
321
- deviceId: identity.deviceId,
322
- authorizationMethod: authorization.authorizationMethod,
323
- ...(authorization.account === undefined ? {} : { account: authorization.account }),
324
- ...tokens,
325
- });
326
- }
327
- async request(path, init = {}) {
328
- const credentials = await this.authenticate();
329
- return this.publicRequest(path, init, credentials.accessToken);
330
- }
331
- async publicRequest(path, init, accessToken) {
332
- const controller = new AbortController();
333
- const timer = setTimeout(() => controller.abort(), 10_000);
334
- let response;
335
- try {
336
- response = await this.fetchImplementation(`${this.baseUrl}${path}`, {
337
- ...init,
338
- signal: controller.signal,
339
- headers: {
340
- Accept: 'application/json',
341
- 'Content-Type': 'application/json',
342
- ...(accessToken === undefined ? {} : { Authorization: `Bearer ${accessToken}` }),
343
- ...init.headers,
344
- },
345
- });
346
- }
347
- catch (error) {
348
- throw new ServerApiError('CONNECTION_FAILED', error instanceof Error ? error.message : 'Server request failed.', true);
349
- }
350
- finally {
351
- clearTimeout(timer);
352
- }
353
- const body = await parseBody(response);
354
- if (!response.ok) {
355
- const envelope = (body ?? {});
356
- throw new ServerApiError(typeof envelope.error?.code === 'string' ? envelope.error.code : mapStatus(response.status), typeof envelope.error?.message === 'string' ? envelope.error.message : 'The Server rejected the request.', envelope.error?.retryable === true || response.status >= 500, response.status);
357
- }
358
- return body;
359
- }
360
- requireIdentity() {
361
- if (this.identity === undefined)
362
- throw new ServerApiError('IDENTITY_INVALID', 'The device identity is not loaded.', false);
363
- return this.identity;
364
- }
365
- }
366
- /**
367
- * Accept the authorization URL a server hands back for a QR login.
368
- *
369
- * A real OAuth provider's page lives on another origin (`github.com`,
370
- * `open.weixin.qq.com`), so requiring the server's own origin would reject every
371
- * provider. The guard is the scheme instead: HTTPS, or HTTP when the server
372
- * itself is loopback. That still keeps `javascript:`, `data:` and obfuscated
373
- * payloads out of the QR link and the rendered anchor.
374
- */
375
- function normalizeOAuthScanUrl(value, baseUrl) {
376
- if (typeof value !== 'string' || TERMINAL_CONTROL_CHARACTERS.test(value))
377
- return undefined;
378
- try {
379
- const normalized = new URL(value);
380
- if (normalized.protocol === 'https:')
381
- return normalized.href;
382
- if (normalized.protocol !== 'http:')
383
- return undefined;
384
- const server = new URL(baseUrl);
385
- const loopback = server.hostname === 'localhost' || server.hostname === '127.0.0.1' || server.hostname === '::1';
386
- return loopback ? normalized.href : undefined;
387
- }
388
- catch {
389
- return undefined;
390
- }
391
- }
392
- export class ClientServerApi extends HostServerApi {
393
- constructor(serverUrl, store, fetchImplementation = fetch) {
394
- super(serverUrl, store, fetchImplementation, 'client');
395
- }
396
- }
397
- export class ServerApiError extends Error {
398
- code;
399
- retryable;
400
- status;
401
- phase;
402
- constructor(code, message, retryable, status, phase) {
403
- super(message);
404
- this.code = code;
405
- this.retryable = retryable;
406
- this.status = status;
407
- this.phase = phase;
408
- }
409
- }
410
- function validateTokens(value) {
411
- const parsed = deviceTokenPairSchema.safeParse(value);
412
- if (!parsed.success) {
413
- throw new ServerApiError('INVALID_MESSAGE', 'The Server returned invalid device credentials.', false);
414
- }
415
- return parsed.data;
416
- }
417
- function validateWebLogin(value) {
418
- const item = requireRecord(value, 'account login');
419
- if (typeof item.token !== 'string' || item.token.length < 16
420
- || !Number.isSafeInteger(item.expiresAt)
421
- || typeof item.account !== 'string' || item.account.length === 0 || item.account.length > 254
422
- || typeof item.isAdmin !== 'boolean') {
423
- throw new ServerApiError('INVALID_MESSAGE', 'The Server returned an invalid account session.', false);
424
- }
425
- return {
426
- token: item.token,
427
- expiresAt: item.expiresAt,
428
- account: item.account,
429
- profile: item.profile,
430
- isAdmin: item.isAdmin,
431
- };
432
- }
433
- async function parseBody(response) {
434
- const text = await response.text();
435
- if (text.length === 0)
436
- return undefined;
437
- try {
438
- return JSON.parse(text);
439
- }
440
- catch {
441
- throw new ServerApiError('INVALID_MESSAGE', 'The Server returned invalid JSON.', false, response.status);
442
- }
443
- }
444
- function mapStatus(status) {
445
- if (status === 401)
446
- return 'AUTH_INVALID';
447
- if (status === 403)
448
- return 'AUTH_REQUIRED';
449
- if (status === 404)
450
- return 'DEVICE_NOT_FOUND';
451
- if (status === 429)
452
- return 'RATE_LIMITED';
453
- return status >= 500 ? 'CONNECTION_FAILED' : 'INVALID_MESSAGE';
454
- }
455
- function parseHostDevice(value) {
456
- const item = requireRecord(value, 'host device');
457
- if (item.role !== 'host' || typeof item.deviceId !== 'string' || typeof item.name !== 'string'
458
- || typeof item.platform !== 'string' || typeof item.membershipId !== 'string' || item.membershipId.length === 0) {
459
- throw new ServerApiError('INVALID_MESSAGE', 'The Server returned invalid host device data.', false);
460
- }
461
- return {
462
- deviceId: item.deviceId,
463
- name: item.name,
464
- platform: item.platform,
465
- membershipId: item.membershipId,
466
- ...(typeof item.online === 'boolean' ? { online: item.online } : {}),
467
- ...(typeof item.lastSeenAt === 'number' && Number.isSafeInteger(item.lastSeenAt) ? { lastSeenAt: item.lastSeenAt } : {}),
468
- ...(typeof item.clientVersion === 'string' ? { clientVersion: item.clientVersion } : {}),
469
- ...(typeof item.harnessVersion === 'string' ? { harnessVersion: item.harnessVersion } : {}),
470
- };
471
- }
472
- function parseAuthorizedPeer(value) {
473
- const item = requireRecord(value, 'authorized peer');
474
- if ((item.role !== 'host' && item.role !== 'client')
475
- || typeof item.deviceId !== 'string' || item.deviceId.length === 0
476
- || typeof item.name !== 'string' || item.name.length === 0
477
- || typeof item.platform !== 'string' || item.platform.length === 0
478
- || typeof item.identityKey !== 'string' || !isIdentityKey(item.identityKey)
479
- || typeof item.membershipId !== 'string' || item.membershipId.length === 0) {
480
- throw new ServerApiError('INVALID_MESSAGE', 'The Server returned invalid authorized peer data.', false);
481
- }
482
- return {
483
- deviceId: item.deviceId,
484
- name: item.name,
485
- role: item.role,
486
- platform: item.platform,
487
- identityKey: item.identityKey,
488
- membershipId: item.membershipId,
489
- ...(typeof item.online === 'boolean' ? { online: item.online } : {}),
490
- ...(typeof item.lastSeenAt === 'number' && Number.isSafeInteger(item.lastSeenAt) ? { lastSeenAt: item.lastSeenAt } : {}),
491
- };
492
- }
493
- function parseIceServer(value) {
494
- const item = requireRecord(value, 'ICE server');
495
- const urls = item.urls;
496
- if (typeof urls !== 'string' && !(Array.isArray(urls) && urls.every(url => typeof url === 'string'))) {
497
- throw new ServerApiError('INVALID_MESSAGE', 'The Server returned an invalid ICE server.', false);
498
- }
499
- return {
500
- urls,
501
- ...(typeof item.username === 'string' ? { username: item.username } : {}),
502
- ...(typeof item.credential === 'string' ? { credential: item.credential } : {}),
503
- };
504
- }
505
- function isIdentityKey(value) {
506
- try {
507
- const decoded = fromBase64Url(value);
508
- return decoded.length === 32 && toBase64Url(decoded) === value;
509
- }
510
- catch {
511
- return false;
512
- }
513
- }
514
- function requireRecord(value, name) {
515
- if (typeof value !== 'object' || value === null || Array.isArray(value)) {
516
- throw new ServerApiError('INVALID_MESSAGE', `The Server returned invalid ${name} data.`, false);
517
- }
518
- return value;
519
- }
520
- //# sourceMappingURL=server-api.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-api.js","sourceRoot":"","sources":["../src/server-api.ts"],"names":[],"mappings":"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"}
@@ -1,79 +0,0 @@
1
- import { type RtcPeerConnectionFactory } from '@dsh-remote/webrtc';
2
- import type { ConnectionController } from './connection-controller.js';
3
- import type { ResolvedConfig } from './config.js';
4
- import type { HostIdentity, IdentityStore } from './identity-store.js';
5
- import type { SafeLogger } from './logging.js';
6
- import type { HostServerApi } from './server-api.js';
7
- interface WebSocketLike {
8
- readonly readyState: number;
9
- onopen: ((event: unknown) => void) | null;
10
- onmessage: ((event: {
11
- data: unknown;
12
- }) => void) | null;
13
- onerror: ((event: unknown) => void) | null;
14
- onclose: ((event: {
15
- code: number;
16
- reason: string;
17
- }) => void) | null;
18
- send(data: string): void;
19
- close(code?: number, reason?: string): void;
20
- }
21
- export type WebSocketFactory = (url: string) => WebSocketLike;
22
- export declare class HostServerConnection {
23
- private readonly config;
24
- private readonly identity;
25
- private readonly identities;
26
- private readonly api;
27
- private readonly connections;
28
- private readonly logger;
29
- private readonly createWebSocket;
30
- private readonly rtcFactoryProvider?;
31
- private readonly hostCapabilities;
32
- private readonly harnessVersion?;
33
- private socket?;
34
- private running?;
35
- private stopped;
36
- private online;
37
- private retryWake?;
38
- private readonly tunnels;
39
- private terminalError?;
40
- private lastActiveAt?;
41
- private reconnectRequested;
42
- private resumeQueued;
43
- private authRecoveryAttempted;
44
- private rtcFactory?;
45
- private negotiatedCapabilities;
46
- private controlFrameLimits;
47
- constructor(config: ResolvedConfig, identity: HostIdentity, identities: IdentityStore, api: HostServerApi, connections: ConnectionController, logger: SafeLogger, createWebSocket?: WebSocketFactory, rtcFactoryProvider?: (() => Promise<RtcPeerConnectionFactory | undefined>) | undefined, hostCapabilities?: () => readonly string[], harnessVersion?: string | undefined);
48
- start(): void;
49
- resume(): void;
50
- stop(): Promise<void>;
51
- isOnline(): boolean;
52
- lastError(): string | undefined;
53
- lastActivity(): number | undefined;
54
- isReconnecting(): boolean;
55
- reconnect(): void;
56
- private run;
57
- private connectOnce;
58
- private handleFrame;
59
- private handleConnectIncoming;
60
- private handleHandshake;
61
- private completeHandshake;
62
- private resumePendingHandshake;
63
- private handleRelay;
64
- private handleSignalOffer;
65
- private handleSignalIce;
66
- private handleTransportSelected;
67
- private canUseWebRtc;
68
- private sendRtcSignal;
69
- private handleRtcOpened;
70
- private handleRtcFailed;
71
- private sendTransportSelected;
72
- private sendRelay;
73
- private sendControl;
74
- private dropTunnels;
75
- private dropTunnel;
76
- private waitBeforeRetry;
77
- }
78
- export {};
79
- //# sourceMappingURL=server-connection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-connection.d.ts","sourceRoot":"","sources":["../src/server-connection.ts"],"names":[],"mappings":"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"}