@dxos/messaging 0.6.4 → 0.6.5-staging.42fccfe

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.
@@ -497,7 +497,7 @@ var SignalClientMonitor = class {
497
497
  }
498
498
  };
499
499
  var getByteCount = (message) => {
500
- return message.author.asUint8Array().length + message.recipient.asUint8Array().length + message.payload.type_url.length + message.payload.value.length;
500
+ return message.author.asUint8Array().byteLength + message.recipient.asUint8Array().byteLength + message.payload.type_url.length + message.payload.value.length;
501
501
  };
502
502
  var createIdentityTags = (message) => {
503
503
  return {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/messenger.ts", "../../../src/messenger-monitor.ts", "../../../src/timeouts.ts", "../../../src/signal-client/signal-client.ts", "../../../src/signal-client/signal-client-monitor.ts", "../../../src/signal-client/signal-local-state.ts", "../../../src/signal-client/signal-rpc-client.ts", "../../../src/signal-client/signal-rpc-client-monitor.ts", "../../../src/signal-manager/memory-signal-manager.ts", "../../../src/signal-manager/websocket-signal-manager.ts", "../../../src/signal-manager/websocket-signal-manager-monitor.ts", "../../../src/signal-manager/utils.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 { type ReliablePayload } from '@dxos/protocols/proto/dxos/mesh/messaging';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { MessengerMonitor } from './messenger-monitor';\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 _monitor = new MessengerMonitor();\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 let sendAttempts = 0;\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 sendAttempts++;\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 this._monitor.recordReliableMessage({ sendAttempts, sent: false });\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 this._monitor.recordReliableMessage({ sendAttempts, sent: true });\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 try {\n await this._sendAcknowledgement({\n author,\n recipient,\n messageId: reliablePayload.messageId,\n });\n } catch (err) {\n this._monitor.recordMessageAckFailed();\n throw err;\n }\n\n // Ignore message if it was already received, i.e. from multiple signal servers.\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 2024 DXOS.org\n//\n\nimport { trace } from '@dxos/tracing';\n\nexport class MessengerMonitor {\n public recordMessageAckFailed() {\n trace.metrics.increment('dxos.mesh.signal.messenger.failed-ack', 1);\n }\n\n public recordReliableMessage(params: { sendAttempts: number; sent: boolean }) {\n trace.metrics.increment('dxos.mesh.signal.messenger.reliable-send', 1, {\n tags: {\n success: params.sent,\n attempts: params.sendAttempts,\n },\n });\n }\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, scheduleTask, scheduleTaskInterval, sleep } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { type Context, cancelWithContext, Resource } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/protocols';\nimport { SignalState, type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\n\nimport { SignalClientMonitor } from './signal-client-monitor';\nimport { SignalLocalState } from './signal-local-state';\nimport { SignalRPCClient } from './signal-rpc-client';\nimport { type Message, type SignalClientMethods, type SignalStatus } from '../signal-methods';\n\nconst DEFAULT_RECONNECT_TIMEOUT = 100;\nconst MAX_RECONNECT_TIMEOUT = 5_000;\nconst ERROR_RECONCILE_DELAY = 1_000;\nconst RECONCILE_INTERVAL = 5_000;\n\n/**\n * KUBE-specific signaling client.\n * Establishes a websocket connection to signal server and provides RPC methods.\n * Subscription state updates are executed immediately against the local state which\n * is reconciled periodically.\n */\n// TODO(burdon): Rename impl.\nexport class SignalClient extends Resource implements SignalClientMethods {\n private readonly _monitor = new SignalClientMonitor();\n\n private _state = SignalState.CLOSED;\n private _lastError?: Error;\n private _lastReconciliationFailed = false;\n\n private readonly _clientReady = new Trigger();\n private _connectionCtx?: Context;\n private _client?: SignalRPCClient;\n\n private _reconcileTask?: DeferredTask;\n private _reconnectTask?: DeferredTask;\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 private readonly _instanceId = PublicKey.random().toHex();\n\n /**\n * @internal\n */\n readonly localState: SignalLocalState;\n\n readonly statusChanged = new Event<SignalStatus>();\n\n /**\n * @param _host Signal server websocket URL.\n * @param onMessage called when a new message is received.\n * @param onSwarmEvent called when a new swarm event is received.\n * @param _getMetadata signal-message metadata provider, called for every message.\n */\n constructor(\n private readonly _host: string,\n onMessage: (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>,\n onSwarmEvent: (params: { topic: PublicKey; swarmEvent: SwarmEvent }) => Promise<void>,\n private readonly _getMetadata?: () => any,\n ) {\n super();\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 this.localState = new SignalLocalState((message) => {\n this._monitor.recordMessageReceived(message);\n return onMessage(message);\n }, onSwarmEvent);\n }\n\n protected override async _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 this._setState(SignalState.CONNECTING);\n\n this._reconcileTask = new DeferredTask(this._ctx, async () => {\n try {\n await cancelWithContext(this._connectionCtx!, this._clientReady.wait({ timeout: 5_000 }));\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n await this.localState.reconcile(this._connectionCtx!, this._client!);\n this._monitor.recordReconciliation({ success: true });\n this._lastReconciliationFailed = false;\n } catch (err) {\n this._lastReconciliationFailed = true;\n this._monitor.recordReconciliation({ success: false });\n throw err;\n }\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 try {\n await this._reconnect();\n this._monitor.recordReconnect({ success: true });\n } catch (err) {\n this._monitor.recordReconnect({ success: false });\n throw err;\n }\n });\n\n this._createClient();\n log.trace('dxos.mesh.signal-client.open', trace.end({ id: this._instanceId }));\n }\n\n protected override async _catch(err: Error) {\n if (this._state === SignalState.CLOSED || this._ctx.disposed) {\n return;\n }\n // Don't log consecutive reconciliation failures.\n if (this._state === SignalState.CONNECTED && !this._lastReconciliationFailed) {\n log.warn('SignalClient error:', err);\n }\n this._scheduleReconcileAfterError();\n }\n\n protected override async _close() {\n log('closing...');\n if ([SignalState.CLOSED].includes(this._state)) {\n return;\n }\n\n this._setState(SignalState.CLOSED);\n await this._safeResetClient();\n\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 ...this._monitor.getRecordedTimestamps(),\n };\n }\n\n async join(args: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n log('joining', { topic: args.topic, peerId: args.peerId });\n this._monitor.recordJoin();\n this.localState.join(args);\n this._reconcileTask?.schedule();\n }\n\n async leave(args: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n log('leaving', { topic: args.topic, peerId: args.peerId });\n this._monitor.recordLeave();\n this.localState.leave(args);\n }\n\n async sendMessage(msg: Message): Promise<void> {\n return this._monitor.recordMessageSending(msg, async () => {\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\n async subscribeMessages(peerId: PublicKey) {\n log('subscribing to messages', { peerId });\n this.localState.subscribeMessages(peerId);\n this._reconcileTask?.schedule();\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log('unsubscribing from messages', { peerId });\n this.localState.unsubscribeMessages(peerId);\n }\n\n private _scheduleReconcileAfterError() {\n scheduleTask(this._ctx, () => this._reconcileTask!.schedule(), ERROR_RECONCILE_DELAY);\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._monitor.recordConnectionStartTime();\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 const { failureCount } = await this.localState.safeCloseStreams();\n this._monitor.recordStreamCloseErrors(failureCount);\n });\n\n try {\n const client = new SignalRPCClient({\n url: this._host,\n callbacks: {\n onConnected: () => {\n if (client === this._client) {\n log('socket connected');\n this._onConnected();\n }\n },\n\n onDisconnected: () => {\n if (client !== this._client) {\n return;\n }\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 } else {\n this._onDisconnected();\n }\n },\n\n onError: (error) => {\n if (client === this._client) {\n log('socket error', { error, state: this._state });\n this._onDisconnected({ error });\n }\n },\n getMetadata: this._getMetadata,\n },\n });\n this._client = client;\n } catch (error: any) {\n this._client = undefined;\n this._onDisconnected({ error });\n }\n }\n\n private async _reconnect() {\n log(`reconnecting in ${this._reconnectAfter}ms`, { state: this._state });\n\n if (this._state === SignalState.RECONNECTING) {\n log.info('Signal api already reconnecting.');\n return;\n }\n if (this._state === SignalState.CLOSED) {\n return;\n }\n this._setState(SignalState.RECONNECTING);\n\n await this._safeResetClient();\n\n await cancelWithContext(this._ctx!, sleep(this._reconnectAfter));\n\n this._createClient();\n }\n\n private _onConnected() {\n this._lastError = undefined;\n this._lastReconciliationFailed = false;\n this._reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;\n this._setState(SignalState.CONNECTED);\n this._clientReady.wake();\n this._reconcileTask!.schedule();\n }\n\n private _onDisconnected(options?: { error: Error }) {\n this._updateReconnectTimeout();\n if (this._state === SignalState.CLOSED) {\n return;\n }\n if (options?.error) {\n this._lastError = options.error;\n this._setState(SignalState.ERROR);\n } else {\n this._setState(SignalState.DISCONNECTED);\n }\n this._reconnectTask!.schedule();\n }\n\n private _setState(newState: SignalState) {\n this._state = newState;\n this._monitor.recordStateChangeTime();\n log('signal state changed', { status: this.getStatus() });\n this.statusChanged.emit(this.getStatus());\n }\n\n private _updateReconnectTimeout() {\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._reconnectAfter *= 2;\n this._reconnectAfter = Math.min(this._reconnectAfter, MAX_RECONNECT_TIMEOUT);\n }\n }\n\n private async _safeResetClient() {\n await this._connectionCtx?.dispose();\n this._connectionCtx = undefined;\n\n this._clientReady.reset();\n await this._client?.close().catch(() => {});\n this._client = undefined;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { trace } from '@dxos/tracing';\n\nimport type { Message } from '../signal-methods';\n\nexport class SignalClientMonitor {\n private readonly _performance = {\n sentMessages: 0,\n receivedMessages: 0,\n reconnectCounter: 0,\n joinCounter: 0,\n leaveCounter: 0,\n };\n\n /**\n * Timestamp of when the connection attempt was began.\n */\n private _connectionStarted = new Date();\n /**\n * Timestamp of last state change.\n */\n private _lastStateChange = new Date();\n\n public getRecordedTimestamps() {\n return {\n connectionStarted: this._connectionStarted,\n lastStateChange: this._lastStateChange,\n };\n }\n\n public recordStateChangeTime() {\n this._lastStateChange = new Date();\n }\n\n public recordConnectionStartTime() {\n this._connectionStarted = new Date();\n }\n\n public recordReconnect(params: { success: boolean }) {\n this._performance.reconnectCounter++;\n trace.metrics.increment('dxos.mesh.signal.signal-client.reconnect', 1, {\n tags: {\n success: params.success,\n },\n });\n }\n\n public recordJoin() {\n this._performance.joinCounter++;\n }\n\n public recordLeave() {\n this._performance.leaveCounter++;\n }\n\n public recordMessageReceived(message: Message) {\n this._performance.receivedMessages++;\n trace.metrics.increment('dxos.mesh.signal.signal-client.received-total', 1, {\n tags: createIdentityTags(message),\n });\n trace.metrics.distribution('dxos.mesh.signal.signal-client.bytes-in', getByteCount(message), {\n tags: createIdentityTags(message),\n });\n }\n\n public async recordMessageSending(message: Message, sendMessage: () => Promise<void>) {\n this._performance.sentMessages++;\n const tags = createIdentityTags(message);\n let success = true;\n try {\n const reqStart = Date.now();\n await sendMessage();\n const reqDuration = Date.now() - reqStart;\n trace.metrics.distribution('dxos.mesh.signal.signal-client.send-duration', reqDuration, { tags });\n trace.metrics.distribution('dxos.mesh.signal.signal-client.bytes-out', getByteCount(message), { tags });\n } catch (err) {\n success = false;\n }\n trace.metrics.increment('dxos.mesh.signal.signal-client.sent-total', 1, {\n tags: { ...tags, success },\n });\n }\n\n public recordStreamCloseErrors(count: number) {\n trace.metrics.increment('dxos.mesh.signal.signal-client.stream-close-errors', count);\n }\n\n public recordReconciliation(params: { success: boolean }) {\n trace.metrics.increment('dxos.mesh.signal.signal-client.reconciliation', 1, {\n tags: {\n success: params.success,\n },\n });\n }\n}\n\nconst getByteCount = (message: Message): number => {\n return (\n message.author.asUint8Array().length +\n message.recipient.asUint8Array().length +\n message.payload.type_url.length +\n message.payload.value.length\n );\n};\n\nconst createIdentityTags = (message: Message) => {\n return { peer: message.author.toHex() };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { asyncTimeout, Event } from '@dxos/async';\nimport type { Any, Stream } from '@dxos/codec-protobuf';\nimport { cancelWithContext, type Context } from '@dxos/context';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type Message as SignalMessage, type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { ComplexMap, ComplexSet, safeAwaitAll } from '@dxos/util';\n\nimport { type SignalRPCClient } from './signal-rpc-client';\nimport type { Message } from '../signal-methods';\n\nexport class SignalLocalState {\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 * Represent desired message subscriptions.\n */\n private readonly _subscribedMessages = new ComplexSet<{ peerId: PublicKey }>(({ peerId }) => peerId.toHex());\n\n /**\n * Message streams. Keys represents actually subscribed peers.\n * @internal\n */\n readonly messageStreams = new ComplexMap<PublicKey, Stream<SignalMessage>>((key) => key.toHex());\n\n /**\n * Event to use in tests to wait till subscription is successfully established.\n * @internal\n */\n readonly reconciled = new Event();\n\n constructor(\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\n async safeCloseStreams(): Promise<{ failureCount: number }> {\n const streams = ([...this._swarmStreams.values()] as Stream<any>[]).concat([...this.messageStreams.values()]);\n this._swarmStreams.clear();\n this.messageStreams.clear();\n const failureCount = (await safeAwaitAll(streams, (s) => s.close())).length;\n return { failureCount };\n }\n\n join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n this._joinedTopics.add({ topic, peerId });\n }\n\n leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n void this._swarmStreams.get({ topic, peerId })?.close();\n this._swarmStreams.delete({ topic, peerId });\n this._joinedTopics.delete({ topic, peerId });\n }\n\n subscribeMessages(peerId: PublicKey) {\n this._subscribedMessages.add({ peerId });\n }\n\n 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 public async reconcile(ctx: Context, client: SignalRPCClient) {\n await this._reconcileSwarmSubscriptions(ctx, client);\n await this._reconcileMessageSubscriptions(ctx, client);\n this.reconciled.emit();\n }\n\n private async _reconcileSwarmSubscriptions(ctx: Context, client: SignalRPCClient): Promise<void> {\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(cancelWithContext(ctx, client.join({ topic, peerId })), 5_000);\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 if (this._joinedTopics.has({ topic, peerId })) {\n log('swarm event', { swarmEvent });\n await this._onSwarmEvent({ topic, swarmEvent });\n }\n });\n\n // Saving swarm stream.\n this._swarmStreams.set({ topic, peerId }, swarmStream);\n }\n }\n\n private async _reconcileMessageSubscriptions(ctx: Context, client: SignalRPCClient): Promise<void> {\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(cancelWithContext(ctx, client.receiveMessages(peerId)), 5_000);\n messageStream.subscribe(async (signalMessage: SignalMessage) => {\n if (this._subscribedMessages.has({ peerId })) {\n const message: Message = {\n author: PublicKey.from(signalMessage.author),\n recipient: PublicKey.from(signalMessage.recipient),\n payload: signalMessage.payload,\n };\n await this._onMessage(message);\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 { scheduleTaskInterval, TimeoutError, Trigger } from '@dxos/async';\nimport { type Any, type Stream } 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, 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\nimport { SignalRpcClientMonitor } from './signal-rpc-client-monitor';\n\nconst SIGNAL_KEEPALIVE_INTERVAL = 10000;\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 getMetadata?: () => any;\n};\n\nexport type SignalRPCClientParams = {\n url: string;\n callbacks?: SignalCallbacks;\n};\n\nexport class SignalRPCClient {\n private readonly _socket: WebSocket;\n private readonly _rpc: ProtoRpcPeer<Services>;\n private readonly _connectTrigger = new Trigger();\n\n private _keepaliveCtx?: Context;\n\n private _closed = false;\n\n private readonly _url: string;\n private readonly _callbacks: SignalCallbacks;\n private readonly _closeComplete = new Trigger();\n\n private readonly _monitor = new SignalRpcClientMonitor();\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 if (this._closed) {\n await this._safeCloseRpc();\n return;\n }\n log(`RPC open ${this._url}`);\n this._callbacks.onConnected?.();\n this._connectTrigger.wake();\n this._keepaliveCtx = new Context();\n scheduleTaskInterval(\n this._keepaliveCtx,\n async () => {\n // TODO(nf): use RFC6455 ping/pong once implemented in the browser?\n // TODO(nf): check for pong response from server (once implemented)\n // Current implementation of signal server ignores all text data messages, and does not send a response.\n // However this is enough to detect breakages in the connection as TCP will reset the connection if ACKs are not received.\n this._socket?.send('__ping__');\n },\n SIGNAL_KEEPALIVE_INTERVAL,\n );\n } catch (err: any) {\n this._callbacks.onError?.(err);\n this._socket.close();\n this._closed = true;\n }\n };\n\n this._socket.onclose = async () => {\n log(`Disconnected ${this._url}`);\n this._callbacks.onDisconnected?.();\n this._closeComplete.wake();\n await this.close();\n };\n\n this._socket.onerror = async (event: WebSocket.ErrorEvent) => {\n if (this._closed) {\n this._socket.close();\n return;\n }\n this._closed = true;\n\n this._callbacks.onError?.(event.error ?? new Error(event.message));\n await this._safeCloseRpc();\n\n log.warn(`Socket ${event.type ?? 'unknown'} error`, { message: event.message, url: this._url });\n };\n\n log.trace('dxos.mesh.signal-rpc-client.constructor', trace.end({ id: traceId }));\n }\n\n async close() {\n if (this._closed) {\n return;\n }\n this._closed = true;\n\n await this._keepaliveCtx?.dispose();\n try {\n await this._safeCloseRpc();\n\n if (this._socket.readyState === WebSocket.OPEN || this._socket.readyState === WebSocket.CONNECTING) {\n // close() only starts the closing handshake.\n this._socket.close();\n }\n\n await this._closeComplete.wait({ timeout: 1_000 });\n } catch (err) {\n const failureReason = err instanceof TimeoutError ? 'timeout' : err?.constructor?.name ?? 'unknown';\n this._monitor.recordClientCloseFailure({ failureReason });\n }\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('join', { topic, peerId, metadata: this._callbacks?.getMetadata?.() });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n const swarmStream = this._rpc.rpc.Signal.join({\n swarm: topic.asUint8Array(),\n peer: peerId.asUint8Array(),\n metadata: this._callbacks?.getMetadata?.(),\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 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, metadata: this._callbacks?.getMetadata?.() });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n await this._rpc.rpc.Signal.sendMessage({\n author: author.asUint8Array(),\n recipient: recipient.asUint8Array(),\n payload,\n metadata: this._callbacks?.getMetadata?.(),\n });\n }\n\n private async _safeCloseRpc() {\n try {\n this._connectTrigger.reset();\n await this._rpc.close();\n } catch (err) {\n log.catch(err);\n }\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { trace } from '@dxos/tracing';\n\nexport class SignalRpcClientMonitor {\n public recordClientCloseFailure(params: { failureReason: string }) {\n trace.metrics.increment('dxos.mesh.signal.signal-rpc-client.close-failure', 1, {\n tags: {\n reason: params.failureReason,\n },\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 SignalStatus } from '../signal-methods';\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 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';\nimport { BitField, safeAwaitAll } from '@dxos/util';\n\nimport { type SignalManager } from './signal-manager';\nimport { WebsocketSignalManagerMonitor } from './websocket-signal-manager-monitor';\nimport { SignalClient } from '../signal-client';\nimport { type SignalClientMethods, type SignalMethods, type SignalStatus } from '../signal-methods';\n\nconst MAX_SERVER_FAILURES = 5;\nconst WSS_SIGNAL_SERVER_REBOOT_DELAY = 3_000;\n\n/**\n * Manages connection to multiple Signal Servers over WebSocket\n */\nexport class WebsocketSignalManager implements SignalManager {\n private readonly _servers = new Map<string, SignalClientMethods>();\n private readonly _monitor = new WebsocketSignalManagerMonitor();\n\n /**\n * Used to avoid logging failed server restarts more than once until the server actually recovers.\n */\n private readonly _failedServersBitfield: Uint8Array;\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 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(\n private readonly _hosts: Runtime.Services.Signal[],\n private readonly _getMetadata?: () => any,\n ) {\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\n // TODO(burdon): Create factory to support different variants.\n const server = new SignalClient(\n host.server,\n async (message) => this.onMessage.emit(message),\n async (data) => this.swarmEvent.emit(data),\n this._getMetadata,\n );\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 }\n this._failedServersBitfield = BitField.zeros(this._hosts.length);\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 await safeAwaitAll(this._servers.values(), (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 await this._ctx.dispose();\n await safeAwaitAll(this._servers.values(), (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 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 });\n invariant(this._opened, 'Closed');\n\n void this._forEachServer(async (server, serverName, index) => {\n void server\n .sendMessage({ author, recipient, payload })\n .then(() => this._clearServerFailedFlag(serverName, index))\n .catch((err) => {\n if (err instanceof RateLimitExceededError) {\n log.info('WSS rate limit exceeded', { err });\n this._monitor.recordRateLimitExceeded();\n } else if (err instanceof TimeoutError || err.constructor.name === 'TimeoutError') {\n log.info('WSS sendMessage timeout', { err });\n void this.checkServerFailure(serverName, index);\n } else {\n log.warn(`error sending to ${serverName}`, { err });\n void this.checkServerFailure(serverName, index);\n }\n });\n });\n }\n\n @synchronized\n async checkServerFailure(serverName: string, index: number) {\n const failureCount = this.failureCount.get(serverName!) ?? 0;\n const isRestartRequired = failureCount > MAX_SERVER_FAILURES;\n this._monitor.recordServerFailure({ serverName, willRestart: isRestartRequired });\n if (isRestartRequired) {\n if (!BitField.get(this._failedServersBitfield, index)) {\n log.warn('too many failures for ws-server, restarting', { serverName, failureCount });\n BitField.set(this._failedServersBitfield, index, true);\n }\n await this.restartServer(serverName!);\n this.failureCount.set(serverName!, 0);\n return;\n }\n\n this.failureCount.set(serverName!, (this.failureCount.get(serverName!) ?? 0) + 1);\n }\n\n private _clearServerFailedFlag(serverName: string, index: number) {\n if (BitField.get(this._failedServersBitfield, index)) {\n log.info('server connection restored', { serverName });\n BitField.set(this._failedServersBitfield, index, false);\n this.failureCount.set(serverName!, 0);\n }\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log('subscribed for message stream', { 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 });\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: SignalMethods, serverName: string, index: number) => Promise<ReturnType>,\n ): Promise<ReturnType[]> {\n return Promise.all(\n Array.from(this._servers.entries()).map(([serverName, server], idx) => fn(server, serverName, idx)),\n );\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { trace } from '@dxos/tracing';\n\nexport class WebsocketSignalManagerMonitor {\n public recordRateLimitExceeded() {\n trace.metrics.increment('dxos.mesh.signal.signal-manager.rate-limit-hit', 1);\n }\n\n public recordServerFailure(params: { serverName: string; willRestart: boolean }) {\n trace.metrics.increment('dxos.mesh.signal.signal-manager.server-failure', 1, {\n tags: {\n server: params.serverName,\n restarted: params.willRestart,\n },\n });\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { type DevicesService, type IdentityService } from '@dxos/protocols/proto/dxos/client/services';\nimport { DeviceKind } from '@dxos/protocols/proto/dxos/client/services';\n\nexport const setIdentityTags = ({\n identityService,\n devicesService,\n setTag,\n}: {\n identityService: IdentityService;\n devicesService: DevicesService;\n setTag: (k: string, v: string) => void;\n}) => {\n identityService.queryIdentity().subscribe((idqr) => {\n if (!idqr?.identity?.identityKey) {\n log('empty response from identity service', { idqr });\n return;\n }\n\n setTag('identityKey', idqr.identity.identityKey.truncate());\n });\n\n devicesService.queryDevices().subscribe((dqr) => {\n if (!dqr || !dqr.devices || dqr.devices.length === 0) {\n log('empty response from device service', { device: dqr });\n return;\n }\n invariant(dqr, 'empty response from device service');\n\n const thisDevice = dqr.devices.find((device) => device.kind === DeviceKind.CURRENT);\n if (!thisDevice) {\n log('no current device', { device: dqr });\n return;\n }\n setTag('deviceKey', thisDevice.deviceKey.truncate());\n });\n};\n"],
5
- "mappings": "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",
6
- "names": ["TimeoutError", "scheduleExponentialBackoffTaskInterval", "scheduleTask", "scheduleTaskInterval", "Context", "invariant", "PublicKey", "log", "ProtocolTimeoutError", "schema", "trace", "ComplexMap", "ComplexSet", "trace", "MessengerMonitor", "recordMessageAckFailed", "trace", "metrics", "increment", "recordReliableMessage", "params", "tags", "success", "sent", "attempts", "sendAttempts", "MESSAGE_TIMEOUT", "ReliablePayload", "schema", "getCodecForType", "Acknowledgement", "RECEIVED_MESSAGES_GC_INTERVAL", "Messenger", "constructor", "signalManager", "retryDelay", "_monitor", "MessengerMonitor", "_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", "sendAttempts", "promise", "Promise", "resolve", "reject", "scheduleExponentialBackoffTaskInterval", "_encodeAndSend", "scheduleTask", "delete", "ProtocolTimeoutError", "TimeoutError", "MESSAGE_TIMEOUT", "recordReliableMessage", "sent", "set", "listen", "subscribeMessages", "listeners", "get", "Set", "add", "unsubscribe", "type_url", "value", "encode", "preserveAny", "_handleReliablePayload", "_handleAcknowledgement", "decode", "_sendAcknowledgement", "recordMessageAckFailed", "_callListeners", "to", "defaultListenerMap", "listener", "listenerMap", "start", "performance", "now", "key", "keys", "clear", "elapsed", "warn", "DeferredTask", "Event", "Trigger", "scheduleTask", "scheduleTaskInterval", "sleep", "cancelWithContext", "Resource", "invariant", "PublicKey", "log", "trace", "SignalState", "trace", "SignalClientMonitor", "_performance", "sentMessages", "receivedMessages", "reconnectCounter", "joinCounter", "leaveCounter", "_connectionStarted", "Date", "_lastStateChange", "getRecordedTimestamps", "connectionStarted", "lastStateChange", "recordStateChangeTime", "recordConnectionStartTime", "recordReconnect", "params", "trace", "metrics", "increment", "tags", "success", "recordJoin", "recordLeave", "recordMessageReceived", "message", "createIdentityTags", "distribution", "getByteCount", "recordMessageSending", "sendMessage", "reqStart", "now", "reqDuration", "err", "recordStreamCloseErrors", "count", "recordReconciliation", "author", "asUint8Array", "length", "recipient", "payload", "type_url", "value", "peer", "toHex", "asyncTimeout", "Event", "cancelWithContext", "PublicKey", "log", "ComplexMap", "ComplexSet", "safeAwaitAll", "SignalLocalState", "constructor", "_onMessage", "_onSwarmEvent", "_swarmStreams", "topic", "peerId", "toHex", "_joinedTopics", "_subscribedMessages", "messageStreams", "key", "reconciled", "safeCloseStreams", "streams", "values", "concat", "clear", "failureCount", "s", "close", "length", "join", "add", "leave", "get", "delete", "subscribeMessages", "unsubscribeMessages", "reconcile", "ctx", "client", "_reconcileSwarmSubscriptions", "_reconcileMessageSubscriptions", "emit", "keys", "has", "swarmStream", "subscribe", "swarmEvent", "set", "messageStream", "receiveMessages", "signalMessage", "message", "author", "from", "recipient", "payload", "WebSocket", "scheduleTaskInterval", "TimeoutError", "Trigger", "Context", "invariant", "PublicKey", "log", "schema", "trace", "createProtoRpcPeer", "trace", "SignalRpcClientMonitor", "recordClientCloseFailure", "params", "trace", "metrics", "increment", "tags", "reason", "failureReason", "SIGNAL_KEEPALIVE_INTERVAL", "SignalRPCClient", "constructor", "url", "callbacks", "_connectTrigger", "Trigger", "_closed", "_closeComplete", "_monitor", "SignalRpcClientMonitor", "traceId", "PublicKey", "random", "toHex", "log", "trace", "begin", "id", "_url", "_callbacks", "_socket", "WebSocket", "_rpc", "createProtoRpcPeer", "requested", "Signal", "schema", "getService", "noHandshake", "port", "send", "msg", "err", "warn", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "encodingOptions", "preserveAny", "onopen", "open", "_safeCloseRpc", "onConnected", "wake", "_keepaliveCtx", "Context", "scheduleTaskInterval", "onError", "close", "onclose", "onDisconnected", "onerror", "event", "error", "Error", "message", "type", "end", "dispose", "readyState", "OPEN", "CONNECTING", "wait", "timeout", "failureReason", "TimeoutError", "name", "recordClientCloseFailure", "join", "topic", "peerId", "metadata", "getMetadata", "invariant", "swarmStream", "rpc", "swarm", "asUint8Array", "peer", "waitUntilReady", "receiveMessages", "messageStream", "sendMessage", "author", "recipient", "payload", "reset", "catch", "DEFAULT_RECONNECT_TIMEOUT", "MAX_RECONNECT_TIMEOUT", "ERROR_RECONCILE_DELAY", "RECONCILE_INTERVAL", "SignalClient", "Resource", "constructor", "_host", "onMessage", "onSwarmEvent", "_getMetadata", "_monitor", "SignalClientMonitor", "_state", "SignalState", "CLOSED", "_lastReconciliationFailed", "_clientReady", "Trigger", "_reconnectAfter", "_instanceId", "PublicKey", "random", "toHex", "statusChanged", "Event", "startsWith", "Error", "localState", "SignalLocalState", "message", "recordMessageReceived", "_open", "log", "trace", "begin", "id", "CONNECTED", "CONNECTING", "includes", "_setState", "_reconcileTask", "DeferredTask", "_ctx", "cancelWithContext", "_connectionCtx", "wait", "timeout", "invariant", "reconcile", "_client", "recordReconciliation", "success", "err", "scheduleTaskInterval", "schedule", "_reconnectTask", "_reconnect", "recordReconnect", "_createClient", "end", "_catch", "disposed", "warn", "_scheduleReconcileAfterError", "_close", "_safeResetClient", "getStatus", "host", "state", "error", "_lastError", "reconnectIn", "getRecordedTimestamps", "join", "args", "topic", "peerId", "recordJoin", "leave", "recordLeave", "sendMessage", "msg", "recordMessageSending", "subscribeMessages", "unsubscribeMessages", "scheduleTask", "recordConnectionStartTime", "derive", "onDispose", "failureCount", "safeCloseStreams", "recordStreamCloseErrors", "client", "SignalRPCClient", "url", "callbacks", "onConnected", "_onConnected", "onDisconnected", "ERROR", "DISCONNECTED", "_onDisconnected", "onError", "getMetadata", "undefined", "RECONNECTING", "info", "sleep", "wake", "options", "_updateReconnectTimeout", "newState", "recordStateChangeTime", "status", "emit", "Math", "min", "dispose", "reset", "close", "catch", "Event", "Trigger", "Context", "invariant", "PublicKey", "log", "schema", "ComplexMap", "ComplexSet", "MemorySignalManagerContext", "swarmEvent", "swarms", "hash", "connections", "MemorySignalManager", "constructor", "_context", "statusChanged", "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", "BitField", "safeAwaitAll", "trace", "WebsocketSignalManagerMonitor", "recordRateLimitExceeded", "trace", "metrics", "increment", "recordServerFailure", "params", "tags", "server", "serverName", "restarted", "willRestart", "MAX_SERVER_FAILURES", "WSS_SIGNAL_SERVER_REBOOT_DELAY", "WebsocketSignalManager", "constructor", "_hosts", "_getMetadata", "_servers", "Map", "_monitor", "WebsocketSignalManagerMonitor", "_opened", "failureCount", "statusChanged", "Event", "swarmEvent", "onMessage", "_instanceId", "PublicKey", "random", "toHex", "log", "hosts", "host", "has", "server", "SignalClient", "message", "emit", "data", "on", "getStatus", "set", "_failedServersBitfield", "BitField", "zeros", "length", "open", "trace", "begin", "id", "_initContext", "safeAwaitAll", "values", "end", "close", "_ctx", "dispose", "restartServer", "serverName", "invariant", "get", "sleep", "Array", "from", "map", "join", "topic", "peerId", "_forEachServer", "leave", "sendMessage", "author", "recipient", "payload", "index", "then", "_clearServerFailedFlag", "catch", "err", "RateLimitExceededError", "info", "recordRateLimitExceeded", "TimeoutError", "name", "checkServerFailure", "warn", "isRestartRequired", "recordServerFailure", "willRestart", "subscribeMessages", "unsubscribeMessages", "Context", "onError", "fn", "Promise", "all", "entries", "idx", "synchronized", "invariant", "log", "DeviceKind", "setIdentityTags", "identityService", "devicesService", "setTag", "queryIdentity", "subscribe", "idqr", "identity", "identityKey", "truncate", "queryDevices", "dqr", "devices", "length", "device", "thisDevice", "find", "kind", "CURRENT", "deviceKey"]
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 { type ReliablePayload } from '@dxos/protocols/proto/dxos/mesh/messaging';\nimport { ComplexMap, ComplexSet } from '@dxos/util';\n\nimport { MessengerMonitor } from './messenger-monitor';\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 _monitor = new MessengerMonitor();\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 let sendAttempts = 0;\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 sendAttempts++;\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 this._monitor.recordReliableMessage({ sendAttempts, sent: false });\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 this._monitor.recordReliableMessage({ sendAttempts, sent: true });\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 try {\n await this._sendAcknowledgement({\n author,\n recipient,\n messageId: reliablePayload.messageId,\n });\n } catch (err) {\n this._monitor.recordMessageAckFailed();\n throw err;\n }\n\n // Ignore message if it was already received, i.e. from multiple signal servers.\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 2024 DXOS.org\n//\n\nimport { trace } from '@dxos/tracing';\n\nexport class MessengerMonitor {\n public recordMessageAckFailed() {\n trace.metrics.increment('dxos.mesh.signal.messenger.failed-ack', 1);\n }\n\n public recordReliableMessage(params: { sendAttempts: number; sent: boolean }) {\n trace.metrics.increment('dxos.mesh.signal.messenger.reliable-send', 1, {\n tags: {\n success: params.sent,\n attempts: params.sendAttempts,\n },\n });\n }\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, scheduleTask, scheduleTaskInterval, sleep } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { type Context, cancelWithContext, Resource } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/protocols';\nimport { SignalState, type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\n\nimport { SignalClientMonitor } from './signal-client-monitor';\nimport { SignalLocalState } from './signal-local-state';\nimport { SignalRPCClient } from './signal-rpc-client';\nimport { type Message, type SignalClientMethods, type SignalStatus } from '../signal-methods';\n\nconst DEFAULT_RECONNECT_TIMEOUT = 100;\nconst MAX_RECONNECT_TIMEOUT = 5_000;\nconst ERROR_RECONCILE_DELAY = 1_000;\nconst RECONCILE_INTERVAL = 5_000;\n\n/**\n * KUBE-specific signaling client.\n * Establishes a websocket connection to signal server and provides RPC methods.\n * Subscription state updates are executed immediately against the local state which\n * is reconciled periodically.\n */\n// TODO(burdon): Rename impl.\nexport class SignalClient extends Resource implements SignalClientMethods {\n private readonly _monitor = new SignalClientMonitor();\n\n private _state = SignalState.CLOSED;\n private _lastError?: Error;\n private _lastReconciliationFailed = false;\n\n private readonly _clientReady = new Trigger();\n private _connectionCtx?: Context;\n private _client?: SignalRPCClient;\n\n private _reconcileTask?: DeferredTask;\n private _reconnectTask?: DeferredTask;\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 private readonly _instanceId = PublicKey.random().toHex();\n\n /**\n * @internal\n */\n readonly localState: SignalLocalState;\n\n readonly statusChanged = new Event<SignalStatus>();\n\n /**\n * @param _host Signal server websocket URL.\n * @param onMessage called when a new message is received.\n * @param onSwarmEvent called when a new swarm event is received.\n * @param _getMetadata signal-message metadata provider, called for every message.\n */\n constructor(\n private readonly _host: string,\n onMessage: (params: { author: PublicKey; recipient: PublicKey; payload: Any }) => Promise<void>,\n onSwarmEvent: (params: { topic: PublicKey; swarmEvent: SwarmEvent }) => Promise<void>,\n private readonly _getMetadata?: () => any,\n ) {\n super();\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 this.localState = new SignalLocalState((message) => {\n this._monitor.recordMessageReceived(message);\n return onMessage(message);\n }, onSwarmEvent);\n }\n\n protected override async _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 this._setState(SignalState.CONNECTING);\n\n this._reconcileTask = new DeferredTask(this._ctx, async () => {\n try {\n await cancelWithContext(this._connectionCtx!, this._clientReady.wait({ timeout: 5_000 }));\n invariant(this._state === SignalState.CONNECTED, 'Not connected to Signal Server');\n await this.localState.reconcile(this._connectionCtx!, this._client!);\n this._monitor.recordReconciliation({ success: true });\n this._lastReconciliationFailed = false;\n } catch (err) {\n this._lastReconciliationFailed = true;\n this._monitor.recordReconciliation({ success: false });\n throw err;\n }\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 try {\n await this._reconnect();\n this._monitor.recordReconnect({ success: true });\n } catch (err) {\n this._monitor.recordReconnect({ success: false });\n throw err;\n }\n });\n\n this._createClient();\n log.trace('dxos.mesh.signal-client.open', trace.end({ id: this._instanceId }));\n }\n\n protected override async _catch(err: Error) {\n if (this._state === SignalState.CLOSED || this._ctx.disposed) {\n return;\n }\n // Don't log consecutive reconciliation failures.\n if (this._state === SignalState.CONNECTED && !this._lastReconciliationFailed) {\n log.warn('SignalClient error:', err);\n }\n this._scheduleReconcileAfterError();\n }\n\n protected override async _close() {\n log('closing...');\n if ([SignalState.CLOSED].includes(this._state)) {\n return;\n }\n\n this._setState(SignalState.CLOSED);\n await this._safeResetClient();\n\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 ...this._monitor.getRecordedTimestamps(),\n };\n }\n\n async join(args: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n log('joining', { topic: args.topic, peerId: args.peerId });\n this._monitor.recordJoin();\n this.localState.join(args);\n this._reconcileTask?.schedule();\n }\n\n async leave(args: { topic: PublicKey; peerId: PublicKey }): Promise<void> {\n log('leaving', { topic: args.topic, peerId: args.peerId });\n this._monitor.recordLeave();\n this.localState.leave(args);\n }\n\n async sendMessage(msg: Message): Promise<void> {\n return this._monitor.recordMessageSending(msg, async () => {\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\n async subscribeMessages(peerId: PublicKey) {\n log('subscribing to messages', { peerId });\n this.localState.subscribeMessages(peerId);\n this._reconcileTask?.schedule();\n }\n\n async unsubscribeMessages(peerId: PublicKey) {\n log('unsubscribing from messages', { peerId });\n this.localState.unsubscribeMessages(peerId);\n }\n\n private _scheduleReconcileAfterError() {\n scheduleTask(this._ctx, () => this._reconcileTask!.schedule(), ERROR_RECONCILE_DELAY);\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._monitor.recordConnectionStartTime();\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 const { failureCount } = await this.localState.safeCloseStreams();\n this._monitor.recordStreamCloseErrors(failureCount);\n });\n\n try {\n const client = new SignalRPCClient({\n url: this._host,\n callbacks: {\n onConnected: () => {\n if (client === this._client) {\n log('socket connected');\n this._onConnected();\n }\n },\n\n onDisconnected: () => {\n if (client !== this._client) {\n return;\n }\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 } else {\n this._onDisconnected();\n }\n },\n\n onError: (error) => {\n if (client === this._client) {\n log('socket error', { error, state: this._state });\n this._onDisconnected({ error });\n }\n },\n getMetadata: this._getMetadata,\n },\n });\n this._client = client;\n } catch (error: any) {\n this._client = undefined;\n this._onDisconnected({ error });\n }\n }\n\n private async _reconnect() {\n log(`reconnecting in ${this._reconnectAfter}ms`, { state: this._state });\n\n if (this._state === SignalState.RECONNECTING) {\n log.info('Signal api already reconnecting.');\n return;\n }\n if (this._state === SignalState.CLOSED) {\n return;\n }\n this._setState(SignalState.RECONNECTING);\n\n await this._safeResetClient();\n\n await cancelWithContext(this._ctx!, sleep(this._reconnectAfter));\n\n this._createClient();\n }\n\n private _onConnected() {\n this._lastError = undefined;\n this._lastReconciliationFailed = false;\n this._reconnectAfter = DEFAULT_RECONNECT_TIMEOUT;\n this._setState(SignalState.CONNECTED);\n this._clientReady.wake();\n this._reconcileTask!.schedule();\n }\n\n private _onDisconnected(options?: { error: Error }) {\n this._updateReconnectTimeout();\n if (this._state === SignalState.CLOSED) {\n return;\n }\n if (options?.error) {\n this._lastError = options.error;\n this._setState(SignalState.ERROR);\n } else {\n this._setState(SignalState.DISCONNECTED);\n }\n this._reconnectTask!.schedule();\n }\n\n private _setState(newState: SignalState) {\n this._state = newState;\n this._monitor.recordStateChangeTime();\n log('signal state changed', { status: this.getStatus() });\n this.statusChanged.emit(this.getStatus());\n }\n\n private _updateReconnectTimeout() {\n if (this._state !== SignalState.CONNECTED && this._state !== SignalState.CONNECTING) {\n this._reconnectAfter *= 2;\n this._reconnectAfter = Math.min(this._reconnectAfter, MAX_RECONNECT_TIMEOUT);\n }\n }\n\n private async _safeResetClient() {\n await this._connectionCtx?.dispose();\n this._connectionCtx = undefined;\n\n this._clientReady.reset();\n await this._client?.close().catch(() => {});\n this._client = undefined;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { trace } from '@dxos/tracing';\n\nimport type { Message } from '../signal-methods';\n\nexport class SignalClientMonitor {\n private readonly _performance = {\n sentMessages: 0,\n receivedMessages: 0,\n reconnectCounter: 0,\n joinCounter: 0,\n leaveCounter: 0,\n };\n\n /**\n * Timestamp of when the connection attempt was began.\n */\n private _connectionStarted = new Date();\n /**\n * Timestamp of last state change.\n */\n private _lastStateChange = new Date();\n\n public getRecordedTimestamps() {\n return {\n connectionStarted: this._connectionStarted,\n lastStateChange: this._lastStateChange,\n };\n }\n\n public recordStateChangeTime() {\n this._lastStateChange = new Date();\n }\n\n public recordConnectionStartTime() {\n this._connectionStarted = new Date();\n }\n\n public recordReconnect(params: { success: boolean }) {\n this._performance.reconnectCounter++;\n trace.metrics.increment('dxos.mesh.signal.signal-client.reconnect', 1, {\n tags: {\n success: params.success,\n },\n });\n }\n\n public recordJoin() {\n this._performance.joinCounter++;\n }\n\n public recordLeave() {\n this._performance.leaveCounter++;\n }\n\n public recordMessageReceived(message: Message) {\n this._performance.receivedMessages++;\n trace.metrics.increment('dxos.mesh.signal.signal-client.received-total', 1, {\n tags: createIdentityTags(message),\n });\n trace.metrics.distribution('dxos.mesh.signal.signal-client.bytes-in', getByteCount(message), {\n tags: createIdentityTags(message),\n });\n }\n\n public async recordMessageSending(message: Message, sendMessage: () => Promise<void>) {\n this._performance.sentMessages++;\n const tags = createIdentityTags(message);\n let success = true;\n try {\n const reqStart = Date.now();\n await sendMessage();\n const reqDuration = Date.now() - reqStart;\n trace.metrics.distribution('dxos.mesh.signal.signal-client.send-duration', reqDuration, { tags });\n trace.metrics.distribution('dxos.mesh.signal.signal-client.bytes-out', getByteCount(message), { tags });\n } catch (err) {\n success = false;\n }\n trace.metrics.increment('dxos.mesh.signal.signal-client.sent-total', 1, {\n tags: { ...tags, success },\n });\n }\n\n public recordStreamCloseErrors(count: number) {\n trace.metrics.increment('dxos.mesh.signal.signal-client.stream-close-errors', count);\n }\n\n public recordReconciliation(params: { success: boolean }) {\n trace.metrics.increment('dxos.mesh.signal.signal-client.reconciliation', 1, {\n tags: {\n success: params.success,\n },\n });\n }\n}\n\nconst getByteCount = (message: Message): number => {\n return (\n message.author.asUint8Array().byteLength +\n message.recipient.asUint8Array().byteLength +\n message.payload.type_url.length +\n message.payload.value.length\n );\n};\n\nconst createIdentityTags = (message: Message) => {\n return { peer: message.author.toHex() };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { asyncTimeout, Event } from '@dxos/async';\nimport type { Any, Stream } from '@dxos/codec-protobuf';\nimport { cancelWithContext, type Context } from '@dxos/context';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type Message as SignalMessage, type SwarmEvent } from '@dxos/protocols/proto/dxos/mesh/signal';\nimport { ComplexMap, ComplexSet, safeAwaitAll } from '@dxos/util';\n\nimport { type SignalRPCClient } from './signal-rpc-client';\nimport type { Message } from '../signal-methods';\n\nexport class SignalLocalState {\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 * Represent desired message subscriptions.\n */\n private readonly _subscribedMessages = new ComplexSet<{ peerId: PublicKey }>(({ peerId }) => peerId.toHex());\n\n /**\n * Message streams. Keys represents actually subscribed peers.\n * @internal\n */\n readonly messageStreams = new ComplexMap<PublicKey, Stream<SignalMessage>>((key) => key.toHex());\n\n /**\n * Event to use in tests to wait till subscription is successfully established.\n * @internal\n */\n readonly reconciled = new Event();\n\n constructor(\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\n async safeCloseStreams(): Promise<{ failureCount: number }> {\n const streams = ([...this._swarmStreams.values()] as Stream<any>[]).concat([...this.messageStreams.values()]);\n this._swarmStreams.clear();\n this.messageStreams.clear();\n const failureCount = (await safeAwaitAll(streams, (s) => s.close())).length;\n return { failureCount };\n }\n\n join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n this._joinedTopics.add({ topic, peerId });\n }\n\n leave({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n void this._swarmStreams.get({ topic, peerId })?.close();\n this._swarmStreams.delete({ topic, peerId });\n this._joinedTopics.delete({ topic, peerId });\n }\n\n subscribeMessages(peerId: PublicKey) {\n this._subscribedMessages.add({ peerId });\n }\n\n 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 public async reconcile(ctx: Context, client: SignalRPCClient) {\n await this._reconcileSwarmSubscriptions(ctx, client);\n await this._reconcileMessageSubscriptions(ctx, client);\n this.reconciled.emit();\n }\n\n private async _reconcileSwarmSubscriptions(ctx: Context, client: SignalRPCClient): Promise<void> {\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(cancelWithContext(ctx, client.join({ topic, peerId })), 5_000);\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 if (this._joinedTopics.has({ topic, peerId })) {\n log('swarm event', { swarmEvent });\n await this._onSwarmEvent({ topic, swarmEvent });\n }\n });\n\n // Saving swarm stream.\n this._swarmStreams.set({ topic, peerId }, swarmStream);\n }\n }\n\n private async _reconcileMessageSubscriptions(ctx: Context, client: SignalRPCClient): Promise<void> {\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(cancelWithContext(ctx, client.receiveMessages(peerId)), 5_000);\n messageStream.subscribe(async (signalMessage: SignalMessage) => {\n if (this._subscribedMessages.has({ peerId })) {\n const message: Message = {\n author: PublicKey.from(signalMessage.author),\n recipient: PublicKey.from(signalMessage.recipient),\n payload: signalMessage.payload,\n };\n await this._onMessage(message);\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 { scheduleTaskInterval, TimeoutError, Trigger } from '@dxos/async';\nimport { type Any, type Stream } 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, 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\nimport { SignalRpcClientMonitor } from './signal-rpc-client-monitor';\n\nconst SIGNAL_KEEPALIVE_INTERVAL = 10000;\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 getMetadata?: () => any;\n};\n\nexport type SignalRPCClientParams = {\n url: string;\n callbacks?: SignalCallbacks;\n};\n\nexport class SignalRPCClient {\n private readonly _socket: WebSocket;\n private readonly _rpc: ProtoRpcPeer<Services>;\n private readonly _connectTrigger = new Trigger();\n\n private _keepaliveCtx?: Context;\n\n private _closed = false;\n\n private readonly _url: string;\n private readonly _callbacks: SignalCallbacks;\n private readonly _closeComplete = new Trigger();\n\n private readonly _monitor = new SignalRpcClientMonitor();\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 if (this._closed) {\n await this._safeCloseRpc();\n return;\n }\n log(`RPC open ${this._url}`);\n this._callbacks.onConnected?.();\n this._connectTrigger.wake();\n this._keepaliveCtx = new Context();\n scheduleTaskInterval(\n this._keepaliveCtx,\n async () => {\n // TODO(nf): use RFC6455 ping/pong once implemented in the browser?\n // TODO(nf): check for pong response from server (once implemented)\n // Current implementation of signal server ignores all text data messages, and does not send a response.\n // However this is enough to detect breakages in the connection as TCP will reset the connection if ACKs are not received.\n this._socket?.send('__ping__');\n },\n SIGNAL_KEEPALIVE_INTERVAL,\n );\n } catch (err: any) {\n this._callbacks.onError?.(err);\n this._socket.close();\n this._closed = true;\n }\n };\n\n this._socket.onclose = async () => {\n log(`Disconnected ${this._url}`);\n this._callbacks.onDisconnected?.();\n this._closeComplete.wake();\n await this.close();\n };\n\n this._socket.onerror = async (event: WebSocket.ErrorEvent) => {\n if (this._closed) {\n this._socket.close();\n return;\n }\n this._closed = true;\n\n this._callbacks.onError?.(event.error ?? new Error(event.message));\n await this._safeCloseRpc();\n\n log.warn(`Socket ${event.type ?? 'unknown'} error`, { message: event.message, url: this._url });\n };\n\n log.trace('dxos.mesh.signal-rpc-client.constructor', trace.end({ id: traceId }));\n }\n\n async close() {\n if (this._closed) {\n return;\n }\n this._closed = true;\n\n await this._keepaliveCtx?.dispose();\n try {\n await this._safeCloseRpc();\n\n if (this._socket.readyState === WebSocket.OPEN || this._socket.readyState === WebSocket.CONNECTING) {\n // close() only starts the closing handshake.\n this._socket.close();\n }\n\n await this._closeComplete.wait({ timeout: 1_000 });\n } catch (err) {\n const failureReason = err instanceof TimeoutError ? 'timeout' : err?.constructor?.name ?? 'unknown';\n this._monitor.recordClientCloseFailure({ failureReason });\n }\n }\n\n async join({ topic, peerId }: { topic: PublicKey; peerId: PublicKey }) {\n log('join', { topic, peerId, metadata: this._callbacks?.getMetadata?.() });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n const swarmStream = this._rpc.rpc.Signal.join({\n swarm: topic.asUint8Array(),\n peer: peerId.asUint8Array(),\n metadata: this._callbacks?.getMetadata?.(),\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 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, metadata: this._callbacks?.getMetadata?.() });\n invariant(!this._closed, 'SignalRPCClient is closed');\n await this._connectTrigger.wait();\n await this._rpc.rpc.Signal.sendMessage({\n author: author.asUint8Array(),\n recipient: recipient.asUint8Array(),\n payload,\n metadata: this._callbacks?.getMetadata?.(),\n });\n }\n\n private async _safeCloseRpc() {\n try {\n this._connectTrigger.reset();\n await this._rpc.close();\n } catch (err) {\n log.catch(err);\n }\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { trace } from '@dxos/tracing';\n\nexport class SignalRpcClientMonitor {\n public recordClientCloseFailure(params: { failureReason: string }) {\n trace.metrics.increment('dxos.mesh.signal.signal-rpc-client.close-failure', 1, {\n tags: {\n reason: params.failureReason,\n },\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 SignalStatus } from '../signal-methods';\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 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';\nimport { BitField, safeAwaitAll } from '@dxos/util';\n\nimport { type SignalManager } from './signal-manager';\nimport { WebsocketSignalManagerMonitor } from './websocket-signal-manager-monitor';\nimport { SignalClient } from '../signal-client';\nimport { type SignalClientMethods, type SignalMethods, type SignalStatus } from '../signal-methods';\n\nconst MAX_SERVER_FAILURES = 5;\nconst WSS_SIGNAL_SERVER_REBOOT_DELAY = 3_000;\n\n/**\n * Manages connection to multiple Signal Servers over WebSocket\n */\nexport class WebsocketSignalManager implements SignalManager {\n private readonly _servers = new Map<string, SignalClientMethods>();\n private readonly _monitor = new WebsocketSignalManagerMonitor();\n\n /**\n * Used to avoid logging failed server restarts more than once until the server actually recovers.\n */\n private readonly _failedServersBitfield: Uint8Array;\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 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(\n private readonly _hosts: Runtime.Services.Signal[],\n private readonly _getMetadata?: () => any,\n ) {\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\n // TODO(burdon): Create factory to support different variants.\n const server = new SignalClient(\n host.server,\n async (message) => this.onMessage.emit(message),\n async (data) => this.swarmEvent.emit(data),\n this._getMetadata,\n );\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 }\n this._failedServersBitfield = BitField.zeros(this._hosts.length);\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 await safeAwaitAll(this._servers.values(), (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 await this._ctx.dispose();\n await safeAwaitAll(this._servers.values(), (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 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 });\n invariant(this._opened, 'Closed');\n\n void this._forEachServer(async (server, serverName, index) => {\n void server\n .sendMessage({ author, recipient, payload })\n .then(() => this._clearServerFailedFlag(serverName, index))\n .catch((err) => {\n if (err instanceof RateLimitExceededError) {\n log.info('WSS rate limit exceeded', { err });\n this._monitor.recordRateLimitExceeded();\n } else if (err instanceof TimeoutError || err.constructor.name === 'TimeoutError') {\n log.info('WSS sendMessage timeout', { err });\n void this.checkServerFailure(serverName, index);\n } else {\n log.warn(`error sending to ${serverName}`, { err });\n void this.checkServerFailure(serverName, index);\n }\n });\n });\n }\n\n @synchronized\n async checkServerFailure(serverName: string, index: number) {\n const failureCount = this.failureCount.get(serverName!) ?? 0;\n const isRestartRequired = failureCount > MAX_SERVER_FAILURES;\n this._monitor.recordServerFailure({ serverName, willRestart: isRestartRequired });\n if (isRestartRequired) {\n if (!BitField.get(this._failedServersBitfield, index)) {\n log.warn('too many failures for ws-server, restarting', { serverName, failureCount });\n BitField.set(this._failedServersBitfield, index, true);\n }\n await this.restartServer(serverName!);\n this.failureCount.set(serverName!, 0);\n return;\n }\n\n this.failureCount.set(serverName!, (this.failureCount.get(serverName!) ?? 0) + 1);\n }\n\n private _clearServerFailedFlag(serverName: string, index: number) {\n if (BitField.get(this._failedServersBitfield, index)) {\n log.info('server connection restored', { serverName });\n BitField.set(this._failedServersBitfield, index, false);\n this.failureCount.set(serverName!, 0);\n }\n }\n\n async subscribeMessages(peerId: PublicKey) {\n log('subscribed for message stream', { 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 });\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: SignalMethods, serverName: string, index: number) => Promise<ReturnType>,\n ): Promise<ReturnType[]> {\n return Promise.all(\n Array.from(this._servers.entries()).map(([serverName, server], idx) => fn(server, serverName, idx)),\n );\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { trace } from '@dxos/tracing';\n\nexport class WebsocketSignalManagerMonitor {\n public recordRateLimitExceeded() {\n trace.metrics.increment('dxos.mesh.signal.signal-manager.rate-limit-hit', 1);\n }\n\n public recordServerFailure(params: { serverName: string; willRestart: boolean }) {\n trace.metrics.increment('dxos.mesh.signal.signal-manager.server-failure', 1, {\n tags: {\n server: params.serverName,\n restarted: params.willRestart,\n },\n });\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { type DevicesService, type IdentityService } from '@dxos/protocols/proto/dxos/client/services';\nimport { DeviceKind } from '@dxos/protocols/proto/dxos/client/services';\n\nexport const setIdentityTags = ({\n identityService,\n devicesService,\n setTag,\n}: {\n identityService: IdentityService;\n devicesService: DevicesService;\n setTag: (k: string, v: string) => void;\n}) => {\n identityService.queryIdentity().subscribe((idqr) => {\n if (!idqr?.identity?.identityKey) {\n log('empty response from identity service', { idqr });\n return;\n }\n\n setTag('identityKey', idqr.identity.identityKey.truncate());\n });\n\n devicesService.queryDevices().subscribe((dqr) => {\n if (!dqr || !dqr.devices || dqr.devices.length === 0) {\n log('empty response from device service', { device: dqr });\n return;\n }\n invariant(dqr, 'empty response from device service');\n\n const thisDevice = dqr.devices.find((device) => device.kind === DeviceKind.CURRENT);\n if (!thisDevice) {\n log('no current device', { device: dqr });\n return;\n }\n setTag('deviceKey', thisDevice.deviceKey.truncate());\n });\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["TimeoutError", "scheduleExponentialBackoffTaskInterval", "scheduleTask", "scheduleTaskInterval", "Context", "invariant", "PublicKey", "log", "ProtocolTimeoutError", "schema", "trace", "ComplexMap", "ComplexSet", "trace", "MessengerMonitor", "recordMessageAckFailed", "trace", "metrics", "increment", "recordReliableMessage", "params", "tags", "success", "sent", "attempts", "sendAttempts", "MESSAGE_TIMEOUT", "ReliablePayload", "schema", "getCodecForType", "Acknowledgement", "RECEIVED_MESSAGES_GC_INTERVAL", "Messenger", "constructor", "signalManager", "retryDelay", "_monitor", "MessengerMonitor", "_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", "sendAttempts", "promise", "Promise", "resolve", "reject", "scheduleExponentialBackoffTaskInterval", "_encodeAndSend", "scheduleTask", "delete", "ProtocolTimeoutError", "TimeoutError", "MESSAGE_TIMEOUT", "recordReliableMessage", "sent", "set", "listen", "subscribeMessages", "listeners", "get", "Set", "add", "unsubscribe", "type_url", "value", "encode", "preserveAny", "_handleReliablePayload", "_handleAcknowledgement", "decode", "_sendAcknowledgement", "recordMessageAckFailed", "_callListeners", "to", "defaultListenerMap", "listener", "listenerMap", "start", "performance", "now", "key", "keys", "clear", "elapsed", "warn", "DeferredTask", "Event", "Trigger", "scheduleTask", "scheduleTaskInterval", "sleep", "cancelWithContext", "Resource", "invariant", "PublicKey", "log", "trace", "SignalState", "trace", "SignalClientMonitor", "_performance", "sentMessages", "receivedMessages", "reconnectCounter", "joinCounter", "leaveCounter", "_connectionStarted", "Date", "_lastStateChange", "getRecordedTimestamps", "connectionStarted", "lastStateChange", "recordStateChangeTime", "recordConnectionStartTime", "recordReconnect", "params", "trace", "metrics", "increment", "tags", "success", "recordJoin", "recordLeave", "recordMessageReceived", "message", "createIdentityTags", "distribution", "getByteCount", "recordMessageSending", "sendMessage", "reqStart", "now", "reqDuration", "err", "recordStreamCloseErrors", "count", "recordReconciliation", "author", "asUint8Array", "byteLength", "recipient", "payload", "type_url", "length", "value", "peer", "toHex", "asyncTimeout", "Event", "cancelWithContext", "PublicKey", "log", "ComplexMap", "ComplexSet", "safeAwaitAll", "SignalLocalState", "constructor", "_onMessage", "_onSwarmEvent", "_swarmStreams", "topic", "peerId", "toHex", "_joinedTopics", "_subscribedMessages", "messageStreams", "key", "reconciled", "safeCloseStreams", "streams", "values", "concat", "clear", "failureCount", "s", "close", "length", "join", "add", "leave", "get", "delete", "subscribeMessages", "unsubscribeMessages", "reconcile", "ctx", "client", "_reconcileSwarmSubscriptions", "_reconcileMessageSubscriptions", "emit", "keys", "has", "swarmStream", "subscribe", "swarmEvent", "set", "messageStream", "receiveMessages", "signalMessage", "message", "author", "from", "recipient", "payload", "WebSocket", "scheduleTaskInterval", "TimeoutError", "Trigger", "Context", "invariant", "PublicKey", "log", "schema", "trace", "createProtoRpcPeer", "trace", "SignalRpcClientMonitor", "recordClientCloseFailure", "params", "trace", "metrics", "increment", "tags", "reason", "failureReason", "SIGNAL_KEEPALIVE_INTERVAL", "SignalRPCClient", "constructor", "url", "callbacks", "_connectTrigger", "Trigger", "_closed", "_closeComplete", "_monitor", "SignalRpcClientMonitor", "traceId", "PublicKey", "random", "toHex", "log", "trace", "begin", "id", "_url", "_callbacks", "_socket", "WebSocket", "_rpc", "createProtoRpcPeer", "requested", "Signal", "schema", "getService", "noHandshake", "port", "send", "msg", "err", "warn", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "encodingOptions", "preserveAny", "onopen", "open", "_safeCloseRpc", "onConnected", "wake", "_keepaliveCtx", "Context", "scheduleTaskInterval", "onError", "close", "onclose", "onDisconnected", "onerror", "event", "error", "Error", "message", "type", "end", "dispose", "readyState", "OPEN", "CONNECTING", "wait", "timeout", "failureReason", "TimeoutError", "name", "recordClientCloseFailure", "join", "topic", "peerId", "metadata", "getMetadata", "invariant", "swarmStream", "rpc", "swarm", "asUint8Array", "peer", "waitUntilReady", "receiveMessages", "messageStream", "sendMessage", "author", "recipient", "payload", "reset", "catch", "DEFAULT_RECONNECT_TIMEOUT", "MAX_RECONNECT_TIMEOUT", "ERROR_RECONCILE_DELAY", "RECONCILE_INTERVAL", "SignalClient", "Resource", "constructor", "_host", "onMessage", "onSwarmEvent", "_getMetadata", "_monitor", "SignalClientMonitor", "_state", "SignalState", "CLOSED", "_lastReconciliationFailed", "_clientReady", "Trigger", "_reconnectAfter", "_instanceId", "PublicKey", "random", "toHex", "statusChanged", "Event", "startsWith", "Error", "localState", "SignalLocalState", "message", "recordMessageReceived", "_open", "log", "trace", "begin", "id", "CONNECTED", "CONNECTING", "includes", "_setState", "_reconcileTask", "DeferredTask", "_ctx", "cancelWithContext", "_connectionCtx", "wait", "timeout", "invariant", "reconcile", "_client", "recordReconciliation", "success", "err", "scheduleTaskInterval", "schedule", "_reconnectTask", "_reconnect", "recordReconnect", "_createClient", "end", "_catch", "disposed", "warn", "_scheduleReconcileAfterError", "_close", "_safeResetClient", "getStatus", "host", "state", "error", "_lastError", "reconnectIn", "getRecordedTimestamps", "join", "args", "topic", "peerId", "recordJoin", "leave", "recordLeave", "sendMessage", "msg", "recordMessageSending", "subscribeMessages", "unsubscribeMessages", "scheduleTask", "recordConnectionStartTime", "derive", "onDispose", "failureCount", "safeCloseStreams", "recordStreamCloseErrors", "client", "SignalRPCClient", "url", "callbacks", "onConnected", "_onConnected", "onDisconnected", "ERROR", "DISCONNECTED", "_onDisconnected", "onError", "getMetadata", "undefined", "RECONNECTING", "info", "sleep", "wake", "options", "_updateReconnectTimeout", "newState", "recordStateChangeTime", "status", "emit", "Math", "min", "dispose", "reset", "close", "catch", "Event", "Trigger", "Context", "invariant", "PublicKey", "log", "schema", "ComplexMap", "ComplexSet", "MemorySignalManagerContext", "swarmEvent", "swarms", "hash", "connections", "MemorySignalManager", "constructor", "_context", "statusChanged", "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", "BitField", "safeAwaitAll", "trace", "WebsocketSignalManagerMonitor", "recordRateLimitExceeded", "trace", "metrics", "increment", "recordServerFailure", "params", "tags", "server", "serverName", "restarted", "willRestart", "MAX_SERVER_FAILURES", "WSS_SIGNAL_SERVER_REBOOT_DELAY", "WebsocketSignalManager", "constructor", "_hosts", "_getMetadata", "_servers", "Map", "_monitor", "WebsocketSignalManagerMonitor", "_opened", "failureCount", "statusChanged", "Event", "swarmEvent", "onMessage", "_instanceId", "PublicKey", "random", "toHex", "log", "hosts", "host", "has", "server", "SignalClient", "message", "emit", "data", "on", "getStatus", "set", "_failedServersBitfield", "BitField", "zeros", "length", "open", "trace", "begin", "id", "_initContext", "safeAwaitAll", "values", "end", "close", "_ctx", "dispose", "restartServer", "serverName", "invariant", "get", "sleep", "Array", "from", "map", "join", "topic", "peerId", "_forEachServer", "leave", "sendMessage", "author", "recipient", "payload", "index", "then", "_clearServerFailedFlag", "catch", "err", "RateLimitExceededError", "info", "recordRateLimitExceeded", "TimeoutError", "name", "checkServerFailure", "warn", "isRestartRequired", "recordServerFailure", "willRestart", "subscribeMessages", "unsubscribeMessages", "Context", "onError", "fn", "Promise", "all", "entries", "idx", "synchronized", "invariant", "log", "DeviceKind", "setIdentityTags", "identityService", "devicesService", "setTag", "queryIdentity", "subscribe", "idqr", "identity", "identityKey", "truncate", "queryDevices", "dqr", "devices", "length", "device", "thisDevice", "find", "kind", "CURRENT", "deviceKey"]
7
7
  }