@dxos/messaging 0.3.9-main.ee9a520 → 0.3.9-main.ef334cd

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.
@@ -1336,7 +1336,7 @@ import { Context as Context4 } from "@dxos/context";
1336
1336
  import { invariant as invariant5 } from "@dxos/invariant";
1337
1337
  import { PublicKey as PublicKey5 } from "@dxos/keys";
1338
1338
  import { log as log5 } from "@dxos/log";
1339
- import { RateLimitExceededError, trace as trace4 } from "@dxos/protocols";
1339
+ import { RateLimitExceededError, TimeoutError as TimeoutError2, trace as trace4 } from "@dxos/protocols";
1340
1340
  function _ts_decorate(decorators, target, key, desc) {
1341
1341
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1342
1342
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -1528,7 +1528,7 @@ var WebsocketSignalManager = class {
1528
1528
  payload
1529
1529
  }).catch((err) => {
1530
1530
  if (err instanceof RateLimitExceededError) {
1531
- log5("WSS rate limit exceeded", {
1531
+ log5.info("WSS rate limit exceeded", {
1532
1532
  err
1533
1533
  }, {
1534
1534
  F: __dxlog_file5,
@@ -1536,8 +1536,8 @@ var WebsocketSignalManager = class {
1536
1536
  S: this,
1537
1537
  C: (f, a) => f(...a)
1538
1538
  });
1539
- } else {
1540
- log5(`error sending to ${serverName}`, {
1539
+ } else if (err instanceof TimeoutError2 || err.constructor.name === "TimeoutError") {
1540
+ log5.info("WSS sendMessage timeout", {
1541
1541
  err
1542
1542
  }, {
1543
1543
  F: __dxlog_file5,
@@ -1546,6 +1546,16 @@ var WebsocketSignalManager = class {
1546
1546
  C: (f, a) => f(...a)
1547
1547
  });
1548
1548
  void this.checkServerFailure(serverName);
1549
+ } else {
1550
+ log5.info(`error sending to ${serverName}`, {
1551
+ err
1552
+ }, {
1553
+ F: __dxlog_file5,
1554
+ L: 143,
1555
+ S: this,
1556
+ C: (f, a) => f(...a)
1557
+ });
1558
+ void this.checkServerFailure(serverName);
1549
1559
  }
1550
1560
  });
1551
1561
  });
@@ -1555,7 +1565,7 @@ var WebsocketSignalManager = class {
1555
1565
  if (failureCount > MAX_SERVER_FAILURES) {
1556
1566
  log5.warn(`Too many failures sending to ${serverName} (${failureCount} > ${MAX_SERVER_FAILURES}), restarting`, void 0, {
1557
1567
  F: __dxlog_file5,
1558
- L: 151,
1568
+ L: 154,
1559
1569
  S: this,
1560
1570
  C: (f, a) => f(...a)
1561
1571
  });
@@ -1568,13 +1578,13 @@ var WebsocketSignalManager = class {
1568
1578
  async subscribeMessages(peerId) {
1569
1579
  log5(`Subscribed for message stream peerId=${peerId}`, void 0, {
1570
1580
  F: __dxlog_file5,
1571
- L: 160,
1581
+ L: 163,
1572
1582
  S: this,
1573
1583
  C: (f, a) => f(...a)
1574
1584
  });
1575
1585
  invariant5(this._opened, "Closed", {
1576
1586
  F: __dxlog_file5,
1577
- L: 161,
1587
+ L: 164,
1578
1588
  S: this,
1579
1589
  A: [
1580
1590
  "this._opened",
@@ -1586,13 +1596,13 @@ var WebsocketSignalManager = class {
1586
1596
  async unsubscribeMessages(peerId) {
1587
1597
  log5(`Subscribed for message stream peerId=${peerId}`, void 0, {
1588
1598
  F: __dxlog_file5,
1589
- L: 167,
1599
+ L: 170,
1590
1600
  S: this,
1591
1601
  C: (f, a) => f(...a)
1592
1602
  });
1593
1603
  invariant5(this._opened, "Closed", {
1594
1604
  F: __dxlog_file5,
1595
- L: 168,
1605
+ L: 171,
1596
1606
  S: this,
1597
1607
  A: [
1598
1608
  "this._opened",
@@ -1605,7 +1615,7 @@ var WebsocketSignalManager = class {
1605
1615
  this._ctx = new Context4({
1606
1616
  onError: (err) => log5.catch(err, void 0, {
1607
1617
  F: __dxlog_file5,
1608
- L: 175,
1618
+ L: 178,
1609
1619
  S: this,
1610
1620
  C: (f, a) => f(...a)
1611
1621
  })
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/messenger.ts", "../../../src/timeouts.ts", "../../../src/signal-client/signal-client.ts", "../../../src/signal-client/signal-rpc-client.ts", "../../../src/signal-manager/memory-signal-manager.ts", "../../../src/signal-manager/websocket-signal-manager.ts"],
4
- "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { TimeoutError, scheduleExponentialBackoffTaskInterval, scheduleTask, scheduleTaskInterval } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { TimeoutError as ProtocolTimeoutError, schema, trace } from '@dxos/protocols';\nimport { ReliablePayload } from '@dxos/protocols/proto/dxos/mesh/messaging';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { type SignalManager } from './signal-manager';\nimport { type Message } from './signal-methods';\nimport { MESSAGE_TIMEOUT } from './timeouts';\n\nexport type OnMessage = (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>;\n\nexport interface MessengerOptions {\n signalManager: SignalManager;\n retryDelay?: number;\n}\n\nconst ReliablePayload = schema.getCodecForType('dxos.mesh.messaging.ReliablePayload');\nconst Acknowledgement = schema.getCodecForType('dxos.mesh.messaging.Acknowledgement');\n\nconst RECEIVED_MESSAGES_GC_INTERVAL = 120_000;\n\n/**\n * Reliable messenger that works trough signal network.\n */\nexport class Messenger {\n private readonly _signalManager: SignalManager;\n // { peerId, payloadType } => listeners set\n private readonly _listeners = new ComplexMap<{ peerId: PublicKey; payloadType: string }, Set<OnMessage>>(\n ({ peerId, payloadType }) => peerId.toHex() + payloadType,\n );\n\n // peerId => listeners set\n private readonly _defaultListeners = new ComplexMap<PublicKey, Set<OnMessage>>(PublicKey.hash);\n\n private readonly _onAckCallbacks = new ComplexMap<PublicKey, () => void>(PublicKey.hash);\n\n private readonly _receivedMessages = new ComplexSet<PublicKey>(PublicKey.hash);\n\n /**\n * Keys scheduled to be cleared from _receivedMessages on the next iteration.\n */\n private readonly _toClear = new ComplexSet<PublicKey>(PublicKey.hash);\n\n private _ctx!: Context;\n private _closed = true;\n private readonly _retryDelay: number;\n\n constructor({ signalManager, retryDelay = 300 }: MessengerOptions) {\n this._signalManager = signalManager;\n this._retryDelay = retryDelay;\n\n this.open();\n }\n\n open() {\n if (!this._closed) {\n return;\n }\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.mesh.messenger.open', trace.begin({ id: traceId }));\n this._ctx = new Context({\n onError: (err) => log.catch(err),\n });\n this._ctx.onDispose(\n this._signalManager.onMessage.on(async (message) => {\n log('received message', { from: message.author });\n await this._handleMessage(message);\n }),\n );\n\n // Clear the map periodically.\n scheduleTaskInterval(\n this._ctx,\n async () => {\n this._performGc();\n },\n RECEIVED_MESSAGES_GC_INTERVAL,\n );\n\n this._closed = false;\n log.trace('dxos.mesh.messenger.open', trace.end({ id: traceId }));\n }\n\n async close() {\n if (this._closed) {\n return;\n }\n this._closed = true;\n await this._ctx.dispose();\n }\n\n async sendMessage({ author, recipient, payload }: Message): Promise<void> {\n invariant(!this._closed, 'Closed');\n const messageContext = this._ctx.derive();\n\n const reliablePayload: ReliablePayload = {\n messageId: PublicKey.random(),\n payload,\n };\n invariant(!this._onAckCallbacks.has(reliablePayload.messageId!));\n log('send message', { messageId: reliablePayload.messageId, author, recipient });\n\n let messageReceived: () => void;\n let timeoutHit: (err: Error) => void;\n\n const promise = new Promise<void>((resolve, reject) => {\n messageReceived = resolve;\n timeoutHit = reject;\n });\n\n // Setting retry interval if signal was not acknowledged.\n scheduleExponentialBackoffTaskInterval(\n messageContext,\n async () => {\n log('retrying message', { messageId: reliablePayload.messageId });\n await this._encodeAndSend({ author, recipient, reliablePayload }).catch((err) =>\n log('failed to send message', { err }),\n );\n },\n this._retryDelay,\n );\n\n scheduleTask(\n messageContext,\n () => {\n log('message not delivered', { messageId: reliablePayload.messageId });\n this._onAckCallbacks.delete(reliablePayload.messageId!);\n timeoutHit(\n new ProtocolTimeoutError(\n 'signaling message not delivered',\n new TimeoutError(MESSAGE_TIMEOUT, 'Message not delivered'),\n ),\n );\n void messageContext.dispose();\n },\n MESSAGE_TIMEOUT,\n );\n\n this._onAckCallbacks.set(reliablePayload.messageId, () => {\n messageReceived();\n this._onAckCallbacks.delete(reliablePayload.messageId!);\n void messageContext.dispose();\n });\n\n await this._encodeAndSend({ author, recipient, reliablePayload });\n return promise;\n }\n\n /**\n * Subscribes onMessage function to messages that contains payload with payloadType.\n * @param payloadType if not specified, onMessage will be subscribed to all types of messages.\n */\n async listen({\n peerId,\n payloadType,\n onMessage,\n }: {\n peerId: PublicKey;\n payloadType?: string;\n onMessage: OnMessage;\n }): Promise<ListeningHandle> {\n invariant(!this._closed, 'Closed');\n\n await this._signalManager.subscribeMessages(peerId);\n let listeners: Set<OnMessage> | undefined;\n\n if (!payloadType) {\n listeners = this._defaultListeners.get(peerId);\n if (!listeners) {\n listeners = new Set();\n this._defaultListeners.set(peerId, listeners);\n }\n } else {\n listeners = this._listeners.get({ peerId, payloadType });\n if (!listeners) {\n listeners = new Set();\n this._listeners.set({ peerId, payloadType }, listeners);\n }\n }\n\n listeners.add(onMessage);\n\n return {\n unsubscribe: async () => {\n listeners!.delete(onMessage);\n },\n };\n }\n\n private async _encodeAndSend({\n author,\n recipient,\n reliablePayload,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n reliablePayload: ReliablePayload;\n }): Promise<void> {\n await this._signalManager.sendMessage({\n author,\n recipient,\n payload: {\n type_url: 'dxos.mesh.messaging.ReliablePayload',\n value: ReliablePayload.encode(reliablePayload, { preserveAny: true }),\n },\n });\n }\n\n private async _handleMessage(message: Message): Promise<void> {\n switch (message.payload.type_url) {\n case 'dxos.mesh.messaging.ReliablePayload': {\n await this._handleReliablePayload(message);\n break;\n }\n case 'dxos.mesh.messaging.Acknowledgement': {\n await this._handleAcknowledgement({ payload: message.payload });\n break;\n }\n }\n }\n\n private async _handleReliablePayload({ author, recipient, payload }: Message) {\n invariant(payload.type_url === 'dxos.mesh.messaging.ReliablePayload');\n const reliablePayload: ReliablePayload = ReliablePayload.decode(payload.value, { preserveAny: true });\n\n log('handling message', { messageId: reliablePayload.messageId });\n\n await this._sendAcknowledgement({\n author,\n recipient,\n messageId: reliablePayload.messageId,\n });\n\n if (this._receivedMessages.has(reliablePayload.messageId!)) {\n return;\n }\n\n this._receivedMessages.add(reliablePayload.messageId!);\n\n await this._callListeners({\n author,\n recipient,\n payload: reliablePayload.payload,\n });\n }\n\n private async _handleAcknowledgement({ payload }: { payload: Any }) {\n invariant(payload.type_url === 'dxos.mesh.messaging.Acknowledgement');\n this._onAckCallbacks.get(Acknowledgement.decode(payload.value).messageId)?.();\n }\n\n private async _sendAcknowledgement({\n author,\n recipient,\n messageId,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n messageId: PublicKey;\n }): Promise<void> {\n log('sending ACK', { messageId, from: recipient, to: author });\n\n await this._signalManager.sendMessage({\n author: recipient,\n recipient: author,\n payload: {\n type_url: 'dxos.mesh.messaging.Acknowledgement',\n value: Acknowledgement.encode({ messageId }),\n },\n });\n }\n\n private async _callListeners(message: Message): Promise<void> {\n {\n const defaultListenerMap = this._defaultListeners.get(message.recipient);\n if (defaultListenerMap) {\n for (const listener of defaultListenerMap) {\n await listener(message);\n }\n }\n }\n\n {\n const listenerMap = this._listeners.get({\n peerId: message.recipient,\n payloadType: message.payload.type_url,\n });\n if (listenerMap) {\n for (const listener of listenerMap) {\n await listener(message);\n }\n }\n }\n }\n\n private _performGc() {\n const start = performance.now();\n\n for (const key of this._toClear.keys()) {\n this._receivedMessages.delete(key);\n }\n this._toClear.clear();\n for (const key of this._receivedMessages.keys()) {\n this._toClear.add(key);\n }\n\n const elapsed = performance.now() - start;\n if (elapsed > 100) {\n log.warn('GC took too long', { elapsed });\n }\n }\n}\n\nexport interface ListeningHandle {\n unsubscribe: () => Promise<void>;\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\n/**\n * Timeout for retrying messages.\n */\nexport const MESSAGE_TIMEOUT = 10_000;\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { DeferredTask, Event, Trigger, asyncTimeout, scheduleTask, scheduleTaskInterval, sleep } from '@dxos/async';\nimport { type Any, type Stream } from '@dxos/codec-protobuf';\nimport { Context, cancelWithContext } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/protocols';\nimport { type Message as SignalMessage, SignalState, type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { SignalRPCClient } from './signal-rpc-client';\nimport { type Message, type SignalMethods } from '../signal-methods';\n\nconst DEFAULT_RECONNECT_TIMEOUT = 100;\nconst MAX_RECONNECT_TIMEOUT = 5000;\nconst ERROR_RECONCILE_DELAY = 1000;\nconst RECONCILE_INTERVAL = 5_000;\n\nexport type SignalStatus = {\n host: string;\n state: SignalState;\n error?: string;\n reconnectIn: number;\n connectionStarted: Date;\n lastStateChange: Date;\n};\n\nexport type CommandTrace = {\n messageId: string;\n host: string;\n incoming: boolean;\n time: number;\n method: string;\n payload: any;\n response?: any;\n error?: string;\n};\n\n/**\n * Establishes a websocket connection to signal server and provides RPC methods.\n */\nexport class SignalClient implements SignalMethods {\n private _state = SignalState.CLOSED;\n\n private _lastError?: Error;\n\n /**\n * Number of milliseconds after which the connection will be attempted again in case of error.\n */\n private _reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;\n\n /**\n * Timestamp of when the connection attempt was began.\n */\n private _connectionStarted = new Date();\n\n /**\n * Timestamp of last state change.\n */\n private _lastStateChange = new Date();\n\n private _client?: SignalRPCClient;\n private readonly _clientReady = new Trigger();\n\n private _ctx?: Context;\n\n private _connectionCtx?: Context;\n\n private _reconcileTask?: DeferredTask;\n private _reconnectTask?: DeferredTask;\n\n readonly statusChanged = new Event<SignalStatus>();\n readonly commandTrace = new Event<CommandTrace>();\n\n /**\n * Swarm events streams. Keys represent actually joined topic and peerId.\n */\n private readonly _swarmStreams = new ComplexMap<{ topic: PublicKey; peerId: PublicKey }, Stream<SwarmEvent>>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n /**\n * Represent desired joined topic and peerId.\n */\n private readonly _joinedTopics = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n /**\n * Message streams. Keys represents actually subscribed peers.\n * @internal\n */\n public readonly _messageStreams = new ComplexMap<PublicKey, Stream<SignalMessage>>((key) => key.toHex());\n\n /**\n * Represent desired message subscriptions.\n */\n private readonly _subscribedMessages = new ComplexSet<{ peerId: PublicKey }>(({ peerId }) => peerId.toHex());\n\n /**\n * Event to use in tests to wait till subscription is successfully established.\n * @internal\n */\n public _reconciled = new Event();\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n private readonly _performance = {\n sentMessages: 0,\n receivedMessages: 0,\n reconnectCounter: 0,\n joinCounter: 0,\n leaveCounter: 0,\n };\n\n /**\n * @param _host Signal server websocket URL.\n * @param _onMessage\n */\n constructor(\n private readonly _host: string,\n private readonly _onMessage: (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>,\n private readonly _onSwarmEvent: (params: { topic: PublicKey; swarmEvent: SwarmEvent }) => Promise<void>,\n ) {\n if (!this._host.startsWith('wss://') && !this._host.startsWith('ws://')) {\n throw new Error(`Signal server requires a websocket URL. Provided: ${this._host}`);\n }\n }\n\n open() {\n log.trace('dxos.mesh.signal-client.open', trace.begin({ id: this._instanceId }));\n\n if ([SignalState.CONNECTED, SignalState.CONNECTING].includes(this._state)) {\n return;\n }\n\n this._ctx = new Context({\n onError: (err) => {\n if (this._state === SignalState.CLOSED || this._ctx?.disposed) {\n return;\n }\n if (this._state === SignalState.CONNECTED) {\n log.warn('SignalClient error:', err);\n }\n this._scheduleReconcileAfterError();\n },\n });\n\n this._reconcileTask = new DeferredTask(this._ctx, async () => {\n await this._reconcileSwarmSubscriptions();\n await this._reconcileMessageSubscriptions();\n this._reconciled.emit();\n });\n\n // Reconcile subscriptions periodically.\n scheduleTaskInterval(\n this._ctx,\n async () => {\n if (this._state === SignalState.CONNECTED) {\n this._reconcileTask!.schedule();\n }\n },\n RECONCILE_INTERVAL,\n );\n\n this._reconnectTask = new DeferredTask(this._ctx, async () => {\n await this._reconnect();\n });\n\n this._setState(SignalState.CONNECTING);\n this._createClient();\n log.trace('dxos.mesh.signal-client.open', trace.end({ id: this._instanceId }));\n }\n\n async close() {\n log('closing...');\n if ([SignalState.CLOSED].includes(this._state)) {\n return;\n }\n\n await this._ctx?.dispose();\n\n this._clientReady.reset();\n await this._client?.close();\n this._client = undefined;\n this._setState(SignalState.CLOSED);\n log('closed');\n }\n\n getStatus(): SignalStatus {\n return {\n host: this._host,\n state: this._state,\n error: this._lastError?.message,\n reconnectIn: this._reconnectAfter,\n connectionStarted: this._connectionStarted,\n lastStateChange: this._lastStateChange,\n };\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n log('joining', { topic, peerId });\n this._performance.joinCounter++;\n this._joinedTopics.add({ topic, peerId });\n this._reconcileTask!.schedule();\n }\n\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n this._performance.leaveCounter++;\n log('leaving', { topic, peerId });\n\n void this._swarmStreams.get({ topic, peerId })?.close();\n this._swarmStreams.delete({ topic, peerId });\n this._joinedTopics.delete({ topic, peerId });\n }\n\n async sendMessage(msg: Message): Promise<void> {\n this._performance.sentMessages++;\n await this._clientReady.wait();\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n await this._client!.sendMessage(msg);\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log('subscribing to messages', { peerId });\n this._subscribedMessages.add({ peerId });\n this._reconcileTask!.schedule();\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log('unsubscribing from messages', { peerId });\n this._subscribedMessages.delete({ peerId });\n void this._messageStreams.get(peerId)?.close();\n this._messageStreams.delete(peerId);\n }\n\n private _scheduleReconcileAfterError() {\n scheduleTask(\n this._ctx!,\n () => {\n this._reconcileTask!.schedule();\n },\n ERROR_RECONCILE_DELAY,\n );\n }\n\n private _setState(newState: SignalState) {\n this._state = newState;\n this._lastStateChange = new Date();\n log('signal state changed', { status: this.getStatus() });\n this.statusChanged.emit(this.getStatus());\n }\n\n private _createClient() {\n log('creating client', { host: this._host, state: this._state });\n invariant(!this._client, 'Client already created');\n\n this._connectionStarted = new Date();\n\n // Create new context for each connection.\n this._connectionCtx = this._ctx!.derive();\n this._connectionCtx.onDispose(async () => {\n log('connection context disposed');\n await Promise.all(Array.from(this._swarmStreams.values()).map((stream) => stream.close()));\n await Promise.all(Array.from(this._messageStreams.values()).map((stream) => stream.close()));\n this._swarmStreams.clear();\n this._messageStreams.clear();\n });\n\n try {\n this._client = new SignalRPCClient({\n url: this._host,\n callbacks: {\n onConnected: () => {\n log('socket connected');\n this._lastError = undefined;\n this._reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;\n this._setState(SignalState.CONNECTED);\n this._clientReady.wake();\n this._reconcileTask!.schedule();\n },\n\n onDisconnected: () => {\n log('socket disconnected', { state: this._state });\n if (this._state === SignalState.ERROR) {\n // Ignore disconnects after error.\n // Handled by error handler before disconnect handler.\n this._setState(SignalState.DISCONNECTED);\n return;\n }\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._setState(SignalState.DISCONNECTED);\n this._reconnectTask!.schedule();\n },\n\n onError: (error) => {\n log('socket error', { error, state: this._state });\n this._lastError = error;\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._setState(SignalState.ERROR);\n\n this._reconnectTask!.schedule();\n },\n },\n });\n } catch (err: any) {\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._lastError = err;\n this._setState(SignalState.DISCONNECTED);\n this._reconnectTask!.schedule();\n }\n }\n\n private _incrementReconnectTimeout() {\n this._reconnectAfter *= 2;\n this._reconnectAfter = Math.min(this._reconnectAfter, MAX_RECONNECT_TIMEOUT);\n }\n\n private async _reconnect() {\n log(`reconnecting in ${this._reconnectAfter}ms`, { state: this._state });\n this._performance.reconnectCounter++;\n\n if (this._state === SignalState.RECONNECTING) {\n log.warn('Signal api already reconnecting.');\n return;\n }\n\n if (this._state === SignalState.CLOSED) {\n return;\n }\n\n // Close client if it wasn't already closed.\n this._clientReady.reset();\n await this._connectionCtx?.dispose();\n this._client?.close().catch(() => {});\n this._client = undefined;\n\n await cancelWithContext(this._ctx!, sleep(this._reconnectAfter));\n\n this._setState(SignalState.RECONNECTING);\n\n this._createClient();\n }\n\n private async _reconcileSwarmSubscriptions(): Promise<void> {\n await asyncTimeout(cancelWithContext(this._connectionCtx!, this._clientReady.wait()), 5_000);\n // Copy Client reference to avoid client change during the reconcile.\n const client = this._client!;\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n\n // Unsubscribe from topics that are no longer needed.\n for (const { topic, peerId } of this._swarmStreams.keys()) {\n // Join desired topics.\n if (this._joinedTopics.has({ topic, peerId })) {\n continue;\n }\n\n void this._swarmStreams.get({ topic, peerId })?.close();\n this._swarmStreams.delete({ topic, peerId });\n }\n\n // Subscribe to topics that are needed.\n for (const { topic, peerId } of this._joinedTopics.values()) {\n // Join desired topics.\n if (this._swarmStreams.has({ topic, peerId })) {\n continue;\n }\n\n const swarmStream = await asyncTimeout(\n cancelWithContext(this._connectionCtx!, client.join({ topic, peerId })),\n 5000,\n );\n // Subscribing to swarm events.\n // TODO(mykola): What happens when the swarm stream is closed? Maybe send leave event for each peer?\n swarmStream.subscribe(async (swarmEvent: SwarmEvent) => {\n log('swarm event', { swarmEvent });\n await this._onSwarmEvent({ topic, swarmEvent });\n });\n\n // Saving swarm stream.\n this._swarmStreams.set({ topic, peerId }, swarmStream);\n }\n }\n\n private async _reconcileMessageSubscriptions(): Promise<void> {\n await asyncTimeout(cancelWithContext(this._connectionCtx!, this._clientReady.wait()), 5_000);\n // Copy Client reference to avoid client change during the reconcile.\n const client = this._client!;\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n\n // Unsubscribe from messages that are no longer needed.\n for (const peerId of this._messageStreams.keys()) {\n // Join desired topics.\n if (this._subscribedMessages.has({ peerId })) {\n continue;\n }\n\n void this._messageStreams.get(peerId)?.close();\n this._messageStreams.delete(peerId);\n }\n\n // Subscribe to messages that are needed.\n for (const { peerId } of this._subscribedMessages.values()) {\n if (this._messageStreams.has(peerId)) {\n continue;\n }\n\n const messageStream = await asyncTimeout(\n cancelWithContext(this._connectionCtx!, client.receiveMessages(peerId)),\n 5000,\n );\n messageStream.subscribe(async (message: SignalMessage) => {\n this._performance.receivedMessages++;\n await this._onMessage({\n author: PublicKey.from(message.author),\n recipient: PublicKey.from(message.recipient),\n payload: message.payload,\n });\n });\n\n // Saving message stream.\n this._messageStreams.set(peerId, messageStream);\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Trigger } from '@dxos/async';\nimport { type Any, type Stream } from '@dxos/codec-protobuf';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema, trace } from '@dxos/protocols';\nimport { type Message as SignalMessage, type Signal } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { createProtoRpcPeer, type ProtoRpcPeer } from '@dxos/rpc';\n\ninterface Services {\n Signal: Signal;\n}\n\nexport type SignalCallbacks = {\n onConnected?: () => void;\n\n /**\n * Called on disconnect.\n * In case of error, `onError` will be called first and then `onDisconnected`.\n */\n onDisconnected?: () => void;\n\n onError?: (error: Error) => void;\n};\n\nexport type SignalRPCClientParams = {\n url: string;\n callbacks?: SignalCallbacks;\n};\n\nexport class SignalRPCClient {\n private _socket?: WebSocket;\n private _rpc?: ProtoRpcPeer<Services>;\n private readonly _connectTrigger = new Trigger();\n\n private _closed = false;\n\n private readonly _url: string;\n private readonly _callbacks: SignalCallbacks;\n\n constructor({ url, callbacks = {} }: SignalRPCClientParams) {\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.mesh.signal-rpc-client.constructor', trace.begin({ id: traceId }));\n this._url = url;\n this._callbacks = callbacks;\n this._socket = new WebSocket(this._url);\n\n this._rpc = createProtoRpcPeer({\n requested: {\n Signal: schema.getService('dxos.mesh.signal.Signal'),\n },\n noHandshake: true,\n port: {\n send: (msg) => {\n if (this._closed) {\n // Do not send messages after close.\n return;\n }\n try {\n this._socket!.send(msg);\n } catch (err) {\n log.warn('send error', err);\n }\n },\n subscribe: (cb) => {\n this._socket!.onmessage = async (msg: WebSocket.MessageEvent) => {\n if (typeof Blob !== 'undefined' && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data as any);\n }\n };\n },\n },\n encodingOptions: {\n preserveAny: true,\n },\n });\n\n this._socket.onopen = async () => {\n try {\n await this._rpc!.open();\n log(`RPC open ${this._url}`);\n this._callbacks.onConnected?.();\n this._connectTrigger.wake();\n } catch (err: any) {\n this._callbacks.onError?.(err);\n }\n };\n\n this._socket.onclose = async () => {\n log(`Disconnected ${this._url}`);\n this._callbacks.onDisconnected?.();\n await this.close();\n };\n\n this._socket.onerror = async (event: WebSocket.ErrorEvent) => {\n if (this._closed) {\n // Ignore errors after close.\n return;\n }\n\n this._callbacks.onError?.(event.error ?? new Error(event.message));\n this._connectTrigger.reset();\n\n try {\n await this._rpc?.close();\n } catch (err) {\n log.catch(err);\n }\n this._closed = true;\n\n log.warn(event.message ?? 'Socket error', { url: this._url });\n };\n\n log.trace('dxos.mesh.signal-rpc-client.constructor', trace.end({ id: traceId }));\n }\n\n async close() {\n this._closed = true;\n try {\n await this._rpc?.close();\n this._socket?.close();\n } catch (err) {\n log.warn('close error', err);\n }\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('join', { topic, peerId });\n await this._connectTrigger.wait();\n invariant(!this._closed, 'SignalRPCClient is closed');\n invariant(this._rpc, 'Rpc is not initialized');\n const swarmStream = this._rpc.rpc.Signal.join({\n swarm: topic.asUint8Array(),\n peer: peerId.asUint8Array(),\n });\n await swarmStream.waitUntilReady();\n return swarmStream;\n }\n\n async receiveMessages(peerId: PublicKey): Promise<Stream<SignalMessage>> {\n log('receiveMessages', { peerId });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n invariant(this._rpc, 'Rpc is not initialized');\n const messageStream = this._rpc.rpc.Signal.receiveMessages({\n peer: peerId.asUint8Array(),\n });\n await messageStream.waitUntilReady();\n return messageStream;\n }\n\n async sendMessage({ author, recipient, payload }: { author: PublicKey; recipient: PublicKey; payload: Any }) {\n log('sendMessage', { author, recipient, payload });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n invariant(this._rpc, 'Rpc is not initialized');\n await this._rpc.rpc.Signal.sendMessage({\n author: author.asUint8Array(),\n recipient: recipient.asUint8Array(),\n payload,\n });\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event, Trigger } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { type SignalManager } from './signal-manager';\nimport { type CommandTrace, type SignalStatus } from '../signal-client';\n\n/**\n * Common signaling context that connects multiple MemorySignalManager instances.\n */\nexport class MemorySignalManagerContext {\n // Swarm messages.\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n // Mapping from topic to set of peers.\n readonly swarms = new ComplexMap<PublicKey, ComplexSet<PublicKey>>(PublicKey.hash);\n\n // Map of connections for each peer for signaling.\n readonly connections = new ComplexMap<PublicKey, MemorySignalManager>(PublicKey.hash);\n}\n\n/**\n * In memory signal manager for testing.\n */\nexport class MemorySignalManager implements SignalManager {\n readonly statusChanged = new Event<SignalStatus[]>();\n readonly commandTrace = new Event<CommandTrace>();\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n readonly onMessage = new Event<{\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }>();\n\n /** Will be used to emit SwarmEvents on .open() and .close() */\n private _joinedSwarms = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n private _ctx!: Context;\n\n // TODO(dmaretskyi): Replace with callback.\n private readonly _freezeTrigger = new Trigger().wake();\n\n constructor(private readonly _context: MemorySignalManagerContext) {\n this._ctx = new Context();\n\n this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));\n }\n\n async open() {\n if (!this._ctx.disposed) {\n return;\n }\n this._ctx = new Context();\n this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));\n\n await Promise.all([...this._joinedSwarms.values()].map((value) => this.join(value)));\n }\n\n async close() {\n if (this._ctx.disposed) {\n return;\n }\n // save copy of joined swarms.\n const joinedSwarmsCopy = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n [...this._joinedSwarms.values()],\n );\n\n await Promise.all([...this._joinedSwarms.values()].map((value) => this.leave(value)));\n\n // assign joined swarms back because .leave() deletes it.\n this._joinedSwarms = joinedSwarmsCopy;\n\n await this._ctx.dispose();\n }\n\n getStatus(): SignalStatus[] {\n return [];\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n invariant(!this._ctx.disposed, 'Closed');\n\n this._joinedSwarms.add({ topic, peerId });\n\n if (!this._context.swarms.has(topic)) {\n this._context.swarms.set(topic, new ComplexSet(PublicKey.hash));\n }\n\n this._context.swarms.get(topic)!.add(peerId);\n this._context.swarmEvent.emit({\n topic,\n swarmEvent: {\n peerAvailable: {\n peer: peerId.asUint8Array(),\n since: new Date(),\n },\n },\n });\n\n // Emitting swarm events for each peer.\n for (const [topic, peerIds] of this._context.swarms) {\n Array.from(peerIds).forEach((peerId) => {\n this.swarmEvent.emit({\n topic,\n swarmEvent: {\n peerAvailable: {\n peer: peerId.asUint8Array(),\n since: new Date(),\n },\n },\n });\n });\n }\n }\n\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n invariant(!this._ctx.disposed, 'Closed');\n\n this._joinedSwarms.delete({ topic, peerId });\n\n if (!this._context.swarms.has(topic)) {\n this._context.swarms.set(topic, new ComplexSet(PublicKey.hash));\n }\n\n this._context.swarms.get(topic)!.delete(peerId);\n\n const swarmEvent: SwarmEvent = {\n peerLeft: {\n peer: peerId.asUint8Array(),\n },\n };\n\n this._context.swarmEvent.emit({ topic, swarmEvent });\n }\n\n async sendMessage({ author, recipient, payload }: { author: PublicKey; recipient: PublicKey; payload: Any }) {\n log('send message', { author, recipient, ...dec(payload) });\n\n invariant(recipient);\n invariant(!this._ctx.disposed, 'Closed');\n\n await this._freezeTrigger.wait();\n\n const remote = this._context.connections.get(recipient);\n if (!remote) {\n log.warn('recipient is not subscribed for messages', { author, recipient });\n return;\n }\n\n if (remote._ctx.disposed) {\n log.warn('recipient is disposed', { author, recipient });\n return;\n }\n\n remote._freezeTrigger\n .wait()\n .then(() => {\n if (remote._ctx.disposed) {\n log.warn('recipient is disposed', { author, recipient });\n return;\n }\n\n log('receive message', { author, recipient, ...dec(payload) });\n\n remote.onMessage.emit({ author, recipient, payload });\n })\n .catch((err) => {\n log.error('error while waiting for freeze', { err });\n });\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log('subscribing', { peerId });\n this._context.connections.set(peerId, this);\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log('unsubscribing', { peerId });\n this._context.connections.delete(peerId);\n }\n\n freeze() {\n this._freezeTrigger.reset();\n }\n\n unfreeze() {\n this._freezeTrigger.wake();\n }\n}\nconst dec = (payload: Any) => {\n if (!payload.type_url.endsWith('ReliablePayload')) {\n return {};\n }\n\n const relPayload = schema.getCodecForType('dxos.mesh.messaging.ReliablePayload').decode(payload.value);\n\n if (typeof relPayload?.payload?.data === 'object') {\n return { payload: Object.keys(relPayload?.payload?.data)[0], sessionId: relPayload?.payload?.sessionId };\n }\n\n return {};\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event, sleep, synchronized } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { RateLimitExceededError, trace } from '@dxos/protocols';\nimport { type Runtime } from '@dxos/protocols/proto/dxos/config';\nimport { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\n\nimport { type SignalManager } from './signal-manager';\nimport { type CommandTrace, SignalClient, type SignalStatus } from '../signal-client';\n\nconst MAX_SERVER_FAILURES = 5;\nconst WSS_SIGNAL_SERVER_REBOOT_DELAY = 3_000;\n/**\n * Manages connection to multiple Signal Servers over WebSocket\n */\nexport class WebsocketSignalManager implements SignalManager {\n private readonly _servers = new Map<string, SignalClient>();\n\n private _ctx!: Context;\n private _opened = false;\n\n readonly failureCount = new Map<string, number>();\n readonly statusChanged = new Event<SignalStatus[]>();\n readonly commandTrace = new Event<CommandTrace>();\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n readonly onMessage = new Event<{\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }>();\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n constructor(private readonly _hosts: Runtime.Services.Signal[]) {\n log('Created WebsocketSignalManager', { hosts: this._hosts });\n for (const host of this._hosts) {\n if (this._servers.has(host.server)) {\n continue;\n }\n const server = new SignalClient(\n host.server,\n async (message) => this.onMessage.emit(message),\n async (data) => this.swarmEvent.emit(data),\n );\n server.statusChanged.on(() => this.statusChanged.emit(this.getStatus()));\n\n this._servers.set(host.server, server);\n this.failureCount.set(host.server, 0);\n server.commandTrace.on((trace) => this.commandTrace.emit(trace));\n }\n }\n\n @synchronized\n async open() {\n if (this._opened) {\n return;\n }\n log('open signal manager', { hosts: this._hosts });\n log.trace('dxos.mesh.websocket-signal-manager.open', trace.begin({ id: this._instanceId }));\n\n this._initContext();\n\n [...this._servers.values()].forEach((server) => server.open());\n\n this._opened = true;\n log.trace('dxos.mesh.websocket-signal-manager.open', trace.end({ id: this._instanceId }));\n }\n\n @synchronized\n async close() {\n if (!this._opened) {\n return;\n }\n this._opened = false;\n\n await this._ctx.dispose();\n\n await Promise.all(Array.from(this._servers.values()).map((server) => server.close()));\n }\n\n async restartServer(serverName: string) {\n log('Restarting server', { serverName });\n invariant(this._opened, 'server already closed');\n\n const server = this._servers.get(serverName);\n invariant(server, 'server not found');\n\n await server.close();\n await sleep(WSS_SIGNAL_SERVER_REBOOT_DELAY);\n await server.open();\n }\n\n getStatus(): SignalStatus[] {\n return Array.from(this._servers.values()).map((server) => server.getStatus());\n }\n\n @synchronized\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('Join', { topic, peerId });\n invariant(this._opened, 'Closed');\n await this._forEachServer((server) => server.join({ topic, peerId }));\n }\n\n @synchronized\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('leaving', { topic, peerId });\n invariant(this._opened, 'Closed');\n\n await this._forEachServer((server) => server.leave({ topic, peerId }));\n }\n\n async sendMessage({\n author,\n recipient,\n payload,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }): Promise<void> {\n log(`Signal ${recipient.truncate()}`);\n invariant(this._opened, 'Closed');\n\n void this._forEachServer(async (server, serverName) => {\n void server.sendMessage({ author, recipient, payload }).catch((err) => {\n if (err instanceof RateLimitExceededError) {\n log('WSS rate limit exceeded', { err });\n } else {\n log(`error sending to ${serverName}`, { err });\n void this.checkServerFailure(serverName);\n }\n });\n });\n }\n\n @synchronized\n async checkServerFailure(serverName: string) {\n const failureCount = this.failureCount.get(serverName!) ?? 0;\n if (failureCount > MAX_SERVER_FAILURES) {\n log.warn(`Too many failures sending to ${serverName} (${failureCount} > ${MAX_SERVER_FAILURES}), restarting`);\n await this.restartServer(serverName!);\n this.failureCount.set(serverName!, 0);\n return;\n }\n this.failureCount.set(serverName!, (this.failureCount.get(serverName!) ?? 0) + 1);\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log(`Subscribed for message stream peerId=${peerId}`);\n invariant(this._opened, 'Closed');\n\n await this._forEachServer(async (server) => server.subscribeMessages(peerId));\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log(`Subscribed for message stream peerId=${peerId}`);\n invariant(this._opened, 'Closed');\n\n await this._forEachServer(async (server) => server.unsubscribeMessages(peerId));\n }\n\n private _initContext() {\n this._ctx = new Context({\n onError: (err) => log.catch(err),\n });\n }\n\n private async _forEachServer<ReturnType>(\n fn: (server: SignalClient, serverName: string) => Promise<ReturnType>,\n ): Promise<ReturnType[]> {\n return Promise.all(Array.from(this._servers.entries()).map(([serverName, server]) => fn(server, serverName)));\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["TimeoutError", "scheduleExponentialBackoffTaskInterval", "scheduleTask", "scheduleTaskInterval", "Context", "invariant", "PublicKey", "log", "ProtocolTimeoutError", "schema", "trace", "ComplexMap", "ComplexSet", "MESSAGE_TIMEOUT", "ReliablePayload", "schema", "getCodecForType", "Acknowledgement", "RECEIVED_MESSAGES_GC_INTERVAL", "Messenger", "constructor", "signalManager", "retryDelay", "_listeners", "ComplexMap", "peerId", "payloadType", "toHex", "_defaultListeners", "PublicKey", "hash", "_onAckCallbacks", "_receivedMessages", "ComplexSet", "_toClear", "_closed", "_signalManager", "_retryDelay", "open", "traceId", "random", "log", "trace", "begin", "id", "_ctx", "Context", "onError", "err", "catch", "onDispose", "onMessage", "on", "message", "from", "author", "_handleMessage", "scheduleTaskInterval", "_performGc", "end", "close", "dispose", "sendMessage", "recipient", "payload", "invariant", "messageContext", "derive", "reliablePayload", "messageId", "has", "messageReceived", "timeoutHit", "promise", "Promise", "resolve", "reject", "scheduleExponentialBackoffTaskInterval", "_encodeAndSend", "scheduleTask", "delete", "ProtocolTimeoutError", "TimeoutError", "MESSAGE_TIMEOUT", "set", "listen", "subscribeMessages", "listeners", "get", "Set", "add", "unsubscribe", "type_url", "value", "encode", "preserveAny", "_handleReliablePayload", "_handleAcknowledgement", "decode", "_sendAcknowledgement", "_callListeners", "to", "defaultListenerMap", "listener", "listenerMap", "start", "performance", "now", "key", "keys", "clear", "elapsed", "warn", "DeferredTask", "Event", "Trigger", "asyncTimeout", "scheduleTask", "scheduleTaskInterval", "sleep", "Context", "cancelWithContext", "invariant", "PublicKey", "log", "trace", "SignalState", "ComplexMap", "ComplexSet", "WebSocket", "Trigger", "invariant", "PublicKey", "log", "schema", "trace", "createProtoRpcPeer", "SignalRPCClient", "constructor", "url", "callbacks", "_connectTrigger", "_closed", "traceId", "random", "toHex", "begin", "id", "_url", "_callbacks", "_socket", "_rpc", "requested", "Signal", "getService", "noHandshake", "port", "send", "msg", "err", "warn", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "encodingOptions", "preserveAny", "onopen", "open", "onConnected", "wake", "onError", "onclose", "onDisconnected", "close", "onerror", "event", "error", "Error", "message", "reset", "catch", "end", "join", "topic", "peerId", "wait", "swarmStream", "rpc", "swarm", "asUint8Array", "peer", "waitUntilReady", "receiveMessages", "messageStream", "sendMessage", "author", "recipient", "payload", "DEFAULT_RECONNECT_TIMEOUT", "MAX_RECONNECT_TIMEOUT", "ERROR_RECONCILE_DELAY", "RECONCILE_INTERVAL", "SignalClient", "constructor", "_host", "_onMessage", "_onSwarmEvent", "_state", "SignalState", "CLOSED", "_reconnectAfter", "_connectionStarted", "Date", "_lastStateChange", "_clientReady", "Trigger", "statusChanged", "Event", "commandTrace", "_swarmStreams", "ComplexMap", "topic", "peerId", "toHex", "_joinedTopics", "ComplexSet", "_messageStreams", "key", "_subscribedMessages", "_reconciled", "_instanceId", "PublicKey", "random", "_performance", "sentMessages", "receivedMessages", "reconnectCounter", "joinCounter", "leaveCounter", "startsWith", "Error", "open", "log", "trace", "begin", "id", "CONNECTED", "CONNECTING", "includes", "_ctx", "Context", "onError", "err", "disposed", "warn", "_scheduleReconcileAfterError", "_reconcileTask", "DeferredTask", "_reconcileSwarmSubscriptions", "_reconcileMessageSubscriptions", "emit", "scheduleTaskInterval", "schedule", "_reconnectTask", "_reconnect", "_setState", "_createClient", "end", "close", "dispose", "reset", "_client", "undefined", "getStatus", "host", "state", "error", "_lastError", "message", "reconnectIn", "connectionStarted", "lastStateChange", "join", "add", "leave", "get", "delete", "sendMessage", "msg", "wait", "invariant", "subscribeMessages", "unsubscribeMessages", "scheduleTask", "newState", "status", "_connectionCtx", "derive", "onDispose", "Promise", "all", "Array", "from", "values", "map", "stream", "clear", "SignalRPCClient", "url", "callbacks", "onConnected", "wake", "onDisconnected", "ERROR", "DISCONNECTED", "_incrementReconnectTimeout", "Math", "min", "RECONNECTING", "catch", "cancelWithContext", "sleep", "asyncTimeout", "client", "keys", "has", "swarmStream", "subscribe", "swarmEvent", "set", "messageStream", "receiveMessages", "author", "recipient", "payload", "Event", "Trigger", "Context", "invariant", "PublicKey", "log", "schema", "ComplexMap", "ComplexSet", "MemorySignalManagerContext", "swarmEvent", "swarms", "hash", "connections", "MemorySignalManager", "constructor", "_context", "statusChanged", "commandTrace", "onMessage", "_joinedSwarms", "topic", "peerId", "toHex", "_freezeTrigger", "wake", "_ctx", "onDispose", "on", "data", "emit", "open", "disposed", "Promise", "all", "values", "map", "value", "join", "close", "joinedSwarmsCopy", "leave", "dispose", "getStatus", "add", "has", "set", "get", "peerAvailable", "peer", "asUint8Array", "since", "Date", "peerIds", "Array", "from", "forEach", "delete", "peerLeft", "sendMessage", "author", "recipient", "payload", "dec", "wait", "remote", "warn", "then", "catch", "err", "error", "subscribeMessages", "unsubscribeMessages", "freeze", "reset", "unfreeze", "type_url", "endsWith", "relPayload", "getCodecForType", "decode", "Object", "keys", "sessionId", "Event", "sleep", "synchronized", "Context", "invariant", "PublicKey", "log", "RateLimitExceededError", "trace", "MAX_SERVER_FAILURES", "WSS_SIGNAL_SERVER_REBOOT_DELAY", "WebsocketSignalManager", "constructor", "_hosts", "_servers", "Map", "_opened", "failureCount", "statusChanged", "Event", "commandTrace", "swarmEvent", "onMessage", "_instanceId", "PublicKey", "random", "toHex", "log", "hosts", "host", "has", "server", "SignalClient", "message", "emit", "data", "on", "getStatus", "set", "trace", "open", "begin", "id", "_initContext", "values", "forEach", "end", "close", "_ctx", "dispose", "Promise", "all", "Array", "from", "map", "restartServer", "serverName", "invariant", "get", "sleep", "join", "topic", "peerId", "_forEachServer", "leave", "sendMessage", "author", "recipient", "payload", "truncate", "catch", "err", "RateLimitExceededError", "checkServerFailure", "warn", "subscribeMessages", "unsubscribeMessages", "Context", "onError", "fn", "entries", "synchronized"]
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { TimeoutError, scheduleExponentialBackoffTaskInterval, scheduleTask, scheduleTaskInterval } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { TimeoutError as ProtocolTimeoutError, schema, trace } from '@dxos/protocols';\nimport { ReliablePayload } from '@dxos/protocols/proto/dxos/mesh/messaging';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { type SignalManager } from './signal-manager';\nimport { type Message } from './signal-methods';\nimport { MESSAGE_TIMEOUT } from './timeouts';\n\nexport type OnMessage = (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>;\n\nexport interface MessengerOptions {\n signalManager: SignalManager;\n retryDelay?: number;\n}\n\nconst ReliablePayload = schema.getCodecForType('dxos.mesh.messaging.ReliablePayload');\nconst Acknowledgement = schema.getCodecForType('dxos.mesh.messaging.Acknowledgement');\n\nconst RECEIVED_MESSAGES_GC_INTERVAL = 120_000;\n\n/**\n * Reliable messenger that works trough signal network.\n */\nexport class Messenger {\n private readonly _signalManager: SignalManager;\n // { peerId, payloadType } => listeners set\n private readonly _listeners = new ComplexMap<{ peerId: PublicKey; payloadType: string }, Set<OnMessage>>(\n ({ peerId, payloadType }) => peerId.toHex() + payloadType,\n );\n\n // peerId => listeners set\n private readonly _defaultListeners = new ComplexMap<PublicKey, Set<OnMessage>>(PublicKey.hash);\n\n private readonly _onAckCallbacks = new ComplexMap<PublicKey, () => void>(PublicKey.hash);\n\n private readonly _receivedMessages = new ComplexSet<PublicKey>(PublicKey.hash);\n\n /**\n * Keys scheduled to be cleared from _receivedMessages on the next iteration.\n */\n private readonly _toClear = new ComplexSet<PublicKey>(PublicKey.hash);\n\n private _ctx!: Context;\n private _closed = true;\n private readonly _retryDelay: number;\n\n constructor({ signalManager, retryDelay = 300 }: MessengerOptions) {\n this._signalManager = signalManager;\n this._retryDelay = retryDelay;\n\n this.open();\n }\n\n open() {\n if (!this._closed) {\n return;\n }\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.mesh.messenger.open', trace.begin({ id: traceId }));\n this._ctx = new Context({\n onError: (err) => log.catch(err),\n });\n this._ctx.onDispose(\n this._signalManager.onMessage.on(async (message) => {\n log('received message', { from: message.author });\n await this._handleMessage(message);\n }),\n );\n\n // Clear the map periodically.\n scheduleTaskInterval(\n this._ctx,\n async () => {\n this._performGc();\n },\n RECEIVED_MESSAGES_GC_INTERVAL,\n );\n\n this._closed = false;\n log.trace('dxos.mesh.messenger.open', trace.end({ id: traceId }));\n }\n\n async close() {\n if (this._closed) {\n return;\n }\n this._closed = true;\n await this._ctx.dispose();\n }\n\n async sendMessage({ author, recipient, payload }: Message): Promise<void> {\n invariant(!this._closed, 'Closed');\n const messageContext = this._ctx.derive();\n\n const reliablePayload: ReliablePayload = {\n messageId: PublicKey.random(),\n payload,\n };\n invariant(!this._onAckCallbacks.has(reliablePayload.messageId!));\n log('send message', { messageId: reliablePayload.messageId, author, recipient });\n\n let messageReceived: () => void;\n let timeoutHit: (err: Error) => void;\n\n const promise = new Promise<void>((resolve, reject) => {\n messageReceived = resolve;\n timeoutHit = reject;\n });\n\n // Setting retry interval if signal was not acknowledged.\n scheduleExponentialBackoffTaskInterval(\n messageContext,\n async () => {\n log('retrying message', { messageId: reliablePayload.messageId });\n await this._encodeAndSend({ author, recipient, reliablePayload }).catch((err) =>\n log('failed to send message', { err }),\n );\n },\n this._retryDelay,\n );\n\n scheduleTask(\n messageContext,\n () => {\n log('message not delivered', { messageId: reliablePayload.messageId });\n this._onAckCallbacks.delete(reliablePayload.messageId!);\n timeoutHit(\n new ProtocolTimeoutError(\n 'signaling message not delivered',\n new TimeoutError(MESSAGE_TIMEOUT, 'Message not delivered'),\n ),\n );\n void messageContext.dispose();\n },\n MESSAGE_TIMEOUT,\n );\n\n this._onAckCallbacks.set(reliablePayload.messageId, () => {\n messageReceived();\n this._onAckCallbacks.delete(reliablePayload.messageId!);\n void messageContext.dispose();\n });\n\n await this._encodeAndSend({ author, recipient, reliablePayload });\n return promise;\n }\n\n /**\n * Subscribes onMessage function to messages that contains payload with payloadType.\n * @param payloadType if not specified, onMessage will be subscribed to all types of messages.\n */\n async listen({\n peerId,\n payloadType,\n onMessage,\n }: {\n peerId: PublicKey;\n payloadType?: string;\n onMessage: OnMessage;\n }): Promise<ListeningHandle> {\n invariant(!this._closed, 'Closed');\n\n await this._signalManager.subscribeMessages(peerId);\n let listeners: Set<OnMessage> | undefined;\n\n if (!payloadType) {\n listeners = this._defaultListeners.get(peerId);\n if (!listeners) {\n listeners = new Set();\n this._defaultListeners.set(peerId, listeners);\n }\n } else {\n listeners = this._listeners.get({ peerId, payloadType });\n if (!listeners) {\n listeners = new Set();\n this._listeners.set({ peerId, payloadType }, listeners);\n }\n }\n\n listeners.add(onMessage);\n\n return {\n unsubscribe: async () => {\n listeners!.delete(onMessage);\n },\n };\n }\n\n private async _encodeAndSend({\n author,\n recipient,\n reliablePayload,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n reliablePayload: ReliablePayload;\n }): Promise<void> {\n await this._signalManager.sendMessage({\n author,\n recipient,\n payload: {\n type_url: 'dxos.mesh.messaging.ReliablePayload',\n value: ReliablePayload.encode(reliablePayload, { preserveAny: true }),\n },\n });\n }\n\n private async _handleMessage(message: Message): Promise<void> {\n switch (message.payload.type_url) {\n case 'dxos.mesh.messaging.ReliablePayload': {\n await this._handleReliablePayload(message);\n break;\n }\n case 'dxos.mesh.messaging.Acknowledgement': {\n await this._handleAcknowledgement({ payload: message.payload });\n break;\n }\n }\n }\n\n private async _handleReliablePayload({ author, recipient, payload }: Message) {\n invariant(payload.type_url === 'dxos.mesh.messaging.ReliablePayload');\n const reliablePayload: ReliablePayload = ReliablePayload.decode(payload.value, { preserveAny: true });\n\n log('handling message', { messageId: reliablePayload.messageId });\n\n await this._sendAcknowledgement({\n author,\n recipient,\n messageId: reliablePayload.messageId,\n });\n\n if (this._receivedMessages.has(reliablePayload.messageId!)) {\n return;\n }\n\n this._receivedMessages.add(reliablePayload.messageId!);\n\n await this._callListeners({\n author,\n recipient,\n payload: reliablePayload.payload,\n });\n }\n\n private async _handleAcknowledgement({ payload }: { payload: Any }) {\n invariant(payload.type_url === 'dxos.mesh.messaging.Acknowledgement');\n this._onAckCallbacks.get(Acknowledgement.decode(payload.value).messageId)?.();\n }\n\n private async _sendAcknowledgement({\n author,\n recipient,\n messageId,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n messageId: PublicKey;\n }): Promise<void> {\n log('sending ACK', { messageId, from: recipient, to: author });\n\n await this._signalManager.sendMessage({\n author: recipient,\n recipient: author,\n payload: {\n type_url: 'dxos.mesh.messaging.Acknowledgement',\n value: Acknowledgement.encode({ messageId }),\n },\n });\n }\n\n private async _callListeners(message: Message): Promise<void> {\n {\n const defaultListenerMap = this._defaultListeners.get(message.recipient);\n if (defaultListenerMap) {\n for (const listener of defaultListenerMap) {\n await listener(message);\n }\n }\n }\n\n {\n const listenerMap = this._listeners.get({\n peerId: message.recipient,\n payloadType: message.payload.type_url,\n });\n if (listenerMap) {\n for (const listener of listenerMap) {\n await listener(message);\n }\n }\n }\n }\n\n private _performGc() {\n const start = performance.now();\n\n for (const key of this._toClear.keys()) {\n this._receivedMessages.delete(key);\n }\n this._toClear.clear();\n for (const key of this._receivedMessages.keys()) {\n this._toClear.add(key);\n }\n\n const elapsed = performance.now() - start;\n if (elapsed > 100) {\n log.warn('GC took too long', { elapsed });\n }\n }\n}\n\nexport interface ListeningHandle {\n unsubscribe: () => Promise<void>;\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\n/**\n * Timeout for retrying messages.\n */\nexport const MESSAGE_TIMEOUT = 10_000;\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { DeferredTask, Event, Trigger, asyncTimeout, scheduleTask, scheduleTaskInterval, sleep } from '@dxos/async';\nimport { type Any, type Stream } from '@dxos/codec-protobuf';\nimport { Context, cancelWithContext } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/protocols';\nimport { type Message as SignalMessage, SignalState, type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { SignalRPCClient } from './signal-rpc-client';\nimport { type Message, type SignalMethods } from '../signal-methods';\n\nconst DEFAULT_RECONNECT_TIMEOUT = 100;\nconst MAX_RECONNECT_TIMEOUT = 5000;\nconst ERROR_RECONCILE_DELAY = 1000;\nconst RECONCILE_INTERVAL = 5_000;\n\nexport type SignalStatus = {\n host: string;\n state: SignalState;\n error?: string;\n reconnectIn: number;\n connectionStarted: Date;\n lastStateChange: Date;\n};\n\nexport type CommandTrace = {\n messageId: string;\n host: string;\n incoming: boolean;\n time: number;\n method: string;\n payload: any;\n response?: any;\n error?: string;\n};\n\n/**\n * Establishes a websocket connection to signal server and provides RPC methods.\n */\nexport class SignalClient implements SignalMethods {\n private _state = SignalState.CLOSED;\n\n private _lastError?: Error;\n\n /**\n * Number of milliseconds after which the connection will be attempted again in case of error.\n */\n private _reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;\n\n /**\n * Timestamp of when the connection attempt was began.\n */\n private _connectionStarted = new Date();\n\n /**\n * Timestamp of last state change.\n */\n private _lastStateChange = new Date();\n\n private _client?: SignalRPCClient;\n private readonly _clientReady = new Trigger();\n\n private _ctx?: Context;\n\n private _connectionCtx?: Context;\n\n private _reconcileTask?: DeferredTask;\n private _reconnectTask?: DeferredTask;\n\n readonly statusChanged = new Event<SignalStatus>();\n readonly commandTrace = new Event<CommandTrace>();\n\n /**\n * Swarm events streams. Keys represent actually joined topic and peerId.\n */\n private readonly _swarmStreams = new ComplexMap<{ topic: PublicKey; peerId: PublicKey }, Stream<SwarmEvent>>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n /**\n * Represent desired joined topic and peerId.\n */\n private readonly _joinedTopics = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n /**\n * Message streams. Keys represents actually subscribed peers.\n * @internal\n */\n public readonly _messageStreams = new ComplexMap<PublicKey, Stream<SignalMessage>>((key) => key.toHex());\n\n /**\n * Represent desired message subscriptions.\n */\n private readonly _subscribedMessages = new ComplexSet<{ peerId: PublicKey }>(({ peerId }) => peerId.toHex());\n\n /**\n * Event to use in tests to wait till subscription is successfully established.\n * @internal\n */\n public _reconciled = new Event();\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n private readonly _performance = {\n sentMessages: 0,\n receivedMessages: 0,\n reconnectCounter: 0,\n joinCounter: 0,\n leaveCounter: 0,\n };\n\n /**\n * @param _host Signal server websocket URL.\n * @param _onMessage\n */\n constructor(\n private readonly _host: string,\n private readonly _onMessage: (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>,\n private readonly _onSwarmEvent: (params: { topic: PublicKey; swarmEvent: SwarmEvent }) => Promise<void>,\n ) {\n if (!this._host.startsWith('wss://') && !this._host.startsWith('ws://')) {\n throw new Error(`Signal server requires a websocket URL. Provided: ${this._host}`);\n }\n }\n\n open() {\n log.trace('dxos.mesh.signal-client.open', trace.begin({ id: this._instanceId }));\n\n if ([SignalState.CONNECTED, SignalState.CONNECTING].includes(this._state)) {\n return;\n }\n\n this._ctx = new Context({\n onError: (err) => {\n if (this._state === SignalState.CLOSED || this._ctx?.disposed) {\n return;\n }\n if (this._state === SignalState.CONNECTED) {\n log.warn('SignalClient error:', err);\n }\n this._scheduleReconcileAfterError();\n },\n });\n\n this._reconcileTask = new DeferredTask(this._ctx, async () => {\n await this._reconcileSwarmSubscriptions();\n await this._reconcileMessageSubscriptions();\n this._reconciled.emit();\n });\n\n // Reconcile subscriptions periodically.\n scheduleTaskInterval(\n this._ctx,\n async () => {\n if (this._state === SignalState.CONNECTED) {\n this._reconcileTask!.schedule();\n }\n },\n RECONCILE_INTERVAL,\n );\n\n this._reconnectTask = new DeferredTask(this._ctx, async () => {\n await this._reconnect();\n });\n\n this._setState(SignalState.CONNECTING);\n this._createClient();\n log.trace('dxos.mesh.signal-client.open', trace.end({ id: this._instanceId }));\n }\n\n async close() {\n log('closing...');\n if ([SignalState.CLOSED].includes(this._state)) {\n return;\n }\n\n await this._ctx?.dispose();\n\n this._clientReady.reset();\n await this._client?.close();\n this._client = undefined;\n this._setState(SignalState.CLOSED);\n log('closed');\n }\n\n getStatus(): SignalStatus {\n return {\n host: this._host,\n state: this._state,\n error: this._lastError?.message,\n reconnectIn: this._reconnectAfter,\n connectionStarted: this._connectionStarted,\n lastStateChange: this._lastStateChange,\n };\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n log('joining', { topic, peerId });\n this._performance.joinCounter++;\n this._joinedTopics.add({ topic, peerId });\n this._reconcileTask!.schedule();\n }\n\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n this._performance.leaveCounter++;\n log('leaving', { topic, peerId });\n\n void this._swarmStreams.get({ topic, peerId })?.close();\n this._swarmStreams.delete({ topic, peerId });\n this._joinedTopics.delete({ topic, peerId });\n }\n\n async sendMessage(msg: Message): Promise<void> {\n this._performance.sentMessages++;\n await this._clientReady.wait();\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n await this._client!.sendMessage(msg);\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log('subscribing to messages', { peerId });\n this._subscribedMessages.add({ peerId });\n this._reconcileTask!.schedule();\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log('unsubscribing from messages', { peerId });\n this._subscribedMessages.delete({ peerId });\n void this._messageStreams.get(peerId)?.close();\n this._messageStreams.delete(peerId);\n }\n\n private _scheduleReconcileAfterError() {\n scheduleTask(\n this._ctx!,\n () => {\n this._reconcileTask!.schedule();\n },\n ERROR_RECONCILE_DELAY,\n );\n }\n\n private _setState(newState: SignalState) {\n this._state = newState;\n this._lastStateChange = new Date();\n log('signal state changed', { status: this.getStatus() });\n this.statusChanged.emit(this.getStatus());\n }\n\n private _createClient() {\n log('creating client', { host: this._host, state: this._state });\n invariant(!this._client, 'Client already created');\n\n this._connectionStarted = new Date();\n\n // Create new context for each connection.\n this._connectionCtx = this._ctx!.derive();\n this._connectionCtx.onDispose(async () => {\n log('connection context disposed');\n await Promise.all(Array.from(this._swarmStreams.values()).map((stream) => stream.close()));\n await Promise.all(Array.from(this._messageStreams.values()).map((stream) => stream.close()));\n this._swarmStreams.clear();\n this._messageStreams.clear();\n });\n\n try {\n this._client = new SignalRPCClient({\n url: this._host,\n callbacks: {\n onConnected: () => {\n log('socket connected');\n this._lastError = undefined;\n this._reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;\n this._setState(SignalState.CONNECTED);\n this._clientReady.wake();\n this._reconcileTask!.schedule();\n },\n\n onDisconnected: () => {\n log('socket disconnected', { state: this._state });\n if (this._state === SignalState.ERROR) {\n // Ignore disconnects after error.\n // Handled by error handler before disconnect handler.\n this._setState(SignalState.DISCONNECTED);\n return;\n }\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._setState(SignalState.DISCONNECTED);\n this._reconnectTask!.schedule();\n },\n\n onError: (error) => {\n log('socket error', { error, state: this._state });\n this._lastError = error;\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._setState(SignalState.ERROR);\n\n this._reconnectTask!.schedule();\n },\n },\n });\n } catch (err: any) {\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._lastError = err;\n this._setState(SignalState.DISCONNECTED);\n this._reconnectTask!.schedule();\n }\n }\n\n private _incrementReconnectTimeout() {\n this._reconnectAfter *= 2;\n this._reconnectAfter = Math.min(this._reconnectAfter, MAX_RECONNECT_TIMEOUT);\n }\n\n private async _reconnect() {\n log(`reconnecting in ${this._reconnectAfter}ms`, { state: this._state });\n this._performance.reconnectCounter++;\n\n if (this._state === SignalState.RECONNECTING) {\n log.warn('Signal api already reconnecting.');\n return;\n }\n\n if (this._state === SignalState.CLOSED) {\n return;\n }\n\n // Close client if it wasn't already closed.\n this._clientReady.reset();\n await this._connectionCtx?.dispose();\n this._client?.close().catch(() => {});\n this._client = undefined;\n\n await cancelWithContext(this._ctx!, sleep(this._reconnectAfter));\n\n this._setState(SignalState.RECONNECTING);\n\n this._createClient();\n }\n\n private async _reconcileSwarmSubscriptions(): Promise<void> {\n await asyncTimeout(cancelWithContext(this._connectionCtx!, this._clientReady.wait()), 5_000);\n // Copy Client reference to avoid client change during the reconcile.\n const client = this._client!;\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n\n // Unsubscribe from topics that are no longer needed.\n for (const { topic, peerId } of this._swarmStreams.keys()) {\n // Join desired topics.\n if (this._joinedTopics.has({ topic, peerId })) {\n continue;\n }\n\n void this._swarmStreams.get({ topic, peerId })?.close();\n this._swarmStreams.delete({ topic, peerId });\n }\n\n // Subscribe to topics that are needed.\n for (const { topic, peerId } of this._joinedTopics.values()) {\n // Join desired topics.\n if (this._swarmStreams.has({ topic, peerId })) {\n continue;\n }\n\n const swarmStream = await asyncTimeout(\n cancelWithContext(this._connectionCtx!, client.join({ topic, peerId })),\n 5000,\n );\n // Subscribing to swarm events.\n // TODO(mykola): What happens when the swarm stream is closed? Maybe send leave event for each peer?\n swarmStream.subscribe(async (swarmEvent: SwarmEvent) => {\n log('swarm event', { swarmEvent });\n await this._onSwarmEvent({ topic, swarmEvent });\n });\n\n // Saving swarm stream.\n this._swarmStreams.set({ topic, peerId }, swarmStream);\n }\n }\n\n private async _reconcileMessageSubscriptions(): Promise<void> {\n await asyncTimeout(cancelWithContext(this._connectionCtx!, this._clientReady.wait()), 5_000);\n // Copy Client reference to avoid client change during the reconcile.\n const client = this._client!;\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n\n // Unsubscribe from messages that are no longer needed.\n for (const peerId of this._messageStreams.keys()) {\n // Join desired topics.\n if (this._subscribedMessages.has({ peerId })) {\n continue;\n }\n\n void this._messageStreams.get(peerId)?.close();\n this._messageStreams.delete(peerId);\n }\n\n // Subscribe to messages that are needed.\n for (const { peerId } of this._subscribedMessages.values()) {\n if (this._messageStreams.has(peerId)) {\n continue;\n }\n\n const messageStream = await asyncTimeout(\n cancelWithContext(this._connectionCtx!, client.receiveMessages(peerId)),\n 5000,\n );\n messageStream.subscribe(async (message: SignalMessage) => {\n this._performance.receivedMessages++;\n await this._onMessage({\n author: PublicKey.from(message.author),\n recipient: PublicKey.from(message.recipient),\n payload: message.payload,\n });\n });\n\n // Saving message stream.\n this._messageStreams.set(peerId, messageStream);\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Trigger } from '@dxos/async';\nimport { type Any, type Stream } from '@dxos/codec-protobuf';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema, trace } from '@dxos/protocols';\nimport { type Message as SignalMessage, type Signal } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { createProtoRpcPeer, type ProtoRpcPeer } from '@dxos/rpc';\n\ninterface Services {\n Signal: Signal;\n}\n\nexport type SignalCallbacks = {\n onConnected?: () => void;\n\n /**\n * Called on disconnect.\n * In case of error, `onError` will be called first and then `onDisconnected`.\n */\n onDisconnected?: () => void;\n\n onError?: (error: Error) => void;\n};\n\nexport type SignalRPCClientParams = {\n url: string;\n callbacks?: SignalCallbacks;\n};\n\nexport class SignalRPCClient {\n private _socket?: WebSocket;\n private _rpc?: ProtoRpcPeer<Services>;\n private readonly _connectTrigger = new Trigger();\n\n private _closed = false;\n\n private readonly _url: string;\n private readonly _callbacks: SignalCallbacks;\n\n constructor({ url, callbacks = {} }: SignalRPCClientParams) {\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.mesh.signal-rpc-client.constructor', trace.begin({ id: traceId }));\n this._url = url;\n this._callbacks = callbacks;\n this._socket = new WebSocket(this._url);\n\n this._rpc = createProtoRpcPeer({\n requested: {\n Signal: schema.getService('dxos.mesh.signal.Signal'),\n },\n noHandshake: true,\n port: {\n send: (msg) => {\n if (this._closed) {\n // Do not send messages after close.\n return;\n }\n try {\n this._socket!.send(msg);\n } catch (err) {\n log.warn('send error', err);\n }\n },\n subscribe: (cb) => {\n this._socket!.onmessage = async (msg: WebSocket.MessageEvent) => {\n if (typeof Blob !== 'undefined' && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data as any);\n }\n };\n },\n },\n encodingOptions: {\n preserveAny: true,\n },\n });\n\n this._socket.onopen = async () => {\n try {\n await this._rpc!.open();\n log(`RPC open ${this._url}`);\n this._callbacks.onConnected?.();\n this._connectTrigger.wake();\n } catch (err: any) {\n this._callbacks.onError?.(err);\n }\n };\n\n this._socket.onclose = async () => {\n log(`Disconnected ${this._url}`);\n this._callbacks.onDisconnected?.();\n await this.close();\n };\n\n this._socket.onerror = async (event: WebSocket.ErrorEvent) => {\n if (this._closed) {\n // Ignore errors after close.\n return;\n }\n\n this._callbacks.onError?.(event.error ?? new Error(event.message));\n this._connectTrigger.reset();\n\n try {\n await this._rpc?.close();\n } catch (err) {\n log.catch(err);\n }\n this._closed = true;\n\n log.warn(event.message ?? 'Socket error', { url: this._url });\n };\n\n log.trace('dxos.mesh.signal-rpc-client.constructor', trace.end({ id: traceId }));\n }\n\n async close() {\n this._closed = true;\n try {\n await this._rpc?.close();\n this._socket?.close();\n } catch (err) {\n log.warn('close error', err);\n }\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('join', { topic, peerId });\n await this._connectTrigger.wait();\n invariant(!this._closed, 'SignalRPCClient is closed');\n invariant(this._rpc, 'Rpc is not initialized');\n const swarmStream = this._rpc.rpc.Signal.join({\n swarm: topic.asUint8Array(),\n peer: peerId.asUint8Array(),\n });\n await swarmStream.waitUntilReady();\n return swarmStream;\n }\n\n async receiveMessages(peerId: PublicKey): Promise<Stream<SignalMessage>> {\n log('receiveMessages', { peerId });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n invariant(this._rpc, 'Rpc is not initialized');\n const messageStream = this._rpc.rpc.Signal.receiveMessages({\n peer: peerId.asUint8Array(),\n });\n await messageStream.waitUntilReady();\n return messageStream;\n }\n\n async sendMessage({ author, recipient, payload }: { author: PublicKey; recipient: PublicKey; payload: Any }) {\n log('sendMessage', { author, recipient, payload });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n invariant(this._rpc, 'Rpc is not initialized');\n await this._rpc.rpc.Signal.sendMessage({\n author: author.asUint8Array(),\n recipient: recipient.asUint8Array(),\n payload,\n });\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event, Trigger } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { type SignalManager } from './signal-manager';\nimport { type CommandTrace, type SignalStatus } from '../signal-client';\n\n/**\n * Common signaling context that connects multiple MemorySignalManager instances.\n */\nexport class MemorySignalManagerContext {\n // Swarm messages.\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n // Mapping from topic to set of peers.\n readonly swarms = new ComplexMap<PublicKey, ComplexSet<PublicKey>>(PublicKey.hash);\n\n // Map of connections for each peer for signaling.\n readonly connections = new ComplexMap<PublicKey, MemorySignalManager>(PublicKey.hash);\n}\n\n/**\n * In memory signal manager for testing.\n */\nexport class MemorySignalManager implements SignalManager {\n readonly statusChanged = new Event<SignalStatus[]>();\n readonly commandTrace = new Event<CommandTrace>();\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n readonly onMessage = new Event<{\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }>();\n\n /** Will be used to emit SwarmEvents on .open() and .close() */\n private _joinedSwarms = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n private _ctx!: Context;\n\n // TODO(dmaretskyi): Replace with callback.\n private readonly _freezeTrigger = new Trigger().wake();\n\n constructor(private readonly _context: MemorySignalManagerContext) {\n this._ctx = new Context();\n\n this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));\n }\n\n async open() {\n if (!this._ctx.disposed) {\n return;\n }\n this._ctx = new Context();\n this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));\n\n await Promise.all([...this._joinedSwarms.values()].map((value) => this.join(value)));\n }\n\n async close() {\n if (this._ctx.disposed) {\n return;\n }\n // save copy of joined swarms.\n const joinedSwarmsCopy = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n [...this._joinedSwarms.values()],\n );\n\n await Promise.all([...this._joinedSwarms.values()].map((value) => this.leave(value)));\n\n // assign joined swarms back because .leave() deletes it.\n this._joinedSwarms = joinedSwarmsCopy;\n\n await this._ctx.dispose();\n }\n\n getStatus(): SignalStatus[] {\n return [];\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n invariant(!this._ctx.disposed, 'Closed');\n\n this._joinedSwarms.add({ topic, peerId });\n\n if (!this._context.swarms.has(topic)) {\n this._context.swarms.set(topic, new ComplexSet(PublicKey.hash));\n }\n\n this._context.swarms.get(topic)!.add(peerId);\n this._context.swarmEvent.emit({\n topic,\n swarmEvent: {\n peerAvailable: {\n peer: peerId.asUint8Array(),\n since: new Date(),\n },\n },\n });\n\n // Emitting swarm events for each peer.\n for (const [topic, peerIds] of this._context.swarms) {\n Array.from(peerIds).forEach((peerId) => {\n this.swarmEvent.emit({\n topic,\n swarmEvent: {\n peerAvailable: {\n peer: peerId.asUint8Array(),\n since: new Date(),\n },\n },\n });\n });\n }\n }\n\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n invariant(!this._ctx.disposed, 'Closed');\n\n this._joinedSwarms.delete({ topic, peerId });\n\n if (!this._context.swarms.has(topic)) {\n this._context.swarms.set(topic, new ComplexSet(PublicKey.hash));\n }\n\n this._context.swarms.get(topic)!.delete(peerId);\n\n const swarmEvent: SwarmEvent = {\n peerLeft: {\n peer: peerId.asUint8Array(),\n },\n };\n\n this._context.swarmEvent.emit({ topic, swarmEvent });\n }\n\n async sendMessage({ author, recipient, payload }: { author: PublicKey; recipient: PublicKey; payload: Any }) {\n log('send message', { author, recipient, ...dec(payload) });\n\n invariant(recipient);\n invariant(!this._ctx.disposed, 'Closed');\n\n await this._freezeTrigger.wait();\n\n const remote = this._context.connections.get(recipient);\n if (!remote) {\n log.warn('recipient is not subscribed for messages', { author, recipient });\n return;\n }\n\n if (remote._ctx.disposed) {\n log.warn('recipient is disposed', { author, recipient });\n return;\n }\n\n remote._freezeTrigger\n .wait()\n .then(() => {\n if (remote._ctx.disposed) {\n log.warn('recipient is disposed', { author, recipient });\n return;\n }\n\n log('receive message', { author, recipient, ...dec(payload) });\n\n remote.onMessage.emit({ author, recipient, payload });\n })\n .catch((err) => {\n log.error('error while waiting for freeze', { err });\n });\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log('subscribing', { peerId });\n this._context.connections.set(peerId, this);\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log('unsubscribing', { peerId });\n this._context.connections.delete(peerId);\n }\n\n freeze() {\n this._freezeTrigger.reset();\n }\n\n unfreeze() {\n this._freezeTrigger.wake();\n }\n}\nconst dec = (payload: Any) => {\n if (!payload.type_url.endsWith('ReliablePayload')) {\n return {};\n }\n\n const relPayload = schema.getCodecForType('dxos.mesh.messaging.ReliablePayload').decode(payload.value);\n\n if (typeof relPayload?.payload?.data === 'object') {\n return { payload: Object.keys(relPayload?.payload?.data)[0], sessionId: relPayload?.payload?.sessionId };\n }\n\n return {};\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event, sleep, synchronized } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { RateLimitExceededError, TimeoutError, trace } from '@dxos/protocols';\nimport { type Runtime } from '@dxos/protocols/proto/dxos/config';\nimport { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\n\nimport { type SignalManager } from './signal-manager';\nimport { type CommandTrace, SignalClient, type SignalStatus } from '../signal-client';\n\nconst MAX_SERVER_FAILURES = 5;\nconst WSS_SIGNAL_SERVER_REBOOT_DELAY = 3_000;\n/**\n * Manages connection to multiple Signal Servers over WebSocket\n */\nexport class WebsocketSignalManager implements SignalManager {\n private readonly _servers = new Map<string, SignalClient>();\n\n private _ctx!: Context;\n private _opened = false;\n\n readonly failureCount = new Map<string, number>();\n readonly statusChanged = new Event<SignalStatus[]>();\n readonly commandTrace = new Event<CommandTrace>();\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n readonly onMessage = new Event<{\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }>();\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n constructor(private readonly _hosts: Runtime.Services.Signal[]) {\n log('Created WebsocketSignalManager', { hosts: this._hosts });\n for (const host of this._hosts) {\n if (this._servers.has(host.server)) {\n continue;\n }\n const server = new SignalClient(\n host.server,\n async (message) => this.onMessage.emit(message),\n async (data) => this.swarmEvent.emit(data),\n );\n server.statusChanged.on(() => this.statusChanged.emit(this.getStatus()));\n\n this._servers.set(host.server, server);\n this.failureCount.set(host.server, 0);\n server.commandTrace.on((trace) => this.commandTrace.emit(trace));\n }\n }\n\n @synchronized\n async open() {\n if (this._opened) {\n return;\n }\n log('open signal manager', { hosts: this._hosts });\n log.trace('dxos.mesh.websocket-signal-manager.open', trace.begin({ id: this._instanceId }));\n\n this._initContext();\n\n [...this._servers.values()].forEach((server) => server.open());\n\n this._opened = true;\n log.trace('dxos.mesh.websocket-signal-manager.open', trace.end({ id: this._instanceId }));\n }\n\n @synchronized\n async close() {\n if (!this._opened) {\n return;\n }\n this._opened = false;\n\n await this._ctx.dispose();\n\n await Promise.all(Array.from(this._servers.values()).map((server) => server.close()));\n }\n\n async restartServer(serverName: string) {\n log('Restarting server', { serverName });\n invariant(this._opened, 'server already closed');\n\n const server = this._servers.get(serverName);\n invariant(server, 'server not found');\n\n await server.close();\n await sleep(WSS_SIGNAL_SERVER_REBOOT_DELAY);\n await server.open();\n }\n\n getStatus(): SignalStatus[] {\n return Array.from(this._servers.values()).map((server) => server.getStatus());\n }\n\n @synchronized\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('Join', { topic, peerId });\n invariant(this._opened, 'Closed');\n await this._forEachServer((server) => server.join({ topic, peerId }));\n }\n\n @synchronized\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('leaving', { topic, peerId });\n invariant(this._opened, 'Closed');\n\n await this._forEachServer((server) => server.leave({ topic, peerId }));\n }\n\n async sendMessage({\n author,\n recipient,\n payload,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }): Promise<void> {\n log(`Signal ${recipient.truncate()}`);\n invariant(this._opened, 'Closed');\n\n void this._forEachServer(async (server, serverName) => {\n void server.sendMessage({ author, recipient, payload }).catch((err) => {\n if (err instanceof RateLimitExceededError) {\n log.info('WSS rate limit exceeded', { err });\n } else if (err instanceof TimeoutError || err.constructor.name === 'TimeoutError') {\n log.info('WSS sendMessage timeout', { err });\n void this.checkServerFailure(serverName);\n } else {\n log.info(`error sending to ${serverName}`, { err });\n void this.checkServerFailure(serverName);\n }\n });\n });\n }\n\n @synchronized\n async checkServerFailure(serverName: string) {\n const failureCount = this.failureCount.get(serverName!) ?? 0;\n if (failureCount > MAX_SERVER_FAILURES) {\n log.warn(`Too many failures sending to ${serverName} (${failureCount} > ${MAX_SERVER_FAILURES}), restarting`);\n await this.restartServer(serverName!);\n this.failureCount.set(serverName!, 0);\n return;\n }\n this.failureCount.set(serverName!, (this.failureCount.get(serverName!) ?? 0) + 1);\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log(`Subscribed for message stream peerId=${peerId}`);\n invariant(this._opened, 'Closed');\n\n await this._forEachServer(async (server) => server.subscribeMessages(peerId));\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log(`Subscribed for message stream peerId=${peerId}`);\n invariant(this._opened, 'Closed');\n\n await this._forEachServer(async (server) => server.unsubscribeMessages(peerId));\n }\n\n private _initContext() {\n this._ctx = new Context({\n onError: (err) => log.catch(err),\n });\n }\n\n private async _forEachServer<ReturnType>(\n fn: (server: SignalClient, serverName: string) => Promise<ReturnType>,\n ): Promise<ReturnType[]> {\n return Promise.all(Array.from(this._servers.entries()).map(([serverName, server]) => fn(server, serverName)));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["TimeoutError", "scheduleExponentialBackoffTaskInterval", "scheduleTask", "scheduleTaskInterval", "Context", "invariant", "PublicKey", "log", "ProtocolTimeoutError", "schema", "trace", "ComplexMap", "ComplexSet", "MESSAGE_TIMEOUT", "ReliablePayload", "schema", "getCodecForType", "Acknowledgement", "RECEIVED_MESSAGES_GC_INTERVAL", "Messenger", "constructor", "signalManager", "retryDelay", "_listeners", "ComplexMap", "peerId", "payloadType", "toHex", "_defaultListeners", "PublicKey", "hash", "_onAckCallbacks", "_receivedMessages", "ComplexSet", "_toClear", "_closed", "_signalManager", "_retryDelay", "open", "traceId", "random", "log", "trace", "begin", "id", "_ctx", "Context", "onError", "err", "catch", "onDispose", "onMessage", "on", "message", "from", "author", "_handleMessage", "scheduleTaskInterval", "_performGc", "end", "close", "dispose", "sendMessage", "recipient", "payload", "invariant", "messageContext", "derive", "reliablePayload", "messageId", "has", "messageReceived", "timeoutHit", "promise", "Promise", "resolve", "reject", "scheduleExponentialBackoffTaskInterval", "_encodeAndSend", "scheduleTask", "delete", "ProtocolTimeoutError", "TimeoutError", "MESSAGE_TIMEOUT", "set", "listen", "subscribeMessages", "listeners", "get", "Set", "add", "unsubscribe", "type_url", "value", "encode", "preserveAny", "_handleReliablePayload", "_handleAcknowledgement", "decode", "_sendAcknowledgement", "_callListeners", "to", "defaultListenerMap", "listener", "listenerMap", "start", "performance", "now", "key", "keys", "clear", "elapsed", "warn", "DeferredTask", "Event", "Trigger", "asyncTimeout", "scheduleTask", "scheduleTaskInterval", "sleep", "Context", "cancelWithContext", "invariant", "PublicKey", "log", "trace", "SignalState", "ComplexMap", "ComplexSet", "WebSocket", "Trigger", "invariant", "PublicKey", "log", "schema", "trace", "createProtoRpcPeer", "SignalRPCClient", "constructor", "url", "callbacks", "_connectTrigger", "_closed", "traceId", "random", "toHex", "begin", "id", "_url", "_callbacks", "_socket", "_rpc", "requested", "Signal", "getService", "noHandshake", "port", "send", "msg", "err", "warn", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "encodingOptions", "preserveAny", "onopen", "open", "onConnected", "wake", "onError", "onclose", "onDisconnected", "close", "onerror", "event", "error", "Error", "message", "reset", "catch", "end", "join", "topic", "peerId", "wait", "swarmStream", "rpc", "swarm", "asUint8Array", "peer", "waitUntilReady", "receiveMessages", "messageStream", "sendMessage", "author", "recipient", "payload", "DEFAULT_RECONNECT_TIMEOUT", "MAX_RECONNECT_TIMEOUT", "ERROR_RECONCILE_DELAY", "RECONCILE_INTERVAL", "SignalClient", "constructor", "_host", "_onMessage", "_onSwarmEvent", "_state", "SignalState", "CLOSED", "_reconnectAfter", "_connectionStarted", "Date", "_lastStateChange", "_clientReady", "Trigger", "statusChanged", "Event", "commandTrace", "_swarmStreams", "ComplexMap", "topic", "peerId", "toHex", "_joinedTopics", "ComplexSet", "_messageStreams", "key", "_subscribedMessages", "_reconciled", "_instanceId", "PublicKey", "random", "_performance", "sentMessages", "receivedMessages", "reconnectCounter", "joinCounter", "leaveCounter", "startsWith", "Error", "open", "log", "trace", "begin", "id", "CONNECTED", "CONNECTING", "includes", "_ctx", "Context", "onError", "err", "disposed", "warn", "_scheduleReconcileAfterError", "_reconcileTask", "DeferredTask", "_reconcileSwarmSubscriptions", "_reconcileMessageSubscriptions", "emit", "scheduleTaskInterval", "schedule", "_reconnectTask", "_reconnect", "_setState", "_createClient", "end", "close", "dispose", "reset", "_client", "undefined", "getStatus", "host", "state", "error", "_lastError", "message", "reconnectIn", "connectionStarted", "lastStateChange", "join", "add", "leave", "get", "delete", "sendMessage", "msg", "wait", "invariant", "subscribeMessages", "unsubscribeMessages", "scheduleTask", "newState", "status", "_connectionCtx", "derive", "onDispose", "Promise", "all", "Array", "from", "values", "map", "stream", "clear", "SignalRPCClient", "url", "callbacks", "onConnected", "wake", "onDisconnected", "ERROR", "DISCONNECTED", "_incrementReconnectTimeout", "Math", "min", "RECONNECTING", "catch", "cancelWithContext", "sleep", "asyncTimeout", "client", "keys", "has", "swarmStream", "subscribe", "swarmEvent", "set", "messageStream", "receiveMessages", "author", "recipient", "payload", "Event", "Trigger", "Context", "invariant", "PublicKey", "log", "schema", "ComplexMap", "ComplexSet", "MemorySignalManagerContext", "swarmEvent", "swarms", "hash", "connections", "MemorySignalManager", "constructor", "_context", "statusChanged", "commandTrace", "onMessage", "_joinedSwarms", "topic", "peerId", "toHex", "_freezeTrigger", "wake", "_ctx", "onDispose", "on", "data", "emit", "open", "disposed", "Promise", "all", "values", "map", "value", "join", "close", "joinedSwarmsCopy", "leave", "dispose", "getStatus", "add", "has", "set", "get", "peerAvailable", "peer", "asUint8Array", "since", "Date", "peerIds", "Array", "from", "forEach", "delete", "peerLeft", "sendMessage", "author", "recipient", "payload", "dec", "wait", "remote", "warn", "then", "catch", "err", "error", "subscribeMessages", "unsubscribeMessages", "freeze", "reset", "unfreeze", "type_url", "endsWith", "relPayload", "getCodecForType", "decode", "Object", "keys", "sessionId", "Event", "sleep", "synchronized", "Context", "invariant", "PublicKey", "log", "RateLimitExceededError", "TimeoutError", "trace", "MAX_SERVER_FAILURES", "WSS_SIGNAL_SERVER_REBOOT_DELAY", "WebsocketSignalManager", "constructor", "_hosts", "_servers", "Map", "_opened", "failureCount", "statusChanged", "Event", "commandTrace", "swarmEvent", "onMessage", "_instanceId", "PublicKey", "random", "toHex", "log", "hosts", "host", "has", "server", "SignalClient", "message", "emit", "data", "on", "getStatus", "set", "trace", "open", "begin", "id", "_initContext", "values", "forEach", "end", "close", "_ctx", "dispose", "Promise", "all", "Array", "from", "map", "restartServer", "serverName", "invariant", "get", "sleep", "join", "topic", "peerId", "_forEachServer", "leave", "sendMessage", "author", "recipient", "payload", "truncate", "catch", "err", "RateLimitExceededError", "info", "TimeoutError", "name", "checkServerFailure", "warn", "subscribeMessages", "unsubscribeMessages", "Context", "onError", "fn", "entries", "synchronized"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/core/mesh/messaging/src/timeouts.ts":{"bytes":656,"imports":[],"format":"esm"},"packages/core/mesh/messaging/src/messenger.ts":{"bytes":34092,"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/mesh/messaging/src/timeouts.ts","kind":"import-statement","original":"./timeouts"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts":{"bytes":20064,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/messaging/src/signal-client/signal-client.ts":{"bytes":52212,"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/mesh/signal","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts","kind":"import-statement","original":"./signal-rpc-client"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-client/index.ts":{"bytes":499,"imports":[{"path":"packages/core/mesh/messaging/src/signal-client/signal-client.ts","kind":"import-statement","original":"./signal-client"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts":{"bytes":24494,"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/signal-manager.ts":{"bytes":1316,"imports":[],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts":{"bytes":24728,"imports":[{"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/keys","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/messaging/src/signal-client/index.ts","kind":"import-statement","original":"../signal-client"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/index.ts":{"bytes":750,"imports":[{"path":"packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts","kind":"import-statement","original":"./memory-signal-manager"},{"path":"packages/core/mesh/messaging/src/signal-manager/signal-manager.ts","kind":"import-statement","original":"./signal-manager"},{"path":"packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts","kind":"import-statement","original":"./websocket-signal-manager"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-methods.ts":{"bytes":1633,"imports":[],"format":"esm"},"packages/core/mesh/messaging/src/index.ts":{"bytes":782,"imports":[{"path":"packages/core/mesh/messaging/src/messenger.ts","kind":"import-statement","original":"./messenger"},{"path":"packages/core/mesh/messaging/src/signal-client/index.ts","kind":"import-statement","original":"./signal-client"},{"path":"packages/core/mesh/messaging/src/signal-manager/index.ts","kind":"import-statement","original":"./signal-manager"},{"path":"packages/core/mesh/messaging/src/signal-methods.ts","kind":"import-statement","original":"./signal-methods"}],"format":"esm"}},"outputs":{"packages/core/mesh/messaging/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":71750},"packages/core/mesh/messaging/dist/lib/browser/index.mjs":{"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/mesh/signal","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/rpc","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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true}],"exports":["MemorySignalManager","MemorySignalManagerContext","Messenger","SignalClient","WebsocketSignalManager"],"entryPoint":"packages/core/mesh/messaging/src/index.ts","inputs":{"packages/core/mesh/messaging/src/messenger.ts":{"bytesInOutput":9633},"packages/core/mesh/messaging/src/timeouts.ts":{"bytesInOutput":27},"packages/core/mesh/messaging/src/index.ts":{"bytesInOutput":0},"packages/core/mesh/messaging/src/signal-client/signal-client.ts":{"bytesInOutput":13587},"packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts":{"bytesInOutput":6017},"packages/core/mesh/messaging/src/signal-client/index.ts":{"bytesInOutput":0},"packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts":{"bytesInOutput":6661},"packages/core/mesh/messaging/src/signal-manager/index.ts":{"bytesInOutput":0},"packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts":{"bytesInOutput":8157}},"bytes":44783}}}
1
+ {"inputs":{"packages/core/mesh/messaging/src/timeouts.ts":{"bytes":656,"imports":[],"format":"esm"},"packages/core/mesh/messaging/src/messenger.ts":{"bytes":34092,"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/mesh/messaging/src/timeouts.ts","kind":"import-statement","original":"./timeouts"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts":{"bytes":20064,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/messaging/src/signal-client/signal-client.ts":{"bytes":52212,"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/mesh/signal","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts","kind":"import-statement","original":"./signal-rpc-client"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-client/index.ts":{"bytes":499,"imports":[{"path":"packages/core/mesh/messaging/src/signal-client/signal-client.ts","kind":"import-statement","original":"./signal-client"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts":{"bytes":24494,"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/signal-manager.ts":{"bytes":1316,"imports":[],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts":{"bytes":25803,"imports":[{"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/keys","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/messaging/src/signal-client/index.ts","kind":"import-statement","original":"../signal-client"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/index.ts":{"bytes":750,"imports":[{"path":"packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts","kind":"import-statement","original":"./memory-signal-manager"},{"path":"packages/core/mesh/messaging/src/signal-manager/signal-manager.ts","kind":"import-statement","original":"./signal-manager"},{"path":"packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts","kind":"import-statement","original":"./websocket-signal-manager"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-methods.ts":{"bytes":1633,"imports":[],"format":"esm"},"packages/core/mesh/messaging/src/index.ts":{"bytes":782,"imports":[{"path":"packages/core/mesh/messaging/src/messenger.ts","kind":"import-statement","original":"./messenger"},{"path":"packages/core/mesh/messaging/src/signal-client/index.ts","kind":"import-statement","original":"./signal-client"},{"path":"packages/core/mesh/messaging/src/signal-manager/index.ts","kind":"import-statement","original":"./signal-manager"},{"path":"packages/core/mesh/messaging/src/signal-methods.ts","kind":"import-statement","original":"./signal-methods"}],"format":"esm"}},"outputs":{"packages/core/mesh/messaging/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":72195},"packages/core/mesh/messaging/dist/lib/browser/index.mjs":{"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/mesh/signal","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/rpc","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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true}],"exports":["MemorySignalManager","MemorySignalManagerContext","Messenger","SignalClient","WebsocketSignalManager"],"entryPoint":"packages/core/mesh/messaging/src/index.ts","inputs":{"packages/core/mesh/messaging/src/messenger.ts":{"bytesInOutput":9633},"packages/core/mesh/messaging/src/timeouts.ts":{"bytesInOutput":27},"packages/core/mesh/messaging/src/index.ts":{"bytesInOutput":0},"packages/core/mesh/messaging/src/signal-client/signal-client.ts":{"bytesInOutput":13587},"packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts":{"bytesInOutput":6017},"packages/core/mesh/messaging/src/signal-client/index.ts":{"bytesInOutput":0},"packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts":{"bytesInOutput":6661},"packages/core/mesh/messaging/src/signal-manager/index.ts":{"bytesInOutput":0},"packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts":{"bytesInOutput":8542}},"bytes":45168}}}
@@ -1540,7 +1540,7 @@ var WebsocketSignalManager = class {
1540
1540
  payload
1541
1541
  }).catch((err) => {
1542
1542
  if (err instanceof import_protocols5.RateLimitExceededError) {
1543
- (0, import_log5.log)("WSS rate limit exceeded", {
1543
+ import_log5.log.info("WSS rate limit exceeded", {
1544
1544
  err
1545
1545
  }, {
1546
1546
  F: __dxlog_file5,
@@ -1548,8 +1548,8 @@ var WebsocketSignalManager = class {
1548
1548
  S: this,
1549
1549
  C: (f, a) => f(...a)
1550
1550
  });
1551
- } else {
1552
- (0, import_log5.log)(`error sending to ${serverName}`, {
1551
+ } else if (err instanceof import_protocols5.TimeoutError || err.constructor.name === "TimeoutError") {
1552
+ import_log5.log.info("WSS sendMessage timeout", {
1553
1553
  err
1554
1554
  }, {
1555
1555
  F: __dxlog_file5,
@@ -1558,6 +1558,16 @@ var WebsocketSignalManager = class {
1558
1558
  C: (f, a) => f(...a)
1559
1559
  });
1560
1560
  void this.checkServerFailure(serverName);
1561
+ } else {
1562
+ import_log5.log.info(`error sending to ${serverName}`, {
1563
+ err
1564
+ }, {
1565
+ F: __dxlog_file5,
1566
+ L: 143,
1567
+ S: this,
1568
+ C: (f, a) => f(...a)
1569
+ });
1570
+ void this.checkServerFailure(serverName);
1561
1571
  }
1562
1572
  });
1563
1573
  });
@@ -1567,7 +1577,7 @@ var WebsocketSignalManager = class {
1567
1577
  if (failureCount > MAX_SERVER_FAILURES) {
1568
1578
  import_log5.log.warn(`Too many failures sending to ${serverName} (${failureCount} > ${MAX_SERVER_FAILURES}), restarting`, void 0, {
1569
1579
  F: __dxlog_file5,
1570
- L: 151,
1580
+ L: 154,
1571
1581
  S: this,
1572
1582
  C: (f, a) => f(...a)
1573
1583
  });
@@ -1580,13 +1590,13 @@ var WebsocketSignalManager = class {
1580
1590
  async subscribeMessages(peerId) {
1581
1591
  (0, import_log5.log)(`Subscribed for message stream peerId=${peerId}`, void 0, {
1582
1592
  F: __dxlog_file5,
1583
- L: 160,
1593
+ L: 163,
1584
1594
  S: this,
1585
1595
  C: (f, a) => f(...a)
1586
1596
  });
1587
1597
  (0, import_invariant5.invariant)(this._opened, "Closed", {
1588
1598
  F: __dxlog_file5,
1589
- L: 161,
1599
+ L: 164,
1590
1600
  S: this,
1591
1601
  A: [
1592
1602
  "this._opened",
@@ -1598,13 +1608,13 @@ var WebsocketSignalManager = class {
1598
1608
  async unsubscribeMessages(peerId) {
1599
1609
  (0, import_log5.log)(`Subscribed for message stream peerId=${peerId}`, void 0, {
1600
1610
  F: __dxlog_file5,
1601
- L: 167,
1611
+ L: 170,
1602
1612
  S: this,
1603
1613
  C: (f, a) => f(...a)
1604
1614
  });
1605
1615
  (0, import_invariant5.invariant)(this._opened, "Closed", {
1606
1616
  F: __dxlog_file5,
1607
- L: 168,
1617
+ L: 171,
1608
1618
  S: this,
1609
1619
  A: [
1610
1620
  "this._opened",
@@ -1617,7 +1627,7 @@ var WebsocketSignalManager = class {
1617
1627
  this._ctx = new import_context4.Context({
1618
1628
  onError: (err) => import_log5.log.catch(err, void 0, {
1619
1629
  F: __dxlog_file5,
1620
- L: 175,
1630
+ L: 178,
1621
1631
  S: this,
1622
1632
  C: (f, a) => f(...a)
1623
1633
  })
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/messenger.ts", "../../../src/timeouts.ts", "../../../src/signal-client/signal-client.ts", "../../../src/signal-client/signal-rpc-client.ts", "../../../src/signal-manager/memory-signal-manager.ts", "../../../src/signal-manager/websocket-signal-manager.ts"],
4
- "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { TimeoutError, scheduleExponentialBackoffTaskInterval, scheduleTask, scheduleTaskInterval } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { TimeoutError as ProtocolTimeoutError, schema, trace } from '@dxos/protocols';\nimport { ReliablePayload } from '@dxos/protocols/proto/dxos/mesh/messaging';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { type SignalManager } from './signal-manager';\nimport { type Message } from './signal-methods';\nimport { MESSAGE_TIMEOUT } from './timeouts';\n\nexport type OnMessage = (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>;\n\nexport interface MessengerOptions {\n signalManager: SignalManager;\n retryDelay?: number;\n}\n\nconst ReliablePayload = schema.getCodecForType('dxos.mesh.messaging.ReliablePayload');\nconst Acknowledgement = schema.getCodecForType('dxos.mesh.messaging.Acknowledgement');\n\nconst RECEIVED_MESSAGES_GC_INTERVAL = 120_000;\n\n/**\n * Reliable messenger that works trough signal network.\n */\nexport class Messenger {\n private readonly _signalManager: SignalManager;\n // { peerId, payloadType } => listeners set\n private readonly _listeners = new ComplexMap<{ peerId: PublicKey; payloadType: string }, Set<OnMessage>>(\n ({ peerId, payloadType }) => peerId.toHex() + payloadType,\n );\n\n // peerId => listeners set\n private readonly _defaultListeners = new ComplexMap<PublicKey, Set<OnMessage>>(PublicKey.hash);\n\n private readonly _onAckCallbacks = new ComplexMap<PublicKey, () => void>(PublicKey.hash);\n\n private readonly _receivedMessages = new ComplexSet<PublicKey>(PublicKey.hash);\n\n /**\n * Keys scheduled to be cleared from _receivedMessages on the next iteration.\n */\n private readonly _toClear = new ComplexSet<PublicKey>(PublicKey.hash);\n\n private _ctx!: Context;\n private _closed = true;\n private readonly _retryDelay: number;\n\n constructor({ signalManager, retryDelay = 300 }: MessengerOptions) {\n this._signalManager = signalManager;\n this._retryDelay = retryDelay;\n\n this.open();\n }\n\n open() {\n if (!this._closed) {\n return;\n }\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.mesh.messenger.open', trace.begin({ id: traceId }));\n this._ctx = new Context({\n onError: (err) => log.catch(err),\n });\n this._ctx.onDispose(\n this._signalManager.onMessage.on(async (message) => {\n log('received message', { from: message.author });\n await this._handleMessage(message);\n }),\n );\n\n // Clear the map periodically.\n scheduleTaskInterval(\n this._ctx,\n async () => {\n this._performGc();\n },\n RECEIVED_MESSAGES_GC_INTERVAL,\n );\n\n this._closed = false;\n log.trace('dxos.mesh.messenger.open', trace.end({ id: traceId }));\n }\n\n async close() {\n if (this._closed) {\n return;\n }\n this._closed = true;\n await this._ctx.dispose();\n }\n\n async sendMessage({ author, recipient, payload }: Message): Promise<void> {\n invariant(!this._closed, 'Closed');\n const messageContext = this._ctx.derive();\n\n const reliablePayload: ReliablePayload = {\n messageId: PublicKey.random(),\n payload,\n };\n invariant(!this._onAckCallbacks.has(reliablePayload.messageId!));\n log('send message', { messageId: reliablePayload.messageId, author, recipient });\n\n let messageReceived: () => void;\n let timeoutHit: (err: Error) => void;\n\n const promise = new Promise<void>((resolve, reject) => {\n messageReceived = resolve;\n timeoutHit = reject;\n });\n\n // Setting retry interval if signal was not acknowledged.\n scheduleExponentialBackoffTaskInterval(\n messageContext,\n async () => {\n log('retrying message', { messageId: reliablePayload.messageId });\n await this._encodeAndSend({ author, recipient, reliablePayload }).catch((err) =>\n log('failed to send message', { err }),\n );\n },\n this._retryDelay,\n );\n\n scheduleTask(\n messageContext,\n () => {\n log('message not delivered', { messageId: reliablePayload.messageId });\n this._onAckCallbacks.delete(reliablePayload.messageId!);\n timeoutHit(\n new ProtocolTimeoutError(\n 'signaling message not delivered',\n new TimeoutError(MESSAGE_TIMEOUT, 'Message not delivered'),\n ),\n );\n void messageContext.dispose();\n },\n MESSAGE_TIMEOUT,\n );\n\n this._onAckCallbacks.set(reliablePayload.messageId, () => {\n messageReceived();\n this._onAckCallbacks.delete(reliablePayload.messageId!);\n void messageContext.dispose();\n });\n\n await this._encodeAndSend({ author, recipient, reliablePayload });\n return promise;\n }\n\n /**\n * Subscribes onMessage function to messages that contains payload with payloadType.\n * @param payloadType if not specified, onMessage will be subscribed to all types of messages.\n */\n async listen({\n peerId,\n payloadType,\n onMessage,\n }: {\n peerId: PublicKey;\n payloadType?: string;\n onMessage: OnMessage;\n }): Promise<ListeningHandle> {\n invariant(!this._closed, 'Closed');\n\n await this._signalManager.subscribeMessages(peerId);\n let listeners: Set<OnMessage> | undefined;\n\n if (!payloadType) {\n listeners = this._defaultListeners.get(peerId);\n if (!listeners) {\n listeners = new Set();\n this._defaultListeners.set(peerId, listeners);\n }\n } else {\n listeners = this._listeners.get({ peerId, payloadType });\n if (!listeners) {\n listeners = new Set();\n this._listeners.set({ peerId, payloadType }, listeners);\n }\n }\n\n listeners.add(onMessage);\n\n return {\n unsubscribe: async () => {\n listeners!.delete(onMessage);\n },\n };\n }\n\n private async _encodeAndSend({\n author,\n recipient,\n reliablePayload,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n reliablePayload: ReliablePayload;\n }): Promise<void> {\n await this._signalManager.sendMessage({\n author,\n recipient,\n payload: {\n type_url: 'dxos.mesh.messaging.ReliablePayload',\n value: ReliablePayload.encode(reliablePayload, { preserveAny: true }),\n },\n });\n }\n\n private async _handleMessage(message: Message): Promise<void> {\n switch (message.payload.type_url) {\n case 'dxos.mesh.messaging.ReliablePayload': {\n await this._handleReliablePayload(message);\n break;\n }\n case 'dxos.mesh.messaging.Acknowledgement': {\n await this._handleAcknowledgement({ payload: message.payload });\n break;\n }\n }\n }\n\n private async _handleReliablePayload({ author, recipient, payload }: Message) {\n invariant(payload.type_url === 'dxos.mesh.messaging.ReliablePayload');\n const reliablePayload: ReliablePayload = ReliablePayload.decode(payload.value, { preserveAny: true });\n\n log('handling message', { messageId: reliablePayload.messageId });\n\n await this._sendAcknowledgement({\n author,\n recipient,\n messageId: reliablePayload.messageId,\n });\n\n if (this._receivedMessages.has(reliablePayload.messageId!)) {\n return;\n }\n\n this._receivedMessages.add(reliablePayload.messageId!);\n\n await this._callListeners({\n author,\n recipient,\n payload: reliablePayload.payload,\n });\n }\n\n private async _handleAcknowledgement({ payload }: { payload: Any }) {\n invariant(payload.type_url === 'dxos.mesh.messaging.Acknowledgement');\n this._onAckCallbacks.get(Acknowledgement.decode(payload.value).messageId)?.();\n }\n\n private async _sendAcknowledgement({\n author,\n recipient,\n messageId,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n messageId: PublicKey;\n }): Promise<void> {\n log('sending ACK', { messageId, from: recipient, to: author });\n\n await this._signalManager.sendMessage({\n author: recipient,\n recipient: author,\n payload: {\n type_url: 'dxos.mesh.messaging.Acknowledgement',\n value: Acknowledgement.encode({ messageId }),\n },\n });\n }\n\n private async _callListeners(message: Message): Promise<void> {\n {\n const defaultListenerMap = this._defaultListeners.get(message.recipient);\n if (defaultListenerMap) {\n for (const listener of defaultListenerMap) {\n await listener(message);\n }\n }\n }\n\n {\n const listenerMap = this._listeners.get({\n peerId: message.recipient,\n payloadType: message.payload.type_url,\n });\n if (listenerMap) {\n for (const listener of listenerMap) {\n await listener(message);\n }\n }\n }\n }\n\n private _performGc() {\n const start = performance.now();\n\n for (const key of this._toClear.keys()) {\n this._receivedMessages.delete(key);\n }\n this._toClear.clear();\n for (const key of this._receivedMessages.keys()) {\n this._toClear.add(key);\n }\n\n const elapsed = performance.now() - start;\n if (elapsed > 100) {\n log.warn('GC took too long', { elapsed });\n }\n }\n}\n\nexport interface ListeningHandle {\n unsubscribe: () => Promise<void>;\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\n/**\n * Timeout for retrying messages.\n */\nexport const MESSAGE_TIMEOUT = 10_000;\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { DeferredTask, Event, Trigger, asyncTimeout, scheduleTask, scheduleTaskInterval, sleep } from '@dxos/async';\nimport { type Any, type Stream } from '@dxos/codec-protobuf';\nimport { Context, cancelWithContext } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/protocols';\nimport { type Message as SignalMessage, SignalState, type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { SignalRPCClient } from './signal-rpc-client';\nimport { type Message, type SignalMethods } from '../signal-methods';\n\nconst DEFAULT_RECONNECT_TIMEOUT = 100;\nconst MAX_RECONNECT_TIMEOUT = 5000;\nconst ERROR_RECONCILE_DELAY = 1000;\nconst RECONCILE_INTERVAL = 5_000;\n\nexport type SignalStatus = {\n host: string;\n state: SignalState;\n error?: string;\n reconnectIn: number;\n connectionStarted: Date;\n lastStateChange: Date;\n};\n\nexport type CommandTrace = {\n messageId: string;\n host: string;\n incoming: boolean;\n time: number;\n method: string;\n payload: any;\n response?: any;\n error?: string;\n};\n\n/**\n * Establishes a websocket connection to signal server and provides RPC methods.\n */\nexport class SignalClient implements SignalMethods {\n private _state = SignalState.CLOSED;\n\n private _lastError?: Error;\n\n /**\n * Number of milliseconds after which the connection will be attempted again in case of error.\n */\n private _reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;\n\n /**\n * Timestamp of when the connection attempt was began.\n */\n private _connectionStarted = new Date();\n\n /**\n * Timestamp of last state change.\n */\n private _lastStateChange = new Date();\n\n private _client?: SignalRPCClient;\n private readonly _clientReady = new Trigger();\n\n private _ctx?: Context;\n\n private _connectionCtx?: Context;\n\n private _reconcileTask?: DeferredTask;\n private _reconnectTask?: DeferredTask;\n\n readonly statusChanged = new Event<SignalStatus>();\n readonly commandTrace = new Event<CommandTrace>();\n\n /**\n * Swarm events streams. Keys represent actually joined topic and peerId.\n */\n private readonly _swarmStreams = new ComplexMap<{ topic: PublicKey; peerId: PublicKey }, Stream<SwarmEvent>>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n /**\n * Represent desired joined topic and peerId.\n */\n private readonly _joinedTopics = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n /**\n * Message streams. Keys represents actually subscribed peers.\n * @internal\n */\n public readonly _messageStreams = new ComplexMap<PublicKey, Stream<SignalMessage>>((key) => key.toHex());\n\n /**\n * Represent desired message subscriptions.\n */\n private readonly _subscribedMessages = new ComplexSet<{ peerId: PublicKey }>(({ peerId }) => peerId.toHex());\n\n /**\n * Event to use in tests to wait till subscription is successfully established.\n * @internal\n */\n public _reconciled = new Event();\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n private readonly _performance = {\n sentMessages: 0,\n receivedMessages: 0,\n reconnectCounter: 0,\n joinCounter: 0,\n leaveCounter: 0,\n };\n\n /**\n * @param _host Signal server websocket URL.\n * @param _onMessage\n */\n constructor(\n private readonly _host: string,\n private readonly _onMessage: (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>,\n private readonly _onSwarmEvent: (params: { topic: PublicKey; swarmEvent: SwarmEvent }) => Promise<void>,\n ) {\n if (!this._host.startsWith('wss://') && !this._host.startsWith('ws://')) {\n throw new Error(`Signal server requires a websocket URL. Provided: ${this._host}`);\n }\n }\n\n open() {\n log.trace('dxos.mesh.signal-client.open', trace.begin({ id: this._instanceId }));\n\n if ([SignalState.CONNECTED, SignalState.CONNECTING].includes(this._state)) {\n return;\n }\n\n this._ctx = new Context({\n onError: (err) => {\n if (this._state === SignalState.CLOSED || this._ctx?.disposed) {\n return;\n }\n if (this._state === SignalState.CONNECTED) {\n log.warn('SignalClient error:', err);\n }\n this._scheduleReconcileAfterError();\n },\n });\n\n this._reconcileTask = new DeferredTask(this._ctx, async () => {\n await this._reconcileSwarmSubscriptions();\n await this._reconcileMessageSubscriptions();\n this._reconciled.emit();\n });\n\n // Reconcile subscriptions periodically.\n scheduleTaskInterval(\n this._ctx,\n async () => {\n if (this._state === SignalState.CONNECTED) {\n this._reconcileTask!.schedule();\n }\n },\n RECONCILE_INTERVAL,\n );\n\n this._reconnectTask = new DeferredTask(this._ctx, async () => {\n await this._reconnect();\n });\n\n this._setState(SignalState.CONNECTING);\n this._createClient();\n log.trace('dxos.mesh.signal-client.open', trace.end({ id: this._instanceId }));\n }\n\n async close() {\n log('closing...');\n if ([SignalState.CLOSED].includes(this._state)) {\n return;\n }\n\n await this._ctx?.dispose();\n\n this._clientReady.reset();\n await this._client?.close();\n this._client = undefined;\n this._setState(SignalState.CLOSED);\n log('closed');\n }\n\n getStatus(): SignalStatus {\n return {\n host: this._host,\n state: this._state,\n error: this._lastError?.message,\n reconnectIn: this._reconnectAfter,\n connectionStarted: this._connectionStarted,\n lastStateChange: this._lastStateChange,\n };\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n log('joining', { topic, peerId });\n this._performance.joinCounter++;\n this._joinedTopics.add({ topic, peerId });\n this._reconcileTask!.schedule();\n }\n\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n this._performance.leaveCounter++;\n log('leaving', { topic, peerId });\n\n void this._swarmStreams.get({ topic, peerId })?.close();\n this._swarmStreams.delete({ topic, peerId });\n this._joinedTopics.delete({ topic, peerId });\n }\n\n async sendMessage(msg: Message): Promise<void> {\n this._performance.sentMessages++;\n await this._clientReady.wait();\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n await this._client!.sendMessage(msg);\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log('subscribing to messages', { peerId });\n this._subscribedMessages.add({ peerId });\n this._reconcileTask!.schedule();\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log('unsubscribing from messages', { peerId });\n this._subscribedMessages.delete({ peerId });\n void this._messageStreams.get(peerId)?.close();\n this._messageStreams.delete(peerId);\n }\n\n private _scheduleReconcileAfterError() {\n scheduleTask(\n this._ctx!,\n () => {\n this._reconcileTask!.schedule();\n },\n ERROR_RECONCILE_DELAY,\n );\n }\n\n private _setState(newState: SignalState) {\n this._state = newState;\n this._lastStateChange = new Date();\n log('signal state changed', { status: this.getStatus() });\n this.statusChanged.emit(this.getStatus());\n }\n\n private _createClient() {\n log('creating client', { host: this._host, state: this._state });\n invariant(!this._client, 'Client already created');\n\n this._connectionStarted = new Date();\n\n // Create new context for each connection.\n this._connectionCtx = this._ctx!.derive();\n this._connectionCtx.onDispose(async () => {\n log('connection context disposed');\n await Promise.all(Array.from(this._swarmStreams.values()).map((stream) => stream.close()));\n await Promise.all(Array.from(this._messageStreams.values()).map((stream) => stream.close()));\n this._swarmStreams.clear();\n this._messageStreams.clear();\n });\n\n try {\n this._client = new SignalRPCClient({\n url: this._host,\n callbacks: {\n onConnected: () => {\n log('socket connected');\n this._lastError = undefined;\n this._reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;\n this._setState(SignalState.CONNECTED);\n this._clientReady.wake();\n this._reconcileTask!.schedule();\n },\n\n onDisconnected: () => {\n log('socket disconnected', { state: this._state });\n if (this._state === SignalState.ERROR) {\n // Ignore disconnects after error.\n // Handled by error handler before disconnect handler.\n this._setState(SignalState.DISCONNECTED);\n return;\n }\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._setState(SignalState.DISCONNECTED);\n this._reconnectTask!.schedule();\n },\n\n onError: (error) => {\n log('socket error', { error, state: this._state });\n this._lastError = error;\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._setState(SignalState.ERROR);\n\n this._reconnectTask!.schedule();\n },\n },\n });\n } catch (err: any) {\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._lastError = err;\n this._setState(SignalState.DISCONNECTED);\n this._reconnectTask!.schedule();\n }\n }\n\n private _incrementReconnectTimeout() {\n this._reconnectAfter *= 2;\n this._reconnectAfter = Math.min(this._reconnectAfter, MAX_RECONNECT_TIMEOUT);\n }\n\n private async _reconnect() {\n log(`reconnecting in ${this._reconnectAfter}ms`, { state: this._state });\n this._performance.reconnectCounter++;\n\n if (this._state === SignalState.RECONNECTING) {\n log.warn('Signal api already reconnecting.');\n return;\n }\n\n if (this._state === SignalState.CLOSED) {\n return;\n }\n\n // Close client if it wasn't already closed.\n this._clientReady.reset();\n await this._connectionCtx?.dispose();\n this._client?.close().catch(() => {});\n this._client = undefined;\n\n await cancelWithContext(this._ctx!, sleep(this._reconnectAfter));\n\n this._setState(SignalState.RECONNECTING);\n\n this._createClient();\n }\n\n private async _reconcileSwarmSubscriptions(): Promise<void> {\n await asyncTimeout(cancelWithContext(this._connectionCtx!, this._clientReady.wait()), 5_000);\n // Copy Client reference to avoid client change during the reconcile.\n const client = this._client!;\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n\n // Unsubscribe from topics that are no longer needed.\n for (const { topic, peerId } of this._swarmStreams.keys()) {\n // Join desired topics.\n if (this._joinedTopics.has({ topic, peerId })) {\n continue;\n }\n\n void this._swarmStreams.get({ topic, peerId })?.close();\n this._swarmStreams.delete({ topic, peerId });\n }\n\n // Subscribe to topics that are needed.\n for (const { topic, peerId } of this._joinedTopics.values()) {\n // Join desired topics.\n if (this._swarmStreams.has({ topic, peerId })) {\n continue;\n }\n\n const swarmStream = await asyncTimeout(\n cancelWithContext(this._connectionCtx!, client.join({ topic, peerId })),\n 5000,\n );\n // Subscribing to swarm events.\n // TODO(mykola): What happens when the swarm stream is closed? Maybe send leave event for each peer?\n swarmStream.subscribe(async (swarmEvent: SwarmEvent) => {\n log('swarm event', { swarmEvent });\n await this._onSwarmEvent({ topic, swarmEvent });\n });\n\n // Saving swarm stream.\n this._swarmStreams.set({ topic, peerId }, swarmStream);\n }\n }\n\n private async _reconcileMessageSubscriptions(): Promise<void> {\n await asyncTimeout(cancelWithContext(this._connectionCtx!, this._clientReady.wait()), 5_000);\n // Copy Client reference to avoid client change during the reconcile.\n const client = this._client!;\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n\n // Unsubscribe from messages that are no longer needed.\n for (const peerId of this._messageStreams.keys()) {\n // Join desired topics.\n if (this._subscribedMessages.has({ peerId })) {\n continue;\n }\n\n void this._messageStreams.get(peerId)?.close();\n this._messageStreams.delete(peerId);\n }\n\n // Subscribe to messages that are needed.\n for (const { peerId } of this._subscribedMessages.values()) {\n if (this._messageStreams.has(peerId)) {\n continue;\n }\n\n const messageStream = await asyncTimeout(\n cancelWithContext(this._connectionCtx!, client.receiveMessages(peerId)),\n 5000,\n );\n messageStream.subscribe(async (message: SignalMessage) => {\n this._performance.receivedMessages++;\n await this._onMessage({\n author: PublicKey.from(message.author),\n recipient: PublicKey.from(message.recipient),\n payload: message.payload,\n });\n });\n\n // Saving message stream.\n this._messageStreams.set(peerId, messageStream);\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Trigger } from '@dxos/async';\nimport { type Any, type Stream } from '@dxos/codec-protobuf';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema, trace } from '@dxos/protocols';\nimport { type Message as SignalMessage, type Signal } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { createProtoRpcPeer, type ProtoRpcPeer } from '@dxos/rpc';\n\ninterface Services {\n Signal: Signal;\n}\n\nexport type SignalCallbacks = {\n onConnected?: () => void;\n\n /**\n * Called on disconnect.\n * In case of error, `onError` will be called first and then `onDisconnected`.\n */\n onDisconnected?: () => void;\n\n onError?: (error: Error) => void;\n};\n\nexport type SignalRPCClientParams = {\n url: string;\n callbacks?: SignalCallbacks;\n};\n\nexport class SignalRPCClient {\n private _socket?: WebSocket;\n private _rpc?: ProtoRpcPeer<Services>;\n private readonly _connectTrigger = new Trigger();\n\n private _closed = false;\n\n private readonly _url: string;\n private readonly _callbacks: SignalCallbacks;\n\n constructor({ url, callbacks = {} }: SignalRPCClientParams) {\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.mesh.signal-rpc-client.constructor', trace.begin({ id: traceId }));\n this._url = url;\n this._callbacks = callbacks;\n this._socket = new WebSocket(this._url);\n\n this._rpc = createProtoRpcPeer({\n requested: {\n Signal: schema.getService('dxos.mesh.signal.Signal'),\n },\n noHandshake: true,\n port: {\n send: (msg) => {\n if (this._closed) {\n // Do not send messages after close.\n return;\n }\n try {\n this._socket!.send(msg);\n } catch (err) {\n log.warn('send error', err);\n }\n },\n subscribe: (cb) => {\n this._socket!.onmessage = async (msg: WebSocket.MessageEvent) => {\n if (typeof Blob !== 'undefined' && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data as any);\n }\n };\n },\n },\n encodingOptions: {\n preserveAny: true,\n },\n });\n\n this._socket.onopen = async () => {\n try {\n await this._rpc!.open();\n log(`RPC open ${this._url}`);\n this._callbacks.onConnected?.();\n this._connectTrigger.wake();\n } catch (err: any) {\n this._callbacks.onError?.(err);\n }\n };\n\n this._socket.onclose = async () => {\n log(`Disconnected ${this._url}`);\n this._callbacks.onDisconnected?.();\n await this.close();\n };\n\n this._socket.onerror = async (event: WebSocket.ErrorEvent) => {\n if (this._closed) {\n // Ignore errors after close.\n return;\n }\n\n this._callbacks.onError?.(event.error ?? new Error(event.message));\n this._connectTrigger.reset();\n\n try {\n await this._rpc?.close();\n } catch (err) {\n log.catch(err);\n }\n this._closed = true;\n\n log.warn(event.message ?? 'Socket error', { url: this._url });\n };\n\n log.trace('dxos.mesh.signal-rpc-client.constructor', trace.end({ id: traceId }));\n }\n\n async close() {\n this._closed = true;\n try {\n await this._rpc?.close();\n this._socket?.close();\n } catch (err) {\n log.warn('close error', err);\n }\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('join', { topic, peerId });\n await this._connectTrigger.wait();\n invariant(!this._closed, 'SignalRPCClient is closed');\n invariant(this._rpc, 'Rpc is not initialized');\n const swarmStream = this._rpc.rpc.Signal.join({\n swarm: topic.asUint8Array(),\n peer: peerId.asUint8Array(),\n });\n await swarmStream.waitUntilReady();\n return swarmStream;\n }\n\n async receiveMessages(peerId: PublicKey): Promise<Stream<SignalMessage>> {\n log('receiveMessages', { peerId });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n invariant(this._rpc, 'Rpc is not initialized');\n const messageStream = this._rpc.rpc.Signal.receiveMessages({\n peer: peerId.asUint8Array(),\n });\n await messageStream.waitUntilReady();\n return messageStream;\n }\n\n async sendMessage({ author, recipient, payload }: { author: PublicKey; recipient: PublicKey; payload: Any }) {\n log('sendMessage', { author, recipient, payload });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n invariant(this._rpc, 'Rpc is not initialized');\n await this._rpc.rpc.Signal.sendMessage({\n author: author.asUint8Array(),\n recipient: recipient.asUint8Array(),\n payload,\n });\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event, Trigger } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { type SignalManager } from './signal-manager';\nimport { type CommandTrace, type SignalStatus } from '../signal-client';\n\n/**\n * Common signaling context that connects multiple MemorySignalManager instances.\n */\nexport class MemorySignalManagerContext {\n // Swarm messages.\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n // Mapping from topic to set of peers.\n readonly swarms = new ComplexMap<PublicKey, ComplexSet<PublicKey>>(PublicKey.hash);\n\n // Map of connections for each peer for signaling.\n readonly connections = new ComplexMap<PublicKey, MemorySignalManager>(PublicKey.hash);\n}\n\n/**\n * In memory signal manager for testing.\n */\nexport class MemorySignalManager implements SignalManager {\n readonly statusChanged = new Event<SignalStatus[]>();\n readonly commandTrace = new Event<CommandTrace>();\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n readonly onMessage = new Event<{\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }>();\n\n /** Will be used to emit SwarmEvents on .open() and .close() */\n private _joinedSwarms = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n private _ctx!: Context;\n\n // TODO(dmaretskyi): Replace with callback.\n private readonly _freezeTrigger = new Trigger().wake();\n\n constructor(private readonly _context: MemorySignalManagerContext) {\n this._ctx = new Context();\n\n this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));\n }\n\n async open() {\n if (!this._ctx.disposed) {\n return;\n }\n this._ctx = new Context();\n this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));\n\n await Promise.all([...this._joinedSwarms.values()].map((value) => this.join(value)));\n }\n\n async close() {\n if (this._ctx.disposed) {\n return;\n }\n // save copy of joined swarms.\n const joinedSwarmsCopy = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n [...this._joinedSwarms.values()],\n );\n\n await Promise.all([...this._joinedSwarms.values()].map((value) => this.leave(value)));\n\n // assign joined swarms back because .leave() deletes it.\n this._joinedSwarms = joinedSwarmsCopy;\n\n await this._ctx.dispose();\n }\n\n getStatus(): SignalStatus[] {\n return [];\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n invariant(!this._ctx.disposed, 'Closed');\n\n this._joinedSwarms.add({ topic, peerId });\n\n if (!this._context.swarms.has(topic)) {\n this._context.swarms.set(topic, new ComplexSet(PublicKey.hash));\n }\n\n this._context.swarms.get(topic)!.add(peerId);\n this._context.swarmEvent.emit({\n topic,\n swarmEvent: {\n peerAvailable: {\n peer: peerId.asUint8Array(),\n since: new Date(),\n },\n },\n });\n\n // Emitting swarm events for each peer.\n for (const [topic, peerIds] of this._context.swarms) {\n Array.from(peerIds).forEach((peerId) => {\n this.swarmEvent.emit({\n topic,\n swarmEvent: {\n peerAvailable: {\n peer: peerId.asUint8Array(),\n since: new Date(),\n },\n },\n });\n });\n }\n }\n\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n invariant(!this._ctx.disposed, 'Closed');\n\n this._joinedSwarms.delete({ topic, peerId });\n\n if (!this._context.swarms.has(topic)) {\n this._context.swarms.set(topic, new ComplexSet(PublicKey.hash));\n }\n\n this._context.swarms.get(topic)!.delete(peerId);\n\n const swarmEvent: SwarmEvent = {\n peerLeft: {\n peer: peerId.asUint8Array(),\n },\n };\n\n this._context.swarmEvent.emit({ topic, swarmEvent });\n }\n\n async sendMessage({ author, recipient, payload }: { author: PublicKey; recipient: PublicKey; payload: Any }) {\n log('send message', { author, recipient, ...dec(payload) });\n\n invariant(recipient);\n invariant(!this._ctx.disposed, 'Closed');\n\n await this._freezeTrigger.wait();\n\n const remote = this._context.connections.get(recipient);\n if (!remote) {\n log.warn('recipient is not subscribed for messages', { author, recipient });\n return;\n }\n\n if (remote._ctx.disposed) {\n log.warn('recipient is disposed', { author, recipient });\n return;\n }\n\n remote._freezeTrigger\n .wait()\n .then(() => {\n if (remote._ctx.disposed) {\n log.warn('recipient is disposed', { author, recipient });\n return;\n }\n\n log('receive message', { author, recipient, ...dec(payload) });\n\n remote.onMessage.emit({ author, recipient, payload });\n })\n .catch((err) => {\n log.error('error while waiting for freeze', { err });\n });\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log('subscribing', { peerId });\n this._context.connections.set(peerId, this);\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log('unsubscribing', { peerId });\n this._context.connections.delete(peerId);\n }\n\n freeze() {\n this._freezeTrigger.reset();\n }\n\n unfreeze() {\n this._freezeTrigger.wake();\n }\n}\nconst dec = (payload: Any) => {\n if (!payload.type_url.endsWith('ReliablePayload')) {\n return {};\n }\n\n const relPayload = schema.getCodecForType('dxos.mesh.messaging.ReliablePayload').decode(payload.value);\n\n if (typeof relPayload?.payload?.data === 'object') {\n return { payload: Object.keys(relPayload?.payload?.data)[0], sessionId: relPayload?.payload?.sessionId };\n }\n\n return {};\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event, sleep, synchronized } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { RateLimitExceededError, trace } from '@dxos/protocols';\nimport { type Runtime } from '@dxos/protocols/proto/dxos/config';\nimport { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\n\nimport { type SignalManager } from './signal-manager';\nimport { type CommandTrace, SignalClient, type SignalStatus } from '../signal-client';\n\nconst MAX_SERVER_FAILURES = 5;\nconst WSS_SIGNAL_SERVER_REBOOT_DELAY = 3_000;\n/**\n * Manages connection to multiple Signal Servers over WebSocket\n */\nexport class WebsocketSignalManager implements SignalManager {\n private readonly _servers = new Map<string, SignalClient>();\n\n private _ctx!: Context;\n private _opened = false;\n\n readonly failureCount = new Map<string, number>();\n readonly statusChanged = new Event<SignalStatus[]>();\n readonly commandTrace = new Event<CommandTrace>();\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n readonly onMessage = new Event<{\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }>();\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n constructor(private readonly _hosts: Runtime.Services.Signal[]) {\n log('Created WebsocketSignalManager', { hosts: this._hosts });\n for (const host of this._hosts) {\n if (this._servers.has(host.server)) {\n continue;\n }\n const server = new SignalClient(\n host.server,\n async (message) => this.onMessage.emit(message),\n async (data) => this.swarmEvent.emit(data),\n );\n server.statusChanged.on(() => this.statusChanged.emit(this.getStatus()));\n\n this._servers.set(host.server, server);\n this.failureCount.set(host.server, 0);\n server.commandTrace.on((trace) => this.commandTrace.emit(trace));\n }\n }\n\n @synchronized\n async open() {\n if (this._opened) {\n return;\n }\n log('open signal manager', { hosts: this._hosts });\n log.trace('dxos.mesh.websocket-signal-manager.open', trace.begin({ id: this._instanceId }));\n\n this._initContext();\n\n [...this._servers.values()].forEach((server) => server.open());\n\n this._opened = true;\n log.trace('dxos.mesh.websocket-signal-manager.open', trace.end({ id: this._instanceId }));\n }\n\n @synchronized\n async close() {\n if (!this._opened) {\n return;\n }\n this._opened = false;\n\n await this._ctx.dispose();\n\n await Promise.all(Array.from(this._servers.values()).map((server) => server.close()));\n }\n\n async restartServer(serverName: string) {\n log('Restarting server', { serverName });\n invariant(this._opened, 'server already closed');\n\n const server = this._servers.get(serverName);\n invariant(server, 'server not found');\n\n await server.close();\n await sleep(WSS_SIGNAL_SERVER_REBOOT_DELAY);\n await server.open();\n }\n\n getStatus(): SignalStatus[] {\n return Array.from(this._servers.values()).map((server) => server.getStatus());\n }\n\n @synchronized\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('Join', { topic, peerId });\n invariant(this._opened, 'Closed');\n await this._forEachServer((server) => server.join({ topic, peerId }));\n }\n\n @synchronized\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('leaving', { topic, peerId });\n invariant(this._opened, 'Closed');\n\n await this._forEachServer((server) => server.leave({ topic, peerId }));\n }\n\n async sendMessage({\n author,\n recipient,\n payload,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }): Promise<void> {\n log(`Signal ${recipient.truncate()}`);\n invariant(this._opened, 'Closed');\n\n void this._forEachServer(async (server, serverName) => {\n void server.sendMessage({ author, recipient, payload }).catch((err) => {\n if (err instanceof RateLimitExceededError) {\n log('WSS rate limit exceeded', { err });\n } else {\n log(`error sending to ${serverName}`, { err });\n void this.checkServerFailure(serverName);\n }\n });\n });\n }\n\n @synchronized\n async checkServerFailure(serverName: string) {\n const failureCount = this.failureCount.get(serverName!) ?? 0;\n if (failureCount > MAX_SERVER_FAILURES) {\n log.warn(`Too many failures sending to ${serverName} (${failureCount} > ${MAX_SERVER_FAILURES}), restarting`);\n await this.restartServer(serverName!);\n this.failureCount.set(serverName!, 0);\n return;\n }\n this.failureCount.set(serverName!, (this.failureCount.get(serverName!) ?? 0) + 1);\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log(`Subscribed for message stream peerId=${peerId}`);\n invariant(this._opened, 'Closed');\n\n await this._forEachServer(async (server) => server.subscribeMessages(peerId));\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log(`Subscribed for message stream peerId=${peerId}`);\n invariant(this._opened, 'Closed');\n\n await this._forEachServer(async (server) => server.unsubscribeMessages(peerId));\n }\n\n private _initContext() {\n this._ctx = new Context({\n onError: (err) => log.catch(err),\n });\n }\n\n private async _forEachServer<ReturnType>(\n fn: (server: SignalClient, serverName: string) => Promise<ReturnType>,\n ): Promise<ReturnType[]> {\n return Promise.all(Array.from(this._servers.entries()).map(([serverName, server]) => fn(server, serverName)));\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["import_async", "import_context", "import_invariant", "import_keys", "import_log", "import_protocols", "import_util", "MESSAGE_TIMEOUT", "ReliablePayload", "schema", "getCodecForType", "Acknowledgement", "RECEIVED_MESSAGES_GC_INTERVAL", "Messenger", "constructor", "signalManager", "retryDelay", "ComplexMap", "peerId", "payloadType", "toHex", "PublicKey", "hash", "_onAckCallbacks", "_receivedMessages", "ComplexSet", "_closed", "_signalManager", "_retryDelay", "open", "traceId", "random", "log", "trace", "begin", "id", "_ctx", "Context", "onError", "err", "catch", "onDispose", "onMessage", "on", "message", "from", "author", "_handleMessage", "scheduleTaskInterval", "_performGc", "end", "close", "dispose", "sendMessage", "recipient", "payload", "invariant", "messageContext", "derive", "reliablePayload", "messageId", "has", "messageReceived", "timeoutHit", "promise", "Promise", "resolve", "reject", "scheduleExponentialBackoffTaskInterval", "_encodeAndSend", "scheduleTask", "delete", "ProtocolTimeoutError", "TimeoutError", "set", "listen", "subscribeMessages", "listeners", "_defaultListeners", "get", "Set", "_listeners", "add", "unsubscribe", "type_url", "value", "encode", "preserveAny", "_handleReliablePayload", "_handleAcknowledgement", "decode", "_sendAcknowledgement", "_callListeners", "to", "defaultListenerMap", "listener", "listenerMap", "start", "performance", "now", "key", "_toClear", "keys", "clear", "elapsed", "warn", "SignalRPCClient", "url", "callbacks", "_connectTrigger", "Trigger", "_url", "_callbacks", "_socket", "WebSocket", "_rpc", "createProtoRpcPeer", "requested", "Signal", "getService", "noHandshake", "port", "send", "msg", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "arrayBuffer", "encodingOptions", "onopen", "onConnected", "wake", "onclose", "onDisconnected", "onerror", "event", "error", "Error", "reset", "join", "topic", "wait", "swarmStream", "rpc", "swarm", "asUint8Array", "peer", "waitUntilReady", "receiveMessages", "messageStream", "DEFAULT_RECONNECT_TIMEOUT", "MAX_RECONNECT_TIMEOUT", "ERROR_RECONCILE_DELAY", "RECONCILE_INTERVAL", "SignalClient", "_host", "_onMessage", "_onSwarmEvent", "_state", "SignalState", "CLOSED", "_reconnectAfter", "_connectionStarted", "Date", "_lastStateChange", "_clientReady", "statusChanged", "Event", "commandTrace", "_swarmStreams", "_joinedTopics", "_messageStreams", "_subscribedMessages", "_reconciled", "_instanceId", "_performance", "sentMessages", "receivedMessages", "reconnectCounter", "joinCounter", "leaveCounter", "startsWith", "CONNECTED", "CONNECTING", "includes", "disposed", "_scheduleReconcileAfterError", "_reconcileTask", "DeferredTask", "_reconcileSwarmSubscriptions", "_reconcileMessageSubscriptions", "emit", "schedule", "_reconnectTask", "_reconnect", "_setState", "_createClient", "_client", "undefined", "getStatus", "host", "state", "_lastError", "reconnectIn", "connectionStarted", "lastStateChange", "leave", "unsubscribeMessages", "newState", "status", "_connectionCtx", "all", "Array", "values", "map", "stream", "ERROR", "DISCONNECTED", "_incrementReconnectTimeout", "Math", "min", "RECONNECTING", "cancelWithContext", "sleep", "asyncTimeout", "client", "swarmEvent", "MemorySignalManagerContext", "MemorySignalManager", "_context", "_joinedSwarms", "_freezeTrigger", "joinedSwarmsCopy", "swarms", "peerAvailable", "since", "peerIds", "forEach", "peerLeft", "dec", "remote", "connections", "then", "freeze", "unfreeze", "endsWith", "relPayload", "Object", "sessionId", "MAX_SERVER_FAILURES", "WSS_SIGNAL_SERVER_REBOOT_DELAY", "WebsocketSignalManager", "_hosts", "_servers", "Map", "_opened", "failureCount", "hosts", "server", "_initContext", "restartServer", "serverName", "_forEachServer", "truncate", "RateLimitExceededError", "checkServerFailure", "fn", "entries", "synchronized"]
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { TimeoutError, scheduleExponentialBackoffTaskInterval, scheduleTask, scheduleTaskInterval } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { TimeoutError as ProtocolTimeoutError, schema, trace } from '@dxos/protocols';\nimport { ReliablePayload } from '@dxos/protocols/proto/dxos/mesh/messaging';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { type SignalManager } from './signal-manager';\nimport { type Message } from './signal-methods';\nimport { MESSAGE_TIMEOUT } from './timeouts';\n\nexport type OnMessage = (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>;\n\nexport interface MessengerOptions {\n signalManager: SignalManager;\n retryDelay?: number;\n}\n\nconst ReliablePayload = schema.getCodecForType('dxos.mesh.messaging.ReliablePayload');\nconst Acknowledgement = schema.getCodecForType('dxos.mesh.messaging.Acknowledgement');\n\nconst RECEIVED_MESSAGES_GC_INTERVAL = 120_000;\n\n/**\n * Reliable messenger that works trough signal network.\n */\nexport class Messenger {\n private readonly _signalManager: SignalManager;\n // { peerId, payloadType } => listeners set\n private readonly _listeners = new ComplexMap<{ peerId: PublicKey; payloadType: string }, Set<OnMessage>>(\n ({ peerId, payloadType }) => peerId.toHex() + payloadType,\n );\n\n // peerId => listeners set\n private readonly _defaultListeners = new ComplexMap<PublicKey, Set<OnMessage>>(PublicKey.hash);\n\n private readonly _onAckCallbacks = new ComplexMap<PublicKey, () => void>(PublicKey.hash);\n\n private readonly _receivedMessages = new ComplexSet<PublicKey>(PublicKey.hash);\n\n /**\n * Keys scheduled to be cleared from _receivedMessages on the next iteration.\n */\n private readonly _toClear = new ComplexSet<PublicKey>(PublicKey.hash);\n\n private _ctx!: Context;\n private _closed = true;\n private readonly _retryDelay: number;\n\n constructor({ signalManager, retryDelay = 300 }: MessengerOptions) {\n this._signalManager = signalManager;\n this._retryDelay = retryDelay;\n\n this.open();\n }\n\n open() {\n if (!this._closed) {\n return;\n }\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.mesh.messenger.open', trace.begin({ id: traceId }));\n this._ctx = new Context({\n onError: (err) => log.catch(err),\n });\n this._ctx.onDispose(\n this._signalManager.onMessage.on(async (message) => {\n log('received message', { from: message.author });\n await this._handleMessage(message);\n }),\n );\n\n // Clear the map periodically.\n scheduleTaskInterval(\n this._ctx,\n async () => {\n this._performGc();\n },\n RECEIVED_MESSAGES_GC_INTERVAL,\n );\n\n this._closed = false;\n log.trace('dxos.mesh.messenger.open', trace.end({ id: traceId }));\n }\n\n async close() {\n if (this._closed) {\n return;\n }\n this._closed = true;\n await this._ctx.dispose();\n }\n\n async sendMessage({ author, recipient, payload }: Message): Promise<void> {\n invariant(!this._closed, 'Closed');\n const messageContext = this._ctx.derive();\n\n const reliablePayload: ReliablePayload = {\n messageId: PublicKey.random(),\n payload,\n };\n invariant(!this._onAckCallbacks.has(reliablePayload.messageId!));\n log('send message', { messageId: reliablePayload.messageId, author, recipient });\n\n let messageReceived: () => void;\n let timeoutHit: (err: Error) => void;\n\n const promise = new Promise<void>((resolve, reject) => {\n messageReceived = resolve;\n timeoutHit = reject;\n });\n\n // Setting retry interval if signal was not acknowledged.\n scheduleExponentialBackoffTaskInterval(\n messageContext,\n async () => {\n log('retrying message', { messageId: reliablePayload.messageId });\n await this._encodeAndSend({ author, recipient, reliablePayload }).catch((err) =>\n log('failed to send message', { err }),\n );\n },\n this._retryDelay,\n );\n\n scheduleTask(\n messageContext,\n () => {\n log('message not delivered', { messageId: reliablePayload.messageId });\n this._onAckCallbacks.delete(reliablePayload.messageId!);\n timeoutHit(\n new ProtocolTimeoutError(\n 'signaling message not delivered',\n new TimeoutError(MESSAGE_TIMEOUT, 'Message not delivered'),\n ),\n );\n void messageContext.dispose();\n },\n MESSAGE_TIMEOUT,\n );\n\n this._onAckCallbacks.set(reliablePayload.messageId, () => {\n messageReceived();\n this._onAckCallbacks.delete(reliablePayload.messageId!);\n void messageContext.dispose();\n });\n\n await this._encodeAndSend({ author, recipient, reliablePayload });\n return promise;\n }\n\n /**\n * Subscribes onMessage function to messages that contains payload with payloadType.\n * @param payloadType if not specified, onMessage will be subscribed to all types of messages.\n */\n async listen({\n peerId,\n payloadType,\n onMessage,\n }: {\n peerId: PublicKey;\n payloadType?: string;\n onMessage: OnMessage;\n }): Promise<ListeningHandle> {\n invariant(!this._closed, 'Closed');\n\n await this._signalManager.subscribeMessages(peerId);\n let listeners: Set<OnMessage> | undefined;\n\n if (!payloadType) {\n listeners = this._defaultListeners.get(peerId);\n if (!listeners) {\n listeners = new Set();\n this._defaultListeners.set(peerId, listeners);\n }\n } else {\n listeners = this._listeners.get({ peerId, payloadType });\n if (!listeners) {\n listeners = new Set();\n this._listeners.set({ peerId, payloadType }, listeners);\n }\n }\n\n listeners.add(onMessage);\n\n return {\n unsubscribe: async () => {\n listeners!.delete(onMessage);\n },\n };\n }\n\n private async _encodeAndSend({\n author,\n recipient,\n reliablePayload,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n reliablePayload: ReliablePayload;\n }): Promise<void> {\n await this._signalManager.sendMessage({\n author,\n recipient,\n payload: {\n type_url: 'dxos.mesh.messaging.ReliablePayload',\n value: ReliablePayload.encode(reliablePayload, { preserveAny: true }),\n },\n });\n }\n\n private async _handleMessage(message: Message): Promise<void> {\n switch (message.payload.type_url) {\n case 'dxos.mesh.messaging.ReliablePayload': {\n await this._handleReliablePayload(message);\n break;\n }\n case 'dxos.mesh.messaging.Acknowledgement': {\n await this._handleAcknowledgement({ payload: message.payload });\n break;\n }\n }\n }\n\n private async _handleReliablePayload({ author, recipient, payload }: Message) {\n invariant(payload.type_url === 'dxos.mesh.messaging.ReliablePayload');\n const reliablePayload: ReliablePayload = ReliablePayload.decode(payload.value, { preserveAny: true });\n\n log('handling message', { messageId: reliablePayload.messageId });\n\n await this._sendAcknowledgement({\n author,\n recipient,\n messageId: reliablePayload.messageId,\n });\n\n if (this._receivedMessages.has(reliablePayload.messageId!)) {\n return;\n }\n\n this._receivedMessages.add(reliablePayload.messageId!);\n\n await this._callListeners({\n author,\n recipient,\n payload: reliablePayload.payload,\n });\n }\n\n private async _handleAcknowledgement({ payload }: { payload: Any }) {\n invariant(payload.type_url === 'dxos.mesh.messaging.Acknowledgement');\n this._onAckCallbacks.get(Acknowledgement.decode(payload.value).messageId)?.();\n }\n\n private async _sendAcknowledgement({\n author,\n recipient,\n messageId,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n messageId: PublicKey;\n }): Promise<void> {\n log('sending ACK', { messageId, from: recipient, to: author });\n\n await this._signalManager.sendMessage({\n author: recipient,\n recipient: author,\n payload: {\n type_url: 'dxos.mesh.messaging.Acknowledgement',\n value: Acknowledgement.encode({ messageId }),\n },\n });\n }\n\n private async _callListeners(message: Message): Promise<void> {\n {\n const defaultListenerMap = this._defaultListeners.get(message.recipient);\n if (defaultListenerMap) {\n for (const listener of defaultListenerMap) {\n await listener(message);\n }\n }\n }\n\n {\n const listenerMap = this._listeners.get({\n peerId: message.recipient,\n payloadType: message.payload.type_url,\n });\n if (listenerMap) {\n for (const listener of listenerMap) {\n await listener(message);\n }\n }\n }\n }\n\n private _performGc() {\n const start = performance.now();\n\n for (const key of this._toClear.keys()) {\n this._receivedMessages.delete(key);\n }\n this._toClear.clear();\n for (const key of this._receivedMessages.keys()) {\n this._toClear.add(key);\n }\n\n const elapsed = performance.now() - start;\n if (elapsed > 100) {\n log.warn('GC took too long', { elapsed });\n }\n }\n}\n\nexport interface ListeningHandle {\n unsubscribe: () => Promise<void>;\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\n/**\n * Timeout for retrying messages.\n */\nexport const MESSAGE_TIMEOUT = 10_000;\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { DeferredTask, Event, Trigger, asyncTimeout, scheduleTask, scheduleTaskInterval, sleep } from '@dxos/async';\nimport { type Any, type Stream } from '@dxos/codec-protobuf';\nimport { Context, cancelWithContext } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/protocols';\nimport { type Message as SignalMessage, SignalState, type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { SignalRPCClient } from './signal-rpc-client';\nimport { type Message, type SignalMethods } from '../signal-methods';\n\nconst DEFAULT_RECONNECT_TIMEOUT = 100;\nconst MAX_RECONNECT_TIMEOUT = 5000;\nconst ERROR_RECONCILE_DELAY = 1000;\nconst RECONCILE_INTERVAL = 5_000;\n\nexport type SignalStatus = {\n host: string;\n state: SignalState;\n error?: string;\n reconnectIn: number;\n connectionStarted: Date;\n lastStateChange: Date;\n};\n\nexport type CommandTrace = {\n messageId: string;\n host: string;\n incoming: boolean;\n time: number;\n method: string;\n payload: any;\n response?: any;\n error?: string;\n};\n\n/**\n * Establishes a websocket connection to signal server and provides RPC methods.\n */\nexport class SignalClient implements SignalMethods {\n private _state = SignalState.CLOSED;\n\n private _lastError?: Error;\n\n /**\n * Number of milliseconds after which the connection will be attempted again in case of error.\n */\n private _reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;\n\n /**\n * Timestamp of when the connection attempt was began.\n */\n private _connectionStarted = new Date();\n\n /**\n * Timestamp of last state change.\n */\n private _lastStateChange = new Date();\n\n private _client?: SignalRPCClient;\n private readonly _clientReady = new Trigger();\n\n private _ctx?: Context;\n\n private _connectionCtx?: Context;\n\n private _reconcileTask?: DeferredTask;\n private _reconnectTask?: DeferredTask;\n\n readonly statusChanged = new Event<SignalStatus>();\n readonly commandTrace = new Event<CommandTrace>();\n\n /**\n * Swarm events streams. Keys represent actually joined topic and peerId.\n */\n private readonly _swarmStreams = new ComplexMap<{ topic: PublicKey; peerId: PublicKey }, Stream<SwarmEvent>>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n /**\n * Represent desired joined topic and peerId.\n */\n private readonly _joinedTopics = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n /**\n * Message streams. Keys represents actually subscribed peers.\n * @internal\n */\n public readonly _messageStreams = new ComplexMap<PublicKey, Stream<SignalMessage>>((key) => key.toHex());\n\n /**\n * Represent desired message subscriptions.\n */\n private readonly _subscribedMessages = new ComplexSet<{ peerId: PublicKey }>(({ peerId }) => peerId.toHex());\n\n /**\n * Event to use in tests to wait till subscription is successfully established.\n * @internal\n */\n public _reconciled = new Event();\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n private readonly _performance = {\n sentMessages: 0,\n receivedMessages: 0,\n reconnectCounter: 0,\n joinCounter: 0,\n leaveCounter: 0,\n };\n\n /**\n * @param _host Signal server websocket URL.\n * @param _onMessage\n */\n constructor(\n private readonly _host: string,\n private readonly _onMessage: (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>,\n private readonly _onSwarmEvent: (params: { topic: PublicKey; swarmEvent: SwarmEvent }) => Promise<void>,\n ) {\n if (!this._host.startsWith('wss://') && !this._host.startsWith('ws://')) {\n throw new Error(`Signal server requires a websocket URL. Provided: ${this._host}`);\n }\n }\n\n open() {\n log.trace('dxos.mesh.signal-client.open', trace.begin({ id: this._instanceId }));\n\n if ([SignalState.CONNECTED, SignalState.CONNECTING].includes(this._state)) {\n return;\n }\n\n this._ctx = new Context({\n onError: (err) => {\n if (this._state === SignalState.CLOSED || this._ctx?.disposed) {\n return;\n }\n if (this._state === SignalState.CONNECTED) {\n log.warn('SignalClient error:', err);\n }\n this._scheduleReconcileAfterError();\n },\n });\n\n this._reconcileTask = new DeferredTask(this._ctx, async () => {\n await this._reconcileSwarmSubscriptions();\n await this._reconcileMessageSubscriptions();\n this._reconciled.emit();\n });\n\n // Reconcile subscriptions periodically.\n scheduleTaskInterval(\n this._ctx,\n async () => {\n if (this._state === SignalState.CONNECTED) {\n this._reconcileTask!.schedule();\n }\n },\n RECONCILE_INTERVAL,\n );\n\n this._reconnectTask = new DeferredTask(this._ctx, async () => {\n await this._reconnect();\n });\n\n this._setState(SignalState.CONNECTING);\n this._createClient();\n log.trace('dxos.mesh.signal-client.open', trace.end({ id: this._instanceId }));\n }\n\n async close() {\n log('closing...');\n if ([SignalState.CLOSED].includes(this._state)) {\n return;\n }\n\n await this._ctx?.dispose();\n\n this._clientReady.reset();\n await this._client?.close();\n this._client = undefined;\n this._setState(SignalState.CLOSED);\n log('closed');\n }\n\n getStatus(): SignalStatus {\n return {\n host: this._host,\n state: this._state,\n error: this._lastError?.message,\n reconnectIn: this._reconnectAfter,\n connectionStarted: this._connectionStarted,\n lastStateChange: this._lastStateChange,\n };\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n log('joining', { topic, peerId });\n this._performance.joinCounter++;\n this._joinedTopics.add({ topic, peerId });\n this._reconcileTask!.schedule();\n }\n\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n this._performance.leaveCounter++;\n log('leaving', { topic, peerId });\n\n void this._swarmStreams.get({ topic, peerId })?.close();\n this._swarmStreams.delete({ topic, peerId });\n this._joinedTopics.delete({ topic, peerId });\n }\n\n async sendMessage(msg: Message): Promise<void> {\n this._performance.sentMessages++;\n await this._clientReady.wait();\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n await this._client!.sendMessage(msg);\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log('subscribing to messages', { peerId });\n this._subscribedMessages.add({ peerId });\n this._reconcileTask!.schedule();\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log('unsubscribing from messages', { peerId });\n this._subscribedMessages.delete({ peerId });\n void this._messageStreams.get(peerId)?.close();\n this._messageStreams.delete(peerId);\n }\n\n private _scheduleReconcileAfterError() {\n scheduleTask(\n this._ctx!,\n () => {\n this._reconcileTask!.schedule();\n },\n ERROR_RECONCILE_DELAY,\n );\n }\n\n private _setState(newState: SignalState) {\n this._state = newState;\n this._lastStateChange = new Date();\n log('signal state changed', { status: this.getStatus() });\n this.statusChanged.emit(this.getStatus());\n }\n\n private _createClient() {\n log('creating client', { host: this._host, state: this._state });\n invariant(!this._client, 'Client already created');\n\n this._connectionStarted = new Date();\n\n // Create new context for each connection.\n this._connectionCtx = this._ctx!.derive();\n this._connectionCtx.onDispose(async () => {\n log('connection context disposed');\n await Promise.all(Array.from(this._swarmStreams.values()).map((stream) => stream.close()));\n await Promise.all(Array.from(this._messageStreams.values()).map((stream) => stream.close()));\n this._swarmStreams.clear();\n this._messageStreams.clear();\n });\n\n try {\n this._client = new SignalRPCClient({\n url: this._host,\n callbacks: {\n onConnected: () => {\n log('socket connected');\n this._lastError = undefined;\n this._reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;\n this._setState(SignalState.CONNECTED);\n this._clientReady.wake();\n this._reconcileTask!.schedule();\n },\n\n onDisconnected: () => {\n log('socket disconnected', { state: this._state });\n if (this._state === SignalState.ERROR) {\n // Ignore disconnects after error.\n // Handled by error handler before disconnect handler.\n this._setState(SignalState.DISCONNECTED);\n return;\n }\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._setState(SignalState.DISCONNECTED);\n this._reconnectTask!.schedule();\n },\n\n onError: (error) => {\n log('socket error', { error, state: this._state });\n this._lastError = error;\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._setState(SignalState.ERROR);\n\n this._reconnectTask!.schedule();\n },\n },\n });\n } catch (err: any) {\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._incrementReconnectTimeout();\n }\n this._lastError = err;\n this._setState(SignalState.DISCONNECTED);\n this._reconnectTask!.schedule();\n }\n }\n\n private _incrementReconnectTimeout() {\n this._reconnectAfter *= 2;\n this._reconnectAfter = Math.min(this._reconnectAfter, MAX_RECONNECT_TIMEOUT);\n }\n\n private async _reconnect() {\n log(`reconnecting in ${this._reconnectAfter}ms`, { state: this._state });\n this._performance.reconnectCounter++;\n\n if (this._state === SignalState.RECONNECTING) {\n log.warn('Signal api already reconnecting.');\n return;\n }\n\n if (this._state === SignalState.CLOSED) {\n return;\n }\n\n // Close client if it wasn't already closed.\n this._clientReady.reset();\n await this._connectionCtx?.dispose();\n this._client?.close().catch(() => {});\n this._client = undefined;\n\n await cancelWithContext(this._ctx!, sleep(this._reconnectAfter));\n\n this._setState(SignalState.RECONNECTING);\n\n this._createClient();\n }\n\n private async _reconcileSwarmSubscriptions(): Promise<void> {\n await asyncTimeout(cancelWithContext(this._connectionCtx!, this._clientReady.wait()), 5_000);\n // Copy Client reference to avoid client change during the reconcile.\n const client = this._client!;\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n\n // Unsubscribe from topics that are no longer needed.\n for (const { topic, peerId } of this._swarmStreams.keys()) {\n // Join desired topics.\n if (this._joinedTopics.has({ topic, peerId })) {\n continue;\n }\n\n void this._swarmStreams.get({ topic, peerId })?.close();\n this._swarmStreams.delete({ topic, peerId });\n }\n\n // Subscribe to topics that are needed.\n for (const { topic, peerId } of this._joinedTopics.values()) {\n // Join desired topics.\n if (this._swarmStreams.has({ topic, peerId })) {\n continue;\n }\n\n const swarmStream = await asyncTimeout(\n cancelWithContext(this._connectionCtx!, client.join({ topic, peerId })),\n 5000,\n );\n // Subscribing to swarm events.\n // TODO(mykola): What happens when the swarm stream is closed? Maybe send leave event for each peer?\n swarmStream.subscribe(async (swarmEvent: SwarmEvent) => {\n log('swarm event', { swarmEvent });\n await this._onSwarmEvent({ topic, swarmEvent });\n });\n\n // Saving swarm stream.\n this._swarmStreams.set({ topic, peerId }, swarmStream);\n }\n }\n\n private async _reconcileMessageSubscriptions(): Promise<void> {\n await asyncTimeout(cancelWithContext(this._connectionCtx!, this._clientReady.wait()), 5_000);\n // Copy Client reference to avoid client change during the reconcile.\n const client = this._client!;\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n\n // Unsubscribe from messages that are no longer needed.\n for (const peerId of this._messageStreams.keys()) {\n // Join desired topics.\n if (this._subscribedMessages.has({ peerId })) {\n continue;\n }\n\n void this._messageStreams.get(peerId)?.close();\n this._messageStreams.delete(peerId);\n }\n\n // Subscribe to messages that are needed.\n for (const { peerId } of this._subscribedMessages.values()) {\n if (this._messageStreams.has(peerId)) {\n continue;\n }\n\n const messageStream = await asyncTimeout(\n cancelWithContext(this._connectionCtx!, client.receiveMessages(peerId)),\n 5000,\n );\n messageStream.subscribe(async (message: SignalMessage) => {\n this._performance.receivedMessages++;\n await this._onMessage({\n author: PublicKey.from(message.author),\n recipient: PublicKey.from(message.recipient),\n payload: message.payload,\n });\n });\n\n // Saving message stream.\n this._messageStreams.set(peerId, messageStream);\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Trigger } from '@dxos/async';\nimport { type Any, type Stream } from '@dxos/codec-protobuf';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema, trace } from '@dxos/protocols';\nimport { type Message as SignalMessage, type Signal } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { createProtoRpcPeer, type ProtoRpcPeer } from '@dxos/rpc';\n\ninterface Services {\n Signal: Signal;\n}\n\nexport type SignalCallbacks = {\n onConnected?: () => void;\n\n /**\n * Called on disconnect.\n * In case of error, `onError` will be called first and then `onDisconnected`.\n */\n onDisconnected?: () => void;\n\n onError?: (error: Error) => void;\n};\n\nexport type SignalRPCClientParams = {\n url: string;\n callbacks?: SignalCallbacks;\n};\n\nexport class SignalRPCClient {\n private _socket?: WebSocket;\n private _rpc?: ProtoRpcPeer<Services>;\n private readonly _connectTrigger = new Trigger();\n\n private _closed = false;\n\n private readonly _url: string;\n private readonly _callbacks: SignalCallbacks;\n\n constructor({ url, callbacks = {} }: SignalRPCClientParams) {\n const traceId = PublicKey.random().toHex();\n log.trace('dxos.mesh.signal-rpc-client.constructor', trace.begin({ id: traceId }));\n this._url = url;\n this._callbacks = callbacks;\n this._socket = new WebSocket(this._url);\n\n this._rpc = createProtoRpcPeer({\n requested: {\n Signal: schema.getService('dxos.mesh.signal.Signal'),\n },\n noHandshake: true,\n port: {\n send: (msg) => {\n if (this._closed) {\n // Do not send messages after close.\n return;\n }\n try {\n this._socket!.send(msg);\n } catch (err) {\n log.warn('send error', err);\n }\n },\n subscribe: (cb) => {\n this._socket!.onmessage = async (msg: WebSocket.MessageEvent) => {\n if (typeof Blob !== 'undefined' && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data as any);\n }\n };\n },\n },\n encodingOptions: {\n preserveAny: true,\n },\n });\n\n this._socket.onopen = async () => {\n try {\n await this._rpc!.open();\n log(`RPC open ${this._url}`);\n this._callbacks.onConnected?.();\n this._connectTrigger.wake();\n } catch (err: any) {\n this._callbacks.onError?.(err);\n }\n };\n\n this._socket.onclose = async () => {\n log(`Disconnected ${this._url}`);\n this._callbacks.onDisconnected?.();\n await this.close();\n };\n\n this._socket.onerror = async (event: WebSocket.ErrorEvent) => {\n if (this._closed) {\n // Ignore errors after close.\n return;\n }\n\n this._callbacks.onError?.(event.error ?? new Error(event.message));\n this._connectTrigger.reset();\n\n try {\n await this._rpc?.close();\n } catch (err) {\n log.catch(err);\n }\n this._closed = true;\n\n log.warn(event.message ?? 'Socket error', { url: this._url });\n };\n\n log.trace('dxos.mesh.signal-rpc-client.constructor', trace.end({ id: traceId }));\n }\n\n async close() {\n this._closed = true;\n try {\n await this._rpc?.close();\n this._socket?.close();\n } catch (err) {\n log.warn('close error', err);\n }\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('join', { topic, peerId });\n await this._connectTrigger.wait();\n invariant(!this._closed, 'SignalRPCClient is closed');\n invariant(this._rpc, 'Rpc is not initialized');\n const swarmStream = this._rpc.rpc.Signal.join({\n swarm: topic.asUint8Array(),\n peer: peerId.asUint8Array(),\n });\n await swarmStream.waitUntilReady();\n return swarmStream;\n }\n\n async receiveMessages(peerId: PublicKey): Promise<Stream<SignalMessage>> {\n log('receiveMessages', { peerId });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n invariant(this._rpc, 'Rpc is not initialized');\n const messageStream = this._rpc.rpc.Signal.receiveMessages({\n peer: peerId.asUint8Array(),\n });\n await messageStream.waitUntilReady();\n return messageStream;\n }\n\n async sendMessage({ author, recipient, payload }: { author: PublicKey; recipient: PublicKey; payload: Any }) {\n log('sendMessage', { author, recipient, payload });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n invariant(this._rpc, 'Rpc is not initialized');\n await this._rpc.rpc.Signal.sendMessage({\n author: author.asUint8Array(),\n recipient: recipient.asUint8Array(),\n payload,\n });\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event, Trigger } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { type SignalManager } from './signal-manager';\nimport { type CommandTrace, type SignalStatus } from '../signal-client';\n\n/**\n * Common signaling context that connects multiple MemorySignalManager instances.\n */\nexport class MemorySignalManagerContext {\n // Swarm messages.\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n // Mapping from topic to set of peers.\n readonly swarms = new ComplexMap<PublicKey, ComplexSet<PublicKey>>(PublicKey.hash);\n\n // Map of connections for each peer for signaling.\n readonly connections = new ComplexMap<PublicKey, MemorySignalManager>(PublicKey.hash);\n}\n\n/**\n * In memory signal manager for testing.\n */\nexport class MemorySignalManager implements SignalManager {\n readonly statusChanged = new Event<SignalStatus[]>();\n readonly commandTrace = new Event<CommandTrace>();\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n readonly onMessage = new Event<{\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }>();\n\n /** Will be used to emit SwarmEvents on .open() and .close() */\n private _joinedSwarms = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n );\n\n private _ctx!: Context;\n\n // TODO(dmaretskyi): Replace with callback.\n private readonly _freezeTrigger = new Trigger().wake();\n\n constructor(private readonly _context: MemorySignalManagerContext) {\n this._ctx = new Context();\n\n this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));\n }\n\n async open() {\n if (!this._ctx.disposed) {\n return;\n }\n this._ctx = new Context();\n this._ctx.onDispose(this._context.swarmEvent.on((data) => this.swarmEvent.emit(data)));\n\n await Promise.all([...this._joinedSwarms.values()].map((value) => this.join(value)));\n }\n\n async close() {\n if (this._ctx.disposed) {\n return;\n }\n // save copy of joined swarms.\n const joinedSwarmsCopy = new ComplexSet<{ topic: PublicKey; peerId: PublicKey }>(\n ({ topic, peerId }) => topic.toHex() + peerId.toHex(),\n [...this._joinedSwarms.values()],\n );\n\n await Promise.all([...this._joinedSwarms.values()].map((value) => this.leave(value)));\n\n // assign joined swarms back because .leave() deletes it.\n this._joinedSwarms = joinedSwarmsCopy;\n\n await this._ctx.dispose();\n }\n\n getStatus(): SignalStatus[] {\n return [];\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n invariant(!this._ctx.disposed, 'Closed');\n\n this._joinedSwarms.add({ topic, peerId });\n\n if (!this._context.swarms.has(topic)) {\n this._context.swarms.set(topic, new ComplexSet(PublicKey.hash));\n }\n\n this._context.swarms.get(topic)!.add(peerId);\n this._context.swarmEvent.emit({\n topic,\n swarmEvent: {\n peerAvailable: {\n peer: peerId.asUint8Array(),\n since: new Date(),\n },\n },\n });\n\n // Emitting swarm events for each peer.\n for (const [topic, peerIds] of this._context.swarms) {\n Array.from(peerIds).forEach((peerId) => {\n this.swarmEvent.emit({\n topic,\n swarmEvent: {\n peerAvailable: {\n peer: peerId.asUint8Array(),\n since: new Date(),\n },\n },\n });\n });\n }\n }\n\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n invariant(!this._ctx.disposed, 'Closed');\n\n this._joinedSwarms.delete({ topic, peerId });\n\n if (!this._context.swarms.has(topic)) {\n this._context.swarms.set(topic, new ComplexSet(PublicKey.hash));\n }\n\n this._context.swarms.get(topic)!.delete(peerId);\n\n const swarmEvent: SwarmEvent = {\n peerLeft: {\n peer: peerId.asUint8Array(),\n },\n };\n\n this._context.swarmEvent.emit({ topic, swarmEvent });\n }\n\n async sendMessage({ author, recipient, payload }: { author: PublicKey; recipient: PublicKey; payload: Any }) {\n log('send message', { author, recipient, ...dec(payload) });\n\n invariant(recipient);\n invariant(!this._ctx.disposed, 'Closed');\n\n await this._freezeTrigger.wait();\n\n const remote = this._context.connections.get(recipient);\n if (!remote) {\n log.warn('recipient is not subscribed for messages', { author, recipient });\n return;\n }\n\n if (remote._ctx.disposed) {\n log.warn('recipient is disposed', { author, recipient });\n return;\n }\n\n remote._freezeTrigger\n .wait()\n .then(() => {\n if (remote._ctx.disposed) {\n log.warn('recipient is disposed', { author, recipient });\n return;\n }\n\n log('receive message', { author, recipient, ...dec(payload) });\n\n remote.onMessage.emit({ author, recipient, payload });\n })\n .catch((err) => {\n log.error('error while waiting for freeze', { err });\n });\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log('subscribing', { peerId });\n this._context.connections.set(peerId, this);\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log('unsubscribing', { peerId });\n this._context.connections.delete(peerId);\n }\n\n freeze() {\n this._freezeTrigger.reset();\n }\n\n unfreeze() {\n this._freezeTrigger.wake();\n }\n}\nconst dec = (payload: Any) => {\n if (!payload.type_url.endsWith('ReliablePayload')) {\n return {};\n }\n\n const relPayload = schema.getCodecForType('dxos.mesh.messaging.ReliablePayload').decode(payload.value);\n\n if (typeof relPayload?.payload?.data === 'object') {\n return { payload: Object.keys(relPayload?.payload?.data)[0], sessionId: relPayload?.payload?.sessionId };\n }\n\n return {};\n};\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event, sleep, synchronized } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { RateLimitExceededError, TimeoutError, trace } from '@dxos/protocols';\nimport { type Runtime } from '@dxos/protocols/proto/dxos/config';\nimport { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\n\nimport { type SignalManager } from './signal-manager';\nimport { type CommandTrace, SignalClient, type SignalStatus } from '../signal-client';\n\nconst MAX_SERVER_FAILURES = 5;\nconst WSS_SIGNAL_SERVER_REBOOT_DELAY = 3_000;\n/**\n * Manages connection to multiple Signal Servers over WebSocket\n */\nexport class WebsocketSignalManager implements SignalManager {\n private readonly _servers = new Map<string, SignalClient>();\n\n private _ctx!: Context;\n private _opened = false;\n\n readonly failureCount = new Map<string, number>();\n readonly statusChanged = new Event<SignalStatus[]>();\n readonly commandTrace = new Event<CommandTrace>();\n readonly swarmEvent = new Event<{\n topic: PublicKey;\n swarmEvent: SwarmEvent;\n }>();\n\n readonly onMessage = new Event<{\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }>();\n\n private readonly _instanceId = PublicKey.random().toHex();\n\n constructor(private readonly _hosts: Runtime.Services.Signal[]) {\n log('Created WebsocketSignalManager', { hosts: this._hosts });\n for (const host of this._hosts) {\n if (this._servers.has(host.server)) {\n continue;\n }\n const server = new SignalClient(\n host.server,\n async (message) => this.onMessage.emit(message),\n async (data) => this.swarmEvent.emit(data),\n );\n server.statusChanged.on(() => this.statusChanged.emit(this.getStatus()));\n\n this._servers.set(host.server, server);\n this.failureCount.set(host.server, 0);\n server.commandTrace.on((trace) => this.commandTrace.emit(trace));\n }\n }\n\n @synchronized\n async open() {\n if (this._opened) {\n return;\n }\n log('open signal manager', { hosts: this._hosts });\n log.trace('dxos.mesh.websocket-signal-manager.open', trace.begin({ id: this._instanceId }));\n\n this._initContext();\n\n [...this._servers.values()].forEach((server) => server.open());\n\n this._opened = true;\n log.trace('dxos.mesh.websocket-signal-manager.open', trace.end({ id: this._instanceId }));\n }\n\n @synchronized\n async close() {\n if (!this._opened) {\n return;\n }\n this._opened = false;\n\n await this._ctx.dispose();\n\n await Promise.all(Array.from(this._servers.values()).map((server) => server.close()));\n }\n\n async restartServer(serverName: string) {\n log('Restarting server', { serverName });\n invariant(this._opened, 'server already closed');\n\n const server = this._servers.get(serverName);\n invariant(server, 'server not found');\n\n await server.close();\n await sleep(WSS_SIGNAL_SERVER_REBOOT_DELAY);\n await server.open();\n }\n\n getStatus(): SignalStatus[] {\n return Array.from(this._servers.values()).map((server) => server.getStatus());\n }\n\n @synchronized\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('Join', { topic, peerId });\n invariant(this._opened, 'Closed');\n await this._forEachServer((server) => server.join({ topic, peerId }));\n }\n\n @synchronized\n async leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('leaving', { topic, peerId });\n invariant(this._opened, 'Closed');\n\n await this._forEachServer((server) => server.leave({ topic, peerId }));\n }\n\n async sendMessage({\n author,\n recipient,\n payload,\n }: {\n author: PublicKey;\n recipient: PublicKey;\n payload: Any;\n }): Promise<void> {\n log(`Signal ${recipient.truncate()}`);\n invariant(this._opened, 'Closed');\n\n void this._forEachServer(async (server, serverName) => {\n void server.sendMessage({ author, recipient, payload }).catch((err) => {\n if (err instanceof RateLimitExceededError) {\n log.info('WSS rate limit exceeded', { err });\n } else if (err instanceof TimeoutError || err.constructor.name === 'TimeoutError') {\n log.info('WSS sendMessage timeout', { err });\n void this.checkServerFailure(serverName);\n } else {\n log.info(`error sending to ${serverName}`, { err });\n void this.checkServerFailure(serverName);\n }\n });\n });\n }\n\n @synchronized\n async checkServerFailure(serverName: string) {\n const failureCount = this.failureCount.get(serverName!) ?? 0;\n if (failureCount > MAX_SERVER_FAILURES) {\n log.warn(`Too many failures sending to ${serverName} (${failureCount} > ${MAX_SERVER_FAILURES}), restarting`);\n await this.restartServer(serverName!);\n this.failureCount.set(serverName!, 0);\n return;\n }\n this.failureCount.set(serverName!, (this.failureCount.get(serverName!) ?? 0) + 1);\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log(`Subscribed for message stream peerId=${peerId}`);\n invariant(this._opened, 'Closed');\n\n await this._forEachServer(async (server) => server.subscribeMessages(peerId));\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log(`Subscribed for message stream peerId=${peerId}`);\n invariant(this._opened, 'Closed');\n\n await this._forEachServer(async (server) => server.unsubscribeMessages(peerId));\n }\n\n private _initContext() {\n this._ctx = new Context({\n onError: (err) => log.catch(err),\n });\n }\n\n private async _forEachServer<ReturnType>(\n fn: (server: SignalClient, serverName: string) => Promise<ReturnType>,\n ): Promise<ReturnType[]> {\n return Promise.all(Array.from(this._servers.entries()).map(([serverName, server]) => fn(server, serverName)));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_async", "import_context", "import_invariant", "import_keys", "import_log", "import_protocols", "import_util", "MESSAGE_TIMEOUT", "ReliablePayload", "schema", "getCodecForType", "Acknowledgement", "RECEIVED_MESSAGES_GC_INTERVAL", "Messenger", "constructor", "signalManager", "retryDelay", "ComplexMap", "peerId", "payloadType", "toHex", "PublicKey", "hash", "_onAckCallbacks", "_receivedMessages", "ComplexSet", "_closed", "_signalManager", "_retryDelay", "open", "traceId", "random", "log", "trace", "begin", "id", "_ctx", "Context", "onError", "err", "catch", "onDispose", "onMessage", "on", "message", "from", "author", "_handleMessage", "scheduleTaskInterval", "_performGc", "end", "close", "dispose", "sendMessage", "recipient", "payload", "invariant", "messageContext", "derive", "reliablePayload", "messageId", "has", "messageReceived", "timeoutHit", "promise", "Promise", "resolve", "reject", "scheduleExponentialBackoffTaskInterval", "_encodeAndSend", "scheduleTask", "delete", "ProtocolTimeoutError", "TimeoutError", "set", "listen", "subscribeMessages", "listeners", "_defaultListeners", "get", "Set", "_listeners", "add", "unsubscribe", "type_url", "value", "encode", "preserveAny", "_handleReliablePayload", "_handleAcknowledgement", "decode", "_sendAcknowledgement", "_callListeners", "to", "defaultListenerMap", "listener", "listenerMap", "start", "performance", "now", "key", "_toClear", "keys", "clear", "elapsed", "warn", "SignalRPCClient", "url", "callbacks", "_connectTrigger", "Trigger", "_url", "_callbacks", "_socket", "WebSocket", "_rpc", "createProtoRpcPeer", "requested", "Signal", "getService", "noHandshake", "port", "send", "msg", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "arrayBuffer", "encodingOptions", "onopen", "onConnected", "wake", "onclose", "onDisconnected", "onerror", "event", "error", "Error", "reset", "join", "topic", "wait", "swarmStream", "rpc", "swarm", "asUint8Array", "peer", "waitUntilReady", "receiveMessages", "messageStream", "DEFAULT_RECONNECT_TIMEOUT", "MAX_RECONNECT_TIMEOUT", "ERROR_RECONCILE_DELAY", "RECONCILE_INTERVAL", "SignalClient", "_host", "_onMessage", "_onSwarmEvent", "_state", "SignalState", "CLOSED", "_reconnectAfter", "_connectionStarted", "Date", "_lastStateChange", "_clientReady", "statusChanged", "Event", "commandTrace", "_swarmStreams", "_joinedTopics", "_messageStreams", "_subscribedMessages", "_reconciled", "_instanceId", "_performance", "sentMessages", "receivedMessages", "reconnectCounter", "joinCounter", "leaveCounter", "startsWith", "CONNECTED", "CONNECTING", "includes", "disposed", "_scheduleReconcileAfterError", "_reconcileTask", "DeferredTask", "_reconcileSwarmSubscriptions", "_reconcileMessageSubscriptions", "emit", "schedule", "_reconnectTask", "_reconnect", "_setState", "_createClient", "_client", "undefined", "getStatus", "host", "state", "_lastError", "reconnectIn", "connectionStarted", "lastStateChange", "leave", "unsubscribeMessages", "newState", "status", "_connectionCtx", "all", "Array", "values", "map", "stream", "ERROR", "DISCONNECTED", "_incrementReconnectTimeout", "Math", "min", "RECONNECTING", "cancelWithContext", "sleep", "asyncTimeout", "client", "swarmEvent", "MemorySignalManagerContext", "MemorySignalManager", "_context", "_joinedSwarms", "_freezeTrigger", "joinedSwarmsCopy", "swarms", "peerAvailable", "since", "peerIds", "forEach", "peerLeft", "dec", "remote", "connections", "then", "freeze", "unfreeze", "endsWith", "relPayload", "Object", "sessionId", "MAX_SERVER_FAILURES", "WSS_SIGNAL_SERVER_REBOOT_DELAY", "WebsocketSignalManager", "_hosts", "_servers", "Map", "_opened", "failureCount", "hosts", "server", "_initContext", "restartServer", "serverName", "_forEachServer", "truncate", "RateLimitExceededError", "info", "name", "checkServerFailure", "fn", "entries", "synchronized"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/core/mesh/messaging/src/timeouts.ts":{"bytes":656,"imports":[],"format":"esm"},"packages/core/mesh/messaging/src/messenger.ts":{"bytes":34092,"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/mesh/messaging/src/timeouts.ts","kind":"import-statement","original":"./timeouts"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts":{"bytes":20064,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/messaging/src/signal-client/signal-client.ts":{"bytes":52212,"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/mesh/signal","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts","kind":"import-statement","original":"./signal-rpc-client"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-client/index.ts":{"bytes":499,"imports":[{"path":"packages/core/mesh/messaging/src/signal-client/signal-client.ts","kind":"import-statement","original":"./signal-client"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts":{"bytes":24494,"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/signal-manager.ts":{"bytes":1316,"imports":[],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts":{"bytes":24728,"imports":[{"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/keys","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/messaging/src/signal-client/index.ts","kind":"import-statement","original":"../signal-client"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/index.ts":{"bytes":750,"imports":[{"path":"packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts","kind":"import-statement","original":"./memory-signal-manager"},{"path":"packages/core/mesh/messaging/src/signal-manager/signal-manager.ts","kind":"import-statement","original":"./signal-manager"},{"path":"packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts","kind":"import-statement","original":"./websocket-signal-manager"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-methods.ts":{"bytes":1633,"imports":[],"format":"esm"},"packages/core/mesh/messaging/src/index.ts":{"bytes":782,"imports":[{"path":"packages/core/mesh/messaging/src/messenger.ts","kind":"import-statement","original":"./messenger"},{"path":"packages/core/mesh/messaging/src/signal-client/index.ts","kind":"import-statement","original":"./signal-client"},{"path":"packages/core/mesh/messaging/src/signal-manager/index.ts","kind":"import-statement","original":"./signal-manager"},{"path":"packages/core/mesh/messaging/src/signal-methods.ts","kind":"import-statement","original":"./signal-methods"}],"format":"esm"}},"outputs":{"packages/core/mesh/messaging/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":71748},"packages/core/mesh/messaging/dist/lib/node/index.cjs":{"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/mesh/signal","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/rpc","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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true}],"exports":["MemorySignalManager","MemorySignalManagerContext","Messenger","SignalClient","WebsocketSignalManager"],"entryPoint":"packages/core/mesh/messaging/src/index.ts","inputs":{"packages/core/mesh/messaging/src/messenger.ts":{"bytesInOutput":9633},"packages/core/mesh/messaging/src/timeouts.ts":{"bytesInOutput":27},"packages/core/mesh/messaging/src/index.ts":{"bytesInOutput":0},"packages/core/mesh/messaging/src/signal-client/signal-client.ts":{"bytesInOutput":13587},"packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts":{"bytesInOutput":6017},"packages/core/mesh/messaging/src/signal-client/index.ts":{"bytesInOutput":0},"packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts":{"bytesInOutput":6661},"packages/core/mesh/messaging/src/signal-manager/index.ts":{"bytesInOutput":0},"packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts":{"bytesInOutput":8157}},"bytes":44749}}}
1
+ {"inputs":{"packages/core/mesh/messaging/src/timeouts.ts":{"bytes":656,"imports":[],"format":"esm"},"packages/core/mesh/messaging/src/messenger.ts":{"bytes":34092,"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/mesh/messaging/src/timeouts.ts","kind":"import-statement","original":"./timeouts"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts":{"bytes":20064,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/messaging/src/signal-client/signal-client.ts":{"bytes":52212,"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/mesh/signal","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts","kind":"import-statement","original":"./signal-rpc-client"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-client/index.ts":{"bytes":499,"imports":[{"path":"packages/core/mesh/messaging/src/signal-client/signal-client.ts","kind":"import-statement","original":"./signal-client"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts":{"bytes":24494,"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/signal-manager.ts":{"bytes":1316,"imports":[],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts":{"bytes":25803,"imports":[{"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/keys","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/messaging/src/signal-client/index.ts","kind":"import-statement","original":"../signal-client"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-manager/index.ts":{"bytes":750,"imports":[{"path":"packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts","kind":"import-statement","original":"./memory-signal-manager"},{"path":"packages/core/mesh/messaging/src/signal-manager/signal-manager.ts","kind":"import-statement","original":"./signal-manager"},{"path":"packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts","kind":"import-statement","original":"./websocket-signal-manager"}],"format":"esm"},"packages/core/mesh/messaging/src/signal-methods.ts":{"bytes":1633,"imports":[],"format":"esm"},"packages/core/mesh/messaging/src/index.ts":{"bytes":782,"imports":[{"path":"packages/core/mesh/messaging/src/messenger.ts","kind":"import-statement","original":"./messenger"},{"path":"packages/core/mesh/messaging/src/signal-client/index.ts","kind":"import-statement","original":"./signal-client"},{"path":"packages/core/mesh/messaging/src/signal-manager/index.ts","kind":"import-statement","original":"./signal-manager"},{"path":"packages/core/mesh/messaging/src/signal-methods.ts","kind":"import-statement","original":"./signal-methods"}],"format":"esm"}},"outputs":{"packages/core/mesh/messaging/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":72193},"packages/core/mesh/messaging/dist/lib/node/index.cjs":{"imports":[{"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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/mesh/signal","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/rpc","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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/util","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/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true}],"exports":["MemorySignalManager","MemorySignalManagerContext","Messenger","SignalClient","WebsocketSignalManager"],"entryPoint":"packages/core/mesh/messaging/src/index.ts","inputs":{"packages/core/mesh/messaging/src/messenger.ts":{"bytesInOutput":9633},"packages/core/mesh/messaging/src/timeouts.ts":{"bytesInOutput":27},"packages/core/mesh/messaging/src/index.ts":{"bytesInOutput":0},"packages/core/mesh/messaging/src/signal-client/signal-client.ts":{"bytesInOutput":13587},"packages/core/mesh/messaging/src/signal-client/signal-rpc-client.ts":{"bytesInOutput":6017},"packages/core/mesh/messaging/src/signal-client/index.ts":{"bytesInOutput":0},"packages/core/mesh/messaging/src/signal-manager/memory-signal-manager.ts":{"bytesInOutput":6661},"packages/core/mesh/messaging/src/signal-manager/index.ts":{"bytesInOutput":0},"packages/core/mesh/messaging/src/signal-manager/websocket-signal-manager.ts":{"bytesInOutput":8542}},"bytes":45134}}}
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-signal-manager.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/websocket-signal-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAuB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,KAAK,YAAY,EAAgB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAItF;;GAEG;AACH,qBAAa,sBAAuB,YAAW,aAAa;IAsB9C,OAAO,CAAC,QAAQ,CAAC,MAAM;IArBnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAE5D,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,OAAO,CAAS;IAExB,QAAQ,CAAC,YAAY,sBAA6B;IAClD,QAAQ,CAAC,aAAa,wBAA+B;IACrD,QAAQ,CAAC,YAAY,sBAA6B;IAClD,QAAQ,CAAC,UAAU;eACV,SAAS;oBACJ,UAAU;OACnB;IAEL,QAAQ,CAAC,SAAS;gBACR,SAAS;mBACN,SAAS;iBACX,GAAG;OACT;IAEL,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAE7B,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE;IAoBxD,IAAI;IAgBJ,KAAK;IAWL,aAAa,CAAC,UAAU,EAAE,MAAM;IAYtC,SAAS,IAAI,YAAY,EAAE;IAKrB,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE;IAO/D,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE;IAOhE,WAAW,CAAC,EAChB,MAAM,EACN,SAAS,EACT,OAAO,GACR,EAAE;QACD,MAAM,EAAE,SAAS,CAAC;QAClB,SAAS,EAAE,SAAS,CAAC;QACrB,OAAO,EAAE,GAAG,CAAC;KACd,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBX,kBAAkB,CAAC,UAAU,EAAE,MAAM;IAWrC,iBAAiB,CAAC,MAAM,EAAE,SAAS;IAOnC,mBAAmB,CAAC,MAAM,EAAE,SAAS;IAO3C,OAAO,CAAC,YAAY;YAMN,cAAc;CAK7B"}
1
+ {"version":3,"file":"websocket-signal-manager.d.ts","sourceRoot":"","sources":["../../../../src/signal-manager/websocket-signal-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAuB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,KAAK,YAAY,EAAgB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAItF;;GAEG;AACH,qBAAa,sBAAuB,YAAW,aAAa;IAsB9C,OAAO,CAAC,QAAQ,CAAC,MAAM;IArBnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAE5D,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,OAAO,CAAS;IAExB,QAAQ,CAAC,YAAY,sBAA6B;IAClD,QAAQ,CAAC,aAAa,wBAA+B;IACrD,QAAQ,CAAC,YAAY,sBAA6B;IAClD,QAAQ,CAAC,UAAU;eACV,SAAS;oBACJ,UAAU;OACnB;IAEL,QAAQ,CAAC,SAAS;gBACR,SAAS;mBACN,SAAS;iBACX,GAAG;OACT;IAEL,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAE7B,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE;IAoBxD,IAAI;IAgBJ,KAAK;IAWL,aAAa,CAAC,UAAU,EAAE,MAAM;IAYtC,SAAS,IAAI,YAAY,EAAE;IAKrB,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE;IAO/D,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,SAAS,CAAA;KAAE;IAOhE,WAAW,CAAC,EAChB,MAAM,EACN,SAAS,EACT,OAAO,GACR,EAAE;QACD,MAAM,EAAE,SAAS,CAAC;QAClB,SAAS,EAAE,SAAS,CAAC;QACrB,OAAO,EAAE,GAAG,CAAC;KACd,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBX,kBAAkB,CAAC,UAAU,EAAE,MAAM;IAWrC,iBAAiB,CAAC,MAAM,EAAE,SAAS;IAOnC,mBAAmB,CAAC,MAAM,EAAE,SAAS;IAO3C,OAAO,CAAC,YAAY;YAMN,cAAc;CAK7B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/messaging",
3
- "version": "0.3.9-main.ee9a520",
3
+ "version": "0.3.9-main.ef334cd",
4
4
  "description": "Messaging",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -19,23 +19,23 @@
19
19
  "dependencies": {
20
20
  "isomorphic-ws": "^4.0.1",
21
21
  "ws": "^8.14.2",
22
- "@dxos/async": "0.3.9-main.ee9a520",
23
- "@dxos/context": "0.3.9-main.ee9a520",
24
- "@dxos/invariant": "0.3.9-main.ee9a520",
25
- "@dxos/keys": "0.3.9-main.ee9a520",
26
- "@dxos/log": "0.3.9-main.ee9a520",
27
- "@dxos/protocols": "0.3.9-main.ee9a520",
28
- "@dxos/node-std": "0.3.9-main.ee9a520",
29
- "@dxos/util": "0.3.9-main.ee9a520",
30
- "@dxos/rpc": "0.3.9-main.ee9a520",
31
- "@dxos/codec-protobuf": "0.3.9-main.ee9a520"
22
+ "@dxos/async": "0.3.9-main.ef334cd",
23
+ "@dxos/invariant": "0.3.9-main.ef334cd",
24
+ "@dxos/codec-protobuf": "0.3.9-main.ef334cd",
25
+ "@dxos/keys": "0.3.9-main.ef334cd",
26
+ "@dxos/node-std": "0.3.9-main.ef334cd",
27
+ "@dxos/log": "0.3.9-main.ef334cd",
28
+ "@dxos/context": "0.3.9-main.ef334cd",
29
+ "@dxos/rpc": "0.3.9-main.ef334cd",
30
+ "@dxos/protocols": "0.3.9-main.ef334cd",
31
+ "@dxos/util": "0.3.9-main.ef334cd"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/node": "^18.11.9",
35
35
  "earljs": "~0.1.10",
36
36
  "typescript": "^5.2.2",
37
37
  "wait-for-expect": "^3.0.2",
38
- "@dxos/signal": "0.3.9-main.ee9a520"
38
+ "@dxos/signal": "0.3.9-main.ef334cd"
39
39
  },
40
40
  "publishConfig": {
41
41
  "access": "public"
@@ -8,7 +8,7 @@ import { Context } from '@dxos/context';
8
8
  import { invariant } from '@dxos/invariant';
9
9
  import { PublicKey } from '@dxos/keys';
10
10
  import { log } from '@dxos/log';
11
- import { RateLimitExceededError, trace } from '@dxos/protocols';
11
+ import { RateLimitExceededError, TimeoutError, trace } from '@dxos/protocols';
12
12
  import { type Runtime } from '@dxos/protocols/proto/dxos/config';
13
13
  import { type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';
14
14
 
@@ -135,9 +135,12 @@ export class WebsocketSignalManager implements SignalManager {
135
135
  void this._forEachServer(async (server, serverName) => {
136
136
  void server.sendMessage({ author, recipient, payload }).catch((err) => {
137
137
  if (err instanceof RateLimitExceededError) {
138
- log('WSS rate limit exceeded', { err });
138
+ log.info('WSS rate limit exceeded', { err });
139
+ } else if (err instanceof TimeoutError || err.constructor.name === 'TimeoutError') {
140
+ log.info('WSS sendMessage timeout', { err });
141
+ void this.checkServerFailure(serverName);
139
142
  } else {
140
- log(`error sending to ${serverName}`, { err });
143
+ log.info(`error sending to ${serverName}`, { err });
141
144
  void this.checkServerFailure(serverName);
142
145
  }
143
146
  });