@dxos/edge-client 0.8.4-main.84f28bd → 0.8.4-main.b97322e
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/dist/lib/browser/index.mjs +41 -28
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +41 -28
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/edge-http-client.d.ts +1 -0
- package/dist/types/src/edge-http-client.d.ts.map +1 -1
- package/dist/types/src/edge-ws-connection.d.ts +1 -0
- package/dist/types/src/edge-ws-connection.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -15
- package/src/edge-http-client.ts +4 -0
- package/src/edge-ws-connection.ts +10 -2
- package/src/http-client.test.ts +0 -1
|
@@ -77,7 +77,7 @@ var SIGNAL_KEEPALIVE_INTERVAL = 4e3;
|
|
|
77
77
|
var SIGNAL_KEEPALIVE_TIMEOUT = 12e3;
|
|
78
78
|
var EdgeWsConnection = class extends Resource {
|
|
79
79
|
constructor(_identity, _connectionInfo, _callbacks) {
|
|
80
|
-
super(), this._identity = _identity, this._connectionInfo = _connectionInfo, this._callbacks = _callbacks;
|
|
80
|
+
super(), this._identity = _identity, this._connectionInfo = _connectionInfo, this._callbacks = _callbacks, this._lastReceivedMessageTimestamp = Date.now();
|
|
81
81
|
}
|
|
82
82
|
get info() {
|
|
83
83
|
return {
|
|
@@ -89,7 +89,7 @@ var EdgeWsConnection = class extends Resource {
|
|
|
89
89
|
send(message) {
|
|
90
90
|
invariant2(this._ws, void 0, {
|
|
91
91
|
F: __dxlog_file2,
|
|
92
|
-
L:
|
|
92
|
+
L: 53,
|
|
93
93
|
S: this,
|
|
94
94
|
A: [
|
|
95
95
|
"this._ws",
|
|
@@ -98,7 +98,7 @@ var EdgeWsConnection = class extends Resource {
|
|
|
98
98
|
});
|
|
99
99
|
invariant2(this._wsMuxer, void 0, {
|
|
100
100
|
F: __dxlog_file2,
|
|
101
|
-
L:
|
|
101
|
+
L: 54,
|
|
102
102
|
S: this,
|
|
103
103
|
A: [
|
|
104
104
|
"this._wsMuxer",
|
|
@@ -110,7 +110,7 @@ var EdgeWsConnection = class extends Resource {
|
|
|
110
110
|
payload: protocol.getPayloadType(message)
|
|
111
111
|
}, {
|
|
112
112
|
F: __dxlog_file2,
|
|
113
|
-
L:
|
|
113
|
+
L: 55,
|
|
114
114
|
S: this,
|
|
115
115
|
C: (f, a) => f(...a)
|
|
116
116
|
});
|
|
@@ -123,7 +123,7 @@ var EdgeWsConnection = class extends Resource {
|
|
|
123
123
|
payload: protocol.getPayloadType(message)
|
|
124
124
|
}, {
|
|
125
125
|
F: __dxlog_file2,
|
|
126
|
-
L:
|
|
126
|
+
L: 59,
|
|
127
127
|
S: this,
|
|
128
128
|
C: (f, a) => f(...a)
|
|
129
129
|
});
|
|
@@ -133,7 +133,7 @@ var EdgeWsConnection = class extends Resource {
|
|
|
133
133
|
} else {
|
|
134
134
|
this._wsMuxer.send(message).catch((e) => log.catch(e, void 0, {
|
|
135
135
|
F: __dxlog_file2,
|
|
136
|
-
L:
|
|
136
|
+
L: 68,
|
|
137
137
|
S: this,
|
|
138
138
|
C: (f, a) => f(...a)
|
|
139
139
|
}));
|
|
@@ -155,7 +155,7 @@ var EdgeWsConnection = class extends Resource {
|
|
|
155
155
|
if (this.isOpen) {
|
|
156
156
|
log("connected", void 0, {
|
|
157
157
|
F: __dxlog_file2,
|
|
158
|
-
L:
|
|
158
|
+
L: 85,
|
|
159
159
|
S: this,
|
|
160
160
|
C: (f, a) => f(...a)
|
|
161
161
|
});
|
|
@@ -166,7 +166,7 @@ var EdgeWsConnection = class extends Resource {
|
|
|
166
166
|
currentIdentity: this._identity
|
|
167
167
|
}, {
|
|
168
168
|
F: __dxlog_file2,
|
|
169
|
-
L:
|
|
169
|
+
L: 89,
|
|
170
170
|
S: this,
|
|
171
171
|
C: (f, a) => f(...a)
|
|
172
172
|
});
|
|
@@ -179,7 +179,7 @@ var EdgeWsConnection = class extends Resource {
|
|
|
179
179
|
reason: event.reason
|
|
180
180
|
}, {
|
|
181
181
|
F: __dxlog_file2,
|
|
182
|
-
L:
|
|
182
|
+
L: 94,
|
|
183
183
|
S: this,
|
|
184
184
|
C: (f, a) => f(...a)
|
|
185
185
|
});
|
|
@@ -194,7 +194,7 @@ var EdgeWsConnection = class extends Resource {
|
|
|
194
194
|
info: event.message
|
|
195
195
|
}, {
|
|
196
196
|
F: __dxlog_file2,
|
|
197
|
-
L:
|
|
197
|
+
L: 101,
|
|
198
198
|
S: this,
|
|
199
199
|
C: (f, a) => f(...a)
|
|
200
200
|
});
|
|
@@ -204,7 +204,7 @@ var EdgeWsConnection = class extends Resource {
|
|
|
204
204
|
error: event.error
|
|
205
205
|
}, {
|
|
206
206
|
F: __dxlog_file2,
|
|
207
|
-
L:
|
|
207
|
+
L: 104,
|
|
208
208
|
S: this,
|
|
209
209
|
C: (f, a) => f(...a)
|
|
210
210
|
});
|
|
@@ -216,12 +216,13 @@ var EdgeWsConnection = class extends Resource {
|
|
|
216
216
|
event: event.type
|
|
217
217
|
}, {
|
|
218
218
|
F: __dxlog_file2,
|
|
219
|
-
L:
|
|
219
|
+
L: 112,
|
|
220
220
|
S: this,
|
|
221
221
|
C: (f, a) => f(...a)
|
|
222
222
|
});
|
|
223
223
|
return;
|
|
224
224
|
}
|
|
225
|
+
this._lastReceivedMessageTimestamp = Date.now();
|
|
225
226
|
if (event.data === "__pong__") {
|
|
226
227
|
this._rescheduleHeartbeatTimeout();
|
|
227
228
|
return;
|
|
@@ -237,7 +238,7 @@ var EdgeWsConnection = class extends Resource {
|
|
|
237
238
|
payload: protocol.getPayloadType(message)
|
|
238
239
|
}, {
|
|
239
240
|
F: __dxlog_file2,
|
|
240
|
-
L:
|
|
241
|
+
L: 130,
|
|
241
242
|
S: this,
|
|
242
243
|
C: (f, a) => f(...a)
|
|
243
244
|
});
|
|
@@ -261,7 +262,7 @@ var EdgeWsConnection = class extends Resource {
|
|
|
261
262
|
err
|
|
262
263
|
}, {
|
|
263
264
|
F: __dxlog_file2,
|
|
264
|
-
L:
|
|
265
|
+
L: 148,
|
|
265
266
|
S: this,
|
|
266
267
|
C: (f, a) => f(...a)
|
|
267
268
|
});
|
|
@@ -270,7 +271,7 @@ var EdgeWsConnection = class extends Resource {
|
|
|
270
271
|
_scheduleHeartbeats() {
|
|
271
272
|
invariant2(this._ws, void 0, {
|
|
272
273
|
F: __dxlog_file2,
|
|
273
|
-
L:
|
|
274
|
+
L: 153,
|
|
274
275
|
S: this,
|
|
275
276
|
A: [
|
|
276
277
|
"this._ws",
|
|
@@ -290,17 +291,23 @@ var EdgeWsConnection = class extends Resource {
|
|
|
290
291
|
void this._inactivityTimeoutCtx?.dispose();
|
|
291
292
|
this._inactivityTimeoutCtx = new Context(void 0, {
|
|
292
293
|
F: __dxlog_file2,
|
|
293
|
-
L:
|
|
294
|
+
L: 172
|
|
294
295
|
});
|
|
295
296
|
scheduleTask(this._inactivityTimeoutCtx, () => {
|
|
296
297
|
if (this.isOpen) {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
298
|
+
if (Date.now() - this._lastReceivedMessageTimestamp > SIGNAL_KEEPALIVE_TIMEOUT) {
|
|
299
|
+
log.warn("restart due to inactivity timeout", {
|
|
300
|
+
lastReceivedMessageTimestamp: this._lastReceivedMessageTimestamp
|
|
301
|
+
}, {
|
|
302
|
+
F: __dxlog_file2,
|
|
303
|
+
L: 178,
|
|
304
|
+
S: this,
|
|
305
|
+
C: (f, a) => f(...a)
|
|
306
|
+
});
|
|
307
|
+
this._callbacks.onRestartRequired();
|
|
308
|
+
} else {
|
|
309
|
+
this._rescheduleHeartbeatTimeout();
|
|
310
|
+
}
|
|
304
311
|
}
|
|
305
312
|
}, SIGNAL_KEEPALIVE_TIMEOUT);
|
|
306
313
|
}
|
|
@@ -873,6 +880,12 @@ var EdgeHttpClient = class {
|
|
|
873
880
|
//
|
|
874
881
|
// OAuth and credentials
|
|
875
882
|
//
|
|
883
|
+
async listFunctions(args) {
|
|
884
|
+
return this._call(new URL("/functions", this.baseUrl), {
|
|
885
|
+
...args,
|
|
886
|
+
method: "GET"
|
|
887
|
+
});
|
|
888
|
+
}
|
|
876
889
|
async initiateOAuthFlow(body, args) {
|
|
877
890
|
return this._call(new URL("/oauth/initiate", this.baseUrl), {
|
|
878
891
|
...args,
|
|
@@ -960,14 +973,14 @@ var EdgeHttpClient = class {
|
|
|
960
973
|
const shouldRetry = createRetryHandler(args);
|
|
961
974
|
const requestContext = args.context ?? new Context3(void 0, {
|
|
962
975
|
F: __dxlog_file6,
|
|
963
|
-
L:
|
|
976
|
+
L: 293
|
|
964
977
|
});
|
|
965
978
|
log4("fetch", {
|
|
966
979
|
url,
|
|
967
980
|
request: args.body
|
|
968
981
|
}, {
|
|
969
982
|
F: __dxlog_file6,
|
|
970
|
-
L:
|
|
983
|
+
L: 294,
|
|
971
984
|
S: this,
|
|
972
985
|
C: (f, a) => f(...a)
|
|
973
986
|
});
|
|
@@ -989,7 +1002,7 @@ var EdgeHttpClient = class {
|
|
|
989
1002
|
body
|
|
990
1003
|
}, {
|
|
991
1004
|
F: __dxlog_file6,
|
|
992
|
-
L:
|
|
1005
|
+
L: 310,
|
|
993
1006
|
S: this,
|
|
994
1007
|
C: (f, a) => f(...a)
|
|
995
1008
|
});
|
|
@@ -1014,7 +1027,7 @@ var EdgeHttpClient = class {
|
|
|
1014
1027
|
processingError
|
|
1015
1028
|
}, {
|
|
1016
1029
|
F: __dxlog_file6,
|
|
1017
|
-
L:
|
|
1030
|
+
L: 328,
|
|
1018
1031
|
S: this,
|
|
1019
1032
|
C: (f, a) => f(...a)
|
|
1020
1033
|
});
|
|
@@ -1027,7 +1040,7 @@ var EdgeHttpClient = class {
|
|
|
1027
1040
|
if (!this._edgeIdentity) {
|
|
1028
1041
|
log4.warn("unauthorized response received before identity was set", void 0, {
|
|
1029
1042
|
F: __dxlog_file6,
|
|
1030
|
-
L:
|
|
1043
|
+
L: 337,
|
|
1031
1044
|
S: this,
|
|
1032
1045
|
C: (f, a) => f(...a)
|
|
1033
1046
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/index.ts", "../../../src/edge-client.ts", "../../../src/edge-identity.ts", "../../../src/edge-ws-connection.ts", "../../../src/errors.ts", "../../../src/utils.ts", "../../../src/auth.ts", "../../../src/edge-http-client.ts", "../../../src/http-client.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nexport * from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nexport * from './edge-client';\nexport * from './defs';\nexport * from './protocol';\nexport * from './errors';\nexport * from './auth';\nexport * from './edge-http-client';\nexport * from './edge-identity';\nexport * from './edge-ws-muxer';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Trigger, scheduleMicroTask, TriggerState, PersistentLifecycle, Event } from '@dxos/async';\nimport { Resource, type Lifecycle } from '@dxos/context';\nimport { log, logInfo } from '@dxos/log';\nimport { type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\nimport { EdgeStatus } from '@dxos/protocols/proto/dxos/client/services';\n\nimport { protocol } from './defs';\nimport { type EdgeIdentity, handleAuthChallenge } from './edge-identity';\nimport { EdgeWsConnection } from './edge-ws-connection';\nimport { EdgeConnectionClosedError, EdgeIdentityChangedError } from './errors';\nimport { type Protocol } from './protocol';\nimport { getEdgeUrlWithProtocol } from './utils';\n\nconst DEFAULT_TIMEOUT = 10_000;\n\nexport type MessageListener = (message: Message) => void;\nexport type ReconnectListener = () => void;\n\nexport interface EdgeConnection extends Required<Lifecycle> {\n statusChanged: Event<EdgeStatus>;\n get info(): any;\n get identityKey(): string;\n get peerKey(): string;\n get isOpen(): boolean;\n get status(): EdgeStatus;\n setIdentity(identity: EdgeIdentity): void;\n onMessage(listener: MessageListener): () => void;\n onReconnected(listener: ReconnectListener): () => void;\n send(message: Message): Promise<void>;\n}\n\nexport type MessengerConfig = {\n socketEndpoint: string;\n timeout?: number;\n protocol?: Protocol;\n disableAuth?: boolean;\n};\n\n/**\n * Messenger client for EDGE:\n * - While open, uses PersistentLifecycle to keep an open EdgeWsConnection, reconnecting on failures.\n * - Manages identity and re-create EdgeWsConnection when identity changes.\n * - Dispatches connection state and message notifications.\n */\nexport class EdgeClient extends Resource implements EdgeConnection {\n public readonly statusChanged = new Event<EdgeStatus>();\n\n private readonly _persistentLifecycle = new PersistentLifecycle<EdgeWsConnection>({\n start: async () => this._connect(),\n stop: async (state: EdgeWsConnection) => this._disconnect(state),\n });\n\n private readonly _messageListeners = new Set<MessageListener>();\n private readonly _reconnectListeners = new Set<ReconnectListener>();\n private readonly _baseWsUrl: string;\n private readonly _baseHttpUrl: string;\n private _currentConnection?: EdgeWsConnection = undefined;\n private _ready = new Trigger();\n\n constructor(\n private _identity: EdgeIdentity,\n private readonly _config: MessengerConfig,\n ) {\n super();\n this._baseWsUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, 'ws');\n this._baseHttpUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, 'http');\n }\n\n @logInfo\n public get info() {\n return {\n open: this.isOpen,\n status: this.status,\n identity: this._identity.identityKey,\n device: this._identity.peerKey,\n };\n }\n\n get status(): EdgeStatus {\n return Boolean(this._currentConnection) && this._ready.state === TriggerState.RESOLVED\n ? EdgeStatus.CONNECTED\n : EdgeStatus.NOT_CONNECTED;\n }\n\n get identityKey() {\n return this._identity.identityKey;\n }\n\n get peerKey() {\n return this._identity.peerKey;\n }\n\n setIdentity(identity: EdgeIdentity): void {\n if (identity.identityKey !== this._identity.identityKey || identity.peerKey !== this._identity.peerKey) {\n log('Edge identity changed', { identity, oldIdentity: this._identity });\n this._identity = identity;\n this._closeCurrentConnection(new EdgeIdentityChangedError());\n void this._persistentLifecycle.scheduleRestart();\n }\n }\n\n public onMessage(listener: MessageListener): () => void {\n this._messageListeners.add(listener);\n return () => this._messageListeners.delete(listener);\n }\n\n public onReconnected(listener: () => void): () => void {\n this._reconnectListeners.add(listener);\n if (this._ready.state === TriggerState.RESOLVED) {\n // Microtask so that listener is always called asynchronously, no matter the state of the ready trigger\n // at the moment of registration.\n scheduleMicroTask(this._ctx, () => {\n if (this._reconnectListeners.has(listener)) {\n try {\n listener();\n } catch (error) {\n log.catch(error);\n }\n }\n });\n }\n return () => this._reconnectListeners.delete(listener);\n }\n\n /**\n * Open connection to messaging service.\n */\n protected override async _open(): Promise<void> {\n log('opening...', { info: this.info });\n this._persistentLifecycle.open().catch((err) => {\n log.warn('Error while opening connection', { err });\n });\n }\n\n /**\n * Close connection and free resources.\n */\n protected override async _close(): Promise<void> {\n log('closing...', { peerKey: this._identity.peerKey });\n this._closeCurrentConnection();\n await this._persistentLifecycle.close();\n }\n\n private async _connect(): Promise<EdgeWsConnection | undefined> {\n if (this._ctx.disposed) {\n return undefined;\n }\n\n const identity = this._identity;\n const path = `/ws/${identity.identityKey}/${identity.peerKey}`;\n const protocolHeader = this._config.disableAuth ? undefined : await this._createAuthHeader(path);\n if (this._identity !== identity) {\n log('identity changed during auth header request');\n return undefined;\n }\n\n const restartRequired = new Trigger();\n const url = new URL(path, this._baseWsUrl);\n log('Opening websocket', { url: url.toString(), protocolHeader });\n const connection = new EdgeWsConnection(\n identity,\n { url, protocolHeader },\n {\n onConnected: () => {\n if (this._isActive(connection)) {\n this._ready.wake();\n this._notifyReconnected();\n } else {\n log.verbose('connected callback ignored, because connection is not active');\n }\n },\n onRestartRequired: () => {\n if (this._isActive(connection)) {\n this._closeCurrentConnection();\n void this._persistentLifecycle.scheduleRestart();\n } else {\n log.verbose('restart requested by inactive connection');\n }\n restartRequired.wake();\n },\n onMessage: (message) => {\n if (this._isActive(connection)) {\n this._notifyMessageReceived(message);\n } else {\n log.verbose('ignored a message on inactive connection', {\n from: message.source,\n type: message.payload?.typeUrl,\n });\n }\n },\n },\n );\n this._currentConnection = connection;\n\n await connection.open();\n // Race with restartRequired so that restart is not blocked by _connect execution.\n // Wait on ready to attempt a reconnect if it times out.\n await Promise.race([this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT }), restartRequired]);\n\n return connection;\n }\n\n private async _disconnect(state: EdgeWsConnection): Promise<void> {\n await state.close();\n this.statusChanged.emit(this.status);\n }\n\n private _closeCurrentConnection(error: Error = new EdgeConnectionClosedError()): void {\n this._currentConnection = undefined;\n this._ready.throw(error);\n this._ready.reset();\n this.statusChanged.emit(this.status);\n }\n\n private _notifyReconnected(): void {\n this.statusChanged.emit(this.status);\n for (const listener of this._reconnectListeners) {\n try {\n listener();\n } catch (err) {\n log.error('ws reconnect listener failed', { err });\n }\n }\n }\n\n private _notifyMessageReceived(message: Message): void {\n for (const listener of this._messageListeners) {\n try {\n listener(message);\n } catch (err) {\n log.error('ws incoming message processing failed', { err, payload: protocol.getPayloadType(message) });\n }\n }\n }\n\n /**\n * Send message.\n * NOTE: The message is guaranteed to be delivered but the service must respond with a message to confirm processing.\n */\n public async send(message: Message): Promise<void> {\n if (this._ready.state !== TriggerState.RESOLVED) {\n log('waiting for websocket to become ready');\n await this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT });\n }\n\n if (!this._currentConnection) {\n throw new EdgeConnectionClosedError();\n }\n\n if (\n message.source &&\n (message.source.peerKey !== this._identity.peerKey || message.source.identityKey !== this.identityKey)\n ) {\n throw new EdgeIdentityChangedError();\n }\n\n this._currentConnection.send(message);\n }\n\n private async _createAuthHeader(path: string): Promise<string | undefined> {\n const httpUrl = new URL(path, this._baseHttpUrl);\n httpUrl.protocol = getEdgeUrlWithProtocol(this._baseWsUrl.toString(), 'http');\n const response = await fetch(httpUrl, { method: 'GET' });\n if (response.status === 401) {\n return encodePresentationWsAuthHeader(await handleAuthChallenge(response, this._identity));\n } else {\n log.warn('no auth challenge from edge', { status: response.status, statusText: response.statusText });\n return undefined;\n }\n }\n\n private _isActive = (connection: EdgeWsConnection) => connection === this._currentConnection;\n}\n\nconst encodePresentationWsAuthHeader = (encodedPresentation: Uint8Array): string => {\n // = and / characters are not allowed in the WebSocket subprotocol header.\n const encodedToken = Buffer.from(encodedPresentation).toString('base64').replace(/=*$/, '').replaceAll('/', '|');\n return `base64url.bearer.authorization.dxos.org.${encodedToken}`;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\nimport { schema } from '@dxos/protocols/proto';\nimport { type Presentation } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nexport interface EdgeIdentity {\n peerKey: string;\n identityKey: string;\n /**\n * Returns credential presentation issued by the identity key.\n * Presentation must have the provided challenge.\n * Presentation may include ServiceAccess credentials.\n */\n presentCredentials({ challenge }: { challenge: Uint8Array }): Promise<Presentation>;\n}\n\nexport const handleAuthChallenge = async (failedResponse: Response, identity: EdgeIdentity): Promise<Uint8Array> => {\n invariant(failedResponse.status === 401);\n\n const headerValue = failedResponse.headers.get('Www-Authenticate');\n invariant(headerValue?.startsWith('VerifiablePresentation challenge='));\n\n const challenge = headerValue?.slice('VerifiablePresentation challenge='.length);\n invariant(challenge);\n\n const presentation = await identity.presentCredentials({ challenge: Buffer.from(challenge, 'base64') });\n return schema.getCodecForType('dxos.halo.credentials.Presentation').encode(presentation);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { scheduleTask, scheduleTaskInterval } from '@dxos/async';\nimport { Context, Resource } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log, logInfo } from '@dxos/log';\nimport { EdgeWebsocketProtocol } from '@dxos/protocols';\nimport { buf } from '@dxos/protocols/buf';\nimport { MessageSchema, type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport { protocol } from './defs';\nimport { type EdgeIdentity } from './edge-identity';\nimport { CLOUDFLARE_MESSAGE_MAX_BYTES, WebSocketMuxer } from './edge-ws-muxer';\nimport { toUint8Array } from './protocol';\n\nconst SIGNAL_KEEPALIVE_INTERVAL = 4_000;\nconst SIGNAL_KEEPALIVE_TIMEOUT = 12_000;\n\nexport type EdgeWsConnectionCallbacks = {\n onConnected: () => void;\n onMessage: (message: Message) => void;\n onRestartRequired: () => void;\n};\n\nexport class EdgeWsConnection extends Resource {\n private _inactivityTimeoutCtx: Context | undefined;\n private _ws: WebSocket | undefined;\n private _wsMuxer: WebSocketMuxer | undefined;\n\n constructor(\n private readonly _identity: EdgeIdentity,\n private readonly _connectionInfo: { url: URL; protocolHeader?: string },\n private readonly _callbacks: EdgeWsConnectionCallbacks,\n ) {\n super();\n }\n\n @logInfo\n public get info() {\n return {\n open: this.isOpen,\n identity: this._identity.identityKey,\n device: this._identity.peerKey,\n };\n }\n\n public send(message: Message): void {\n invariant(this._ws);\n invariant(this._wsMuxer);\n log('sending...', { peerKey: this._identity.peerKey, payload: protocol.getPayloadType(message) });\n if (this._ws?.protocol.includes(EdgeWebsocketProtocol.V0)) {\n const binary = buf.toBinary(MessageSchema, message);\n if (binary.length > CLOUDFLARE_MESSAGE_MAX_BYTES) {\n log.error('Message dropped because it was too large (>1MB).', {\n byteLength: binary.byteLength,\n serviceId: message.serviceId,\n payload: protocol.getPayloadType(message),\n });\n return;\n }\n this._ws.send(binary);\n } else {\n this._wsMuxer.send(message).catch((e) => log.catch(e));\n }\n }\n\n protected override async _open(): Promise<void> {\n const baseProtocols = [...Object.values(EdgeWebsocketProtocol)];\n this._ws = new WebSocket(\n this._connectionInfo.url.toString(),\n this._connectionInfo.protocolHeader\n ? [...baseProtocols, this._connectionInfo.protocolHeader]\n : [...baseProtocols],\n );\n const muxer = new WebSocketMuxer(this._ws);\n this._wsMuxer = muxer;\n\n this._ws.onopen = () => {\n if (this.isOpen) {\n log('connected');\n this._callbacks.onConnected();\n this._scheduleHeartbeats();\n } else {\n log.verbose('connected after becoming inactive', { currentIdentity: this._identity });\n }\n };\n this._ws.onclose = (event) => {\n if (this.isOpen) {\n log.warn('disconnected while being open', { code: event.code, reason: event.reason });\n this._callbacks.onRestartRequired();\n muxer.destroy();\n }\n };\n this._ws.onerror = (event) => {\n if (this.isOpen) {\n log.warn('edge connection socket error', { error: event.error, info: event.message });\n this._callbacks.onRestartRequired();\n } else {\n log.verbose('error ignored on closed connection', { error: event.error });\n }\n };\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent/data\n */\n this._ws.onmessage = async (event) => {\n if (!this.isOpen) {\n log.verbose('message ignored on closed connection', { event: event.type });\n return;\n }\n if (event.data === '__pong__') {\n this._rescheduleHeartbeatTimeout();\n return;\n }\n const bytes = await toUint8Array(event.data);\n if (!this.isOpen) {\n return;\n }\n\n const message = this._ws?.protocol?.includes(EdgeWebsocketProtocol.V0)\n ? buf.fromBinary(MessageSchema, bytes)\n : muxer.receiveData(bytes);\n\n if (message) {\n log('received', { from: message.source, payload: protocol.getPayloadType(message) });\n this._callbacks.onMessage(message);\n }\n };\n }\n\n protected override async _close(): Promise<void> {\n void this._inactivityTimeoutCtx?.dispose().catch(() => {});\n\n try {\n this._ws?.close();\n this._ws = undefined;\n this._wsMuxer?.destroy();\n this._wsMuxer = undefined;\n } catch (err) {\n if (err instanceof Error && err.message.includes('WebSocket is closed before the connection is established.')) {\n return;\n }\n log.warn('Error closing websocket', { err });\n }\n }\n\n private _scheduleHeartbeats(): void {\n invariant(this._ws);\n scheduleTaskInterval(\n this._ctx,\n async () => {\n // TODO(mykola): use RFC6455 ping/pong once implemented in the browser?\n // Cloudflare's worker responds to this `without interrupting hibernation`. https://developers.cloudflare.com/durable-objects/api/websockets/#setwebsocketautoresponse\n this._ws?.send('__ping__');\n },\n SIGNAL_KEEPALIVE_INTERVAL,\n );\n this._ws.send('__ping__');\n this._rescheduleHeartbeatTimeout();\n }\n\n private _rescheduleHeartbeatTimeout(): void {\n if (!this.isOpen) {\n return;\n }\n void this._inactivityTimeoutCtx?.dispose();\n this._inactivityTimeoutCtx = new Context();\n scheduleTask(\n this._inactivityTimeoutCtx,\n () => {\n if (this.isOpen) {\n log.warn('restart due to inactivity timeout');\n this._callbacks.onRestartRequired();\n }\n },\n SIGNAL_KEEPALIVE_TIMEOUT,\n );\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nexport class EdgeConnectionClosedError extends Error {\n constructor() {\n super('Edge connection closed.');\n }\n}\n\nexport class EdgeIdentityChangedError extends Error {\n constructor() {\n super('Edge identity changed.');\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nexport const getEdgeUrlWithProtocol = (baseUrl: string, protocol: 'http' | 'ws') => {\n const isSecure = baseUrl.startsWith('https') || baseUrl.startsWith('wss');\n const url = new URL(baseUrl);\n url.protocol = protocol + (isSecure ? 's' : '');\n return url.toString();\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createCredential, signPresentation } from '@dxos/credentials';\nimport { type Signer } from '@dxos/crypto';\nimport { invariant } from '@dxos/invariant';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { type Chain, type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nimport type { EdgeIdentity } from './edge-identity';\n\n/**\n * Edge identity backed by a device key without a credential chain.\n */\nexport const createDeviceEdgeIdentity = async (signer: Signer, key: PublicKey): Promise<EdgeIdentity> => {\n return {\n identityKey: key.toHex(),\n peerKey: key.toHex(),\n presentCredentials: async ({ challenge }) => {\n return signPresentation({\n presentation: {\n credentials: [\n // Verifier requires at least one credential in the presentation to establish the subject.\n await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.Auth',\n },\n issuer: key,\n subject: key,\n signer,\n }),\n ],\n },\n signer,\n signerKey: key,\n nonce: challenge,\n });\n },\n };\n};\n\n/**\n * Edge identity backed by a chain of credentials.\n */\nexport const createChainEdgeIdentity = async (\n signer: Signer,\n identityKey: PublicKey,\n peerKey: PublicKey,\n chain: Chain | undefined,\n credentials: Credential[],\n): Promise<EdgeIdentity> => {\n const credentialsToSign =\n credentials.length > 0\n ? credentials\n : [\n await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.Auth',\n },\n issuer: identityKey,\n subject: identityKey,\n signer,\n chain,\n signingKey: peerKey,\n }),\n ];\n\n return {\n identityKey: identityKey.toHex(),\n peerKey: peerKey.toHex(),\n presentCredentials: async ({ challenge }) => {\n // TODO: make chain required after device invitation flow update release\n invariant(chain);\n return signPresentation({\n presentation: {\n credentials: credentialsToSign,\n },\n signer,\n nonce: challenge,\n signerKey: peerKey,\n chain,\n });\n },\n };\n};\n\n/**\n * Edge identity backed by a random ephemeral key without HALO.\n */\nexport const createEphemeralEdgeIdentity = async (): Promise<EdgeIdentity> => {\n const keyring = new Keyring();\n const key = await keyring.createKey();\n return createDeviceEdgeIdentity(keyring, key);\n};\n\n/**\n * Creates a HALO chain of credentials to act as an edge identity.\n */\nexport const createTestHaloEdgeIdentity = async (\n signer: Signer,\n identityKey: PublicKey,\n deviceKey: PublicKey,\n): Promise<EdgeIdentity> => {\n const deviceAdmission = await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.AuthorizedDevice',\n deviceKey,\n identityKey,\n },\n issuer: identityKey,\n subject: deviceKey,\n signer,\n });\n return createChainEdgeIdentity(signer, identityKey, deviceKey, { credential: deviceAdmission }, [\n await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.Auth',\n },\n issuer: identityKey,\n subject: identityKey,\n signer,\n }),\n ]);\n};\n\nexport const createStubEdgeIdentity = (): EdgeIdentity => {\n const identityKey = PublicKey.random();\n const deviceKey = PublicKey.random();\n return {\n identityKey: identityKey.toHex(),\n peerKey: deviceKey.toHex(),\n presentCredentials: async () => {\n throw new Error('Stub identity does not support authentication.');\n },\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { FetchHttpClient, HttpClient } from '@effect/platform';\nimport { Effect, pipe } from 'effect';\n\nimport { sleep } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { type PublicKey, type SpaceId } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport {\n type CreateAgentResponseBody,\n type CreateAgentRequestBody,\n type CreateSpaceRequest,\n type CreateSpaceResponseBody,\n EdgeAuthChallengeError,\n EdgeCallFailedError,\n type EdgeHttpResponse,\n type ExecuteWorkflowResponseBody,\n type GetAgentStatusResponseBody,\n type GetNotarizationResponseBody,\n type InitiateOAuthFlowRequest,\n type InitiateOAuthFlowResponse,\n type JoinSpaceRequest,\n type JoinSpaceResponseBody,\n type RecoverIdentityRequest,\n type RecoverIdentityResponseBody,\n type ObjectId,\n type PostNotarizationRequestBody,\n type QueueQuery,\n type QueryResult,\n type UploadFunctionRequest,\n type UploadFunctionResponseBody,\n type EdgeStatus,\n} from '@dxos/protocols';\nimport { createUrl } from '@dxos/util';\n\nimport { type EdgeIdentity, handleAuthChallenge } from './edge-identity';\nimport { encodeAuthHeader, HttpConfig, withLogging, withRetryConfig } from './http-client';\nimport { getEdgeUrlWithProtocol } from './utils';\n\nconst DEFAULT_RETRY_TIMEOUT = 1500;\nconst DEFAULT_RETRY_JITTER = 500;\nconst DEFAULT_MAX_RETRIES_COUNT = 3;\n\nexport type RetryConfig = {\n /**\n * A number of call retries, not counting the initial request.\n */\n count: number;\n /**\n * Delay before retries in ms.\n */\n timeout?: number;\n /**\n * A random amount of time before retrying to help prevent large bursts of requests.\n */\n jitter?: number;\n};\n\ntype EdgeHttpRequestArgs = {\n method: string;\n context?: Context;\n retry?: RetryConfig;\n body?: any;\n};\n\nexport type EdgeHttpGetArgs = Pick<EdgeHttpRequestArgs, 'context' | 'retry'>;\nexport type EdgeHttpPostArgs = Pick<EdgeHttpRequestArgs, 'context' | 'retry' | 'body'>;\n\nexport class EdgeHttpClient {\n private readonly _baseUrl: string;\n\n private _edgeIdentity: EdgeIdentity | undefined;\n\n /**\n * Auth header is cached until receiving the next 401 from EDGE, at which point it gets refreshed.\n */\n private _authHeader: string | undefined;\n\n constructor(baseUrl: string) {\n this._baseUrl = getEdgeUrlWithProtocol(baseUrl, 'http');\n log('created', { url: this._baseUrl });\n }\n\n get baseUrl() {\n return this._baseUrl;\n }\n\n setIdentity(identity: EdgeIdentity): void {\n if (this._edgeIdentity?.identityKey !== identity.identityKey || this._edgeIdentity?.peerKey !== identity.peerKey) {\n this._edgeIdentity = identity;\n this._authHeader = undefined;\n }\n }\n\n //\n // Status\n //\n\n public async getStatus(args?: EdgeHttpGetArgs): Promise<EdgeStatus> {\n return this._call(new URL('/status', this.baseUrl), { ...args, method: 'GET' });\n }\n\n //\n // Agents\n //\n\n public createAgent(body: CreateAgentRequestBody, args?: EdgeHttpGetArgs): Promise<CreateAgentResponseBody> {\n return this._call(new URL('/agents/create', this.baseUrl), { ...args, method: 'POST', body });\n }\n\n public getAgentStatus(\n request: { ownerIdentityKey: PublicKey },\n args?: EdgeHttpGetArgs,\n ): Promise<GetAgentStatusResponseBody> {\n return this._call(new URL(`/users/${request.ownerIdentityKey.toHex()}/agent/status`, this.baseUrl), {\n ...args,\n method: 'GET',\n });\n }\n\n //\n // Credentials\n //\n\n public getCredentialsForNotarization(spaceId: SpaceId, args?: EdgeHttpGetArgs): Promise<GetNotarizationResponseBody> {\n return this._call(new URL(`/spaces/${spaceId}/notarization`, this.baseUrl), { ...args, method: 'GET' });\n }\n\n public async notarizeCredentials(\n spaceId: SpaceId,\n body: PostNotarizationRequestBody,\n args?: EdgeHttpGetArgs,\n ): Promise<void> {\n await this._call(new URL(`/spaces/${spaceId}/notarization`, this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n //\n // Identity\n //\n\n public async recoverIdentity(\n body: RecoverIdentityRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<RecoverIdentityResponseBody> {\n return this._call(new URL('/identity/recover', this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n //\n // Invitations\n //\n\n public async joinSpaceByInvitation(\n spaceId: SpaceId,\n body: JoinSpaceRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<JoinSpaceResponseBody> {\n return this._call(new URL(`/spaces/${spaceId}/join`, this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n //\n // OAuth and credentials\n //\n\n public async initiateOAuthFlow(\n body: InitiateOAuthFlowRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<InitiateOAuthFlowResponse> {\n return this._call(new URL('/oauth/initiate', this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n //\n // Spaces\n //\n\n async createSpace(body: CreateSpaceRequest, args?: EdgeHttpGetArgs): Promise<CreateSpaceResponseBody> {\n return this._call(new URL('/spaces/create', this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n //\n // Queues\n //\n\n public async queryQueue(\n subspaceTag: string,\n spaceId: SpaceId,\n query: QueueQuery,\n args?: EdgeHttpGetArgs,\n ): Promise<QueryResult> {\n const { queueId } = query;\n return this._call(\n createUrl(new URL(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}/query`, this.baseUrl), {\n after: query.after,\n before: query.before,\n limit: query.limit,\n reverse: query.reverse,\n objectIds: query.objectIds?.join(','),\n }),\n {\n ...args,\n method: 'GET',\n },\n );\n }\n\n public async insertIntoQueue(\n subspaceTag: string,\n spaceId: SpaceId,\n queueId: ObjectId,\n objects: unknown[],\n args?: EdgeHttpGetArgs,\n ): Promise<void> {\n return this._call(new URL(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}`, this.baseUrl), {\n ...args,\n body: { objects },\n method: 'POST',\n });\n }\n\n public async deleteFromQueue(\n subspaceTag: string,\n spaceId: SpaceId,\n queueId: ObjectId,\n objectIds: ObjectId[],\n args?: EdgeHttpGetArgs,\n ): Promise<void> {\n return this._call(\n createUrl(new URL(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}`, this.baseUrl), {\n ids: objectIds.join(','),\n }),\n {\n ...args,\n method: 'DELETE',\n },\n );\n }\n\n //\n // Functions\n //\n\n public async uploadFunction(\n pathParts: { functionId?: string },\n body: UploadFunctionRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<UploadFunctionResponseBody> {\n const path = ['functions', ...(pathParts.functionId ? [pathParts.functionId] : [])].join('/');\n return this._call(new URL(path, this.baseUrl), { ...args, body, method: 'PUT' });\n }\n\n //\n // Workflows\n //\n\n public async executeWorkflow(\n spaceId: SpaceId,\n graphId: ObjectId,\n input: any,\n args?: EdgeHttpGetArgs,\n ): Promise<ExecuteWorkflowResponseBody> {\n return this._call(new URL(`/workflows/${spaceId}/${graphId}`, this.baseUrl), {\n ...args,\n body: input,\n method: 'POST',\n });\n }\n\n //\n // Internal\n //\n\n private async _fetch<T>(url: URL, args: EdgeHttpRequestArgs): Promise<T> {\n return pipe(\n HttpClient.get(url),\n withLogging,\n withRetryConfig,\n Effect.provide(FetchHttpClient.layer),\n Effect.provide(HttpConfig.default),\n Effect.withSpan('EdgeHttpClient'),\n Effect.runPromise,\n ) as T;\n }\n\n // TODO(burdon): Refactor with effect (see edge-http-client.test.ts).\n private async _call<T>(url: URL, args: EdgeHttpRequestArgs): Promise<T> {\n const shouldRetry = createRetryHandler(args);\n const requestContext = args.context ?? new Context();\n log('fetch', { url, request: args.body });\n\n let handledAuth = false;\n while (true) {\n let processingError: EdgeCallFailedError;\n let retryAfterHeaderValue: number = Number.NaN;\n try {\n const request = createRequest(args, this._authHeader);\n const response = await fetch(url, request);\n retryAfterHeaderValue = Number(response.headers.get('Retry-After'));\n if (response.ok) {\n const body = (await response.json()) as EdgeHttpResponse<T>;\n if (body.success) {\n return body.data;\n }\n\n log.warn('unsuccessful edge response', { url, body });\n if (body.errorData?.type === 'auth_challenge' && typeof body.errorData?.challenge === 'string') {\n processingError = new EdgeAuthChallengeError(body.errorData.challenge, body.errorData);\n } else {\n processingError = EdgeCallFailedError.fromUnsuccessfulResponse(response, body);\n }\n } else if (response.status === 401 && !handledAuth) {\n this._authHeader = await this._handleUnauthorized(response);\n handledAuth = true;\n continue;\n } else {\n processingError = EdgeCallFailedError.fromHttpFailure(response);\n }\n } catch (error: any) {\n processingError = EdgeCallFailedError.fromProcessingFailureCause(error);\n }\n\n if (processingError.isRetryable && (await shouldRetry(requestContext, retryAfterHeaderValue))) {\n log('retrying edge request', { url, processingError });\n } else {\n throw processingError;\n }\n }\n }\n\n private async _handleUnauthorized(response: Response): Promise<string> {\n if (!this._edgeIdentity) {\n log.warn('unauthorized response received before identity was set');\n throw EdgeCallFailedError.fromHttpFailure(response);\n }\n\n const challenge = await handleAuthChallenge(response, this._edgeIdentity);\n return encodeAuthHeader(challenge);\n }\n}\n\nconst createRequest = ({ method, body }: EdgeHttpRequestArgs, authHeader: string | undefined): RequestInit => {\n return {\n method,\n body: body && JSON.stringify(body),\n headers: authHeader ? { Authorization: authHeader } : undefined,\n };\n};\n\n/**\n * @deprecated\n */\nconst createRetryHandler = ({ retry }: EdgeHttpRequestArgs) => {\n if (!retry || retry.count < 1) {\n return async () => false;\n }\n\n let retries = 0;\n const maxRetries = retry.count ?? DEFAULT_MAX_RETRIES_COUNT;\n const baseTimeout = retry.timeout ?? DEFAULT_RETRY_TIMEOUT;\n const jitter = retry.jitter ?? DEFAULT_RETRY_JITTER;\n return async (ctx: Context, retryAfter: number) => {\n if (++retries > maxRetries || ctx.disposed) {\n return false;\n }\n\n if (retryAfter) {\n await sleep(retryAfter);\n } else {\n const timeout = baseTimeout + Math.random() * jitter;\n await sleep(timeout);\n }\n\n return true;\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type HttpClient } from '@effect/platform';\nimport { type HttpClientError } from '@effect/platform/HttpClientError';\nimport { type HttpClientResponse } from '@effect/platform/HttpClientResponse';\nimport { Context, Duration, Effect, Layer, Schedule } from 'effect';\n\nimport { log } from '@dxos/log';\n\n// TODO(burdon): Factor out.\n\nexport type RetryOptions = {\n timeout: Duration.Duration;\n retryTimes: number;\n retryBaseDelay: Duration.Duration;\n};\n\n// Layer pattern.\nexport class HttpConfig extends Context.Tag('HttpConfig')<HttpConfig, RetryOptions>() {\n static default = Layer.succeed(HttpConfig, {\n timeout: Duration.millis(1_000),\n retryTimes: 3,\n retryBaseDelay: Duration.millis(1_000),\n });\n}\n\n// HOC pattern.\nexport const withRetry = (\n effect: Effect.Effect<HttpClientResponse, HttpClientError, HttpClient.HttpClient>,\n {\n timeout = Duration.millis(1_000),\n retryBaseDelay = Duration.millis(1_000),\n retryTimes = 3,\n }: Partial<RetryOptions> = {},\n) => {\n return effect.pipe(\n Effect.flatMap((res) =>\n // Treat 500 errors as retryable?\n res.status === 500 ? Effect.fail(new Error(res.status.toString())) : res.json,\n ),\n Effect.timeout(timeout),\n Effect.retry({\n schedule: Schedule.exponential(retryBaseDelay).pipe(Schedule.jittered),\n times: retryTimes,\n }),\n );\n};\n\nexport const withRetryConfig = (effect: Effect.Effect<HttpClientResponse, HttpClientError, HttpClient.HttpClient>) =>\n Effect.gen(function* () {\n const config = yield* HttpConfig;\n return yield* withRetry(effect, config);\n });\n\nexport const withLogging = <A extends HttpClientResponse, E, R>(effect: Effect.Effect<A, E, R>) =>\n effect.pipe(Effect.tap((res) => log.info('response', { status: res.status })));\n\n/**\n *\n */\n// TODO(burdon): Document.\nexport const encodeAuthHeader = (challenge: Uint8Array) => {\n const encodedChallenge = Buffer.from(challenge).toString('base64');\n return `VerifiablePresentation pb;base64,${encodedChallenge}`;\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Trigger", "scheduleMicroTask", "TriggerState", "PersistentLifecycle", "Event", "Resource", "log", "logInfo", "EdgeStatus", "invariant", "schema", "handleAuthChallenge", "failedResponse", "identity", "status", "headerValue", "headers", "get", "startsWith", "challenge", "slice", "length", "presentation", "presentCredentials", "Buffer", "from", "getCodecForType", "encode", "WebSocket", "scheduleTask", "scheduleTaskInterval", "Context", "Resource", "invariant", "log", "logInfo", "EdgeWebsocketProtocol", "buf", "MessageSchema", "SIGNAL_KEEPALIVE_INTERVAL", "SIGNAL_KEEPALIVE_TIMEOUT", "EdgeWsConnection", "Resource", "_identity", "_connectionInfo", "_callbacks", "info", "open", "isOpen", "identity", "identityKey", "device", "peerKey", "send", "message", "invariant", "_ws", "_wsMuxer", "log", "payload", "protocol", "getPayloadType", "includes", "EdgeWebsocketProtocol", "V0", "binary", "buf", "toBinary", "MessageSchema", "length", "CLOUDFLARE_MESSAGE_MAX_BYTES", "error", "byteLength", "serviceId", "catch", "e", "_open", "baseProtocols", "Object", "values", "WebSocket", "url", "toString", "protocolHeader", "muxer", "WebSocketMuxer", "onopen", "onConnected", "_scheduleHeartbeats", "verbose", "currentIdentity", "onclose", "event", "warn", "code", "reason", "onRestartRequired", "destroy", "onerror", "onmessage", "type", "data", "_rescheduleHeartbeatTimeout", "bytes", "toUint8Array", "fromBinary", "receiveData", "from", "source", "onMessage", "_close", "_inactivityTimeoutCtx", "dispose", "close", "undefined", "err", "Error", "scheduleTaskInterval", "_ctx", "Context", "scheduleTask", "EdgeConnectionClosedError", "Error", "EdgeIdentityChangedError", "getEdgeUrlWithProtocol", "baseUrl", "protocol", "isSecure", "startsWith", "url", "URL", "toString", "DEFAULT_TIMEOUT", "EdgeClient", "Resource", "_identity", "_config", "statusChanged", "Event", "_persistentLifecycle", "PersistentLifecycle", "start", "_connect", "stop", "state", "_disconnect", "_messageListeners", "Set", "_reconnectListeners", "_currentConnection", "undefined", "_ready", "Trigger", "_isActive", "connection", "_baseWsUrl", "getEdgeUrlWithProtocol", "socketEndpoint", "_baseHttpUrl", "info", "open", "isOpen", "status", "identity", "identityKey", "device", "peerKey", "Boolean", "TriggerState", "RESOLVED", "EdgeStatus", "CONNECTED", "NOT_CONNECTED", "setIdentity", "log", "oldIdentity", "_closeCurrentConnection", "EdgeIdentityChangedError", "scheduleRestart", "onMessage", "listener", "add", "delete", "onReconnected", "scheduleMicroTask", "_ctx", "has", "error", "catch", "_open", "err", "warn", "_close", "close", "disposed", "path", "protocolHeader", "disableAuth", "_createAuthHeader", "restartRequired", "url", "URL", "toString", "EdgeWsConnection", "onConnected", "wake", "_notifyReconnected", "verbose", "onRestartRequired", "message", "_notifyMessageReceived", "from", "source", "type", "payload", "typeUrl", "Promise", "race", "wait", "timeout", "emit", "EdgeConnectionClosedError", "throw", "reset", "protocol", "getPayloadType", "send", "httpUrl", "response", "fetch", "method", "encodePresentationWsAuthHeader", "handleAuthChallenge", "statusText", "encodedPresentation", "encodedToken", "Buffer", "replace", "replaceAll", "createCredential", "signPresentation", "invariant", "Keyring", "PublicKey", "createDeviceEdgeIdentity", "signer", "key", "identityKey", "toHex", "peerKey", "presentCredentials", "challenge", "presentation", "credentials", "assertion", "issuer", "subject", "signerKey", "nonce", "createChainEdgeIdentity", "chain", "credentialsToSign", "length", "signingKey", "createEphemeralEdgeIdentity", "keyring", "createKey", "createTestHaloEdgeIdentity", "deviceKey", "deviceAdmission", "credential", "createStubEdgeIdentity", "random", "Error", "FetchHttpClient", "HttpClient", "Effect", "pipe", "sleep", "Context", "log", "EdgeAuthChallengeError", "EdgeCallFailedError", "createUrl", "Context", "Duration", "Effect", "Layer", "Schedule", "log", "HttpConfig", "Tag", "default", "succeed", "timeout", "millis", "retryTimes", "retryBaseDelay", "withRetry", "effect", "pipe", "flatMap", "res", "status", "fail", "Error", "toString", "json", "retry", "schedule", "exponential", "jittered", "times", "withRetryConfig", "gen", "config", "withLogging", "tap", "info", "encodeAuthHeader", "challenge", "encodedChallenge", "Buffer", "from", "DEFAULT_RETRY_TIMEOUT", "DEFAULT_RETRY_JITTER", "DEFAULT_MAX_RETRIES_COUNT", "EdgeHttpClient", "baseUrl", "_baseUrl", "getEdgeUrlWithProtocol", "log", "url", "setIdentity", "identity", "_edgeIdentity", "identityKey", "peerKey", "_authHeader", "undefined", "getStatus", "args", "_call", "URL", "method", "createAgent", "body", "getAgentStatus", "request", "ownerIdentityKey", "toHex", "getCredentialsForNotarization", "spaceId", "notarizeCredentials", "recoverIdentity", "joinSpaceByInvitation", "initiateOAuthFlow", "createSpace", "queryQueue", "subspaceTag", "query", "queueId", "createUrl", "after", "before", "limit", "reverse", "objectIds", "join", "insertIntoQueue", "objects", "deleteFromQueue", "ids", "uploadFunction", "pathParts", "path", "functionId", "executeWorkflow", "graphId", "input", "_fetch", "pipe", "HttpClient", "get", "withLogging", "withRetryConfig", "Effect", "provide", "FetchHttpClient", "layer", "HttpConfig", "default", "withSpan", "runPromise", "shouldRetry", "createRetryHandler", "requestContext", "context", "Context", "handledAuth", "processingError", "retryAfterHeaderValue", "Number", "NaN", "createRequest", "response", "fetch", "headers", "ok", "json", "success", "data", "warn", "errorData", "type", "challenge", "EdgeAuthChallengeError", "EdgeCallFailedError", "fromUnsuccessfulResponse", "status", "_handleUnauthorized", "fromHttpFailure", "error", "fromProcessingFailureCause", "isRetryable", "handleAuthChallenge", "encodeAuthHeader", "authHeader", "JSON", "stringify", "Authorization", "retry", "count", "retries", "maxRetries", "baseTimeout", "timeout", "jitter", "ctx", "retryAfter", "disposed", "sleep", "Math", "random"]
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nexport * from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nexport * from './edge-client';\nexport * from './defs';\nexport * from './protocol';\nexport * from './errors';\nexport * from './auth';\nexport * from './edge-http-client';\nexport * from './edge-identity';\nexport * from './edge-ws-muxer';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Trigger, scheduleMicroTask, TriggerState, PersistentLifecycle, Event } from '@dxos/async';\nimport { Resource, type Lifecycle } from '@dxos/context';\nimport { log, logInfo } from '@dxos/log';\nimport { type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\nimport { EdgeStatus } from '@dxos/protocols/proto/dxos/client/services';\n\nimport { protocol } from './defs';\nimport { type EdgeIdentity, handleAuthChallenge } from './edge-identity';\nimport { EdgeWsConnection } from './edge-ws-connection';\nimport { EdgeConnectionClosedError, EdgeIdentityChangedError } from './errors';\nimport { type Protocol } from './protocol';\nimport { getEdgeUrlWithProtocol } from './utils';\n\nconst DEFAULT_TIMEOUT = 10_000;\n\nexport type MessageListener = (message: Message) => void;\nexport type ReconnectListener = () => void;\n\nexport interface EdgeConnection extends Required<Lifecycle> {\n statusChanged: Event<EdgeStatus>;\n get info(): any;\n get identityKey(): string;\n get peerKey(): string;\n get isOpen(): boolean;\n get status(): EdgeStatus;\n setIdentity(identity: EdgeIdentity): void;\n onMessage(listener: MessageListener): () => void;\n onReconnected(listener: ReconnectListener): () => void;\n send(message: Message): Promise<void>;\n}\n\nexport type MessengerConfig = {\n socketEndpoint: string;\n timeout?: number;\n protocol?: Protocol;\n disableAuth?: boolean;\n};\n\n/**\n * Messenger client for EDGE:\n * - While open, uses PersistentLifecycle to keep an open EdgeWsConnection, reconnecting on failures.\n * - Manages identity and re-create EdgeWsConnection when identity changes.\n * - Dispatches connection state and message notifications.\n */\nexport class EdgeClient extends Resource implements EdgeConnection {\n public readonly statusChanged = new Event<EdgeStatus>();\n\n private readonly _persistentLifecycle = new PersistentLifecycle<EdgeWsConnection>({\n start: async () => this._connect(),\n stop: async (state: EdgeWsConnection) => this._disconnect(state),\n });\n\n private readonly _messageListeners = new Set<MessageListener>();\n private readonly _reconnectListeners = new Set<ReconnectListener>();\n private readonly _baseWsUrl: string;\n private readonly _baseHttpUrl: string;\n private _currentConnection?: EdgeWsConnection = undefined;\n private _ready = new Trigger();\n\n constructor(\n private _identity: EdgeIdentity,\n private readonly _config: MessengerConfig,\n ) {\n super();\n this._baseWsUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, 'ws');\n this._baseHttpUrl = getEdgeUrlWithProtocol(_config.socketEndpoint, 'http');\n }\n\n @logInfo\n public get info() {\n return {\n open: this.isOpen,\n status: this.status,\n identity: this._identity.identityKey,\n device: this._identity.peerKey,\n };\n }\n\n get status(): EdgeStatus {\n return Boolean(this._currentConnection) && this._ready.state === TriggerState.RESOLVED\n ? EdgeStatus.CONNECTED\n : EdgeStatus.NOT_CONNECTED;\n }\n\n get identityKey() {\n return this._identity.identityKey;\n }\n\n get peerKey() {\n return this._identity.peerKey;\n }\n\n setIdentity(identity: EdgeIdentity): void {\n if (identity.identityKey !== this._identity.identityKey || identity.peerKey !== this._identity.peerKey) {\n log('Edge identity changed', { identity, oldIdentity: this._identity });\n this._identity = identity;\n this._closeCurrentConnection(new EdgeIdentityChangedError());\n void this._persistentLifecycle.scheduleRestart();\n }\n }\n\n public onMessage(listener: MessageListener): () => void {\n this._messageListeners.add(listener);\n return () => this._messageListeners.delete(listener);\n }\n\n public onReconnected(listener: () => void): () => void {\n this._reconnectListeners.add(listener);\n if (this._ready.state === TriggerState.RESOLVED) {\n // Microtask so that listener is always called asynchronously, no matter the state of the ready trigger\n // at the moment of registration.\n scheduleMicroTask(this._ctx, () => {\n if (this._reconnectListeners.has(listener)) {\n try {\n listener();\n } catch (error) {\n log.catch(error);\n }\n }\n });\n }\n return () => this._reconnectListeners.delete(listener);\n }\n\n /**\n * Open connection to messaging service.\n */\n protected override async _open(): Promise<void> {\n log('opening...', { info: this.info });\n this._persistentLifecycle.open().catch((err) => {\n log.warn('Error while opening connection', { err });\n });\n }\n\n /**\n * Close connection and free resources.\n */\n protected override async _close(): Promise<void> {\n log('closing...', { peerKey: this._identity.peerKey });\n this._closeCurrentConnection();\n await this._persistentLifecycle.close();\n }\n\n private async _connect(): Promise<EdgeWsConnection | undefined> {\n if (this._ctx.disposed) {\n return undefined;\n }\n\n const identity = this._identity;\n const path = `/ws/${identity.identityKey}/${identity.peerKey}`;\n const protocolHeader = this._config.disableAuth ? undefined : await this._createAuthHeader(path);\n if (this._identity !== identity) {\n log('identity changed during auth header request');\n return undefined;\n }\n\n const restartRequired = new Trigger();\n const url = new URL(path, this._baseWsUrl);\n log('Opening websocket', { url: url.toString(), protocolHeader });\n const connection = new EdgeWsConnection(\n identity,\n { url, protocolHeader },\n {\n onConnected: () => {\n if (this._isActive(connection)) {\n this._ready.wake();\n this._notifyReconnected();\n } else {\n log.verbose('connected callback ignored, because connection is not active');\n }\n },\n onRestartRequired: () => {\n if (this._isActive(connection)) {\n this._closeCurrentConnection();\n void this._persistentLifecycle.scheduleRestart();\n } else {\n log.verbose('restart requested by inactive connection');\n }\n restartRequired.wake();\n },\n onMessage: (message) => {\n if (this._isActive(connection)) {\n this._notifyMessageReceived(message);\n } else {\n log.verbose('ignored a message on inactive connection', {\n from: message.source,\n type: message.payload?.typeUrl,\n });\n }\n },\n },\n );\n this._currentConnection = connection;\n\n await connection.open();\n // Race with restartRequired so that restart is not blocked by _connect execution.\n // Wait on ready to attempt a reconnect if it times out.\n await Promise.race([this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT }), restartRequired]);\n\n return connection;\n }\n\n private async _disconnect(state: EdgeWsConnection): Promise<void> {\n await state.close();\n this.statusChanged.emit(this.status);\n }\n\n private _closeCurrentConnection(error: Error = new EdgeConnectionClosedError()): void {\n this._currentConnection = undefined;\n this._ready.throw(error);\n this._ready.reset();\n this.statusChanged.emit(this.status);\n }\n\n private _notifyReconnected(): void {\n this.statusChanged.emit(this.status);\n for (const listener of this._reconnectListeners) {\n try {\n listener();\n } catch (err) {\n log.error('ws reconnect listener failed', { err });\n }\n }\n }\n\n private _notifyMessageReceived(message: Message): void {\n for (const listener of this._messageListeners) {\n try {\n listener(message);\n } catch (err) {\n log.error('ws incoming message processing failed', { err, payload: protocol.getPayloadType(message) });\n }\n }\n }\n\n /**\n * Send message.\n * NOTE: The message is guaranteed to be delivered but the service must respond with a message to confirm processing.\n */\n public async send(message: Message): Promise<void> {\n if (this._ready.state !== TriggerState.RESOLVED) {\n log('waiting for websocket to become ready');\n await this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT });\n }\n\n if (!this._currentConnection) {\n throw new EdgeConnectionClosedError();\n }\n\n if (\n message.source &&\n (message.source.peerKey !== this._identity.peerKey || message.source.identityKey !== this.identityKey)\n ) {\n throw new EdgeIdentityChangedError();\n }\n\n this._currentConnection.send(message);\n }\n\n private async _createAuthHeader(path: string): Promise<string | undefined> {\n const httpUrl = new URL(path, this._baseHttpUrl);\n httpUrl.protocol = getEdgeUrlWithProtocol(this._baseWsUrl.toString(), 'http');\n const response = await fetch(httpUrl, { method: 'GET' });\n if (response.status === 401) {\n return encodePresentationWsAuthHeader(await handleAuthChallenge(response, this._identity));\n } else {\n log.warn('no auth challenge from edge', { status: response.status, statusText: response.statusText });\n return undefined;\n }\n }\n\n private _isActive = (connection: EdgeWsConnection) => connection === this._currentConnection;\n}\n\nconst encodePresentationWsAuthHeader = (encodedPresentation: Uint8Array): string => {\n // = and / characters are not allowed in the WebSocket subprotocol header.\n const encodedToken = Buffer.from(encodedPresentation).toString('base64').replace(/=*$/, '').replaceAll('/', '|');\n return `base64url.bearer.authorization.dxos.org.${encodedToken}`;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\nimport { schema } from '@dxos/protocols/proto';\nimport { type Presentation } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nexport interface EdgeIdentity {\n peerKey: string;\n identityKey: string;\n /**\n * Returns credential presentation issued by the identity key.\n * Presentation must have the provided challenge.\n * Presentation may include ServiceAccess credentials.\n */\n presentCredentials({ challenge }: { challenge: Uint8Array }): Promise<Presentation>;\n}\n\nexport const handleAuthChallenge = async (failedResponse: Response, identity: EdgeIdentity): Promise<Uint8Array> => {\n invariant(failedResponse.status === 401);\n\n const headerValue = failedResponse.headers.get('Www-Authenticate');\n invariant(headerValue?.startsWith('VerifiablePresentation challenge='));\n\n const challenge = headerValue?.slice('VerifiablePresentation challenge='.length);\n invariant(challenge);\n\n const presentation = await identity.presentCredentials({ challenge: Buffer.from(challenge, 'base64') });\n return schema.getCodecForType('dxos.halo.credentials.Presentation').encode(presentation);\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { scheduleTask, scheduleTaskInterval } from '@dxos/async';\nimport { Context, Resource } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log, logInfo } from '@dxos/log';\nimport { EdgeWebsocketProtocol } from '@dxos/protocols';\nimport { buf } from '@dxos/protocols/buf';\nimport { MessageSchema, type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport { protocol } from './defs';\nimport { type EdgeIdentity } from './edge-identity';\nimport { CLOUDFLARE_MESSAGE_MAX_BYTES, WebSocketMuxer } from './edge-ws-muxer';\nimport { toUint8Array } from './protocol';\n\nconst SIGNAL_KEEPALIVE_INTERVAL = 4_000;\nconst SIGNAL_KEEPALIVE_TIMEOUT = 12_000;\n\nexport type EdgeWsConnectionCallbacks = {\n onConnected: () => void;\n onMessage: (message: Message) => void;\n onRestartRequired: () => void;\n};\n\nexport class EdgeWsConnection extends Resource {\n private _inactivityTimeoutCtx: Context | undefined;\n private _ws: WebSocket | undefined;\n private _wsMuxer: WebSocketMuxer | undefined;\n private _lastReceivedMessageTimestamp = Date.now();\n\n constructor(\n private readonly _identity: EdgeIdentity,\n private readonly _connectionInfo: { url: URL; protocolHeader?: string },\n private readonly _callbacks: EdgeWsConnectionCallbacks,\n ) {\n super();\n }\n\n @logInfo\n public get info() {\n return {\n open: this.isOpen,\n identity: this._identity.identityKey,\n device: this._identity.peerKey,\n };\n }\n\n public send(message: Message): void {\n invariant(this._ws);\n invariant(this._wsMuxer);\n log('sending...', { peerKey: this._identity.peerKey, payload: protocol.getPayloadType(message) });\n if (this._ws?.protocol.includes(EdgeWebsocketProtocol.V0)) {\n const binary = buf.toBinary(MessageSchema, message);\n if (binary.length > CLOUDFLARE_MESSAGE_MAX_BYTES) {\n log.error('Message dropped because it was too large (>1MB).', {\n byteLength: binary.byteLength,\n serviceId: message.serviceId,\n payload: protocol.getPayloadType(message),\n });\n return;\n }\n this._ws.send(binary);\n } else {\n this._wsMuxer.send(message).catch((e) => log.catch(e));\n }\n }\n\n protected override async _open(): Promise<void> {\n const baseProtocols = [...Object.values(EdgeWebsocketProtocol)];\n this._ws = new WebSocket(\n this._connectionInfo.url.toString(),\n this._connectionInfo.protocolHeader\n ? [...baseProtocols, this._connectionInfo.protocolHeader]\n : [...baseProtocols],\n );\n const muxer = new WebSocketMuxer(this._ws);\n this._wsMuxer = muxer;\n\n this._ws.onopen = () => {\n if (this.isOpen) {\n log('connected');\n this._callbacks.onConnected();\n this._scheduleHeartbeats();\n } else {\n log.verbose('connected after becoming inactive', { currentIdentity: this._identity });\n }\n };\n this._ws.onclose = (event) => {\n if (this.isOpen) {\n log.warn('disconnected while being open', { code: event.code, reason: event.reason });\n this._callbacks.onRestartRequired();\n muxer.destroy();\n }\n };\n this._ws.onerror = (event) => {\n if (this.isOpen) {\n log.warn('edge connection socket error', { error: event.error, info: event.message });\n this._callbacks.onRestartRequired();\n } else {\n log.verbose('error ignored on closed connection', { error: event.error });\n }\n };\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent/data\n */\n this._ws.onmessage = async (event) => {\n if (!this.isOpen) {\n log.verbose('message ignored on closed connection', { event: event.type });\n return;\n }\n this._lastReceivedMessageTimestamp = Date.now();\n if (event.data === '__pong__') {\n this._rescheduleHeartbeatTimeout();\n return;\n }\n const bytes = await toUint8Array(event.data);\n if (!this.isOpen) {\n return;\n }\n\n const message = this._ws?.protocol?.includes(EdgeWebsocketProtocol.V0)\n ? buf.fromBinary(MessageSchema, bytes)\n : muxer.receiveData(bytes);\n\n if (message) {\n log('received', { from: message.source, payload: protocol.getPayloadType(message) });\n this._callbacks.onMessage(message);\n }\n };\n }\n\n protected override async _close(): Promise<void> {\n void this._inactivityTimeoutCtx?.dispose().catch(() => {});\n\n try {\n this._ws?.close();\n this._ws = undefined;\n this._wsMuxer?.destroy();\n this._wsMuxer = undefined;\n } catch (err) {\n if (err instanceof Error && err.message.includes('WebSocket is closed before the connection is established.')) {\n return;\n }\n log.warn('Error closing websocket', { err });\n }\n }\n\n private _scheduleHeartbeats(): void {\n invariant(this._ws);\n scheduleTaskInterval(\n this._ctx,\n async () => {\n // TODO(mykola): use RFC6455 ping/pong once implemented in the browser?\n // Cloudflare's worker responds to this `without interrupting hibernation`. https://developers.cloudflare.com/durable-objects/api/websockets/#setwebsocketautoresponse\n this._ws?.send('__ping__');\n },\n SIGNAL_KEEPALIVE_INTERVAL,\n );\n this._ws.send('__ping__');\n this._rescheduleHeartbeatTimeout();\n }\n\n private _rescheduleHeartbeatTimeout(): void {\n if (!this.isOpen) {\n return;\n }\n void this._inactivityTimeoutCtx?.dispose();\n this._inactivityTimeoutCtx = new Context();\n scheduleTask(\n this._inactivityTimeoutCtx,\n () => {\n if (this.isOpen) {\n if (Date.now() - this._lastReceivedMessageTimestamp > SIGNAL_KEEPALIVE_TIMEOUT) {\n log.warn('restart due to inactivity timeout', {\n lastReceivedMessageTimestamp: this._lastReceivedMessageTimestamp,\n });\n this._callbacks.onRestartRequired();\n } else {\n this._rescheduleHeartbeatTimeout();\n }\n }\n },\n SIGNAL_KEEPALIVE_TIMEOUT,\n );\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nexport class EdgeConnectionClosedError extends Error {\n constructor() {\n super('Edge connection closed.');\n }\n}\n\nexport class EdgeIdentityChangedError extends Error {\n constructor() {\n super('Edge identity changed.');\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nexport const getEdgeUrlWithProtocol = (baseUrl: string, protocol: 'http' | 'ws') => {\n const isSecure = baseUrl.startsWith('https') || baseUrl.startsWith('wss');\n const url = new URL(baseUrl);\n url.protocol = protocol + (isSecure ? 's' : '');\n return url.toString();\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createCredential, signPresentation } from '@dxos/credentials';\nimport { type Signer } from '@dxos/crypto';\nimport { invariant } from '@dxos/invariant';\nimport { Keyring } from '@dxos/keyring';\nimport { PublicKey } from '@dxos/keys';\nimport { type Chain, type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nimport type { EdgeIdentity } from './edge-identity';\n\n/**\n * Edge identity backed by a device key without a credential chain.\n */\nexport const createDeviceEdgeIdentity = async (signer: Signer, key: PublicKey): Promise<EdgeIdentity> => {\n return {\n identityKey: key.toHex(),\n peerKey: key.toHex(),\n presentCredentials: async ({ challenge }) => {\n return signPresentation({\n presentation: {\n credentials: [\n // Verifier requires at least one credential in the presentation to establish the subject.\n await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.Auth',\n },\n issuer: key,\n subject: key,\n signer,\n }),\n ],\n },\n signer,\n signerKey: key,\n nonce: challenge,\n });\n },\n };\n};\n\n/**\n * Edge identity backed by a chain of credentials.\n */\nexport const createChainEdgeIdentity = async (\n signer: Signer,\n identityKey: PublicKey,\n peerKey: PublicKey,\n chain: Chain | undefined,\n credentials: Credential[],\n): Promise<EdgeIdentity> => {\n const credentialsToSign =\n credentials.length > 0\n ? credentials\n : [\n await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.Auth',\n },\n issuer: identityKey,\n subject: identityKey,\n signer,\n chain,\n signingKey: peerKey,\n }),\n ];\n\n return {\n identityKey: identityKey.toHex(),\n peerKey: peerKey.toHex(),\n presentCredentials: async ({ challenge }) => {\n // TODO: make chain required after device invitation flow update release\n invariant(chain);\n return signPresentation({\n presentation: {\n credentials: credentialsToSign,\n },\n signer,\n nonce: challenge,\n signerKey: peerKey,\n chain,\n });\n },\n };\n};\n\n/**\n * Edge identity backed by a random ephemeral key without HALO.\n */\nexport const createEphemeralEdgeIdentity = async (): Promise<EdgeIdentity> => {\n const keyring = new Keyring();\n const key = await keyring.createKey();\n return createDeviceEdgeIdentity(keyring, key);\n};\n\n/**\n * Creates a HALO chain of credentials to act as an edge identity.\n */\nexport const createTestHaloEdgeIdentity = async (\n signer: Signer,\n identityKey: PublicKey,\n deviceKey: PublicKey,\n): Promise<EdgeIdentity> => {\n const deviceAdmission = await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.AuthorizedDevice',\n deviceKey,\n identityKey,\n },\n issuer: identityKey,\n subject: deviceKey,\n signer,\n });\n return createChainEdgeIdentity(signer, identityKey, deviceKey, { credential: deviceAdmission }, [\n await createCredential({\n assertion: {\n '@type': 'dxos.halo.credentials.Auth',\n },\n issuer: identityKey,\n subject: identityKey,\n signer,\n }),\n ]);\n};\n\nexport const createStubEdgeIdentity = (): EdgeIdentity => {\n const identityKey = PublicKey.random();\n const deviceKey = PublicKey.random();\n return {\n identityKey: identityKey.toHex(),\n peerKey: deviceKey.toHex(),\n presentCredentials: async () => {\n throw new Error('Stub identity does not support authentication.');\n },\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { FetchHttpClient, HttpClient } from '@effect/platform';\nimport { Effect, pipe } from 'effect';\n\nimport { sleep } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { type PublicKey, type SpaceId } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport {\n type CreateAgentResponseBody,\n type CreateAgentRequestBody,\n type CreateSpaceRequest,\n type CreateSpaceResponseBody,\n EdgeAuthChallengeError,\n EdgeCallFailedError,\n type EdgeHttpResponse,\n type ExecuteWorkflowResponseBody,\n type GetAgentStatusResponseBody,\n type GetNotarizationResponseBody,\n type InitiateOAuthFlowRequest,\n type InitiateOAuthFlowResponse,\n type JoinSpaceRequest,\n type JoinSpaceResponseBody,\n type RecoverIdentityRequest,\n type RecoverIdentityResponseBody,\n type ObjectId,\n type PostNotarizationRequestBody,\n type QueueQuery,\n type QueryResult,\n type UploadFunctionRequest,\n type UploadFunctionResponseBody,\n type EdgeStatus,\n} from '@dxos/protocols';\nimport { createUrl } from '@dxos/util';\n\nimport { type EdgeIdentity, handleAuthChallenge } from './edge-identity';\nimport { encodeAuthHeader, HttpConfig, withLogging, withRetryConfig } from './http-client';\nimport { getEdgeUrlWithProtocol } from './utils';\n\nconst DEFAULT_RETRY_TIMEOUT = 1500;\nconst DEFAULT_RETRY_JITTER = 500;\nconst DEFAULT_MAX_RETRIES_COUNT = 3;\n\nexport type RetryConfig = {\n /**\n * A number of call retries, not counting the initial request.\n */\n count: number;\n /**\n * Delay before retries in ms.\n */\n timeout?: number;\n /**\n * A random amount of time before retrying to help prevent large bursts of requests.\n */\n jitter?: number;\n};\n\ntype EdgeHttpRequestArgs = {\n method: string;\n context?: Context;\n retry?: RetryConfig;\n body?: any;\n};\n\nexport type EdgeHttpGetArgs = Pick<EdgeHttpRequestArgs, 'context' | 'retry'>;\nexport type EdgeHttpPostArgs = Pick<EdgeHttpRequestArgs, 'context' | 'retry' | 'body'>;\n\nexport class EdgeHttpClient {\n private readonly _baseUrl: string;\n\n private _edgeIdentity: EdgeIdentity | undefined;\n\n /**\n * Auth header is cached until receiving the next 401 from EDGE, at which point it gets refreshed.\n */\n private _authHeader: string | undefined;\n\n constructor(baseUrl: string) {\n this._baseUrl = getEdgeUrlWithProtocol(baseUrl, 'http');\n log('created', { url: this._baseUrl });\n }\n\n get baseUrl() {\n return this._baseUrl;\n }\n\n setIdentity(identity: EdgeIdentity): void {\n if (this._edgeIdentity?.identityKey !== identity.identityKey || this._edgeIdentity?.peerKey !== identity.peerKey) {\n this._edgeIdentity = identity;\n this._authHeader = undefined;\n }\n }\n\n //\n // Status\n //\n\n public async getStatus(args?: EdgeHttpGetArgs): Promise<EdgeStatus> {\n return this._call(new URL('/status', this.baseUrl), { ...args, method: 'GET' });\n }\n\n //\n // Agents\n //\n\n public createAgent(body: CreateAgentRequestBody, args?: EdgeHttpGetArgs): Promise<CreateAgentResponseBody> {\n return this._call(new URL('/agents/create', this.baseUrl), { ...args, method: 'POST', body });\n }\n\n public getAgentStatus(\n request: { ownerIdentityKey: PublicKey },\n args?: EdgeHttpGetArgs,\n ): Promise<GetAgentStatusResponseBody> {\n return this._call(new URL(`/users/${request.ownerIdentityKey.toHex()}/agent/status`, this.baseUrl), {\n ...args,\n method: 'GET',\n });\n }\n\n //\n // Credentials\n //\n\n public getCredentialsForNotarization(spaceId: SpaceId, args?: EdgeHttpGetArgs): Promise<GetNotarizationResponseBody> {\n return this._call(new URL(`/spaces/${spaceId}/notarization`, this.baseUrl), { ...args, method: 'GET' });\n }\n\n public async notarizeCredentials(\n spaceId: SpaceId,\n body: PostNotarizationRequestBody,\n args?: EdgeHttpGetArgs,\n ): Promise<void> {\n await this._call(new URL(`/spaces/${spaceId}/notarization`, this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n //\n // Identity\n //\n\n public async recoverIdentity(\n body: RecoverIdentityRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<RecoverIdentityResponseBody> {\n return this._call(new URL('/identity/recover', this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n //\n // Invitations\n //\n\n public async joinSpaceByInvitation(\n spaceId: SpaceId,\n body: JoinSpaceRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<JoinSpaceResponseBody> {\n return this._call(new URL(`/spaces/${spaceId}/join`, this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n //\n // OAuth and credentials\n //\n\n public async listFunctions(args?: EdgeHttpGetArgs): Promise<any> {\n return this._call(new URL('/functions', this.baseUrl), { ...args, method: 'GET' });\n }\n\n public async initiateOAuthFlow(\n body: InitiateOAuthFlowRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<InitiateOAuthFlowResponse> {\n return this._call(new URL('/oauth/initiate', this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n //\n // Spaces\n //\n\n async createSpace(body: CreateSpaceRequest, args?: EdgeHttpGetArgs): Promise<CreateSpaceResponseBody> {\n return this._call(new URL('/spaces/create', this.baseUrl), { ...args, body, method: 'POST' });\n }\n\n //\n // Queues\n //\n\n public async queryQueue(\n subspaceTag: string,\n spaceId: SpaceId,\n query: QueueQuery,\n args?: EdgeHttpGetArgs,\n ): Promise<QueryResult> {\n const { queueId } = query;\n return this._call(\n createUrl(new URL(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}/query`, this.baseUrl), {\n after: query.after,\n before: query.before,\n limit: query.limit,\n reverse: query.reverse,\n objectIds: query.objectIds?.join(','),\n }),\n {\n ...args,\n method: 'GET',\n },\n );\n }\n\n public async insertIntoQueue(\n subspaceTag: string,\n spaceId: SpaceId,\n queueId: ObjectId,\n objects: unknown[],\n args?: EdgeHttpGetArgs,\n ): Promise<void> {\n return this._call(new URL(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}`, this.baseUrl), {\n ...args,\n body: { objects },\n method: 'POST',\n });\n }\n\n public async deleteFromQueue(\n subspaceTag: string,\n spaceId: SpaceId,\n queueId: ObjectId,\n objectIds: ObjectId[],\n args?: EdgeHttpGetArgs,\n ): Promise<void> {\n return this._call(\n createUrl(new URL(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}`, this.baseUrl), {\n ids: objectIds.join(','),\n }),\n {\n ...args,\n method: 'DELETE',\n },\n );\n }\n\n //\n // Functions\n //\n\n public async uploadFunction(\n pathParts: { functionId?: string },\n body: UploadFunctionRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<UploadFunctionResponseBody> {\n const path = ['functions', ...(pathParts.functionId ? [pathParts.functionId] : [])].join('/');\n return this._call(new URL(path, this.baseUrl), { ...args, body, method: 'PUT' });\n }\n\n //\n // Workflows\n //\n\n public async executeWorkflow(\n spaceId: SpaceId,\n graphId: ObjectId,\n input: any,\n args?: EdgeHttpGetArgs,\n ): Promise<ExecuteWorkflowResponseBody> {\n return this._call(new URL(`/workflows/${spaceId}/${graphId}`, this.baseUrl), {\n ...args,\n body: input,\n method: 'POST',\n });\n }\n\n //\n // Internal\n //\n\n private async _fetch<T>(url: URL, args: EdgeHttpRequestArgs): Promise<T> {\n return pipe(\n HttpClient.get(url),\n withLogging,\n withRetryConfig,\n Effect.provide(FetchHttpClient.layer),\n Effect.provide(HttpConfig.default),\n Effect.withSpan('EdgeHttpClient'),\n Effect.runPromise,\n ) as T;\n }\n\n // TODO(burdon): Refactor with effect (see edge-http-client.test.ts).\n private async _call<T>(url: URL, args: EdgeHttpRequestArgs): Promise<T> {\n const shouldRetry = createRetryHandler(args);\n const requestContext = args.context ?? new Context();\n log('fetch', { url, request: args.body });\n\n let handledAuth = false;\n while (true) {\n let processingError: EdgeCallFailedError;\n let retryAfterHeaderValue: number = Number.NaN;\n try {\n const request = createRequest(args, this._authHeader);\n const response = await fetch(url, request);\n retryAfterHeaderValue = Number(response.headers.get('Retry-After'));\n if (response.ok) {\n const body = (await response.json()) as EdgeHttpResponse<T>;\n if (body.success) {\n return body.data;\n }\n\n log.warn('unsuccessful edge response', { url, body });\n if (body.errorData?.type === 'auth_challenge' && typeof body.errorData?.challenge === 'string') {\n processingError = new EdgeAuthChallengeError(body.errorData.challenge, body.errorData);\n } else {\n processingError = EdgeCallFailedError.fromUnsuccessfulResponse(response, body);\n }\n } else if (response.status === 401 && !handledAuth) {\n this._authHeader = await this._handleUnauthorized(response);\n handledAuth = true;\n continue;\n } else {\n processingError = EdgeCallFailedError.fromHttpFailure(response);\n }\n } catch (error: any) {\n processingError = EdgeCallFailedError.fromProcessingFailureCause(error);\n }\n\n if (processingError.isRetryable && (await shouldRetry(requestContext, retryAfterHeaderValue))) {\n log('retrying edge request', { url, processingError });\n } else {\n throw processingError;\n }\n }\n }\n\n private async _handleUnauthorized(response: Response): Promise<string> {\n if (!this._edgeIdentity) {\n log.warn('unauthorized response received before identity was set');\n throw EdgeCallFailedError.fromHttpFailure(response);\n }\n\n const challenge = await handleAuthChallenge(response, this._edgeIdentity);\n return encodeAuthHeader(challenge);\n }\n}\n\nconst createRequest = ({ method, body }: EdgeHttpRequestArgs, authHeader: string | undefined): RequestInit => {\n return {\n method,\n body: body && JSON.stringify(body),\n headers: authHeader ? { Authorization: authHeader } : undefined,\n };\n};\n\n/**\n * @deprecated\n */\nconst createRetryHandler = ({ retry }: EdgeHttpRequestArgs) => {\n if (!retry || retry.count < 1) {\n return async () => false;\n }\n\n let retries = 0;\n const maxRetries = retry.count ?? DEFAULT_MAX_RETRIES_COUNT;\n const baseTimeout = retry.timeout ?? DEFAULT_RETRY_TIMEOUT;\n const jitter = retry.jitter ?? DEFAULT_RETRY_JITTER;\n return async (ctx: Context, retryAfter: number) => {\n if (++retries > maxRetries || ctx.disposed) {\n return false;\n }\n\n if (retryAfter) {\n await sleep(retryAfter);\n } else {\n const timeout = baseTimeout + Math.random() * jitter;\n await sleep(timeout);\n }\n\n return true;\n };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type HttpClient } from '@effect/platform';\nimport { type HttpClientError } from '@effect/platform/HttpClientError';\nimport { type HttpClientResponse } from '@effect/platform/HttpClientResponse';\nimport { Context, Duration, Effect, Layer, Schedule } from 'effect';\n\nimport { log } from '@dxos/log';\n\n// TODO(burdon): Factor out.\n\nexport type RetryOptions = {\n timeout: Duration.Duration;\n retryTimes: number;\n retryBaseDelay: Duration.Duration;\n};\n\n// Layer pattern.\nexport class HttpConfig extends Context.Tag('HttpConfig')<HttpConfig, RetryOptions>() {\n static default = Layer.succeed(HttpConfig, {\n timeout: Duration.millis(1_000),\n retryTimes: 3,\n retryBaseDelay: Duration.millis(1_000),\n });\n}\n\n// HOC pattern.\nexport const withRetry = (\n effect: Effect.Effect<HttpClientResponse, HttpClientError, HttpClient.HttpClient>,\n {\n timeout = Duration.millis(1_000),\n retryBaseDelay = Duration.millis(1_000),\n retryTimes = 3,\n }: Partial<RetryOptions> = {},\n) => {\n return effect.pipe(\n Effect.flatMap((res) =>\n // Treat 500 errors as retryable?\n res.status === 500 ? Effect.fail(new Error(res.status.toString())) : res.json,\n ),\n Effect.timeout(timeout),\n Effect.retry({\n schedule: Schedule.exponential(retryBaseDelay).pipe(Schedule.jittered),\n times: retryTimes,\n }),\n );\n};\n\nexport const withRetryConfig = (effect: Effect.Effect<HttpClientResponse, HttpClientError, HttpClient.HttpClient>) =>\n Effect.gen(function* () {\n const config = yield* HttpConfig;\n return yield* withRetry(effect, config);\n });\n\nexport const withLogging = <A extends HttpClientResponse, E, R>(effect: Effect.Effect<A, E, R>) =>\n effect.pipe(Effect.tap((res) => log.info('response', { status: res.status })));\n\n/**\n *\n */\n// TODO(burdon): Document.\nexport const encodeAuthHeader = (challenge: Uint8Array) => {\n const encodedChallenge = Buffer.from(challenge).toString('base64');\n return `VerifiablePresentation pb;base64,${encodedChallenge}`;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Trigger", "scheduleMicroTask", "TriggerState", "PersistentLifecycle", "Event", "Resource", "log", "logInfo", "EdgeStatus", "invariant", "schema", "handleAuthChallenge", "failedResponse", "identity", "status", "headerValue", "headers", "get", "startsWith", "challenge", "slice", "length", "presentation", "presentCredentials", "Buffer", "from", "getCodecForType", "encode", "WebSocket", "scheduleTask", "scheduleTaskInterval", "Context", "Resource", "invariant", "log", "logInfo", "EdgeWebsocketProtocol", "buf", "MessageSchema", "SIGNAL_KEEPALIVE_INTERVAL", "SIGNAL_KEEPALIVE_TIMEOUT", "EdgeWsConnection", "Resource", "_identity", "_connectionInfo", "_callbacks", "_lastReceivedMessageTimestamp", "Date", "now", "info", "open", "isOpen", "identity", "identityKey", "device", "peerKey", "send", "message", "invariant", "_ws", "_wsMuxer", "log", "payload", "protocol", "getPayloadType", "includes", "EdgeWebsocketProtocol", "V0", "binary", "buf", "toBinary", "MessageSchema", "length", "CLOUDFLARE_MESSAGE_MAX_BYTES", "error", "byteLength", "serviceId", "catch", "e", "_open", "baseProtocols", "Object", "values", "WebSocket", "url", "toString", "protocolHeader", "muxer", "WebSocketMuxer", "onopen", "onConnected", "_scheduleHeartbeats", "verbose", "currentIdentity", "onclose", "event", "warn", "code", "reason", "onRestartRequired", "destroy", "onerror", "onmessage", "type", "data", "_rescheduleHeartbeatTimeout", "bytes", "toUint8Array", "fromBinary", "receiveData", "from", "source", "onMessage", "_close", "_inactivityTimeoutCtx", "dispose", "close", "undefined", "err", "Error", "scheduleTaskInterval", "_ctx", "Context", "scheduleTask", "lastReceivedMessageTimestamp", "EdgeConnectionClosedError", "Error", "EdgeIdentityChangedError", "getEdgeUrlWithProtocol", "baseUrl", "protocol", "isSecure", "startsWith", "url", "URL", "toString", "DEFAULT_TIMEOUT", "EdgeClient", "Resource", "_identity", "_config", "statusChanged", "Event", "_persistentLifecycle", "PersistentLifecycle", "start", "_connect", "stop", "state", "_disconnect", "_messageListeners", "Set", "_reconnectListeners", "_currentConnection", "undefined", "_ready", "Trigger", "_isActive", "connection", "_baseWsUrl", "getEdgeUrlWithProtocol", "socketEndpoint", "_baseHttpUrl", "info", "open", "isOpen", "status", "identity", "identityKey", "device", "peerKey", "Boolean", "TriggerState", "RESOLVED", "EdgeStatus", "CONNECTED", "NOT_CONNECTED", "setIdentity", "log", "oldIdentity", "_closeCurrentConnection", "EdgeIdentityChangedError", "scheduleRestart", "onMessage", "listener", "add", "delete", "onReconnected", "scheduleMicroTask", "_ctx", "has", "error", "catch", "_open", "err", "warn", "_close", "close", "disposed", "path", "protocolHeader", "disableAuth", "_createAuthHeader", "restartRequired", "url", "URL", "toString", "EdgeWsConnection", "onConnected", "wake", "_notifyReconnected", "verbose", "onRestartRequired", "message", "_notifyMessageReceived", "from", "source", "type", "payload", "typeUrl", "Promise", "race", "wait", "timeout", "emit", "EdgeConnectionClosedError", "throw", "reset", "protocol", "getPayloadType", "send", "httpUrl", "response", "fetch", "method", "encodePresentationWsAuthHeader", "handleAuthChallenge", "statusText", "encodedPresentation", "encodedToken", "Buffer", "replace", "replaceAll", "createCredential", "signPresentation", "invariant", "Keyring", "PublicKey", "createDeviceEdgeIdentity", "signer", "key", "identityKey", "toHex", "peerKey", "presentCredentials", "challenge", "presentation", "credentials", "assertion", "issuer", "subject", "signerKey", "nonce", "createChainEdgeIdentity", "chain", "credentialsToSign", "length", "signingKey", "createEphemeralEdgeIdentity", "keyring", "createKey", "createTestHaloEdgeIdentity", "deviceKey", "deviceAdmission", "credential", "createStubEdgeIdentity", "random", "Error", "FetchHttpClient", "HttpClient", "Effect", "pipe", "sleep", "Context", "log", "EdgeAuthChallengeError", "EdgeCallFailedError", "createUrl", "Context", "Duration", "Effect", "Layer", "Schedule", "log", "HttpConfig", "Tag", "default", "succeed", "timeout", "millis", "retryTimes", "retryBaseDelay", "withRetry", "effect", "pipe", "flatMap", "res", "status", "fail", "Error", "toString", "json", "retry", "schedule", "exponential", "jittered", "times", "withRetryConfig", "gen", "config", "withLogging", "tap", "info", "encodeAuthHeader", "challenge", "encodedChallenge", "Buffer", "from", "DEFAULT_RETRY_TIMEOUT", "DEFAULT_RETRY_JITTER", "DEFAULT_MAX_RETRIES_COUNT", "EdgeHttpClient", "baseUrl", "_baseUrl", "getEdgeUrlWithProtocol", "log", "url", "setIdentity", "identity", "_edgeIdentity", "identityKey", "peerKey", "_authHeader", "undefined", "getStatus", "args", "_call", "URL", "method", "createAgent", "body", "getAgentStatus", "request", "ownerIdentityKey", "toHex", "getCredentialsForNotarization", "spaceId", "notarizeCredentials", "recoverIdentity", "joinSpaceByInvitation", "listFunctions", "initiateOAuthFlow", "createSpace", "queryQueue", "subspaceTag", "query", "queueId", "createUrl", "after", "before", "limit", "reverse", "objectIds", "join", "insertIntoQueue", "objects", "deleteFromQueue", "ids", "uploadFunction", "pathParts", "path", "functionId", "executeWorkflow", "graphId", "input", "_fetch", "pipe", "HttpClient", "get", "withLogging", "withRetryConfig", "Effect", "provide", "FetchHttpClient", "layer", "HttpConfig", "default", "withSpan", "runPromise", "shouldRetry", "createRetryHandler", "requestContext", "context", "Context", "handledAuth", "processingError", "retryAfterHeaderValue", "Number", "NaN", "createRequest", "response", "fetch", "headers", "ok", "json", "success", "data", "warn", "errorData", "type", "challenge", "EdgeAuthChallengeError", "EdgeCallFailedError", "fromUnsuccessfulResponse", "status", "_handleUnauthorized", "fromHttpFailure", "error", "fromProcessingFailureCause", "isRetryable", "handleAuthChallenge", "encodeAuthHeader", "authHeader", "JSON", "stringify", "Authorization", "retry", "count", "retries", "maxRetries", "baseTimeout", "timeout", "jitter", "ctx", "retryAfter", "disposed", "sleep", "Math", "random"]
|
|
7
7
|
}
|