ds-harness-remote 0.3.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 (130) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -0
  3. package/cordis.patch.yml +7 -0
  4. package/dist/adapters/agent-adapter.d.ts +35 -0
  5. package/dist/adapters/agent-adapter.d.ts.map +1 -0
  6. package/dist/adapters/agent-adapter.js +80 -0
  7. package/dist/adapters/agent-adapter.js.map +1 -0
  8. package/dist/adapters/permission-adapter.d.ts +13 -0
  9. package/dist/adapters/permission-adapter.d.ts.map +1 -0
  10. package/dist/adapters/permission-adapter.js +67 -0
  11. package/dist/adapters/permission-adapter.js.map +1 -0
  12. package/dist/adapters/session-adapter.d.ts +38 -0
  13. package/dist/adapters/session-adapter.d.ts.map +1 -0
  14. package/dist/adapters/session-adapter.js +230 -0
  15. package/dist/adapters/session-adapter.js.map +1 -0
  16. package/dist/adapters/workspace-adapter.d.ts +13 -0
  17. package/dist/adapters/workspace-adapter.d.ts.map +1 -0
  18. package/dist/adapters/workspace-adapter.js +21 -0
  19. package/dist/adapters/workspace-adapter.js.map +1 -0
  20. package/dist/api-proxy-switch.d.ts +33 -0
  21. package/dist/api-proxy-switch.d.ts.map +1 -0
  22. package/dist/api-proxy-switch.js +107 -0
  23. package/dist/api-proxy-switch.js.map +1 -0
  24. package/dist/bin/doctor.d.ts +3 -0
  25. package/dist/bin/doctor.d.ts.map +1 -0
  26. package/dist/bin/doctor.js +13 -0
  27. package/dist/bin/doctor.js.map +1 -0
  28. package/dist/client-runtime.d.ts +98 -0
  29. package/dist/client-runtime.d.ts.map +1 -0
  30. package/dist/client-runtime.js +421 -0
  31. package/dist/client-runtime.js.map +1 -0
  32. package/dist/client-secure-transport.d.ts +22 -0
  33. package/dist/client-secure-transport.d.ts.map +1 -0
  34. package/dist/client-secure-transport.js +129 -0
  35. package/dist/client-secure-transport.js.map +1 -0
  36. package/dist/client.d.ts +12 -0
  37. package/dist/client.d.ts.map +1 -0
  38. package/dist/client.github.js +2938 -0
  39. package/dist/client.js +2938 -0
  40. package/dist/client.js.map +1 -0
  41. package/dist/config.d.ts +33 -0
  42. package/dist/config.d.ts.map +1 -0
  43. package/dist/config.js +80 -0
  44. package/dist/config.js.map +1 -0
  45. package/dist/connection-controller.d.ts +39 -0
  46. package/dist/connection-controller.d.ts.map +1 -0
  47. package/dist/connection-controller.js +170 -0
  48. package/dist/connection-controller.js.map +1 -0
  49. package/dist/control-runtime.d.ts +36 -0
  50. package/dist/control-runtime.d.ts.map +1 -0
  51. package/dist/control-runtime.js +265 -0
  52. package/dist/control-runtime.js.map +1 -0
  53. package/dist/event-sequencer.d.ts +23 -0
  54. package/dist/event-sequencer.d.ts.map +1 -0
  55. package/dist/event-sequencer.js +54 -0
  56. package/dist/event-sequencer.js.map +1 -0
  57. package/dist/harness-api-bridge.d.ts +55 -0
  58. package/dist/harness-api-bridge.d.ts.map +1 -0
  59. package/dist/harness-api-bridge.js +387 -0
  60. package/dist/harness-api-bridge.js.map +1 -0
  61. package/dist/identity-store.d.ts +45 -0
  62. package/dist/identity-store.d.ts.map +1 -0
  63. package/dist/identity-store.js +183 -0
  64. package/dist/identity-store.js.map +1 -0
  65. package/dist/ids.d.ts +2 -0
  66. package/dist/ids.d.ts.map +1 -0
  67. package/dist/ids.js +17 -0
  68. package/dist/ids.js.map +1 -0
  69. package/dist/index.d.ts +38 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +16091 -0
  72. package/dist/index.js.map +7 -0
  73. package/dist/logging.d.ts +18 -0
  74. package/dist/logging.d.ts.map +1 -0
  75. package/dist/logging.js +30 -0
  76. package/dist/logging.js.map +1 -0
  77. package/dist/pairing-controller.d.ts +52 -0
  78. package/dist/pairing-controller.d.ts.map +1 -0
  79. package/dist/pairing-controller.js +73 -0
  80. package/dist/pairing-controller.js.map +1 -0
  81. package/dist/pending-approvals.d.ts +14 -0
  82. package/dist/pending-approvals.d.ts.map +1 -0
  83. package/dist/pending-approvals.js +52 -0
  84. package/dist/pending-approvals.js.map +1 -0
  85. package/dist/remote-api-proxy.d.ts +12 -0
  86. package/dist/remote-api-proxy.d.ts.map +1 -0
  87. package/dist/remote-api-proxy.js +191 -0
  88. package/dist/remote-api-proxy.js.map +1 -0
  89. package/dist/remote-directory-browser.d.ts +16 -0
  90. package/dist/remote-directory-browser.d.ts.map +1 -0
  91. package/dist/remote-directory-browser.js +48 -0
  92. package/dist/remote-directory-browser.js.map +1 -0
  93. package/dist/rpc-router.d.ts +21 -0
  94. package/dist/rpc-router.d.ts.map +1 -0
  95. package/dist/rpc-router.js +93 -0
  96. package/dist/rpc-router.js.map +1 -0
  97. package/dist/server-api.d.ts +80 -0
  98. package/dist/server-api.d.ts.map +1 -0
  99. package/dist/server-api.js +405 -0
  100. package/dist/server-api.js.map +1 -0
  101. package/dist/server-connection.d.ts +70 -0
  102. package/dist/server-connection.d.ts.map +1 -0
  103. package/dist/server-connection.js +759 -0
  104. package/dist/server-connection.js.map +1 -0
  105. package/dist/server-credentials.d.ts +46 -0
  106. package/dist/server-credentials.d.ts.map +1 -0
  107. package/dist/server-credentials.js +71 -0
  108. package/dist/server-credentials.js.map +1 -0
  109. package/dist/service.d.ts +56 -0
  110. package/dist/service.d.ts.map +1 -0
  111. package/dist/service.js +162 -0
  112. package/dist/service.js.map +1 -0
  113. package/dist/typert-gateway-switch.d.ts +19 -0
  114. package/dist/typert-gateway-switch.d.ts.map +1 -0
  115. package/dist/typert-gateway-switch.js +41 -0
  116. package/dist/typert-gateway-switch.js.map +1 -0
  117. package/dist/types.d.ts +20 -0
  118. package/dist/types.d.ts.map +1 -0
  119. package/dist/types.js +2 -0
  120. package/dist/types.js.map +1 -0
  121. package/dist/version.d.ts +12 -0
  122. package/dist/version.d.ts.map +1 -0
  123. package/dist/version.js +12 -0
  124. package/dist/version.js.map +1 -0
  125. package/dist/werift-rtc.d.ts +85 -0
  126. package/dist/werift-rtc.d.ts.map +1 -0
  127. package/dist/werift-rtc.js +164 -0
  128. package/dist/werift-rtc.js.map +1 -0
  129. package/package.json +98 -0
  130. package/public.d.ts +19 -0
