@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.
- package/README.md +14 -3
- package/cordis.patch.yml +30 -30
- package/dist/client.github.js +1 -1
- package/dist/client.js +1 -1
- package/dist/index.js +1216 -396
- package/dist/index.js.map +4 -4
- package/dsh-plugin.json +41 -41
- package/package.json +165 -165
- package/dist/acp.d.ts +0 -75
- package/dist/acp.d.ts.map +0 -1
- package/dist/acp.js +0 -61
- package/dist/acp.js.map +0 -1
- package/dist/api-proxy-switch.d.ts +0 -33
- package/dist/api-proxy-switch.d.ts.map +0 -1
- package/dist/api-proxy-switch.js +0 -109
- package/dist/api-proxy-switch.js.map +0 -1
- package/dist/atomic-file.d.ts +0 -16
- package/dist/atomic-file.d.ts.map +0 -1
- package/dist/atomic-file.js +0 -81
- package/dist/atomic-file.js.map +0 -1
- package/dist/bin/doctor.d.ts +0 -3
- package/dist/bin/doctor.d.ts.map +0 -1
- package/dist/bin/doctor.js +0 -13
- package/dist/bin/doctor.js.map +0 -1
- package/dist/cli.d.ts +0 -32
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -289
- package/dist/cli.js.map +0 -1
- package/dist/client-runtime.d.ts +0 -375
- package/dist/client-runtime.d.ts.map +0 -1
- package/dist/client-runtime.js +0 -1768
- package/dist/client-runtime.js.map +0 -1
- package/dist/client-secure-transport.d.ts +0 -23
- package/dist/client-secure-transport.d.ts.map +0 -1
- package/dist/client-secure-transport.js +0 -144
- package/dist/client-secure-transport.js.map +0 -1
- package/dist/client-target-store.d.ts +0 -40
- package/dist/client-target-store.d.ts.map +0 -1
- package/dist/client-target-store.js +0 -79
- package/dist/client-target-store.js.map +0 -1
- package/dist/client.d.ts +0 -13
- package/dist/client.d.ts.map +0 -1
- package/dist/codex/app-server.d.ts +0 -71
- package/dist/codex/app-server.d.ts.map +0 -1
- package/dist/codex/app-server.js +0 -268
- package/dist/codex/app-server.js.map +0 -1
- package/dist/codex/codex-image-codec.d.ts +0 -7
- package/dist/codex/codex-image-codec.d.ts.map +0 -1
- package/dist/codex/codex-image-codec.js +0 -288
- package/dist/codex/codex-image-codec.js.map +0 -1
- package/dist/codex/domain.d.ts +0 -102
- package/dist/codex/domain.d.ts.map +0 -1
- package/dist/codex/domain.js +0 -1323
- package/dist/codex/domain.js.map +0 -1
- package/dist/codex/method-policy.d.ts +0 -338
- package/dist/codex/method-policy.d.ts.map +0 -1
- package/dist/codex/method-policy.js +0 -141
- package/dist/codex/method-policy.js.map +0 -1
- package/dist/codex/peer-bridge.d.ts +0 -57
- package/dist/codex/peer-bridge.d.ts.map +0 -1
- package/dist/codex/peer-bridge.js +0 -299
- package/dist/codex/peer-bridge.js.map +0 -1
- package/dist/codex/permissions.d.ts +0 -4
- package/dist/codex/permissions.d.ts.map +0 -1
- package/dist/codex/permissions.js +0 -21
- package/dist/codex/permissions.js.map +0 -1
- package/dist/codex/session-id.d.ts +0 -10
- package/dist/codex/session-id.d.ts.map +0 -1
- package/dist/codex/session-id.js +0 -15
- package/dist/codex/session-id.js.map +0 -1
- package/dist/codex/virtual-harness.d.ts +0 -209
- package/dist/codex/virtual-harness.d.ts.map +0 -1
- package/dist/codex/virtual-harness.js +0 -2650
- package/dist/codex/virtual-harness.js.map +0 -1
- package/dist/codex-workspace-bridge.d.ts +0 -108
- package/dist/codex-workspace-bridge.d.ts.map +0 -1
- package/dist/codex-workspace-bridge.js +0 -502
- package/dist/codex-workspace-bridge.js.map +0 -1
- package/dist/config.d.ts +0 -99
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -127
- package/dist/config.js.map +0 -1
- package/dist/connection-controller.d.ts +0 -44
- package/dist/connection-controller.d.ts.map +0 -1
- package/dist/connection-controller.js +0 -185
- package/dist/connection-controller.js.map +0 -1
- package/dist/control-route.d.ts +0 -34
- package/dist/control-route.d.ts.map +0 -1
- package/dist/control-route.js +0 -136
- package/dist/control-route.js.map +0 -1
- package/dist/control-runtime.d.ts +0 -138
- package/dist/control-runtime.d.ts.map +0 -1
- package/dist/control-runtime.js +0 -543
- package/dist/control-runtime.js.map +0 -1
- package/dist/control-stream.d.ts +0 -67
- package/dist/control-stream.d.ts.map +0 -1
- package/dist/control-stream.js +0 -179
- package/dist/control-stream.js.map +0 -1
- package/dist/defaults.d.ts +0 -9
- package/dist/defaults.d.ts.map +0 -1
- package/dist/defaults.js +0 -9
- package/dist/defaults.js.map +0 -1
- package/dist/file-viewer-bridge.d.ts +0 -30
- package/dist/file-viewer-bridge.d.ts.map +0 -1
- package/dist/file-viewer-bridge.js +0 -128
- package/dist/file-viewer-bridge.js.map +0 -1
- package/dist/file-viewer-contract.d.ts +0 -5
- package/dist/file-viewer-contract.d.ts.map +0 -1
- package/dist/file-viewer-contract.js +0 -4
- package/dist/file-viewer-contract.js.map +0 -1
- package/dist/harness-api-bridge.d.ts +0 -81
- package/dist/harness-api-bridge.d.ts.map +0 -1
- package/dist/harness-api-bridge.js +0 -862
- package/dist/harness-api-bridge.js.map +0 -1
- package/dist/harness-api-history.d.ts +0 -3
- package/dist/harness-api-history.d.ts.map +0 -1
- package/dist/harness-api-history.js +0 -59
- package/dist/harness-api-history.js.map +0 -1
- package/dist/harness-remote-bridge.d.ts +0 -60
- package/dist/harness-remote-bridge.d.ts.map +0 -1
- package/dist/harness-remote-bridge.js +0 -540
- package/dist/harness-remote-bridge.js.map +0 -1
- package/dist/harness-version.d.ts +0 -23
- package/dist/harness-version.d.ts.map +0 -1
- package/dist/harness-version.js +0 -95
- package/dist/harness-version.js.map +0 -1
- package/dist/identity-store.d.ts +0 -45
- package/dist/identity-store.d.ts.map +0 -1
- package/dist/identity-store.js +0 -186
- package/dist/identity-store.js.map +0 -1
- package/dist/ids.d.ts +0 -2
- package/dist/ids.d.ts.map +0 -1
- package/dist/ids.js +0 -17
- package/dist/ids.js.map +0 -1
- package/dist/index.d.ts +0 -78
- package/dist/index.d.ts.map +0 -1
- package/dist/logging.d.ts +0 -18
- package/dist/logging.d.ts.map +0 -1
- package/dist/logging.js +0 -30
- package/dist/logging.js.map +0 -1
- package/dist/loopback-host.d.ts +0 -20
- package/dist/loopback-host.d.ts.map +0 -1
- package/dist/loopback-host.js +0 -245
- package/dist/loopback-host.js.map +0 -1
- package/dist/loopback-preview.d.ts +0 -19
- package/dist/loopback-preview.d.ts.map +0 -1
- package/dist/loopback-preview.js +0 -232
- package/dist/loopback-preview.js.map +0 -1
- package/dist/native-rtc-helper.d.ts +0 -14
- package/dist/native-rtc-helper.d.ts.map +0 -1
- package/dist/native-rtc-helper.js +0 -575
- package/dist/native-rtc-helper.js.map +0 -1
- package/dist/remote-api-proxy.d.ts +0 -17
- package/dist/remote-api-proxy.d.ts.map +0 -1
- package/dist/remote-api-proxy.js +0 -451
- package/dist/remote-api-proxy.js.map +0 -1
- package/dist/remote-directory-browser.d.ts +0 -16
- package/dist/remote-directory-browser.d.ts.map +0 -1
- package/dist/remote-directory-browser.js +0 -48
- package/dist/remote-directory-browser.js.map +0 -1
- package/dist/remote-file-content-provider.d.ts +0 -48
- package/dist/remote-file-content-provider.d.ts.map +0 -1
- package/dist/remote-file-content-provider.js +0 -93
- package/dist/remote-file-content-provider.js.map +0 -1
- package/dist/remote-typert-gateway.d.ts +0 -20
- package/dist/remote-typert-gateway.d.ts.map +0 -1
- package/dist/remote-typert-gateway.js +0 -334
- package/dist/remote-typert-gateway.js.map +0 -1
- package/dist/rpc-binary-attachments.d.ts +0 -33
- package/dist/rpc-binary-attachments.d.ts.map +0 -1
- package/dist/rpc-binary-attachments.js +0 -142
- package/dist/rpc-binary-attachments.js.map +0 -1
- package/dist/rpc-router.d.ts +0 -31
- package/dist/rpc-router.d.ts.map +0 -1
- package/dist/rpc-router.js +0 -201
- package/dist/rpc-router.js.map +0 -1
- package/dist/safe-error.d.ts +0 -8
- package/dist/safe-error.d.ts.map +0 -1
- package/dist/safe-error.js +0 -20
- package/dist/safe-error.js.map +0 -1
- package/dist/server-api.d.ts +0 -109
- package/dist/server-api.d.ts.map +0 -1
- package/dist/server-api.js +0 -520
- package/dist/server-api.js.map +0 -1
- package/dist/server-connection.d.ts +0 -79
- package/dist/server-connection.d.ts.map +0 -1
- package/dist/server-connection.js +0 -1023
- package/dist/server-connection.js.map +0 -1
- package/dist/server-credentials.d.ts +0 -55
- package/dist/server-credentials.d.ts.map +0 -1
- package/dist/server-credentials.js +0 -108
- package/dist/server-credentials.js.map +0 -1
- package/dist/service.d.ts +0 -151
- package/dist/service.d.ts.map +0 -1
- package/dist/service.js +0 -448
- package/dist/service.js.map +0 -1
- package/dist/session-format-compat.d.ts +0 -3
- package/dist/session-format-compat.d.ts.map +0 -1
- package/dist/session-format-compat.js +0 -183
- package/dist/session-format-compat.js.map +0 -1
- package/dist/status-stream.d.ts +0 -48
- package/dist/status-stream.d.ts.map +0 -1
- package/dist/status-stream.js +0 -133
- package/dist/status-stream.js.map +0 -1
- package/dist/terminal-policy.d.ts +0 -21
- package/dist/terminal-policy.d.ts.map +0 -1
- package/dist/terminal-policy.js +0 -68
- package/dist/terminal-policy.js.map +0 -1
- package/dist/tui-command.d.ts +0 -13
- package/dist/tui-command.d.ts.map +0 -1
- package/dist/tui-command.js +0 -392
- package/dist/tui-command.js.map +0 -1
- package/dist/typert-gateway-contract.d.ts +0 -59
- package/dist/typert-gateway-contract.d.ts.map +0 -1
- package/dist/typert-gateway-contract.js +0 -2
- package/dist/typert-gateway-contract.js.map +0 -1
- package/dist/typert-gateway-switch.d.ts +0 -85
- package/dist/typert-gateway-switch.d.ts.map +0 -1
- package/dist/typert-gateway-switch.js +0 -448
- package/dist/typert-gateway-switch.js.map +0 -1
- package/dist/types.d.ts +0 -20
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/version.d.ts +0 -12
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -12
- package/dist/version.js.map +0 -1
- package/dist/werift-rtc.d.ts +0 -121
- package/dist/werift-rtc.d.ts.map +0 -1
- package/dist/werift-rtc.js +0 -490
- package/dist/werift-rtc.js.map +0 -1
package/dist/server-api.js
DELETED
|
@@ -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
|
package/dist/server-api.js.map
DELETED
|
@@ -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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"}
|