@dxos/edge-client 0.7.4 → 0.7.5-feature-compute.4d9d99a

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.
@@ -114,7 +114,8 @@ function _ts_decorate(decorators, target, key, desc) {
114
114
  return c > 3 && r && Object.defineProperty(target, key, r), r;
115
115
  }
116
116
  var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/mesh/edge-client/src/edge-ws-connection.ts";
117
- var SIGNAL_KEEPALIVE_INTERVAL = 5e3;
117
+ var SIGNAL_KEEPALIVE_INTERVAL = 4e3;
118
+ var SIGNAL_KEEPALIVE_TIMEOUT = 12e3;
118
119
  var EdgeWsConnection = class extends import_context2.Resource {
119
120
  constructor(_identity, _connectionInfo, _callbacks) {
120
121
  super();
@@ -132,7 +133,7 @@ var EdgeWsConnection = class extends import_context2.Resource {
132
133
  send(message) {
133
134
  (0, import_invariant2.invariant)(this._ws, void 0, {
134
135
  F: __dxlog_file2,
135
- L: 48,
136
+ L: 49,
136
137
  S: this,
137
138
  A: [
138
139
  "this._ws",
@@ -144,21 +145,21 @@ var EdgeWsConnection = class extends import_context2.Resource {
144
145
  payload: import_chunk_ANV2HBEH.protocol.getPayloadType(message)
145
146
  }, {
146
147
  F: __dxlog_file2,
147
- L: 49,
148
+ L: 50,
148
149
  S: this,
149
150
  C: (f, a) => f(...a)
150
151
  });
151
152
  this._ws.send(import_buf.buf.toBinary(import_messenger_pb.MessageSchema, message));
152
153
  }
153
154
  async _open() {
154
- this._ws = new import_isomorphic_ws.default(this._connectionInfo.url, this._connectionInfo.protocolHeader ? [
155
+ this._ws = new import_isomorphic_ws.default(this._connectionInfo.url.toString(), this._connectionInfo.protocolHeader ? [
155
156
  this._connectionInfo.protocolHeader
156
157
  ] : []);
157
158
  this._ws.onopen = () => {
158
159
  if (this.isOpen) {
159
160
  (0, import_log2.log)("connected", void 0, {
160
161
  F: __dxlog_file2,
161
- L: 61,
162
+ L: 62,
162
163
  S: this,
163
164
  C: (f, a) => f(...a)
164
165
  });
@@ -169,17 +170,19 @@ var EdgeWsConnection = class extends import_context2.Resource {
169
170
  currentIdentity: this._identity
170
171
  }, {
171
172
  F: __dxlog_file2,
172
- L: 65,
173
+ L: 66,
173
174
  S: this,
174
175
  C: (f, a) => f(...a)
175
176
  });
176
177
  }
177
178
  };
178
- this._ws.onclose = () => {
179
+ this._ws.onclose = (event) => {
179
180
  if (this.isOpen) {
180
- (0, import_log2.log)("disconnected while being open", void 0, {
181
+ import_log2.log.info("disconnected while being open", {
182
+ event
183
+ }, {
181
184
  F: __dxlog_file2,
182
- L: 70,
185
+ L: 71,
183
186
  S: this,
184
187
  C: (f, a) => f(...a)
185
188
  });
@@ -193,7 +196,7 @@ var EdgeWsConnection = class extends import_context2.Resource {
193
196
  info: event.message
194
197
  }, {
195
198
  F: __dxlog_file2,
196
- L: 76,
199
+ L: 77,
197
200
  S: this,
198
201
  C: (f, a) => f(...a)
199
202
  });
@@ -203,7 +206,7 @@ var EdgeWsConnection = class extends import_context2.Resource {
203
206
  error: event.error
204
207
  }, {
205
208
  F: __dxlog_file2,
206
- L: 79,
209
+ L: 80,
207
210
  S: this,
208
211
  C: (f, a) => f(...a)
209
212
  });
@@ -215,7 +218,7 @@ var EdgeWsConnection = class extends import_context2.Resource {
215
218
  event: event.type
216
219
  }, {
217
220
  F: __dxlog_file2,
218
- L: 87,
221
+ L: 88,
219
222
  S: this,
220
223
  C: (f, a) => f(...a)
221
224
  });
@@ -233,7 +236,7 @@ var EdgeWsConnection = class extends import_context2.Resource {
233
236
  payload: import_chunk_ANV2HBEH.protocol.getPayloadType(message)
234
237
  }, {
235
238
  F: __dxlog_file2,
236
- L: 97,
239
+ L: 98,
237
240
  S: this,
238
241
  C: (f, a) => f(...a)
239
242
  });
@@ -255,7 +258,7 @@ var EdgeWsConnection = class extends import_context2.Resource {
255
258
  err
256
259
  }, {
257
260
  F: __dxlog_file2,
258
- L: 113,
261
+ L: 114,
259
262
  S: this,
260
263
  C: (f, a) => f(...a)
261
264
  });
@@ -264,7 +267,7 @@ var EdgeWsConnection = class extends import_context2.Resource {
264
267
  _scheduleHeartbeats() {
265
268
  (0, import_invariant2.invariant)(this._ws, void 0, {
266
269
  F: __dxlog_file2,
267
- L: 118,
270
+ L: 119,
268
271
  S: this,
269
272
  A: [
270
273
  "this._ws",
@@ -284,13 +287,19 @@ var EdgeWsConnection = class extends import_context2.Resource {
284
287
  void this._inactivityTimeoutCtx?.dispose();
285
288
  this._inactivityTimeoutCtx = new import_context2.Context(void 0, {
286
289
  F: __dxlog_file2,
287
- L: 137
290
+ L: 138
288
291
  });
289
292
  (0, import_async2.scheduleTask)(this._inactivityTimeoutCtx, () => {
290
293
  if (this.isOpen) {
294
+ import_log2.log.warn("restart due to inactivity timeout", void 0, {
295
+ F: __dxlog_file2,
296
+ L: 143,
297
+ S: this,
298
+ C: (f, a) => f(...a)
299
+ });
291
300
  this._callbacks.onRestartRequired();
292
301
  }
293
- }, 2 * SIGNAL_KEEPALIVE_INTERVAL);
302
+ }, SIGNAL_KEEPALIVE_TIMEOUT);
294
303
  }
295
304
  };
296
305
  _ts_decorate([
@@ -831,7 +840,7 @@ var EdgeHttpClient = class {
831
840
  url: this._baseUrl
832
841
  }, {
833
842
  F: __dxlog_file6,
834
- L: 44,
843
+ L: 49,
835
844
  S: this,
836
845
  C: (f, a) => f(...a)
837
846
  });
@@ -882,6 +891,13 @@ var EdgeHttpClient = class {
882
891
  method: "POST"
883
892
  });
884
893
  }
894
+ async executeWorkflow(spaceId, graphId, input, args) {
895
+ return this._call(`/workflows/${spaceId}/${graphId}`, {
896
+ ...args,
897
+ body: input,
898
+ method: "POST"
899
+ });
900
+ }
885
901
  async uploadFunction(pathParts, body, args) {
886
902
  const path = [
887
903
  "functions",
@@ -896,10 +912,42 @@ var EdgeHttpClient = class {
896
912
  method: "PUT"
897
913
  });
898
914
  }
915
+ async queryQueue(subspaceTag, spaceId, query, args) {
916
+ const { queueId, ...rest } = query;
917
+ const queryParams = new URLSearchParams();
918
+ if (query.after != null) {
919
+ queryParams.set("after", query.after);
920
+ }
921
+ if (query.before != null) {
922
+ queryParams.set("before", query.before);
923
+ }
924
+ if (query.limit != null) {
925
+ queryParams.set("limit", query.limit.toString());
926
+ }
927
+ if (query.reverse != null) {
928
+ queryParams.set("reverse", query.reverse.toString());
929
+ }
930
+ if (query.objectIds != null) {
931
+ queryParams.set("objectIds", query.objectIds.join(","));
932
+ }
933
+ return this._call(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}/query?${queryParams.toString()}`, {
934
+ ...args,
935
+ method: "GET"
936
+ });
937
+ }
938
+ async insertIntoQueue(subspaceTag, spaceId, queueId, objects, args) {
939
+ return this._call(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}`, {
940
+ ...args,
941
+ body: {
942
+ objects
943
+ },
944
+ method: "POST"
945
+ });
946
+ }
899
947
  async _call(path, args) {
900
948
  const requestContext = args.context ?? new import_context4.Context(void 0, {
901
949
  F: __dxlog_file6,
902
- L: 102
950
+ L: 159
903
951
  });
904
952
  const shouldRetry = createRetryHandler(args);
905
953
  const url = `${this._baseUrl}${path.startsWith("/") ? path.slice(1) : path}`;
@@ -909,7 +957,7 @@ var EdgeHttpClient = class {
909
957
  request: args.body
910
958
  }, {
911
959
  F: __dxlog_file6,
912
- L: 106,
960
+ L: 163,
913
961
  S: this,
914
962
  C: (f, a) => f(...a)
915
963
  });
@@ -932,7 +980,7 @@ var EdgeHttpClient = class {
932
980
  body
933
981
  }, {
934
982
  F: __dxlog_file6,
935
- L: 125,
983
+ L: 182,
936
984
  S: this,
937
985
  C: (f, a) => f(...a)
938
986
  });
@@ -957,7 +1005,7 @@ var EdgeHttpClient = class {
957
1005
  processingError
958
1006
  }, {
959
1007
  F: __dxlog_file6,
960
- L: 144,
1008
+ L: 201,
961
1009
  S: this,
962
1010
  C: (f, a) => f(...a)
963
1011
  });
@@ -970,7 +1018,7 @@ var EdgeHttpClient = class {
970
1018
  if (!this._edgeIdentity) {
971
1019
  import_log4.log.warn("edge unauthorized response received before identity was set", void 0, {
972
1020
  F: __dxlog_file6,
973
- L: 153,
1021
+ L: 210,
974
1022
  S: this,
975
1023
  C: (f, a) => f(...a)
976
1024
  });
@@ -980,7 +1028,7 @@ var EdgeHttpClient = class {
980
1028
  this._authHeader = encodeAuthHeader(challenge);
981
1029
  (0, import_log4.log)("auth header updated", void 0, {
982
1030
  F: __dxlog_file6,
983
- L: 158,
1031
+ L: 215,
984
1032
  S: this,
985
1033
  C: (f, a) => f(...a)
986
1034
  });
@@ -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/persistent-lifecycle.ts", "../../../src/utils.ts", "../../../src/auth.ts", "../../../src/edge-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';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Trigger, scheduleMicroTask, TriggerState } 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';\n\nimport { protocol } from './defs';\nimport { type EdgeIdentity, handleAuthChallenge } from './edge-identity';\nimport { EdgeWsConnection } from './edge-ws-connection';\nimport { EdgeConnectionClosedError, EdgeIdentityChangedError } from './errors';\nimport { PersistentLifecycle } from './persistent-lifecycle';\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 get info(): any;\n get identityKey(): string;\n get peerKey(): string;\n get isOpen(): boolean;\n get isConnected(): boolean;\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 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\n private readonly _baseWsUrl: string;\n private readonly _baseHttpUrl: string;\n\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 identity: this._identity.identityKey,\n device: this._identity.peerKey,\n };\n }\n\n get isConnected() {\n return Boolean(this._currentConnection) && this._ready.state === TriggerState.RESOLVED;\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) {\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 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() {\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() {\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 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) {\n await state.close();\n }\n\n private _closeCurrentConnection(error: Error = new EdgeConnectionClosedError()) {\n this._currentConnection = undefined;\n this._ready.throw(error);\n this._ready.reset();\n }\n\n private _notifyReconnected() {\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) {\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 { 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 { toUint8Array } from './protocol';\n\nconst SIGNAL_KEEPALIVE_INTERVAL = 5_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\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) {\n invariant(this._ws);\n log('sending...', { peerKey: this._identity.peerKey, payload: protocol.getPayloadType(message) });\n this._ws.send(buf.toBinary(MessageSchema, message));\n }\n\n protected override async _open() {\n this._ws = new WebSocket(\n this._connectionInfo.url,\n this._connectionInfo.protocolHeader ? [this._connectionInfo.protocolHeader] : [],\n );\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 = () => {\n if (this.isOpen) {\n log('disconnected while being open');\n this._callbacks.onRestartRequired();\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 data = await toUint8Array(event.data);\n if (this.isOpen) {\n const message = buf.fromBinary(MessageSchema, data);\n log('received', { from: message.source, payload: protocol.getPayloadType(message) });\n this._callbacks.onMessage(message);\n }\n };\n }\n\n protected override async _close() {\n void this._inactivityTimeoutCtx?.dispose().catch(() => {});\n\n try {\n this._ws?.close();\n this._ws = 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() {\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() {\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 this._callbacks.onRestartRequired();\n }\n },\n 2 * SIGNAL_KEEPALIVE_INTERVAL,\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\nimport { DeferredTask, sleep, synchronized } from '@dxos/async';\nimport { cancelWithContext, LifecycleState, Resource } from '@dxos/context';\nimport { warnAfterTimeout } from '@dxos/debug';\nimport { log } from '@dxos/log';\n\nconst INIT_RESTART_DELAY = 100;\nconst DEFAULT_MAX_RESTART_DELAY = 5000;\n\nexport type PersistentLifecycleParams<T> = {\n /**\n * Create connection.\n * If promise resolves successfully, connection is considered established.\n */\n start: () => Promise<T | undefined>;\n\n /**\n * Reset connection to initial state.\n */\n stop: (state: T) => Promise<void>;\n\n /**\n * Called after successful start.\n */\n onRestart?: () => Promise<void>;\n\n /**\n * Maximum delay between restartion attempts.\n * Default: 5000ms\n */\n maxRestartDelay?: number;\n};\n\n/**\n * Handles restarts (e.g. persists connection).\n * Restarts are scheduled with exponential backoff.\n */\nexport class PersistentLifecycle<T> extends Resource {\n private readonly _start: () => Promise<T | undefined>;\n private readonly _stop: (state: T) => Promise<void>;\n private readonly _onRestart?: () => Promise<void>;\n private readonly _maxRestartDelay: number;\n\n private _currentContext: T | undefined = undefined;\n private _restartTask?: DeferredTask = undefined;\n private _restartAfter = 0;\n\n constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }: PersistentLifecycleParams<T>) {\n super();\n this._start = start;\n this._stop = stop;\n this._onRestart = onRestart;\n this._maxRestartDelay = maxRestartDelay;\n }\n\n @synchronized\n protected override async _open() {\n this._restartTask = new DeferredTask(this._ctx, async () => {\n try {\n await this._restart();\n } catch (err) {\n log.warn('Restart failed', { err });\n this._restartTask?.schedule();\n }\n });\n this._currentContext = await this._start().catch((err) => {\n log.warn('Start failed', { err });\n this._restartTask?.schedule();\n return undefined;\n });\n }\n\n protected override async _close() {\n await this._restartTask?.join();\n await this._stopCurrentContext();\n this._restartTask = undefined;\n }\n\n private async _restart() {\n log(`restarting in ${this._restartAfter}ms`, { state: this._lifecycleState });\n await this._stopCurrentContext();\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n await cancelWithContext(this._ctx!, sleep(this._restartAfter));\n this._restartAfter = Math.min(Math.max(this._restartAfter * 2, INIT_RESTART_DELAY), this._maxRestartDelay);\n\n // May fail if the connection is not established.\n await warnAfterTimeout(5_000, 'Connection establishment takes too long', async () => {\n this._currentContext = await this._start();\n });\n\n this._restartAfter = 0;\n await this._onRestart?.();\n }\n\n private async _stopCurrentContext() {\n if (this._currentContext) {\n try {\n await this._stop(this._currentContext);\n } catch (err) {\n log.catch(err);\n }\n this._currentContext = undefined;\n }\n }\n\n /**\n * Scheduling restart should be done from outside.\n */\n @synchronized\n scheduleRestart() {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n this._restartTask!.schedule();\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 { sleep } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { type PublicKey, type SpaceId } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport {\n EdgeCallFailedError,\n type EdgeHttpResponse,\n type GetNotarizationResponseBody,\n type PostNotarizationRequestBody,\n type JoinSpaceRequest,\n type JoinSpaceResponseBody,\n EdgeAuthChallengeError,\n type CreateAgentResponseBody,\n type CreateAgentRequestBody,\n type GetAgentStatusResponseBody,\n type RecoverIdentityRequest,\n type RecoverIdentityResponseBody,\n type UploadFunctionRequest,\n type UploadFunctionResponseBody,\n} from '@dxos/protocols';\n\nimport { type EdgeIdentity, handleAuthChallenge } from './edge-identity';\nimport { getEdgeUrlWithProtocol } from './utils';\n\nconst DEFAULT_RETRY_TIMEOUT = 1500;\nconst DEFAULT_RETRY_JITTER = 500;\nconst DEFAULT_MAX_RETRIES_COUNT = 3;\n\nexport class EdgeHttpClient {\n private readonly _baseUrl: string;\n\n private _edgeIdentity: EdgeIdentity | undefined;\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 setIdentity(identity: EdgeIdentity) {\n if (this._edgeIdentity?.identityKey !== identity.identityKey || this._edgeIdentity?.peerKey !== identity.peerKey) {\n this._edgeIdentity = identity;\n this._authHeader = undefined;\n }\n }\n\n public createAgent(body: CreateAgentRequestBody, args?: EdgeHttpGetArgs): Promise<CreateAgentResponseBody> {\n return this._call('/agents/create', { ...args, method: 'POST', body });\n }\n\n public getAgentStatus(\n request: { ownerIdentityKey: PublicKey },\n args?: EdgeHttpGetArgs,\n ): Promise<GetAgentStatusResponseBody> {\n return this._call(`/users/${request.ownerIdentityKey.toHex()}/agent/status`, { ...args, method: 'GET' });\n }\n\n public getCredentialsForNotarization(spaceId: SpaceId, args?: EdgeHttpGetArgs): Promise<GetNotarizationResponseBody> {\n return this._call(`/spaces/${spaceId}/notarization`, { ...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(`/spaces/${spaceId}/notarization`, { ...args, body, method: 'POST' });\n }\n\n public async joinSpaceByInvitation(\n spaceId: SpaceId,\n body: JoinSpaceRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<JoinSpaceResponseBody> {\n return this._call(`/spaces/${spaceId}/join`, { ...args, body, method: 'POST' });\n }\n\n public async recoverIdentity(\n body: RecoverIdentityRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<RecoverIdentityResponseBody> {\n return this._call('/identity/recover', { ...args, body, method: 'POST' });\n }\n\n public async uploadFunction(\n pathParts: { spaceId: SpaceId; functionId?: string },\n body: UploadFunctionRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<UploadFunctionResponseBody> {\n const path = ['functions', pathParts.spaceId, ...(pathParts.functionId ? [pathParts.functionId] : [])].join('/');\n return this._call(path, { ...args, body, method: 'PUT' });\n }\n\n private async _call<T>(path: string, args: EdgeHttpCallArgs): Promise<T> {\n const requestContext = args.context ?? new Context();\n const shouldRetry = createRetryHandler(args);\n const url = `${this._baseUrl}${path.startsWith('/') ? path.slice(1) : path}`;\n\n log.info('call', { method: args.method, path, request: args.body });\n\n let handledAuth = false;\n let authHeader = this._authHeader;\n while (true) {\n let processingError: EdgeCallFailedError;\n let retryAfterHeaderValue: number = Number.NaN;\n try {\n const request = createRequest(args, authHeader);\n const response = await fetch(url, request);\n\n retryAfterHeaderValue = Number(response.headers.get('Retry-After'));\n\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.info('unsuccessful edge response', { path, body });\n\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 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.info('retrying edge request', { path, processingError });\n } else {\n throw processingError;\n }\n }\n }\n\n private async _handleUnauthorized(response: Response) {\n if (!this._edgeIdentity) {\n log.warn('edge unauthorized response received before identity was set');\n throw EdgeCallFailedError.fromHttpFailure(response);\n }\n const challenge = await handleAuthChallenge(response, this._edgeIdentity);\n this._authHeader = encodeAuthHeader(challenge);\n log('auth header updated');\n return this._authHeader;\n }\n}\n\nconst createRetryHandler = (args: EdgeHttpCallArgs) => {\n if (!args.retry || args.retry.count < 1) {\n return async () => false;\n }\n let retries = 0;\n const maxRetries = args.retry.count ?? DEFAULT_MAX_RETRIES_COUNT;\n const baseTimeout = args.retry.timeout ?? DEFAULT_RETRY_TIMEOUT;\n const jitter = args.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\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\nexport type EdgeHttpGetArgs = { context?: Context; retry?: RetryConfig };\n\nexport type EdgeHttpPostArgs = { context?: Context; body?: any; retry?: RetryConfig };\n\ntype EdgeHttpCallArgs = {\n method: string;\n body?: any;\n context?: Context;\n retry?: RetryConfig;\n};\n\nconst createRequest = (args: EdgeHttpCallArgs, authHeader: string | undefined): RequestInit => {\n return {\n method: args.method,\n body: args.body && JSON.stringify(args.body),\n headers: authHeader ? { Authorization: authHeader } : undefined,\n };\n};\n\nconst 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": ["import_async", "import_context", "import_invariant", "import_log", "handleAuthChallenge", "failedResponse", "identity", "invariant", "status", "headerValue", "headers", "get", "startsWith", "challenge", "slice", "length", "presentation", "presentCredentials", "Buffer", "from", "schema", "getCodecForType", "encode", "SIGNAL_KEEPALIVE_INTERVAL", "EdgeWsConnection", "Resource", "constructor", "_identity", "_connectionInfo", "_callbacks", "info", "open", "isOpen", "identityKey", "device", "peerKey", "send", "message", "_ws", "log", "payload", "protocol", "getPayloadType", "buf", "toBinary", "MessageSchema", "_open", "WebSocket", "url", "protocolHeader", "onopen", "onConnected", "_scheduleHeartbeats", "verbose", "currentIdentity", "onclose", "onRestartRequired", "onerror", "event", "warn", "error", "onmessage", "type", "data", "_rescheduleHeartbeatTimeout", "toUint8Array", "fromBinary", "source", "onMessage", "_close", "_inactivityTimeoutCtx", "dispose", "catch", "close", "undefined", "err", "Error", "includes", "scheduleTaskInterval", "_ctx", "Context", "scheduleTask", "logInfo", "EdgeConnectionClosedError", "EdgeIdentityChangedError", "INIT_RESTART_DELAY", "DEFAULT_MAX_RESTART_DELAY", "PersistentLifecycle", "start", "stop", "onRestart", "maxRestartDelay", "_currentContext", "_restartTask", "_restartAfter", "_start", "_stop", "_onRestart", "_maxRestartDelay", "DeferredTask", "_restart", "schedule", "join", "_stopCurrentContext", "state", "_lifecycleState", "LifecycleState", "OPEN", "cancelWithContext", "sleep", "Math", "min", "max", "warnAfterTimeout", "scheduleRestart", "synchronized", "getEdgeUrlWithProtocol", "baseUrl", "isSecure", "URL", "toString", "DEFAULT_TIMEOUT", "EdgeClient", "_config", "_persistentLifecycle", "_connect", "_disconnect", "_messageListeners", "Set", "_reconnectListeners", "_currentConnection", "_ready", "Trigger", "_isActive", "connection", "_baseWsUrl", "socketEndpoint", "_baseHttpUrl", "isConnected", "Boolean", "TriggerState", "RESOLVED", "setIdentity", "oldIdentity", "_closeCurrentConnection", "listener", "add", "delete", "onReconnected", "scheduleMicroTask", "has", "disposed", "path", "disableAuth", "_createAuthHeader", "restartRequired", "wake", "_notifyReconnected", "_notifyMessageReceived", "typeUrl", "Promise", "race", "wait", "timeout", "throw", "reset", "httpUrl", "response", "fetch", "method", "encodePresentationWsAuthHeader", "statusText", "encodedPresentation", "encodedToken", "replace", "replaceAll", "createDeviceEdgeIdentity", "signer", "key", "toHex", "signPresentation", "credentials", "createCredential", "assertion", "issuer", "subject", "signerKey", "nonce", "createChainEdgeIdentity", "chain", "credentialsToSign", "signingKey", "createEphemeralEdgeIdentity", "keyring", "Keyring", "createKey", "createTestHaloEdgeIdentity", "deviceKey", "deviceAdmission", "credential", "createStubEdgeIdentity", "PublicKey", "random", "DEFAULT_RETRY_TIMEOUT", "DEFAULT_RETRY_JITTER", "DEFAULT_MAX_RETRIES_COUNT", "EdgeHttpClient", "_baseUrl", "_edgeIdentity", "_authHeader", "createAgent", "body", "args", "_call", "getAgentStatus", "request", "ownerIdentityKey", "getCredentialsForNotarization", "spaceId", "notarizeCredentials", "joinSpaceByInvitation", "recoverIdentity", "uploadFunction", "pathParts", "functionId", "requestContext", "context", "shouldRetry", "createRetryHandler", "handledAuth", "authHeader", "processingError", "retryAfterHeaderValue", "Number", "NaN", "createRequest", "ok", "json", "success", "errorData", "EdgeAuthChallengeError", "EdgeCallFailedError", "fromUnsuccessfulResponse", "_handleUnauthorized", "fromHttpFailure", "fromProcessingFailureCause", "isRetryable", "encodeAuthHeader", "retry", "count", "retries", "maxRetries", "baseTimeout", "jitter", "ctx", "retryAfter", "JSON", "stringify", "Authorization", "encodedChallenge"]
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';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Trigger, scheduleMicroTask, TriggerState } 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';\n\nimport { protocol } from './defs';\nimport { type EdgeIdentity, handleAuthChallenge } from './edge-identity';\nimport { EdgeWsConnection } from './edge-ws-connection';\nimport { EdgeConnectionClosedError, EdgeIdentityChangedError } from './errors';\nimport { PersistentLifecycle } from './persistent-lifecycle';\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 get info(): any;\n get identityKey(): string;\n get peerKey(): string;\n get isOpen(): boolean;\n get isConnected(): boolean;\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 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\n private readonly _baseWsUrl: string;\n private readonly _baseHttpUrl: string;\n\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 identity: this._identity.identityKey,\n device: this._identity.peerKey,\n };\n }\n\n get isConnected() {\n return Boolean(this._currentConnection) && this._ready.state === TriggerState.RESOLVED;\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) {\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 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() {\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() {\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 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) {\n await state.close();\n }\n\n private _closeCurrentConnection(error: Error = new EdgeConnectionClosedError()) {\n this._currentConnection = undefined;\n this._ready.throw(error);\n this._ready.reset();\n }\n\n private _notifyReconnected() {\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) {\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 { 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 { 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\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) {\n invariant(this._ws);\n log('sending...', { peerKey: this._identity.peerKey, payload: protocol.getPayloadType(message) });\n this._ws.send(buf.toBinary(MessageSchema, message));\n }\n\n protected override async _open() {\n this._ws = new WebSocket(\n this._connectionInfo.url.toString(),\n this._connectionInfo.protocolHeader ? [this._connectionInfo.protocolHeader] : [],\n );\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.info('disconnected while being open', { event });\n this._callbacks.onRestartRequired();\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 data = await toUint8Array(event.data);\n if (this.isOpen) {\n const message = buf.fromBinary(MessageSchema, data);\n log('received', { from: message.source, payload: protocol.getPayloadType(message) });\n this._callbacks.onMessage(message);\n }\n };\n }\n\n protected override async _close() {\n void this._inactivityTimeoutCtx?.dispose().catch(() => {});\n\n try {\n this._ws?.close();\n this._ws = 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() {\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() {\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\nimport { DeferredTask, sleep, synchronized } from '@dxos/async';\nimport { cancelWithContext, LifecycleState, Resource } from '@dxos/context';\nimport { warnAfterTimeout } from '@dxos/debug';\nimport { log } from '@dxos/log';\n\nconst INIT_RESTART_DELAY = 100;\nconst DEFAULT_MAX_RESTART_DELAY = 5000;\n\nexport type PersistentLifecycleParams<T> = {\n /**\n * Create connection.\n * If promise resolves successfully, connection is considered established.\n */\n start: () => Promise<T | undefined>;\n\n /**\n * Reset connection to initial state.\n */\n stop: (state: T) => Promise<void>;\n\n /**\n * Called after successful start.\n */\n onRestart?: () => Promise<void>;\n\n /**\n * Maximum delay between restartion attempts.\n * Default: 5000ms\n */\n maxRestartDelay?: number;\n};\n\n/**\n * Handles restarts (e.g. persists connection).\n * Restarts are scheduled with exponential backoff.\n */\nexport class PersistentLifecycle<T> extends Resource {\n private readonly _start: () => Promise<T | undefined>;\n private readonly _stop: (state: T) => Promise<void>;\n private readonly _onRestart?: () => Promise<void>;\n private readonly _maxRestartDelay: number;\n\n private _currentContext: T | undefined = undefined;\n private _restartTask?: DeferredTask = undefined;\n private _restartAfter = 0;\n\n constructor({ start, stop, onRestart, maxRestartDelay = DEFAULT_MAX_RESTART_DELAY }: PersistentLifecycleParams<T>) {\n super();\n this._start = start;\n this._stop = stop;\n this._onRestart = onRestart;\n this._maxRestartDelay = maxRestartDelay;\n }\n\n @synchronized\n protected override async _open() {\n this._restartTask = new DeferredTask(this._ctx, async () => {\n try {\n await this._restart();\n } catch (err) {\n log.warn('Restart failed', { err });\n this._restartTask?.schedule();\n }\n });\n this._currentContext = await this._start().catch((err) => {\n log.warn('Start failed', { err });\n this._restartTask?.schedule();\n return undefined;\n });\n }\n\n protected override async _close() {\n await this._restartTask?.join();\n await this._stopCurrentContext();\n this._restartTask = undefined;\n }\n\n private async _restart() {\n log(`restarting in ${this._restartAfter}ms`, { state: this._lifecycleState });\n await this._stopCurrentContext();\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n await cancelWithContext(this._ctx!, sleep(this._restartAfter));\n this._restartAfter = Math.min(Math.max(this._restartAfter * 2, INIT_RESTART_DELAY), this._maxRestartDelay);\n\n // May fail if the connection is not established.\n await warnAfterTimeout(5_000, 'Connection establishment takes too long', async () => {\n this._currentContext = await this._start();\n });\n\n this._restartAfter = 0;\n await this._onRestart?.();\n }\n\n private async _stopCurrentContext() {\n if (this._currentContext) {\n try {\n await this._stop(this._currentContext);\n } catch (err) {\n log.catch(err);\n }\n this._currentContext = undefined;\n }\n }\n\n /**\n * Scheduling restart should be done from outside.\n */\n @synchronized\n scheduleRestart() {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return;\n }\n this._restartTask!.schedule();\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 { sleep } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { type PublicKey, type SpaceId } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport {\n EdgeCallFailedError,\n type EdgeHttpResponse,\n type GetNotarizationResponseBody,\n type PostNotarizationRequestBody,\n type JoinSpaceRequest,\n type JoinSpaceResponseBody,\n EdgeAuthChallengeError,\n type CreateAgentResponseBody,\n type CreateAgentRequestBody,\n type GetAgentStatusResponseBody,\n type RecoverIdentityRequest,\n type RecoverIdentityResponseBody,\n type UploadFunctionRequest,\n type UploadFunctionResponseBody,\n type ObjectId,\n type ExecuteWorkflowResponseBody,\n type QueueQuery,\n type QueryResult,\n} from '@dxos/protocols';\n\nimport { type EdgeIdentity, handleAuthChallenge } from './edge-identity';\nimport { getEdgeUrlWithProtocol } from './utils';\n\nconst DEFAULT_RETRY_TIMEOUT = 1500;\nconst DEFAULT_RETRY_JITTER = 500;\nconst DEFAULT_MAX_RETRIES_COUNT = 3;\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 setIdentity(identity: EdgeIdentity) {\n if (this._edgeIdentity?.identityKey !== identity.identityKey || this._edgeIdentity?.peerKey !== identity.peerKey) {\n this._edgeIdentity = identity;\n this._authHeader = undefined;\n }\n }\n\n public createAgent(body: CreateAgentRequestBody, args?: EdgeHttpGetArgs): Promise<CreateAgentResponseBody> {\n return this._call('/agents/create', { ...args, method: 'POST', body });\n }\n\n public getAgentStatus(\n request: { ownerIdentityKey: PublicKey },\n args?: EdgeHttpGetArgs,\n ): Promise<GetAgentStatusResponseBody> {\n return this._call(`/users/${request.ownerIdentityKey.toHex()}/agent/status`, { ...args, method: 'GET' });\n }\n\n public getCredentialsForNotarization(spaceId: SpaceId, args?: EdgeHttpGetArgs): Promise<GetNotarizationResponseBody> {\n return this._call(`/spaces/${spaceId}/notarization`, { ...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(`/spaces/${spaceId}/notarization`, { ...args, body, method: 'POST' });\n }\n\n public async joinSpaceByInvitation(\n spaceId: SpaceId,\n body: JoinSpaceRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<JoinSpaceResponseBody> {\n return this._call(`/spaces/${spaceId}/join`, { ...args, body, method: 'POST' });\n }\n\n public async recoverIdentity(\n body: RecoverIdentityRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<RecoverIdentityResponseBody> {\n return this._call('/identity/recover', { ...args, body, method: 'POST' });\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(`/workflows/${spaceId}/${graphId}`, { ...args, body: input, method: 'POST' });\n }\n\n public async uploadFunction(\n pathParts: { spaceId: SpaceId; functionId?: string },\n body: UploadFunctionRequest,\n args?: EdgeHttpGetArgs,\n ): Promise<UploadFunctionResponseBody> {\n const path = ['functions', pathParts.spaceId, ...(pathParts.functionId ? [pathParts.functionId] : [])].join('/');\n return this._call(path, { ...args, body, method: 'PUT' });\n }\n\n public async queryQueue(\n subspaceTag: string,\n spaceId: SpaceId,\n query: QueueQuery,\n args?: EdgeHttpGetArgs,\n ): Promise<QueryResult> {\n const { queueId, ...rest } = query;\n const queryParams = new URLSearchParams();\n if (query.after != null) {\n queryParams.set('after', query.after);\n }\n if (query.before != null) {\n queryParams.set('before', query.before);\n }\n if (query.limit != null) {\n queryParams.set('limit', query.limit.toString());\n }\n if (query.reverse != null) {\n queryParams.set('reverse', query.reverse.toString());\n }\n if (query.objectIds != null) {\n queryParams.set('objectIds', query.objectIds.join(','));\n }\n return this._call(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}/query?${queryParams.toString()}`, {\n ...args,\n method: 'GET',\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(`/spaces/${subspaceTag}/${spaceId}/queue/${queueId}`, {\n ...args,\n body: { objects },\n method: 'POST',\n });\n }\n\n private async _call<T>(path: string, args: EdgeHttpCallArgs): Promise<T> {\n const requestContext = args.context ?? new Context();\n const shouldRetry = createRetryHandler(args);\n const url = `${this._baseUrl}${path.startsWith('/') ? path.slice(1) : path}`;\n\n log.info('call', { method: args.method, path, request: args.body });\n\n let handledAuth = false;\n let authHeader = this._authHeader;\n while (true) {\n let processingError: EdgeCallFailedError;\n let retryAfterHeaderValue: number = Number.NaN;\n try {\n const request = createRequest(args, authHeader);\n const response = await fetch(url, request);\n\n retryAfterHeaderValue = Number(response.headers.get('Retry-After'));\n\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.info('unsuccessful edge response', { path, body });\n\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 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.info('retrying edge request', { path, processingError });\n } else {\n throw processingError;\n }\n }\n }\n\n private async _handleUnauthorized(response: Response) {\n if (!this._edgeIdentity) {\n log.warn('edge unauthorized response received before identity was set');\n throw EdgeCallFailedError.fromHttpFailure(response);\n }\n const challenge = await handleAuthChallenge(response, this._edgeIdentity);\n this._authHeader = encodeAuthHeader(challenge);\n log('auth header updated');\n return this._authHeader;\n }\n}\n\nconst createRetryHandler = (args: EdgeHttpCallArgs) => {\n if (!args.retry || args.retry.count < 1) {\n return async () => false;\n }\n let retries = 0;\n const maxRetries = args.retry.count ?? DEFAULT_MAX_RETRIES_COUNT;\n const baseTimeout = args.retry.timeout ?? DEFAULT_RETRY_TIMEOUT;\n const jitter = args.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\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\nexport type EdgeHttpGetArgs = { context?: Context; retry?: RetryConfig };\n\nexport type EdgeHttpPostArgs = { context?: Context; body?: any; retry?: RetryConfig };\n\ntype EdgeHttpCallArgs = {\n method: string;\n body?: any;\n context?: Context;\n retry?: RetryConfig;\n};\n\nconst createRequest = (args: EdgeHttpCallArgs, authHeader: string | undefined): RequestInit => {\n return {\n method: args.method,\n body: args.body && JSON.stringify(args.body),\n headers: authHeader ? { Authorization: authHeader } : undefined,\n };\n};\n\nconst 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": ["import_async", "import_context", "import_invariant", "import_log", "handleAuthChallenge", "failedResponse", "identity", "invariant", "status", "headerValue", "headers", "get", "startsWith", "challenge", "slice", "length", "presentation", "presentCredentials", "Buffer", "from", "schema", "getCodecForType", "encode", "SIGNAL_KEEPALIVE_INTERVAL", "SIGNAL_KEEPALIVE_TIMEOUT", "EdgeWsConnection", "Resource", "constructor", "_identity", "_connectionInfo", "_callbacks", "info", "open", "isOpen", "identityKey", "device", "peerKey", "send", "message", "_ws", "log", "payload", "protocol", "getPayloadType", "buf", "toBinary", "MessageSchema", "_open", "WebSocket", "url", "toString", "protocolHeader", "onopen", "onConnected", "_scheduleHeartbeats", "verbose", "currentIdentity", "onclose", "event", "onRestartRequired", "onerror", "warn", "error", "onmessage", "type", "data", "_rescheduleHeartbeatTimeout", "toUint8Array", "fromBinary", "source", "onMessage", "_close", "_inactivityTimeoutCtx", "dispose", "catch", "close", "undefined", "err", "Error", "includes", "scheduleTaskInterval", "_ctx", "Context", "scheduleTask", "logInfo", "EdgeConnectionClosedError", "EdgeIdentityChangedError", "INIT_RESTART_DELAY", "DEFAULT_MAX_RESTART_DELAY", "PersistentLifecycle", "start", "stop", "onRestart", "maxRestartDelay", "_currentContext", "_restartTask", "_restartAfter", "_start", "_stop", "_onRestart", "_maxRestartDelay", "DeferredTask", "_restart", "schedule", "join", "_stopCurrentContext", "state", "_lifecycleState", "LifecycleState", "OPEN", "cancelWithContext", "sleep", "Math", "min", "max", "warnAfterTimeout", "scheduleRestart", "synchronized", "getEdgeUrlWithProtocol", "baseUrl", "isSecure", "URL", "DEFAULT_TIMEOUT", "EdgeClient", "_config", "_persistentLifecycle", "_connect", "_disconnect", "_messageListeners", "Set", "_reconnectListeners", "_currentConnection", "_ready", "Trigger", "_isActive", "connection", "_baseWsUrl", "socketEndpoint", "_baseHttpUrl", "isConnected", "Boolean", "TriggerState", "RESOLVED", "setIdentity", "oldIdentity", "_closeCurrentConnection", "listener", "add", "delete", "onReconnected", "scheduleMicroTask", "has", "disposed", "path", "disableAuth", "_createAuthHeader", "restartRequired", "wake", "_notifyReconnected", "_notifyMessageReceived", "typeUrl", "Promise", "race", "wait", "timeout", "throw", "reset", "httpUrl", "response", "fetch", "method", "encodePresentationWsAuthHeader", "statusText", "encodedPresentation", "encodedToken", "replace", "replaceAll", "createDeviceEdgeIdentity", "signer", "key", "toHex", "signPresentation", "credentials", "createCredential", "assertion", "issuer", "subject", "signerKey", "nonce", "createChainEdgeIdentity", "chain", "credentialsToSign", "signingKey", "createEphemeralEdgeIdentity", "keyring", "Keyring", "createKey", "createTestHaloEdgeIdentity", "deviceKey", "deviceAdmission", "credential", "createStubEdgeIdentity", "PublicKey", "random", "DEFAULT_RETRY_TIMEOUT", "DEFAULT_RETRY_JITTER", "DEFAULT_MAX_RETRIES_COUNT", "EdgeHttpClient", "_baseUrl", "_edgeIdentity", "_authHeader", "createAgent", "body", "args", "_call", "getAgentStatus", "request", "ownerIdentityKey", "getCredentialsForNotarization", "spaceId", "notarizeCredentials", "joinSpaceByInvitation", "recoverIdentity", "executeWorkflow", "graphId", "input", "uploadFunction", "pathParts", "functionId", "queryQueue", "subspaceTag", "query", "queueId", "rest", "queryParams", "URLSearchParams", "after", "set", "before", "limit", "reverse", "objectIds", "insertIntoQueue", "objects", "requestContext", "context", "shouldRetry", "createRetryHandler", "handledAuth", "authHeader", "processingError", "retryAfterHeaderValue", "Number", "NaN", "createRequest", "ok", "json", "success", "errorData", "EdgeAuthChallengeError", "EdgeCallFailedError", "fromUnsuccessfulResponse", "_handleUnauthorized", "fromHttpFailure", "fromProcessingFailureCause", "isRetryable", "encodeAuthHeader", "retry", "count", "retries", "maxRetries", "baseTimeout", "jitter", "ctx", "retryAfter", "JSON", "stringify", "Authorization", "encodedChallenge"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/core/mesh/edge-client/src/protocol.ts":{"bytes":10334,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/defs.ts":{"bytes":1607,"imports":[{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-identity.ts":{"bytes":4069,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-ws-connection.ts":{"bytes":18846,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/errors.ts":{"bytes":1265,"imports":[],"format":"esm"},"packages/core/mesh/edge-client/src/persistent-lifecycle.ts":{"bytes":12584,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/utils.ts":{"bytes":1451,"imports":[],"format":"esm"},"packages/core/mesh/edge-client/src/edge-client.ts":{"bytes":34295,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/edge-ws-connection.ts","kind":"import-statement","original":"./edge-ws-connection"},{"path":"packages/core/mesh/edge-client/src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"packages/core/mesh/edge-client/src/persistent-lifecycle.ts","kind":"import-statement","original":"./persistent-lifecycle"},{"path":"packages/core/mesh/edge-client/src/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/core/mesh/edge-client/src/auth.ts":{"bytes":12314,"imports":[{"path":"@dxos/credentials","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-http-client.ts":{"bytes":25302,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/core/mesh/edge-client/src/index.ts":{"bytes":1228,"imports":[{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/edge-client.ts","kind":"import-statement","original":"./edge-client"},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"},{"path":"packages/core/mesh/edge-client/src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"packages/core/mesh/edge-client/src/auth.ts","kind":"import-statement","original":"./auth"},{"path":"packages/core/mesh/edge-client/src/edge-http-client.ts","kind":"import-statement","original":"./edge-http-client"},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"}],"format":"esm"},"packages/core/mesh/edge-client/src/testing/test-utils.ts":{"bytes":13201,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"../defs"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"../protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/testing/index.ts":{"bytes":516,"imports":[{"path":"packages/core/mesh/edge-client/src/testing/test-utils.ts","kind":"import-statement","original":"./test-utils"}],"format":"esm"}},"outputs":{"packages/core/mesh/edge-client/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":51390},"packages/core/mesh/edge-client/dist/lib/node/index.cjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/node/chunk-ANV2HBEH.cjs","kind":"import-statement"},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/credentials","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true}],"exports":["EdgeClient","EdgeConnectionClosedError","EdgeHttpClient","EdgeIdentityChangedError","Protocol","createChainEdgeIdentity","createDeviceEdgeIdentity","createEphemeralEdgeIdentity","createStubEdgeIdentity","createTestHaloEdgeIdentity","getTypename","handleAuthChallenge","protocol","toUint8Array"],"entryPoint":"packages/core/mesh/edge-client/src/index.ts","inputs":{"packages/core/mesh/edge-client/src/index.ts":{"bytesInOutput":60},"packages/core/mesh/edge-client/src/edge-client.ts":{"bytesInOutput":9076},"packages/core/mesh/edge-client/src/edge-identity.ts":{"bytesInOutput":1150},"packages/core/mesh/edge-client/src/edge-ws-connection.ts":{"bytesInOutput":5569},"packages/core/mesh/edge-client/src/errors.ts":{"bytesInOutput":232},"packages/core/mesh/edge-client/src/persistent-lifecycle.ts":{"bytesInOutput":3547},"packages/core/mesh/edge-client/src/utils.ts":{"bytesInOutput":244},"packages/core/mesh/edge-client/src/auth.ts":{"bytesInOutput":2993},"packages/core/mesh/edge-client/src/edge-http-client.ts":{"bytesInOutput":6050}},"bytes":29909},"packages/core/mesh/edge-client/dist/lib/node/testing/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":6741},"packages/core/mesh/edge-client/dist/lib/node/testing/index.cjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/node/chunk-ANV2HBEH.cjs","kind":"import-statement"},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true}],"exports":["DEFAULT_PORT","createTestEdgeWsServer"],"entryPoint":"packages/core/mesh/edge-client/src/testing/index.ts","inputs":{"packages/core/mesh/edge-client/src/testing/test-utils.ts":{"bytesInOutput":3466},"packages/core/mesh/edge-client/src/testing/index.ts":{"bytesInOutput":0}},"bytes":3683},"packages/core/mesh/edge-client/dist/lib/node/chunk-ANV2HBEH.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5676},"packages/core/mesh/edge-client/dist/lib/node/chunk-ANV2HBEH.cjs":{"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true}],"exports":["Protocol","getTypename","protocol","toUint8Array"],"inputs":{"packages/core/mesh/edge-client/src/protocol.ts":{"bytesInOutput":2600},"packages/core/mesh/edge-client/src/defs.ts":{"bytesInOutput":298}},"bytes":3106}}}
1
+ {"inputs":{"packages/core/mesh/edge-client/src/protocol.ts":{"bytes":10334,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/defs.ts":{"bytes":1607,"imports":[{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-identity.ts":{"bytes":4069,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-ws-connection.ts":{"bytes":19531,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/errors.ts":{"bytes":1265,"imports":[],"format":"esm"},"packages/core/mesh/edge-client/src/persistent-lifecycle.ts":{"bytes":12584,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/utils.ts":{"bytes":1451,"imports":[],"format":"esm"},"packages/core/mesh/edge-client/src/edge-client.ts":{"bytes":34295,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/edge-ws-connection.ts","kind":"import-statement","original":"./edge-ws-connection"},{"path":"packages/core/mesh/edge-client/src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"packages/core/mesh/edge-client/src/persistent-lifecycle.ts","kind":"import-statement","original":"./persistent-lifecycle"},{"path":"packages/core/mesh/edge-client/src/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/core/mesh/edge-client/src/auth.ts":{"bytes":12314,"imports":[{"path":"@dxos/credentials","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/edge-client/src/edge-http-client.ts":{"bytes":30706,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"},{"path":"packages/core/mesh/edge-client/src/utils.ts","kind":"import-statement","original":"./utils"}],"format":"esm"},"packages/core/mesh/edge-client/src/index.ts":{"bytes":1228,"imports":[{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/edge-client.ts","kind":"import-statement","original":"./edge-client"},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"./defs"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"./protocol"},{"path":"packages/core/mesh/edge-client/src/errors.ts","kind":"import-statement","original":"./errors"},{"path":"packages/core/mesh/edge-client/src/auth.ts","kind":"import-statement","original":"./auth"},{"path":"packages/core/mesh/edge-client/src/edge-http-client.ts","kind":"import-statement","original":"./edge-http-client"},{"path":"packages/core/mesh/edge-client/src/edge-identity.ts","kind":"import-statement","original":"./edge-identity"}],"format":"esm"},"packages/core/mesh/edge-client/src/testing/test-utils.ts":{"bytes":13201,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"packages/core/mesh/edge-client/src/defs.ts","kind":"import-statement","original":"../defs"},{"path":"packages/core/mesh/edge-client/src/protocol.ts","kind":"import-statement","original":"../protocol"}],"format":"esm"},"packages/core/mesh/edge-client/src/testing/index.ts":{"bytes":516,"imports":[{"path":"packages/core/mesh/edge-client/src/testing/test-utils.ts","kind":"import-statement","original":"./test-utils"}],"format":"esm"}},"outputs":{"packages/core/mesh/edge-client/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":54437},"packages/core/mesh/edge-client/dist/lib/node/index.cjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/node/chunk-ANV2HBEH.cjs","kind":"import-statement"},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/credentials","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true}],"exports":["EdgeClient","EdgeConnectionClosedError","EdgeHttpClient","EdgeIdentityChangedError","Protocol","createChainEdgeIdentity","createDeviceEdgeIdentity","createEphemeralEdgeIdentity","createStubEdgeIdentity","createTestHaloEdgeIdentity","getTypename","handleAuthChallenge","protocol","toUint8Array"],"entryPoint":"packages/core/mesh/edge-client/src/index.ts","inputs":{"packages/core/mesh/edge-client/src/index.ts":{"bytesInOutput":60},"packages/core/mesh/edge-client/src/edge-client.ts":{"bytesInOutput":9076},"packages/core/mesh/edge-client/src/edge-identity.ts":{"bytesInOutput":1150},"packages/core/mesh/edge-client/src/edge-ws-connection.ts":{"bytesInOutput":5815},"packages/core/mesh/edge-client/src/errors.ts":{"bytesInOutput":232},"packages/core/mesh/edge-client/src/persistent-lifecycle.ts":{"bytesInOutput":3547},"packages/core/mesh/edge-client/src/utils.ts":{"bytesInOutput":244},"packages/core/mesh/edge-client/src/auth.ts":{"bytesInOutput":2993},"packages/core/mesh/edge-client/src/edge-http-client.ts":{"bytesInOutput":7234}},"bytes":31339},"packages/core/mesh/edge-client/dist/lib/node/testing/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":6741},"packages/core/mesh/edge-client/dist/lib/node/testing/index.cjs":{"imports":[{"path":"packages/core/mesh/edge-client/dist/lib/node/chunk-ANV2HBEH.cjs","kind":"import-statement"},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true}],"exports":["DEFAULT_PORT","createTestEdgeWsServer"],"entryPoint":"packages/core/mesh/edge-client/src/testing/index.ts","inputs":{"packages/core/mesh/edge-client/src/testing/test-utils.ts":{"bytesInOutput":3466},"packages/core/mesh/edge-client/src/testing/index.ts":{"bytesInOutput":0}},"bytes":3683},"packages/core/mesh/edge-client/dist/lib/node/chunk-ANV2HBEH.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5676},"packages/core/mesh/edge-client/dist/lib/node/chunk-ANV2HBEH.cjs":{"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf","kind":"import-statement","external":true},{"path":"@dxos/protocols/buf/dxos/edge/messenger_pb","kind":"import-statement","external":true}],"exports":["Protocol","getTypename","protocol","toUint8Array"],"inputs":{"packages/core/mesh/edge-client/src/protocol.ts":{"bytesInOutput":2600},"packages/core/mesh/edge-client/src/defs.ts":{"bytesInOutput":298}},"bytes":3106}}}