@@ -0,0 +1,93 @@
1
+ import { createRpcError, createRpcResponse, } from '@dsh-remote/protocol';
2
+ import { z } from 'zod';
3
+ const wireRequestSchema = z.object({ method: z.string().min(1), params: z.unknown() }).strict();
4
+ const apiMethods = new Set([
5
+ 'harness.api.call',
6
+ 'harness.api.respond',
7
+ 'harness.api.stream.open',
8
+ 'harness.api.stream.close',
9
+ ]);
10
+ export const HOST_CAPABILITIES = ['harness.api.v1'];
11
+ export class RpcRouter {
12
+ harnessApi;
13
+ maxPending;
14
+ logger;
15
+ active = 0;
16
+ constructor(harnessApi, maxPending = 128, logger) {
17
+ this.harnessApi = harnessApi;
18
+ this.maxPending = maxPending;
19
+ this.logger = logger;
20
+ }
21
+ closePeerStreams() { return this.harnessApi.closeAll(); }
22
+ async handle(message) {
23
+ if (message.type !== 'rpc.request') {
24
+ return createRpcError(message.id, 'INVALID_MESSAGE', 'Only RPC requests are accepted on the Host business channel.');
25
+ }
26
+ const parsedPayload = wireRequestSchema.safeParse(message.payload);
27
+ if (!parsedPayload.success)
28
+ return createRpcError(message.id, 'INVALID_MESSAGE', 'The RPC request payload is invalid.');
29
+ if (!apiMethods.has(parsedPayload.data.method)) {
30
+ return createRpcError(message.id, 'METHOD_NOT_FOUND', 'The requested method does not exist.');
31
+ }
32
+ const request = message;
33
+ if (this.active >= this.maxPending) {
34
+ return createRpcError(request.id, 'RATE_LIMITED', 'Too many Host requests are already pending.', undefined, true);
35
+ }
36
+ this.active += 1;
37
+ const startedAt = performance.now();
38
+ try {
39
+ const result = await this.invoke(request.payload.method, request.payload.params);
40
+ this.logger?.debug('host rpc ok', {
41
+ method: request.payload.method,
42
+ durationMs: Math.round(performance.now() - startedAt),
43
+ });
44
+ return createRpcResponse(request.id, result);
45
+ }
46
+ catch (error) {
47
+ const response = errorResponse(request.id, error);
48
+ this.logger?.warn('host rpc failed', {
49
+ method: request.payload.method,
50
+ durationMs: Math.round(performance.now() - startedAt),
51
+ code: response.payload.code,
52
+ retryable: response.payload.retryable,
53
+ reason: diagnosticReason(error),
54
+ });
55
+ return response;
56
+ }
57
+ finally {
58
+ this.active -= 1;
59
+ }
60
+ }
61
+ invoke(method, params) {
62
+ switch (method) {
63
+ case 'harness.api.call': return this.harnessApi.call(params);
64
+ case 'harness.api.respond': return this.harnessApi.respond(params);
65
+ case 'harness.api.stream.open': return this.harnessApi.openStream(params);
66
+ case 'harness.api.stream.close': return this.harnessApi.closeStream(params);
67
+ default: throw new RpcError('METHOD_NOT_FOUND', 'The requested method does not exist.');
68
+ }
69
+ }
70
+ }
71
+ export class RpcError extends Error {
72
+ code;
73
+ details;
74
+ retryable;
75
+ constructor(code, message, details, retryable = false) {
76
+ super(message);
77
+ this.code = code;
78
+ this.details = details;
79
+ this.retryable = retryable;
80
+ }
81
+ }
82
+ function errorResponse(requestId, error) {
83
+ if (error instanceof RpcError)
84
+ return createRpcError(requestId, error.code, error.message, error.details, error.retryable);
85
+ if (error instanceof z.ZodError)
86
+ return createRpcError(requestId, 'INVALID_MESSAGE', 'The RPC parameters are invalid.');
87
+ return createRpcError(requestId, 'INTERNAL_ERROR', 'The Host could not complete the request.');
88
+ }
89
+ function diagnosticReason(error) {
90
+ const message = error instanceof Error ? error.message : String(error);
91
+ return message.replace(/[\r\n]+/g, ' ').slice(0, 160) || 'Unknown Host request failure.';
92
+ }
93
+ //# sourceMappingURL=rpc-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-router.js","sourceRoot":"","sources":["../src/rpc-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import type { RtcIceServer } from '@dsh-remote/webrtc';
2
+ import type { HostIdentity } from './identity-store.js';
3
+ import type { ServerCredentialStore, ServerCredentials } from './server-credentials.js';
4
+ export interface OAuthQrSession {
5
+ qrId: string;
6
+ scanUrl: string;
7
+ expiresIn: number;
8
+ }
9
+ export type OAuthQrPollResult = {
10
+ status: 'pending' | 'expired';
11
+ } | {
12
+ status: 'complete';
13
+ authorization: DeviceAuthorization;
14
+ };
15
+ export interface DeviceAuthorization {
16
+ method: 'account' | 'host_registration_code' | 'owned_device';
17
+ account?: string;
18
+ expiresAt?: number;
19
+ isAdmin?: boolean;
20
+ }
21
+ export type FetchImplementation = typeof fetch;
22
+ export interface ServerHostDevice {
23
+ deviceId: string;
24
+ name: string;
25
+ platform: string;
26
+ membershipId: string;
27
+ online?: boolean;
28
+ lastSeenAt?: number;
29
+ clientVersion?: string;
30
+ harnessVersion?: string;
31
+ }
32
+ export interface AuthorizedPeerDevice extends ServerHostDevice {
33
+ role: 'host' | 'client';
34
+ identityKey: string;
35
+ }
36
+ export declare class HostServerApi {
37
+ private readonly store;
38
+ private readonly fetchImplementation;
39
+ private readonly role;
40
+ readonly baseUrl: string;
41
+ private identity?;
42
+ private credentials?;
43
+ private credentialsPromise?;
44
+ constructor(serverUrl: string, store: ServerCredentialStore, fetchImplementation?: FetchImplementation, role?: 'host' | 'client');
45
+ bindIdentity(identity: HostIdentity): void;
46
+ currentAuthorization(): DeviceAuthorization | undefined;
47
+ clearAuthorization(): Promise<void>;
48
+ revokeCurrentDevice(): Promise<void>;
49
+ authorizeWithAccount(identity: HostIdentity, email: string, password: string): Promise<DeviceAuthorization>;
50
+ startOAuthQrLogin(): Promise<OAuthQrSession>;
51
+ pollOAuthQrLogin(identity: HostIdentity, qrId: string): Promise<OAuthQrPollResult>;
52
+ authorizeHostWithCode(identity: HostIdentity, code: string): Promise<DeviceAuthorization>;
53
+ authorizeOwnedRole(identity: HostIdentity, authorizingAccessToken: string, account?: string): Promise<DeviceAuthorization>;
54
+ authenticate(identity?: HostIdentity): Promise<ServerCredentials>;
55
+ refreshCredentials(): Promise<ServerCredentials>;
56
+ listDevices(): Promise<ServerHostDevice[]>;
57
+ deviceFor(peerDeviceId: string): Promise<AuthorizedPeerDevice>;
58
+ turnCredentials(connectionId: string): Promise<RtcIceServer[]>;
59
+ presenceFor(deviceId: string): Promise<{
60
+ online: boolean;
61
+ lastSeenAt?: number;
62
+ }>;
63
+ private loadOrIssue;
64
+ private register;
65
+ private deviceDescriptor;
66
+ private saveTokens;
67
+ private request;
68
+ private publicRequest;
69
+ private requireIdentity;
70
+ }
71
+ export declare class ClientServerApi extends HostServerApi {
72
+ constructor(serverUrl: string, store: ServerCredentialStore, fetchImplementation?: FetchImplementation);
73
+ }
74
+ export declare class ServerApiError extends Error {
75
+ readonly code: string;
76
+ readonly retryable: boolean;
77
+ readonly status?: number | undefined;
78
+ constructor(code: string, message: string, retryable: boolean, status?: number | undefined);
79
+ }
80
+ //# sourceMappingURL=server-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-api.d.ts","sourceRoot":"","sources":["../src/server-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,405 @@
1
+ import { platform } from 'node:os';
2
+ import { fromBase64Url, toBase64Url } from '@dsh-remote/crypto';
3
+ import { normalizeServerUrl } from './config.js';
4
+ import { PLUGIN_VERSION } from './version.js';
5
+ export class HostServerApi {
6
+ store;
7
+ fetchImplementation;
8
+ role;
9
+ baseUrl;
10
+ identity;
11
+ credentials;
12
+ credentialsPromise;
13
+ constructor(serverUrl, store, fetchImplementation = fetch, role = 'host') {
14
+ this.store = store;
15
+ this.fetchImplementation = fetchImplementation;
16
+ this.role = role;
17
+ this.baseUrl = normalizeServerUrl(serverUrl);
18
+ }
19
+ bindIdentity(identity) { this.identity = identity; }
20
+ currentAuthorization() {
21
+ if (this.credentials === undefined)
22
+ return undefined;
23
+ return {
24
+ method: this.credentials.authorizationMethod,
25
+ ...(this.credentials.account === undefined ? {} : { account: this.credentials.account }),
26
+ };
27
+ }
28
+ async clearAuthorization() {
29
+ this.credentials = undefined;
30
+ this.credentialsPromise = undefined;
31
+ await this.store.clear();
32
+ }
33
+ async revokeCurrentDevice() {
34
+ const identity = this.requireIdentity();
35
+ if (await this.store.load(this.baseUrl, identity.deviceId) === undefined) {
36
+ await this.clearAuthorization();
37
+ return;
38
+ }
39
+ try {
40
+ await this.request('/api/v1/devices/self', { method: 'DELETE' });
41
+ }
42
+ finally {
43
+ await this.clearAuthorization();
44
+ }
45
+ }
46
+ async authorizeWithAccount(identity, email, password) {
47
+ this.bindIdentity(identity);
48
+ const account = email.trim();
49
+ if (account.length === 0 || password.length === 0) {
50
+ throw new ServerApiError('INVALID_MESSAGE', 'Email and password are required.', false);
51
+ }
52
+ const login = validateWebLogin(await this.publicRequest('/api/v1/auth/login', {
53
+ method: 'POST',
54
+ body: JSON.stringify({ email: account, password }),
55
+ }));
56
+ await this.register(identity, {
57
+ accountToken: login.token,
58
+ account: login.account,
59
+ authorizationMethod: 'account',
60
+ });
61
+ return {
62
+ method: 'account',
63
+ account: login.account,
64
+ expiresAt: login.expiresAt,
65
+ isAdmin: login.isAdmin,
66
+ };
67
+ }
68
+ async startOAuthQrLogin() {
69
+ const value = requireRecord(await this.publicRequest('/api/v1/auth/oauth/qr/start', {
70
+ method: 'POST',
71
+ body: '{}',
72
+ }), 'QR login');
73
+ if (typeof value.qrId !== 'string' || value.qrId.length < 20
74
+ || typeof value.scanUrl !== 'string' || !value.scanUrl.startsWith(`${this.baseUrl}/`)
75
+ || !Number.isSafeInteger(value.expiresIn)) {
76
+ throw new ServerApiError('INVALID_MESSAGE', 'The Server returned an invalid QR login session.', false);
77
+ }
78
+ return { qrId: value.qrId, scanUrl: value.scanUrl, expiresIn: value.expiresIn };
79
+ }
80
+ async pollOAuthQrLogin(identity, qrId) {
81
+ const value = requireRecord(await this.publicRequest(`/api/v1/auth/oauth/qr/${encodeURIComponent(qrId)}`, { method: 'GET' }), 'QR login status');
82
+ if (value.status === 'pending' || value.status === 'expired')
83
+ return { status: value.status };
84
+ if (value.status !== 'complete' || typeof value.token !== 'string' || value.token.length < 16) {
85
+ throw new ServerApiError('INVALID_MESSAGE', 'The Server returned an invalid QR login status.', false);
86
+ }
87
+ const account = requireRecord(await this.publicRequest('/api/v1/auth/me', { method: 'GET' }, value.token), 'account profile');
88
+ if (typeof account.account !== 'string' || account.account.length === 0 || typeof account.isAdmin !== 'boolean') {
89
+ throw new ServerApiError('INVALID_MESSAGE', 'The Server returned an invalid account profile.', false);
90
+ }
91
+ await this.register(identity, {
92
+ accountToken: value.token,
93
+ account: account.account,
94
+ authorizationMethod: 'account',
95
+ });
96
+ return {
97
+ status: 'complete',
98
+ authorization: { method: 'account', account: account.account, isAdmin: account.isAdmin },
99
+ };
100
+ }
101
+ async authorizeHostWithCode(identity, code) {
102
+ if (this.role !== 'host') {
103
+ throw new ServerApiError('METHOD_NOT_ALLOWED', 'Host registration codes can only authorize a Host device.', false);
104
+ }
105
+ const registrationCode = code.trim().toUpperCase();
106
+ if (registrationCode.length === 0) {
107
+ throw new ServerApiError('INVALID_MESSAGE', 'A Host registration code is required.', false);
108
+ }
109
+ this.bindIdentity(identity);
110
+ const tokens = await this.publicRequest('/api/v1/devices/register-with-code', {
111
+ method: 'POST',
112
+ body: JSON.stringify({ v: 1, code: registrationCode, device: this.deviceDescriptor(identity) }),
113
+ });
114
+ this.credentials = await this.saveTokens(identity, validateTokens(tokens), {
115
+ authorizationMethod: 'host_registration_code',
116
+ });
117
+ return { method: 'host_registration_code' };
118
+ }
119
+ async authorizeOwnedRole(identity, authorizingAccessToken, account) {
120
+ this.bindIdentity(identity);
121
+ const tokens = await this.publicRequest('/api/v1/devices/register-owned-role', {
122
+ method: 'POST',
123
+ body: JSON.stringify({ v: 1, device: this.deviceDescriptor(identity) }),
124
+ }, authorizingAccessToken);
125
+ this.credentials = await this.saveTokens(identity, validateTokens(tokens), {
126
+ authorizationMethod: 'owned_device',
127
+ ...(account === undefined ? {} : { account }),
128
+ });
129
+ return {
130
+ method: 'owned_device',
131
+ ...(account === undefined ? {} : { account }),
132
+ };
133
+ }
134
+ async authenticate(identity = this.requireIdentity()) {
135
+ this.bindIdentity(identity);
136
+ if (this.credentials !== undefined && this.credentials.accessTokenExpiresAt > Date.now() + 30_000) {
137
+ return this.credentials;
138
+ }
139
+ this.credentialsPromise ??= this.loadOrIssue(identity).finally(() => { this.credentialsPromise = undefined; });
140
+ this.credentials = await this.credentialsPromise;
141
+ return this.credentials;
142
+ }
143
+ async refreshCredentials() {
144
+ const identity = this.requireIdentity();
145
+ const stored = await this.store.load(this.baseUrl, identity.deviceId);
146
+ if (stored === undefined || stored.refreshTokenExpiresAt <= Date.now())
147
+ return this.register(identity);
148
+ const tokens = await this.publicRequest('/api/v1/auth/refresh', {
149
+ method: 'POST',
150
+ body: JSON.stringify({ deviceId: identity.deviceId, refreshToken: stored.refreshToken }),
151
+ });
152
+ this.credentials = await this.store.save({
153
+ serverUrl: this.baseUrl,
154
+ deviceId: identity.deviceId,
155
+ authorizationMethod: stored.authorizationMethod,
156
+ ...(stored.account === undefined ? {} : { account: stored.account }),
157
+ ...validateTokens(tokens),
158
+ });
159
+ return this.credentials;
160
+ }
161
+ async listDevices() {
162
+ const result = await this.request('/api/v1/devices');
163
+ if (!Array.isArray(result.items))
164
+ throw new ServerApiError('INVALID_MESSAGE', 'The Server returned an invalid device list.', false);
165
+ return result.items.map(parseHostDevice);
166
+ }
167
+ async deviceFor(peerDeviceId) {
168
+ const result = await this.request(`/api/v1/devices/${encodeURIComponent(peerDeviceId)}`);
169
+ return parseAuthorizedPeer(result);
170
+ }
171
+ async turnCredentials(connectionId) {
172
+ const result = await this.request(`/api/v1/turn/credentials?connection_id=${encodeURIComponent(connectionId)}`);
173
+ if (!Array.isArray(result.iceServers))
174
+ return [];
175
+ return result.iceServers.map(parseIceServer);
176
+ }
177
+ async presenceFor(deviceId) {
178
+ const result = await this.request(`/api/v1/devices/${encodeURIComponent(deviceId)}/presence`);
179
+ if (typeof result.online !== 'boolean'
180
+ || (result.lastSeenAt !== null && result.lastSeenAt !== undefined && !Number.isSafeInteger(result.lastSeenAt))) {
181
+ throw new ServerApiError('INVALID_MESSAGE', 'The Server returned invalid device presence.', false);
182
+ }
183
+ return { online: result.online, ...(typeof result.lastSeenAt === 'number' ? { lastSeenAt: result.lastSeenAt } : {}) };
184
+ }
185
+ async loadOrIssue(identity) {
186
+ const stored = await this.store.load(this.baseUrl, identity.deviceId);
187
+ if (stored === undefined || stored.refreshTokenExpiresAt <= Date.now() + 30_000) {
188
+ return this.register(identity);
189
+ }
190
+ if (stored.accessTokenExpiresAt > Date.now() + 30_000)
191
+ return stored;
192
+ const tokens = await this.publicRequest('/api/v1/auth/refresh', {
193
+ method: 'POST',
194
+ body: JSON.stringify({ deviceId: identity.deviceId, refreshToken: stored.refreshToken }),
195
+ });
196
+ return this.store.save({
197
+ serverUrl: this.baseUrl,
198
+ deviceId: identity.deviceId,
199
+ authorizationMethod: stored.authorizationMethod,
200
+ ...(stored.account === undefined ? {} : { account: stored.account }),
201
+ ...validateTokens(tokens),
202
+ });
203
+ }
204
+ async register(identity, authorization) {
205
+ const tokens = await this.publicRequest('/api/v1/devices/register', {
206
+ method: 'POST',
207
+ body: JSON.stringify({
208
+ v: 1,
209
+ device: this.deviceDescriptor(identity),
210
+ }),
211
+ }, authorization?.accountToken);
212
+ this.credentials = await this.saveTokens(identity, validateTokens(tokens), {
213
+ authorizationMethod: authorization?.authorizationMethod ?? 'account',
214
+ ...(authorization?.account === undefined ? {} : { account: authorization.account }),
215
+ });
216
+ return this.credentials;
217
+ }
218
+ deviceDescriptor(identity) {
219
+ return {
220
+ deviceId: identity.deviceId,
221
+ name: identity.name,
222
+ role: this.role,
223
+ platform: platform(),
224
+ identityKey: identity.publicKey,
225
+ clientVersion: PLUGIN_VERSION,
226
+ ...(this.role === 'host' ? { harnessVersion: '0.1.0-rc.6' } : {}),
227
+ };
228
+ }
229
+ saveTokens(identity, tokens, authorization) {
230
+ return this.store.save({
231
+ serverUrl: this.baseUrl,
232
+ deviceId: identity.deviceId,
233
+ authorizationMethod: authorization.authorizationMethod,
234
+ ...(authorization.account === undefined ? {} : { account: authorization.account }),
235
+ ...tokens,
236
+ });
237
+ }
238
+ async request(path, init = {}) {
239
+ const credentials = await this.authenticate();
240
+ return this.publicRequest(path, init, credentials.accessToken);
241
+ }
242
+ async publicRequest(path, init, accessToken) {
243
+ const controller = new AbortController();
244
+ const timer = setTimeout(() => controller.abort(), 10_000);
245
+ let response;
246
+ try {
247
+ response = await this.fetchImplementation(`${this.baseUrl}${path}`, {
248
+ ...init,
249
+ signal: controller.signal,
250
+ headers: {
251
+ Accept: 'application/json',
252
+ 'Content-Type': 'application/json',
253
+ ...(accessToken === undefined ? {} : { Authorization: `Bearer ${accessToken}` }),
254
+ ...init.headers,
255
+ },
256
+ });
257
+ }
258
+ catch (error) {
259
+ throw new ServerApiError('CONNECTION_FAILED', error instanceof Error ? error.message : 'Server request failed.', true);
260
+ }
261
+ finally {
262
+ clearTimeout(timer);
263
+ }
264
+ const body = await parseBody(response);
265
+ if (!response.ok) {
266
+ const envelope = (body ?? {});
267
+ 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);
268
+ }
269
+ return body;
270
+ }
271
+ requireIdentity() {
272
+ if (this.identity === undefined)
273
+ throw new ServerApiError('IDENTITY_INVALID', 'The device identity is not loaded.', false);
274
+ return this.identity;
275
+ }
276
+ }
277
+ export class ClientServerApi extends HostServerApi {
278
+ constructor(serverUrl, store, fetchImplementation = fetch) {
279
+ super(serverUrl, store, fetchImplementation, 'client');
280
+ }
281
+ }
282
+ export class ServerApiError extends Error {
283
+ code;
284
+ retryable;
285
+ status;
286
+ constructor(code, message, retryable, status) {
287
+ super(message);
288
+ this.code = code;
289
+ this.retryable = retryable;
290
+ this.status = status;
291
+ }
292
+ }
293
+ function validateTokens(value) {
294
+ if (typeof value.accessToken !== 'string' || value.accessToken.length < 16
295
+ || typeof value.refreshToken !== 'string' || value.refreshToken.length < 16
296
+ || !Number.isSafeInteger(value.accessTokenExpiresAt)
297
+ || !Number.isSafeInteger(value.refreshTokenExpiresAt)) {
298
+ throw new ServerApiError('INVALID_MESSAGE', 'The Server returned invalid device credentials.', false);
299
+ }
300
+ return value;
301
+ }
302
+ function validateWebLogin(value) {
303
+ const item = requireRecord(value, 'account login');
304
+ if (typeof item.token !== 'string' || item.token.length < 16
305
+ || !Number.isSafeInteger(item.expiresAt)
306
+ || typeof item.account !== 'string' || item.account.length === 0 || item.account.length > 254
307
+ || typeof item.isAdmin !== 'boolean') {
308
+ throw new ServerApiError('INVALID_MESSAGE', 'The Server returned an invalid account session.', false);
309
+ }
310
+ return {
311
+ token: item.token,
312
+ expiresAt: item.expiresAt,
313
+ account: item.account,
314
+ profile: item.profile,
315
+ isAdmin: item.isAdmin,
316
+ };
317
+ }
318
+ async function parseBody(response) {
319
+ const text = await response.text();
320
+ if (text.length === 0)
321
+ return undefined;
322
+ try {
323
+ return JSON.parse(text);
324
+ }
325
+ catch {
326
+ throw new ServerApiError('INVALID_MESSAGE', 'The Server returned invalid JSON.', false, response.status);
327
+ }
328
+ }
329
+ function mapStatus(status) {
330
+ if (status === 401)
331
+ return 'AUTH_INVALID';
332
+ if (status === 403)
333
+ return 'AUTH_REQUIRED';
334
+ if (status === 404)
335
+ return 'DEVICE_NOT_FOUND';
336
+ if (status === 429)
337
+ return 'RATE_LIMITED';
338
+ return status >= 500 ? 'CONNECTION_FAILED' : 'INVALID_MESSAGE';
339
+ }
340
+ function parseHostDevice(value) {
341
+ const item = requireRecord(value, 'host device');
342
+ if (item.role !== 'host' || typeof item.deviceId !== 'string' || typeof item.name !== 'string'
343
+ || typeof item.platform !== 'string' || typeof item.membershipId !== 'string' || item.membershipId.length === 0) {
344
+ throw new ServerApiError('INVALID_MESSAGE', 'The Server returned invalid host device data.', false);
345
+ }
346
+ return {
347
+ deviceId: item.deviceId,
348
+ name: item.name,
349
+ platform: item.platform,
350
+ membershipId: item.membershipId,
351
+ ...(typeof item.online === 'boolean' ? { online: item.online } : {}),
352
+ ...(typeof item.lastSeenAt === 'number' && Number.isSafeInteger(item.lastSeenAt) ? { lastSeenAt: item.lastSeenAt } : {}),
353
+ ...(typeof item.clientVersion === 'string' ? { clientVersion: item.clientVersion } : {}),
354
+ ...(typeof item.harnessVersion === 'string' ? { harnessVersion: item.harnessVersion } : {}),
355
+ };
356
+ }
357
+ function parseAuthorizedPeer(value) {
358
+ const item = requireRecord(value, 'authorized peer');
359
+ if ((item.role !== 'host' && item.role !== 'client')
360
+ || typeof item.deviceId !== 'string' || item.deviceId.length === 0
361
+ || typeof item.name !== 'string' || item.name.length === 0
362
+ || typeof item.platform !== 'string' || item.platform.length === 0
363
+ || typeof item.identityKey !== 'string' || !isIdentityKey(item.identityKey)
364
+ || typeof item.membershipId !== 'string' || item.membershipId.length === 0) {
365
+ throw new ServerApiError('INVALID_MESSAGE', 'The Server returned invalid authorized peer data.', false);
366
+ }
367
+ return {
368
+ deviceId: item.deviceId,
369
+ name: item.name,
370
+ role: item.role,
371
+ platform: item.platform,
372
+ identityKey: item.identityKey,
373
+ membershipId: item.membershipId,
374
+ ...(typeof item.online === 'boolean' ? { online: item.online } : {}),
375
+ ...(typeof item.lastSeenAt === 'number' && Number.isSafeInteger(item.lastSeenAt) ? { lastSeenAt: item.lastSeenAt } : {}),
376
+ };
377
+ }
378
+ function parseIceServer(value) {
379
+ const item = requireRecord(value, 'ICE server');
380
+ const urls = item.urls;
381
+ if (typeof urls !== 'string' && !(Array.isArray(urls) && urls.every(url => typeof url === 'string'))) {
382
+ throw new ServerApiError('INVALID_MESSAGE', 'The Server returned an invalid ICE server.', false);
383
+ }
384
+ return {
385
+ urls,
386
+ ...(typeof item.username === 'string' ? { username: item.username } : {}),
387
+ ...(typeof item.credential === 'string' ? { credential: item.credential } : {}),
388
+ };
389
+ }
390
+ function isIdentityKey(value) {
391
+ try {
392
+ const decoded = fromBase64Url(value);
393
+ return decoded.length === 32 && toBase64Url(decoded) === value;
394
+ }
395
+ catch {
396
+ return false;
397
+ }
398
+ }
399
+ function requireRecord(value, name) {
400
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
401
+ throw new ServerApiError('INVALID_MESSAGE', `The Server returned invalid ${name} data.`, false);
402
+ }
403
+ return value;
404
+ }
405
+ //# sourceMappingURL=server-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-api.js","sourceRoot":"","sources":["../src/server-api.ts"],"names":[],"mappings":"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"}