@anam-ai/js-sdk 3.4.1-oz-alpha.5 → 3.5.0-mic-test.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main/AnamClient.d.ts.map +1 -0
- package/dist/main/AnamClient.js +424 -0
- package/dist/main/AnamClient.js.map +1 -0
- package/dist/{types → main}/index.d.ts +2 -1
- package/dist/main/index.d.ts.map +1 -0
- package/dist/main/index.js +50 -0
- package/dist/main/index.js.map +1 -0
- package/dist/{types → main}/lib/ClientError.d.ts +1 -0
- package/dist/main/lib/ClientError.d.ts.map +1 -0
- package/dist/main/lib/ClientError.js +34 -0
- package/dist/main/lib/ClientError.js.map +1 -0
- package/dist/main/lib/ClientMetrics.js +287 -0
- package/dist/main/lib/ClientMetrics.js.map +1 -0
- package/dist/{types → main}/lib/constants.d.ts +0 -1
- package/dist/{types → main}/lib/constants.d.ts.map +1 -1
- package/dist/main/lib/constants.js +14 -0
- package/dist/main/lib/constants.js.map +1 -0
- package/dist/main/lib/correlationId.js +13 -0
- package/dist/main/lib/correlationId.js.map +1 -0
- package/dist/main/lib/version.js +6 -0
- package/dist/main/lib/version.js.map +1 -0
- package/dist/{types → main}/modules/CoreApiRestClient.d.ts.map +1 -1
- package/dist/main/modules/CoreApiRestClient.js +127 -0
- package/dist/main/modules/CoreApiRestClient.js.map +1 -0
- package/dist/main/modules/EngineApiRestClient.js +42 -0
- package/dist/main/modules/EngineApiRestClient.js.map +1 -0
- package/dist/main/modules/InternalEventEmitter.js +28 -0
- package/dist/main/modules/InternalEventEmitter.js.map +1 -0
- package/dist/main/modules/MessageHistoryClient.js +70 -0
- package/dist/main/modules/MessageHistoryClient.js.map +1 -0
- package/dist/main/modules/PublicEventEmitter.js +37 -0
- package/dist/main/modules/PublicEventEmitter.js.map +1 -0
- package/dist/{types → main}/modules/SignallingClient.d.ts +14 -8
- package/dist/main/modules/SignallingClient.d.ts.map +1 -0
- package/dist/main/modules/SignallingClient.js +210 -0
- package/dist/main/modules/SignallingClient.js.map +1 -0
- package/dist/{types → main}/modules/StreamingClient.d.ts +8 -0
- package/dist/main/modules/StreamingClient.d.ts.map +1 -0
- package/dist/main/modules/StreamingClient.js +590 -0
- package/dist/main/modules/StreamingClient.js.map +1 -0
- package/dist/main/modules/index.js +18 -0
- package/dist/main/modules/index.js.map +1 -0
- package/dist/main/types/AnamClientOptions.js +3 -0
- package/dist/main/types/AnamClientOptions.js.map +1 -0
- package/dist/main/types/AnamInternalClientOptions.js +3 -0
- package/dist/main/types/AnamInternalClientOptions.js.map +1 -0
- package/dist/main/types/AnamPublicClientOptions.js +3 -0
- package/dist/main/types/AnamPublicClientOptions.js.map +1 -0
- package/dist/main/types/InputAudioState.d.ts +11 -0
- package/dist/main/types/InputAudioState.d.ts.map +1 -0
- package/dist/main/types/InputAudioState.js +11 -0
- package/dist/main/types/InputAudioState.js.map +1 -0
- package/dist/main/types/PersonaConfig.js +8 -0
- package/dist/main/types/PersonaConfig.js.map +1 -0
- package/dist/main/types/TalkMessageStream.js +93 -0
- package/dist/main/types/TalkMessageStream.js.map +1 -0
- package/dist/main/types/TalkMessageStreamState.js +11 -0
- package/dist/main/types/TalkMessageStreamState.js.map +1 -0
- package/dist/main/types/VoiceDetectionOptions.js +3 -0
- package/dist/main/types/VoiceDetectionOptions.js.map +1 -0
- package/dist/main/types/coreApi/CoreApiRestClientOptions.js +3 -0
- package/dist/main/types/coreApi/CoreApiRestClientOptions.js.map +1 -0
- package/dist/main/types/coreApi/StartSessionOptions.js +3 -0
- package/dist/main/types/coreApi/StartSessionOptions.js.map +1 -0
- package/dist/{types → main}/types/coreApi/StartSessionResponse.d.ts +2 -2
- package/dist/{types → main}/types/coreApi/StartSessionResponse.d.ts.map +1 -1
- package/dist/main/types/coreApi/StartSessionResponse.js +3 -0
- package/dist/main/types/coreApi/StartSessionResponse.js.map +1 -0
- package/dist/main/types/coreApi/index.js +3 -0
- package/dist/main/types/coreApi/index.js.map +1 -0
- package/dist/main/types/engineApi/EngineApiRestClientOptions.js +3 -0
- package/dist/main/types/engineApi/EngineApiRestClientOptions.js.map +1 -0
- package/dist/main/types/engineApi/index.js +2 -0
- package/dist/main/types/engineApi/index.js.map +1 -0
- package/dist/main/types/events/EventCallback.js +3 -0
- package/dist/main/types/events/EventCallback.js.map +1 -0
- package/dist/main/types/events/index.js +10 -0
- package/dist/main/types/events/index.js.map +1 -0
- package/dist/main/types/events/internal/InternalEvent.js +10 -0
- package/dist/main/types/events/internal/InternalEvent.js.map +1 -0
- package/dist/main/types/events/internal/InternalEventCallbacks.js +4 -0
- package/dist/main/types/events/internal/InternalEventCallbacks.js.map +1 -0
- package/dist/{types → main}/types/events/public/AnamEvent.d.ts +4 -1
- package/dist/{types → main}/types/events/public/AnamEvent.d.ts.map +1 -1
- package/dist/main/types/events/public/AnamEvent.js +21 -0
- package/dist/main/types/events/public/AnamEvent.js.map +1 -0
- package/dist/main/types/events/public/ConnectionClosedCodes.js +12 -0
- package/dist/main/types/events/public/ConnectionClosedCodes.js.map +1 -0
- package/dist/{types → main}/types/events/public/EventCallbacks.d.ts +3 -0
- package/dist/{types → main}/types/events/public/EventCallbacks.d.ts.map +1 -1
- package/dist/main/types/events/public/EventCallbacks.js +4 -0
- package/dist/main/types/events/public/EventCallbacks.js.map +1 -0
- package/dist/{types → main}/types/index.d.ts +1 -0
- package/dist/{types → main}/types/index.d.ts.map +1 -1
- package/dist/main/types/index.js +16 -0
- package/dist/main/types/index.js.map +1 -0
- package/dist/main/types/messageHistory/Message.js +3 -0
- package/dist/main/types/messageHistory/Message.js.map +1 -0
- package/dist/main/types/messageHistory/MessageRole.js +9 -0
- package/dist/main/types/messageHistory/MessageRole.js.map +1 -0
- package/dist/main/types/messageHistory/MessageStreamEvent.js +3 -0
- package/dist/main/types/messageHistory/MessageStreamEvent.js.map +1 -0
- package/dist/main/types/messageHistory/index.js +6 -0
- package/dist/main/types/messageHistory/index.js.map +1 -0
- package/dist/{types → main}/types/signalling/SignalMessage.d.ts +0 -2
- package/dist/{types → main}/types/signalling/SignalMessage.d.ts.map +1 -1
- package/dist/main/types/signalling/SignalMessage.js +16 -0
- package/dist/main/types/signalling/SignalMessage.js.map +1 -0
- package/dist/main/types/signalling/SignallingClientOptions.d.ts +12 -0
- package/dist/main/types/signalling/SignallingClientOptions.d.ts.map +1 -0
- package/dist/main/types/signalling/SignallingClientOptions.js +3 -0
- package/dist/main/types/signalling/SignallingClientOptions.js.map +1 -0
- package/dist/main/types/signalling/TalkMessageStreamPayload.js +3 -0
- package/dist/main/types/signalling/TalkMessageStreamPayload.js.map +1 -0
- package/dist/main/types/signalling/TalkStreamInterruptedSignalMessage.js +11 -0
- package/dist/main/types/signalling/TalkStreamInterruptedSignalMessage.js.map +1 -0
- package/dist/main/types/signalling/index.d.ts +4 -0
- package/dist/main/types/signalling/index.d.ts.map +1 -0
- package/dist/main/types/signalling/index.js +6 -0
- package/dist/main/types/signalling/index.js.map +1 -0
- package/dist/main/types/streaming/InputAudioOptions.js +3 -0
- package/dist/main/types/streaming/InputAudioOptions.js.map +1 -0
- package/dist/main/types/streaming/StreamingClientOptions.js +3 -0
- package/dist/main/types/streaming/StreamingClientOptions.js.map +1 -0
- package/dist/main/types/streaming/WebRtcTextMessageEvent.js +3 -0
- package/dist/main/types/streaming/WebRtcTextMessageEvent.js.map +1 -0
- package/dist/main/types/streaming/index.js +3 -0
- package/dist/main/types/streaming/index.js.map +1 -0
- package/dist/module/AnamClient.d.ts +61 -0
- package/dist/module/AnamClient.d.ts.map +1 -0
- package/dist/module/AnamClient.js +421 -0
- package/dist/module/AnamClient.js.map +1 -0
- package/dist/module/index.d.ts +26 -0
- package/dist/module/index.d.ts.map +1 -0
- package/dist/module/index.js +27 -0
- package/dist/module/index.js.map +1 -0
- package/dist/module/lib/ClientError.d.ts +19 -0
- package/dist/module/lib/ClientError.d.ts.map +1 -0
- package/dist/module/lib/ClientError.js +30 -0
- package/dist/module/lib/ClientError.js.map +1 -0
- package/dist/module/lib/ClientMetrics.d.ts +56 -0
- package/dist/module/lib/ClientMetrics.d.ts.map +1 -0
- package/dist/module/lib/ClientMetrics.js +280 -0
- package/dist/module/lib/ClientMetrics.js.map +1 -0
- package/dist/module/lib/constants.d.ts +10 -0
- package/dist/module/lib/constants.d.ts.map +1 -0
- package/dist/module/lib/constants.js +11 -0
- package/dist/module/lib/constants.js.map +1 -0
- package/dist/module/lib/correlationId.d.ts +2 -0
- package/dist/module/lib/correlationId.d.ts.map +1 -0
- package/dist/module/lib/correlationId.js +9 -0
- package/dist/module/lib/correlationId.js.map +1 -0
- package/dist/module/lib/version.d.ts +3 -0
- package/dist/module/lib/version.d.ts.map +1 -0
- package/dist/module/lib/version.js +3 -0
- package/dist/module/lib/version.js.map +1 -0
- package/dist/module/modules/CoreApiRestClient.d.ts +13 -0
- package/dist/module/modules/CoreApiRestClient.d.ts.map +1 -0
- package/dist/module/modules/CoreApiRestClient.js +123 -0
- package/dist/module/modules/CoreApiRestClient.js.map +1 -0
- package/dist/module/modules/EngineApiRestClient.d.ts +7 -0
- package/dist/module/modules/EngineApiRestClient.d.ts.map +1 -0
- package/dist/module/modules/EngineApiRestClient.js +38 -0
- package/dist/module/modules/EngineApiRestClient.js.map +1 -0
- package/dist/module/modules/InternalEventEmitter.d.ts +9 -0
- package/dist/module/modules/InternalEventEmitter.d.ts.map +1 -0
- package/dist/module/modules/InternalEventEmitter.js +24 -0
- package/dist/module/modules/InternalEventEmitter.js.map +1 -0
- package/dist/module/modules/MessageHistoryClient.d.ts +13 -0
- package/dist/module/modules/MessageHistoryClient.d.ts.map +1 -0
- package/dist/module/modules/MessageHistoryClient.js +66 -0
- package/dist/module/modules/MessageHistoryClient.js.map +1 -0
- package/dist/module/modules/PublicEventEmitter.d.ts +9 -0
- package/dist/module/modules/PublicEventEmitter.d.ts.map +1 -0
- package/dist/module/modules/PublicEventEmitter.js +33 -0
- package/dist/module/modules/PublicEventEmitter.js.map +1 -0
- package/dist/module/modules/SignallingClient.d.ts +31 -0
- package/dist/module/modules/SignallingClient.d.ts.map +1 -0
- package/dist/module/modules/SignallingClient.js +206 -0
- package/dist/module/modules/SignallingClient.js.map +1 -0
- package/dist/module/modules/StreamingClient.d.ts +72 -0
- package/dist/module/modules/StreamingClient.d.ts.map +1 -0
- package/dist/module/modules/StreamingClient.js +586 -0
- package/dist/module/modules/StreamingClient.js.map +1 -0
- package/dist/module/modules/index.d.ts +8 -0
- package/dist/module/modules/index.d.ts.map +1 -0
- package/dist/module/modules/index.js +8 -0
- package/dist/module/modules/index.js.map +1 -0
- package/dist/module/types/AnamClientOptions.d.ts +4 -0
- package/dist/module/types/AnamClientOptions.d.ts.map +1 -0
- package/dist/module/types/AnamClientOptions.js +2 -0
- package/dist/module/types/AnamClientOptions.js.map +1 -0
- package/dist/module/types/AnamInternalClientOptions.d.ts +4 -0
- package/dist/module/types/AnamInternalClientOptions.d.ts.map +1 -0
- package/dist/module/types/AnamInternalClientOptions.js +2 -0
- package/dist/module/types/AnamInternalClientOptions.js.map +1 -0
- package/dist/module/types/AnamPublicClientOptions.d.ts +13 -0
- package/dist/module/types/AnamPublicClientOptions.d.ts.map +1 -0
- package/dist/module/types/AnamPublicClientOptions.js +2 -0
- package/dist/module/types/AnamPublicClientOptions.js.map +1 -0
- package/dist/module/types/InputAudioState.d.ts +11 -0
- package/dist/module/types/InputAudioState.d.ts.map +1 -0
- package/dist/module/types/InputAudioState.js +8 -0
- package/dist/module/types/InputAudioState.js.map +1 -0
- package/dist/module/types/PersonaConfig.d.ts +13 -0
- package/dist/module/types/PersonaConfig.d.ts.map +1 -0
- package/dist/module/types/PersonaConfig.js +4 -0
- package/dist/module/types/PersonaConfig.js.map +1 -0
- package/dist/module/types/TalkMessageStream.d.ts +18 -0
- package/dist/module/types/TalkMessageStream.d.ts.map +1 -0
- package/dist/module/types/TalkMessageStream.js +89 -0
- package/dist/module/types/TalkMessageStream.js.map +1 -0
- package/dist/module/types/TalkMessageStreamState.d.ts +7 -0
- package/dist/module/types/TalkMessageStreamState.d.ts.map +1 -0
- package/dist/module/types/TalkMessageStreamState.js +8 -0
- package/dist/module/types/TalkMessageStreamState.js.map +1 -0
- package/dist/module/types/VoiceDetectionOptions.d.ts +4 -0
- package/dist/module/types/VoiceDetectionOptions.d.ts.map +1 -0
- package/dist/module/types/VoiceDetectionOptions.js +2 -0
- package/dist/module/types/VoiceDetectionOptions.js.map +1 -0
- package/dist/module/types/coreApi/CoreApiRestClientOptions.d.ts +5 -0
- package/dist/module/types/coreApi/CoreApiRestClientOptions.d.ts.map +1 -0
- package/dist/module/types/coreApi/CoreApiRestClientOptions.js +2 -0
- package/dist/module/types/coreApi/CoreApiRestClientOptions.js.map +1 -0
- package/dist/module/types/coreApi/StartSessionOptions.d.ts +5 -0
- package/dist/module/types/coreApi/StartSessionOptions.d.ts.map +1 -0
- package/dist/module/types/coreApi/StartSessionOptions.js +2 -0
- package/dist/module/types/coreApi/StartSessionOptions.js.map +1 -0
- package/dist/module/types/coreApi/StartSessionResponse.d.ts +13 -0
- package/dist/module/types/coreApi/StartSessionResponse.d.ts.map +1 -0
- package/dist/module/types/coreApi/StartSessionResponse.js +2 -0
- package/dist/module/types/coreApi/StartSessionResponse.js.map +1 -0
- package/dist/module/types/coreApi/index.d.ts +4 -0
- package/dist/module/types/coreApi/index.d.ts.map +1 -0
- package/dist/module/types/coreApi/index.js +2 -0
- package/dist/module/types/coreApi/index.js.map +1 -0
- package/dist/module/types/engineApi/EngineApiRestClientOptions.d.ts +4 -0
- package/dist/module/types/engineApi/EngineApiRestClientOptions.d.ts.map +1 -0
- package/dist/module/types/engineApi/EngineApiRestClientOptions.js +2 -0
- package/dist/module/types/engineApi/EngineApiRestClientOptions.js.map +1 -0
- package/dist/module/types/engineApi/index.d.ts +1 -0
- package/dist/module/types/engineApi/index.d.ts.map +1 -0
- package/dist/module/types/engineApi/index.js +2 -0
- package/dist/module/types/engineApi/index.js.map +1 -0
- package/dist/module/types/events/EventCallback.d.ts +2 -0
- package/dist/module/types/events/EventCallback.d.ts.map +1 -0
- package/dist/module/types/events/EventCallback.js +2 -0
- package/dist/module/types/events/EventCallback.js.map +1 -0
- package/dist/module/types/events/index.d.ts +7 -0
- package/dist/module/types/events/index.d.ts.map +1 -0
- package/dist/module/types/events/index.js +4 -0
- package/dist/module/types/events/index.js.map +1 -0
- package/dist/module/types/events/internal/InternalEvent.d.ts +6 -0
- package/dist/module/types/events/internal/InternalEvent.d.ts.map +1 -0
- package/dist/module/types/events/internal/InternalEvent.js +7 -0
- package/dist/module/types/events/internal/InternalEvent.js.map +1 -0
- package/dist/module/types/events/internal/InternalEventCallbacks.d.ts +7 -0
- package/dist/module/types/events/internal/InternalEventCallbacks.d.ts.map +1 -0
- package/dist/module/types/events/internal/InternalEventCallbacks.js +2 -0
- package/dist/module/types/events/internal/InternalEventCallbacks.js.map +1 -0
- package/dist/module/types/events/public/AnamEvent.d.ts +17 -0
- package/dist/module/types/events/public/AnamEvent.d.ts.map +1 -0
- package/dist/module/types/events/public/AnamEvent.js +18 -0
- package/dist/module/types/events/public/AnamEvent.js.map +1 -0
- package/dist/module/types/events/public/ConnectionClosedCodes.d.ts +8 -0
- package/dist/module/types/events/public/ConnectionClosedCodes.d.ts.map +1 -0
- package/dist/module/types/events/public/ConnectionClosedCodes.js +9 -0
- package/dist/module/types/events/public/ConnectionClosedCodes.js.map +1 -0
- package/dist/module/types/events/public/EventCallbacks.d.ts +19 -0
- package/dist/module/types/events/public/EventCallbacks.d.ts.map +1 -0
- package/dist/module/types/events/public/EventCallbacks.js +2 -0
- package/dist/module/types/events/public/EventCallbacks.js.map +1 -0
- package/dist/module/types/index.d.ts +15 -0
- package/dist/module/types/index.d.ts.map +1 -0
- package/dist/module/types/index.js +7 -0
- package/dist/module/types/index.js.map +1 -0
- package/dist/module/types/messageHistory/Message.d.ts +8 -0
- package/dist/module/types/messageHistory/Message.d.ts.map +1 -0
- package/dist/module/types/messageHistory/Message.js +2 -0
- package/dist/module/types/messageHistory/Message.js.map +1 -0
- package/dist/module/types/messageHistory/MessageRole.d.ts +5 -0
- package/dist/module/types/messageHistory/MessageRole.d.ts.map +1 -0
- package/dist/module/types/messageHistory/MessageRole.js +6 -0
- package/dist/module/types/messageHistory/MessageRole.js.map +1 -0
- package/dist/module/types/messageHistory/MessageStreamEvent.d.ts +9 -0
- package/dist/module/types/messageHistory/MessageStreamEvent.d.ts.map +1 -0
- package/dist/module/types/messageHistory/MessageStreamEvent.js +2 -0
- package/dist/module/types/messageHistory/MessageStreamEvent.js.map +1 -0
- package/dist/module/types/messageHistory/index.d.ts +4 -0
- package/dist/module/types/messageHistory/index.d.ts.map +1 -0
- package/dist/module/types/messageHistory/index.js +2 -0
- package/dist/module/types/messageHistory/index.js.map +1 -0
- package/dist/module/types/signalling/SignalMessage.d.ts +17 -0
- package/dist/module/types/signalling/SignalMessage.d.ts.map +1 -0
- package/dist/module/types/signalling/SignalMessage.js +13 -0
- package/dist/module/types/signalling/SignalMessage.js.map +1 -0
- package/dist/module/types/signalling/SignallingClientOptions.d.ts +12 -0
- package/dist/module/types/signalling/SignallingClientOptions.d.ts.map +1 -0
- package/dist/module/types/signalling/SignallingClientOptions.js +2 -0
- package/dist/module/types/signalling/SignallingClientOptions.js.map +1 -0
- package/dist/module/types/signalling/TalkMessageStreamPayload.d.ts +7 -0
- package/dist/module/types/signalling/TalkMessageStreamPayload.d.ts.map +1 -0
- package/dist/module/types/signalling/TalkMessageStreamPayload.js +2 -0
- package/dist/module/types/signalling/TalkMessageStreamPayload.js.map +1 -0
- package/dist/module/types/signalling/TalkStreamInterruptedSignalMessage.d.ts +5 -0
- package/dist/module/types/signalling/TalkStreamInterruptedSignalMessage.d.ts.map +1 -0
- package/dist/module/types/signalling/TalkStreamInterruptedSignalMessage.js +7 -0
- package/dist/module/types/signalling/TalkStreamInterruptedSignalMessage.js.map +1 -0
- package/dist/module/types/signalling/index.d.ts +4 -0
- package/dist/module/types/signalling/index.d.ts.map +1 -0
- package/dist/module/types/signalling/index.js +2 -0
- package/dist/module/types/signalling/index.js.map +1 -0
- package/dist/module/types/streaming/InputAudioOptions.d.ts +8 -0
- package/dist/module/types/streaming/InputAudioOptions.d.ts.map +1 -0
- package/dist/module/types/streaming/InputAudioOptions.js +2 -0
- package/dist/module/types/streaming/InputAudioOptions.js.map +1 -0
- package/dist/module/types/streaming/StreamingClientOptions.d.ts +14 -0
- package/dist/module/types/streaming/StreamingClientOptions.d.ts.map +1 -0
- package/dist/module/types/streaming/StreamingClientOptions.js +2 -0
- package/dist/module/types/streaming/StreamingClientOptions.js.map +1 -0
- package/dist/module/types/streaming/WebRtcTextMessageEvent.d.ts +9 -0
- package/dist/module/types/streaming/WebRtcTextMessageEvent.d.ts.map +1 -0
- package/dist/module/types/streaming/WebRtcTextMessageEvent.js +2 -0
- package/dist/module/types/streaming/WebRtcTextMessageEvent.js.map +1 -0
- package/dist/module/types/streaming/index.d.ts +4 -0
- package/dist/module/types/streaming/index.d.ts.map +1 -0
- package/dist/module/types/streaming/index.js +2 -0
- package/dist/module/types/streaming/index.js.map +1 -0
- package/dist/umd/anam.js +2 -0
- package/dist/umd/anam.js.LICENSE.txt +8 -0
- package/package.json +15 -29
- package/dist/index.cjs.js +0 -31
- package/dist/index.cjs.js.map +0 -7
- package/dist/index.esm.js +0 -31
- package/dist/index.esm.js.map +0 -7
- package/dist/index.js +0 -16
- package/dist/index.umd.js +0 -31
- package/dist/index.umd.js.map +0 -7
- package/dist/types/AnamClient.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/lib/ClientError.d.ts.map +0 -1
- package/dist/types/modules/SignallingClient.d.ts.map +0 -1
- package/dist/types/modules/StreamingClient.d.ts.map +0 -1
- package/dist/types/types/InputAudioState.d.ts +0 -4
- package/dist/types/types/InputAudioState.d.ts.map +0 -1
- package/dist/types/types/signalling/SignallingClientOptions.d.ts +0 -5
- package/dist/types/types/signalling/SignallingClientOptions.d.ts.map +0 -1
- package/dist/types/types/signalling/index.d.ts +0 -4
- package/dist/types/types/signalling/index.d.ts.map +0 -1
- package/src/shims/browser-polyfills.js +0 -11
- package/src/shims/empty.js +0 -3
- package/src/shims/keyv-mock.js +0 -13
- /package/dist/{types → main}/AnamClient.d.ts +0 -0
- /package/dist/{types → main}/lib/ClientMetrics.d.ts +0 -0
- /package/dist/{types → main}/lib/ClientMetrics.d.ts.map +0 -0
- /package/dist/{types → main}/lib/correlationId.d.ts +0 -0
- /package/dist/{types → main}/lib/correlationId.d.ts.map +0 -0
- /package/dist/{types → main}/lib/version.d.ts +0 -0
- /package/dist/{types → main}/lib/version.d.ts.map +0 -0
- /package/dist/{types → main}/modules/CoreApiRestClient.d.ts +0 -0
- /package/dist/{types → main}/modules/EngineApiRestClient.d.ts +0 -0
- /package/dist/{types → main}/modules/EngineApiRestClient.d.ts.map +0 -0
- /package/dist/{types → main}/modules/InternalEventEmitter.d.ts +0 -0
- /package/dist/{types → main}/modules/InternalEventEmitter.d.ts.map +0 -0
- /package/dist/{types → main}/modules/MessageHistoryClient.d.ts +0 -0
- /package/dist/{types → main}/modules/MessageHistoryClient.d.ts.map +0 -0
- /package/dist/{types → main}/modules/PublicEventEmitter.d.ts +0 -0
- /package/dist/{types → main}/modules/PublicEventEmitter.d.ts.map +0 -0
- /package/dist/{types → main}/modules/index.d.ts +0 -0
- /package/dist/{types → main}/modules/index.d.ts.map +0 -0
- /package/dist/{types → main}/types/AnamClientOptions.d.ts +0 -0
- /package/dist/{types → main}/types/AnamClientOptions.d.ts.map +0 -0
- /package/dist/{types → main}/types/AnamInternalClientOptions.d.ts +0 -0
- /package/dist/{types → main}/types/AnamInternalClientOptions.d.ts.map +0 -0
- /package/dist/{types → main}/types/AnamPublicClientOptions.d.ts +0 -0
- /package/dist/{types → main}/types/AnamPublicClientOptions.d.ts.map +0 -0
- /package/dist/{types → main}/types/PersonaConfig.d.ts +0 -0
- /package/dist/{types → main}/types/PersonaConfig.d.ts.map +0 -0
- /package/dist/{types → main}/types/TalkMessageStream.d.ts +0 -0
- /package/dist/{types → main}/types/TalkMessageStream.d.ts.map +0 -0
- /package/dist/{types → main}/types/TalkMessageStreamState.d.ts +0 -0
- /package/dist/{types → main}/types/TalkMessageStreamState.d.ts.map +0 -0
- /package/dist/{types → main}/types/VoiceDetectionOptions.d.ts +0 -0
- /package/dist/{types → main}/types/VoiceDetectionOptions.d.ts.map +0 -0
- /package/dist/{types → main}/types/coreApi/CoreApiRestClientOptions.d.ts +0 -0
- /package/dist/{types → main}/types/coreApi/CoreApiRestClientOptions.d.ts.map +0 -0
- /package/dist/{types → main}/types/coreApi/StartSessionOptions.d.ts +0 -0
- /package/dist/{types → main}/types/coreApi/StartSessionOptions.d.ts.map +0 -0
- /package/dist/{types → main}/types/coreApi/index.d.ts +0 -0
- /package/dist/{types → main}/types/coreApi/index.d.ts.map +0 -0
- /package/dist/{types → main}/types/engineApi/EngineApiRestClientOptions.d.ts +0 -0
- /package/dist/{types → main}/types/engineApi/EngineApiRestClientOptions.d.ts.map +0 -0
- /package/dist/{types → main}/types/engineApi/index.d.ts +0 -0
- /package/dist/{types → main}/types/engineApi/index.d.ts.map +0 -0
- /package/dist/{types → main}/types/events/EventCallback.d.ts +0 -0
- /package/dist/{types → main}/types/events/EventCallback.d.ts.map +0 -0
- /package/dist/{types → main}/types/events/index.d.ts +0 -0
- /package/dist/{types → main}/types/events/index.d.ts.map +0 -0
- /package/dist/{types → main}/types/events/internal/InternalEvent.d.ts +0 -0
- /package/dist/{types → main}/types/events/internal/InternalEvent.d.ts.map +0 -0
- /package/dist/{types → main}/types/events/internal/InternalEventCallbacks.d.ts +0 -0
- /package/dist/{types → main}/types/events/internal/InternalEventCallbacks.d.ts.map +0 -0
- /package/dist/{types → main}/types/events/public/ConnectionClosedCodes.d.ts +0 -0
- /package/dist/{types → main}/types/events/public/ConnectionClosedCodes.d.ts.map +0 -0
- /package/dist/{types → main}/types/messageHistory/Message.d.ts +0 -0
- /package/dist/{types → main}/types/messageHistory/Message.d.ts.map +0 -0
- /package/dist/{types → main}/types/messageHistory/MessageRole.d.ts +0 -0
- /package/dist/{types → main}/types/messageHistory/MessageRole.d.ts.map +0 -0
- /package/dist/{types → main}/types/messageHistory/MessageStreamEvent.d.ts +0 -0
- /package/dist/{types → main}/types/messageHistory/MessageStreamEvent.d.ts.map +0 -0
- /package/dist/{types → main}/types/messageHistory/index.d.ts +0 -0
- /package/dist/{types → main}/types/messageHistory/index.d.ts.map +0 -0
- /package/dist/{types → main}/types/signalling/TalkMessageStreamPayload.d.ts +0 -0
- /package/dist/{types → main}/types/signalling/TalkMessageStreamPayload.d.ts.map +0 -0
- /package/dist/{types → main}/types/signalling/TalkStreamInterruptedSignalMessage.d.ts +0 -0
- /package/dist/{types → main}/types/signalling/TalkStreamInterruptedSignalMessage.d.ts.map +0 -0
- /package/dist/{types → main}/types/streaming/InputAudioOptions.d.ts +0 -0
- /package/dist/{types → main}/types/streaming/InputAudioOptions.d.ts.map +0 -0
- /package/dist/{types → main}/types/streaming/StreamingClientOptions.d.ts +0 -0
- /package/dist/{types → main}/types/streaming/StreamingClientOptions.d.ts.map +0 -0
- /package/dist/{types → main}/types/streaming/WebRtcTextMessageEvent.d.ts +0 -0
- /package/dist/{types → main}/types/streaming/WebRtcTextMessageEvent.d.ts.map +0 -0
- /package/dist/{types → main}/types/streaming/index.d.ts +0 -0
- /package/dist/{types → main}/types/streaming/index.d.ts.map +0 -0
package/dist/index.esm.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/shims/browser-polyfills.js", "../node_modules/base64-js/index.js", "../node_modules/ieee754/index.js", "../node_modules/buffer/index.js", "../node_modules/ably/src/platform/web/index.ts", "../node_modules/ably/src/common/platform.ts", "../node_modules/ably/src/common/lib/util/logger.ts", "../node_modules/ably/src/common/lib/util/utils.ts", "../node_modules/ably/src/common/lib/types/errorinfo.ts", "../node_modules/ably/package.json", "../node_modules/ably/src/common/lib/util/defaults.ts", "../node_modules/ably/src/common/lib/util/multicaster.ts", "../node_modules/ably/src/common/constants/HttpMethods.ts", "../node_modules/ably/src/common/constants/HttpStatusCodes.ts", "../node_modules/ably/src/common/lib/client/auth.ts", "../node_modules/ably/src/common/types/http.ts", "../node_modules/ably/src/common/lib/util/eventemitter.ts", "../node_modules/ably/src/common/lib/types/protocolmessagecommon.ts", "../node_modules/ably/src/common/lib/types/basemessage.ts", "../node_modules/ably/src/common/lib/client/baseclient.ts", "../node_modules/ably/src/common/lib/types/devicedetails.ts", "../node_modules/ably/src/common/lib/client/resource.ts", "../node_modules/ably/src/common/lib/client/paginatedresource.ts", "../node_modules/ably/src/common/lib/types/pushchannelsubscription.ts", "../node_modules/ably/src/common/lib/client/push.ts", "../node_modules/ably/src/common/lib/types/presencemessage.ts", "../node_modules/ably/src/common/lib/client/restpresence.ts", "../node_modules/ably/src/common/lib/types/message.ts", "../node_modules/ably/src/common/lib/client/restchannel.ts", "../node_modules/ably/src/common/lib/types/stats.ts", "../node_modules/ably/src/common/lib/client/restchannelmixin.ts", "../node_modules/ably/src/common/lib/client/restpresencemixin.ts", "../node_modules/ably/src/common/lib/client/rest.ts", "../node_modules/ably/src/common/lib/client/baserest.ts", "../node_modules/ably/src/common/lib/client/modularplugins.ts", "../node_modules/ably/src/common/lib/types/defaultmessage.ts", "../node_modules/ably/src/common/lib/types/defaultpresencemessage.ts", "../node_modules/ably/src/common/lib/types/annotation.ts", "../node_modules/ably/src/common/lib/types/defaultannotation.ts", "../node_modules/ably/src/common/lib/client/restannotations.ts", "../node_modules/ably/src/common/lib/types/protocolmessage.ts", "../node_modules/ably/src/common/lib/client/channelstatechange.ts", "../node_modules/ably/src/common/lib/client/realtimechannel.ts", "../node_modules/ably/src/common/lib/client/realtimeannotations.ts", "../node_modules/ably/src/common/lib/client/defaultrest.ts", "../node_modules/ably/src/common/lib/transport/messagequeue.ts", "../node_modules/ably/src/common/lib/transport/protocol.ts", "../node_modules/ably/src/common/lib/client/connectionstatechange.ts", "../node_modules/ably/src/common/lib/transport/connectionerrors.ts", "../node_modules/ably/src/common/lib/transport/transport.ts", "../node_modules/ably/src/common/constants/TransportName.ts", "../node_modules/ably/src/common/lib/transport/connectionmanager.ts", "../node_modules/ably/src/common/lib/client/connection.ts", "../node_modules/ably/src/common/lib/client/baserealtime.ts", "../node_modules/ably/src/common/lib/client/presencemap.ts", "../node_modules/ably/src/common/lib/client/realtimepresence.ts", "../node_modules/ably/src/common/lib/transport/websockettransport.ts", "../node_modules/ably/src/common/lib/client/filteredsubscriptions.ts", "../node_modules/ably/src/common/lib/client/defaultrealtime.ts", "../node_modules/ably/src/platform/web/lib/util/hmac-sha256.ts", "../node_modules/ably/src/platform/web/lib/util/bufferutils.ts", "../node_modules/ably/src/platform/web/lib/util/crypto.ts", "../node_modules/ably/src/common/constants/XHRStates.ts", "../node_modules/ably/src/platform/web/lib/http/http.ts", "../node_modules/ably/src/platform/web/lib/util/webstorage.ts", "../node_modules/ably/src/platform/web/config.ts", "../node_modules/ably/src/common/lib/transport/comettransport.ts", "../node_modules/ably/src/platform/web/lib/http/request/xhrrequest.ts", "../node_modules/ably/src/platform/web/lib/transport/xhrpollingtransport.ts", "../node_modules/ably/src/platform/web/lib/transport/index.ts", "../node_modules/ably/src/platform/web/lib/util/defaults.ts", "../node_modules/ably/src/platform/web/lib/util/msgpack.ts", "../node_modules/ably/src/platform/web/lib/http/request/fetchrequest.ts", "../node_modules/ably/src/platform/web/lib/http/request/index.ts", "../src/index.ts", "../src/AnamClient.ts", "../src/lib/ClientError.ts", "../src/lib/ClientMetrics.ts", "../src/lib/constants.ts", "../src/lib/correlationId.ts", "../src/modules/index.ts", "../src/modules/SignallingClient.ts", "../src/types/index.ts", "../src/types/signalling/index.ts", "../src/types/signalling/SignalMessage.ts", "../src/types/messageHistory/index.ts", "../src/types/messageHistory/MessageRole.ts", "../src/types/events/index.ts", "../src/types/events/public/AnamEvent.ts", "../src/types/events/internal/InternalEvent.ts", "../src/types/events/public/ConnectionClosedCodes.ts", "../src/modules/CoreApiRestClient.ts", "../src/types/PersonaConfig.ts", "../src/modules/EngineApiRestClient.ts", "../src/modules/InternalEventEmitter.ts", "../src/modules/MessageHistoryClient.ts", "../src/modules/PublicEventEmitter.ts", "../src/modules/StreamingClient.ts", "../src/types/TalkMessageStream.ts", "../src/types/TalkMessageStreamState.ts"],
|
|
4
|
-
"sourcesContent": ["\nif (typeof globalThis === 'undefined' && typeof window !== 'undefined') {\n window.globalThis = window;\n}\nif (typeof global === 'undefined' && typeof window !== 'undefined') {\n window.global = window;\n}\nif (typeof self === 'undefined' && typeof window !== 'undefined') {\n window.self = window;\n}\nexport {};\n", "'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n", "/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n", "/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return '<Buffer ' + str + '>'\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n", "// Common\nimport { DefaultRest } from '../../common/lib/client/defaultrest';\nimport { DefaultRealtime } from '../../common/lib/client/defaultrealtime';\nimport Platform from '../../common/platform';\nimport ErrorInfo from '../../common/lib/types/errorinfo';\nimport { makeFromDeserializedWithDependencies as makeProtocolMessageFromDeserialized } from '../../common/lib/types/protocolmessage';\n\n// Platform Specific\nimport BufferUtils from './lib/util/bufferutils';\n// @ts-ignore\nimport { createCryptoClass } from './lib/util/crypto';\nimport Http from './lib/http/http';\nimport Config from './config';\n// @ts-ignore\nimport Transports from './lib/transport';\nimport Logger from '../../common/lib/util/logger';\nimport { getDefaults } from '../../common/lib/util/defaults';\nimport WebStorage from './lib/util/webstorage';\nimport PlatformDefaults from './lib/util/defaults';\nimport msgpack from './lib/util/msgpack';\nimport { defaultBundledRequestImplementations } from './lib/http/request';\n\nconst Crypto = createCryptoClass(Config, BufferUtils);\n\nPlatform.Crypto = Crypto;\nPlatform.BufferUtils = BufferUtils;\nPlatform.Http = Http;\nPlatform.Config = Config;\nPlatform.Transports = Transports;\nPlatform.WebStorage = WebStorage;\n\nfor (const clientClass of [DefaultRest, DefaultRealtime]) {\n clientClass.Crypto = Crypto;\n clientClass._MsgPack = msgpack;\n}\n\nHttp.bundledRequestImplementations = defaultBundledRequestImplementations;\n\nLogger.initLogHandlers();\n\nPlatform.Defaults = getDefaults(PlatformDefaults);\n\nif (Platform.Config.agent) {\n // @ts-ignore\n Platform.Defaults.agent += ' ' + Platform.Config.agent;\n}\n\nexport { DefaultRest as Rest, DefaultRealtime as Realtime, msgpack, makeProtocolMessageFromDeserialized, ErrorInfo };\n\nexport default {\n ErrorInfo,\n Rest: DefaultRest,\n Realtime: DefaultRealtime,\n msgpack,\n makeProtocolMessageFromDeserialized,\n};\n", "import { IPlatformConfig } from './types/IPlatformConfig';\nimport { IPlatformHttpStatic } from './types/http';\nimport IDefaults from './types/IDefaults';\nimport IWebStorage from './types/IWebStorage';\nimport IBufferUtils from './types/IBufferUtils';\nimport * as WebBufferUtils from '../platform/web/lib/util/bufferutils';\nimport * as NodeBufferUtils from '../platform/nodejs/lib/util/bufferutils';\nimport { IUntypedCryptoStatic } from '../common/types/ICryptoStatic';\nimport TransportName from './constants/TransportName';\nimport { TransportCtor } from './lib/transport/transport';\n\nexport type Bufferlike = WebBufferUtils.Bufferlike | NodeBufferUtils.Bufferlike;\ntype BufferUtilsOutput = WebBufferUtils.Output | NodeBufferUtils.Output;\ntype ToBufferOutput = WebBufferUtils.ToBufferOutput | NodeBufferUtils.ToBufferOutput;\n\nexport type TransportImplementations = Partial<Record<TransportName, TransportCtor>>;\n\nexport default class Platform {\n static Config: IPlatformConfig;\n /*\n What we actually _want_ is for Platform to be a generic class\n parameterised by Bufferlike etc, but that requires far-reaching changes to\n components that make use of Platform. So instead we have to advertise a\n BufferUtils object that accepts a broader range of data types than it\n can in reality handle.\n */\n static BufferUtils: IBufferUtils<Bufferlike, BufferUtilsOutput, ToBufferOutput>;\n /*\n We\u2019d like this to be ICryptoStatic with the correct generic arguments,\n but Platform doesn\u2019t currently allow that, as described in the BufferUtils\n comment above.\n */\n static Crypto: IUntypedCryptoStatic | null;\n static Http: IPlatformHttpStatic;\n static Transports: {\n order: TransportName[];\n // Transport implementations that always come with this platform\n bundledImplementations: TransportImplementations;\n };\n static Defaults: IDefaults;\n static WebStorage: IWebStorage | null;\n}\n", "import Platform from 'common/platform';\n\nexport type LoggerOptions = {\n handler: LoggerFunction;\n level: LogLevels;\n};\ntype LoggerFunction = (...args: string[]) => void;\n\n// Workaround for salesforce lightning locker compatibility\n// This is a shorthand version of Utils.getGlobalObject (which we can't use here without creating a circular import)\nlet globalObject = typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : self;\n\nenum LogLevels {\n None = 0,\n Error = 1,\n Major = 2,\n Minor = 3,\n Micro = 4,\n}\n\nfunction pad(timeSegment: number, three?: number) {\n return `${timeSegment}`.padStart(three ? 3 : 2, '0');\n}\n\nfunction getHandler(logger: Function): Function {\n return Platform.Config.logTimestamps\n ? function (msg: unknown) {\n const time = new Date();\n logger(\n pad(time.getHours()) +\n ':' +\n pad(time.getMinutes()) +\n ':' +\n pad(time.getSeconds()) +\n '.' +\n pad(time.getMilliseconds(), 1) +\n ' ' +\n msg,\n );\n }\n : function (msg: string) {\n logger(msg);\n };\n}\n\nconst getDefaultLoggers = (): [Function, Function] => {\n let consoleLogger;\n let errorLogger;\n\n // we expect ably-js to be run in environments which have `console` object available with its `log` function\n if (typeof globalObject?.console?.log === 'function') {\n consoleLogger = function (...args: unknown[]) {\n console.log.apply(console, args);\n };\n\n errorLogger = console.warn\n ? function (...args: unknown[]) {\n console.warn.apply(console, args);\n }\n : consoleLogger;\n } else {\n // otherwise we should fallback to noop for log functions\n consoleLogger = errorLogger = function () {};\n }\n\n return [consoleLogger, errorLogger].map(getHandler) as [Function, Function];\n};\n\nclass Logger {\n private static defaultLogLevel: LogLevels = LogLevels.Error;\n private static defaultLogHandler: Function;\n private static defaultLogErrorHandler: Function;\n\n private logLevel: LogLevels;\n private logHandler: Function;\n private logErrorHandler: Function;\n\n // public constants\n static readonly LOG_NONE: LogLevels = LogLevels.None;\n static readonly LOG_ERROR: LogLevels = LogLevels.Error;\n static readonly LOG_MAJOR: LogLevels = LogLevels.Major;\n static readonly LOG_MINOR: LogLevels = LogLevels.Minor;\n static readonly LOG_MICRO: LogLevels = LogLevels.Micro;\n\n /**\n * This logger instance should only be used when there is no more appropriate logger to use, for example when implementing a public static method or function whose API doesn\u2019t accept any logging configuration.\n */\n static defaultLogger: Logger;\n\n static initLogHandlers() {\n const [logHandler, logErrorHandler] = getDefaultLoggers();\n this.defaultLogHandler = logHandler;\n this.defaultLogErrorHandler = logErrorHandler;\n this.defaultLogger = new Logger();\n }\n\n constructor() {\n this.logLevel = Logger.defaultLogLevel;\n this.logHandler = Logger.defaultLogHandler;\n this.logErrorHandler = Logger.defaultLogErrorHandler;\n }\n\n /* public static functions */\n /**\n * In the modular variant of the SDK, the `stripLogs` esbuild plugin strips out all calls to this method (when invoked as `Logger.logAction(...)`) except when called with level `Logger.LOG_ERROR`. If you wish for a log statement to never be stripped, use the {@link logActionNoStrip} method instead.\n *\n * The aforementioned plugin expects `level` to be an expression of the form `Logger.LOG_*`; that is, you can\u2019t dynamically specify the log level.\n */\n static logAction = (logger: Logger, level: LogLevels, action: string, message?: string) => {\n this.logActionNoStrip(logger, level, action, message);\n };\n\n /**\n * Calls to this method are never stripped by the `stripLogs` esbuild plugin. Use it for log statements that you wish to always be included in the modular variant of the SDK.\n */\n static logActionNoStrip(logger: Logger, level: LogLevels, action: string, message?: string) {\n logger.logAction(level, action, message);\n }\n\n private logAction(level: LogLevels, action: string, message?: string) {\n if (this.shouldLog(level)) {\n (level === LogLevels.Error ? this.logErrorHandler : this.logHandler)('Ably: ' + action + ': ' + message, level);\n }\n }\n\n deprecated = (description: string, msg: string) => {\n this.deprecationWarning(`${description} is deprecated and will be removed in a future version. ${msg}`);\n };\n\n renamedClientOption(oldName: string, newName: string) {\n this.deprecationWarning(\n `The \\`${oldName}\\` client option has been renamed to \\`${newName}\\`. Please update your code to use \\`${newName}\\` instead. \\`${oldName}\\` will be removed in a future version.`,\n );\n }\n\n renamedMethod(className: string, oldName: string, newName: string) {\n this.deprecationWarning(\n `\\`${className}\\`\u2019s \\`${oldName}\\` method has been renamed to \\`${newName}\\`. Please update your code to use \\`${newName}\\` instead. \\`${oldName}\\` will be removed in a future version.`,\n );\n }\n\n deprecationWarning(message: string) {\n if (this.shouldLog(LogLevels.Error)) {\n this.logErrorHandler(`Ably: Deprecation warning - ${message}`, LogLevels.Error);\n }\n }\n\n /* Where a logging operation is expensive, such as serialisation of data, use shouldLog will prevent\n\t the object being serialised if the log level will not output the message */\n shouldLog = (level: LogLevels) => {\n return level <= this.logLevel;\n };\n\n setLog = (level: LogLevels | undefined, handler: Function | undefined) => {\n if (level !== undefined) this.logLevel = level;\n if (handler !== undefined) this.logHandler = this.logErrorHandler = handler;\n };\n}\n\nexport default Logger;\n", "import Platform, { Bufferlike } from 'common/platform';\r\nimport ErrorInfo, { PartialErrorInfo } from 'common/lib/types/errorinfo';\r\nimport { ModularPlugins } from '../client/modularplugins';\r\nimport { MsgPack } from 'common/types/msgpack';\r\n\r\nfunction randomPosn(arrOrStr: Array<unknown> | string) {\r\n return Math.floor(Math.random() * arrOrStr.length);\r\n}\r\n\r\n/**\r\n * Add a set of properties to a target object\r\n *\r\n * @param target the target object\r\n * @param args objects, which enumerable properties are added to target, by reference only\r\n * @returns target object with added properties\r\n */\r\nexport function mixin(\r\n target: Record<string, unknown>,\r\n ...args: Array<object | undefined | null>\r\n): Record<string, unknown> {\r\n for (let i = 0; i < args.length; i++) {\r\n const source = args[i];\r\n if (!source) {\r\n break;\r\n }\r\n\r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n target[key] = (source as Record<string, unknown>)[key];\r\n }\r\n }\r\n }\r\n return target;\r\n}\r\n\r\n/**\r\n * Creates a copy of enumerable properties of the source object\r\n *\r\n * @param src object to copy\r\n * @returns copy of src\r\n */\r\nexport function copy<T = Record<string, unknown>>(src: T | Record<string, unknown> | null | undefined): T {\r\n return mixin({}, src as Record<string, unknown>) as T;\r\n}\r\n\r\n/*\r\n * Ensures that an Array object is always returned\r\n * returning the original Array of obj is an Array\r\n * else wrapping the obj in a single element Array\r\n */\r\nexport function ensureArray(obj: Record<string, unknown>): unknown[] {\r\n if (isNil(obj)) {\r\n return [];\r\n }\r\n if (Array.isArray(obj)) {\r\n return obj;\r\n }\r\n return [obj];\r\n}\r\n\r\nexport function isObject(ob: unknown): ob is Record<string, unknown> {\r\n return Object.prototype.toString.call(ob) == '[object Object]';\r\n}\r\n\r\n/*\r\n * Determine whether or not an object contains\r\n * any enumerable properties.\r\n * ob: the object\r\n */\r\nexport function isEmpty(ob: Record<string, unknown> | unknown[]): boolean {\r\n for (const prop in ob) return false;\r\n return true;\r\n}\r\n\r\n/**\r\n * Checks if `value` is `null` or `undefined`.\r\n *\r\n * Source: https://github.com/lodash/lodash/blob/main/src/isNil.ts\r\n */\r\nexport function isNil(arg: unknown): arg is null | undefined {\r\n return arg == null;\r\n}\r\n\r\n/*\r\n * Perform a simple shallow clone of an object.\r\n * Result is an object irrespective of whether\r\n * the input is an object or array. All\r\n * enumerable properties are copied.\r\n * ob: the object\r\n */\r\nexport function shallowClone(ob: Record<string, unknown>): Record<string, unknown> {\r\n const result = new Object() as Record<string, unknown>;\r\n for (const prop in ob) result[prop] = ob[prop];\r\n return result;\r\n}\r\n\r\n/*\r\n * Clone an object by creating a new object with the\r\n * given object as its prototype. Optionally\r\n * a set of additional own properties can be\r\n * supplied to be added to the newly created clone.\r\n * ob: the object to be cloned\r\n * ownProperties: optional object with additional\r\n * properties to add\r\n */\r\nexport function prototypicalClone(\r\n ob: Record<string, unknown>,\r\n ownProperties: Record<string, unknown>,\r\n): Record<string, unknown> {\r\n class F {}\r\n F.prototype = ob;\r\n const result = new F() as Record<string, unknown>;\r\n if (ownProperties) mixin(result, ownProperties);\r\n return result;\r\n}\r\n\r\n/*\r\n * Declare a constructor to represent a subclass\r\n * of another constructor\r\n * If platform has a built-in version we use that from Platform, else we\r\n * define here (so can make use of other Utils fns)\r\n * See node.js util.inherits\r\n */\r\nexport const inherits = function (ctor: any, superCtor: Function) {\r\n if (Platform.Config.inherits) {\r\n Platform.Config.inherits(ctor, superCtor);\r\n return;\r\n }\r\n ctor.super_ = superCtor;\r\n ctor.prototype = prototypicalClone(superCtor.prototype, { constructor: ctor });\r\n};\r\n\r\n/*\r\n * Determine whether or not an object has an enumerable\r\n * property whose value equals a given value.\r\n * ob: the object\r\n * val: the value to find\r\n */\r\nexport function containsValue(ob: Record<string, unknown>, val: unknown): boolean {\r\n for (const i in ob) {\r\n if (ob[i] == val) return true;\r\n }\r\n return false;\r\n}\r\n\r\nexport function intersect<K extends string, T>(arr: Array<K>, ob: K[] | Partial<Record<K, T>>): K[] {\r\n return Array.isArray(ob) ? arrIntersect(arr, ob) : arrIntersectOb(arr, ob);\r\n}\r\n\r\nexport function arrIntersect<T>(arr1: Array<T>, arr2: Array<T>): Array<T> {\r\n const result = [];\r\n for (let i = 0; i < arr1.length; i++) {\r\n const member = arr1[i];\r\n if (arr2.indexOf(member) != -1) result.push(member);\r\n }\r\n return result;\r\n}\r\n\r\nexport function arrIntersectOb<K extends string>(arr: Array<K>, ob: Partial<Record<K, unknown>>): K[] {\r\n const result = [];\r\n for (let i = 0; i < arr.length; i++) {\r\n const member = arr[i];\r\n if (member in ob) result.push(member);\r\n }\r\n return result;\r\n}\r\n\r\nexport function arrDeleteValue<T>(arr: Array<T>, val: T): boolean {\r\n const idx = arr.indexOf(val);\r\n const res = idx != -1;\r\n if (res) arr.splice(idx, 1);\r\n return res;\r\n}\r\n\r\nexport function arrWithoutValue<T>(arr: Array<T>, val: T): Array<T> {\r\n const newArr = arr.slice();\r\n arrDeleteValue(newArr, val);\r\n return newArr;\r\n}\r\n\r\n/*\r\n * Construct an array of the keys of the enumerable\r\n * properties of a given object, optionally limited\r\n * to only the own properties.\r\n * ob: the object\r\n * ownOnly: boolean, get own properties only\r\n */\r\nexport function keysArray(ob: Record<string, unknown>, ownOnly?: boolean): Array<string> {\r\n const result = [];\r\n for (const prop in ob) {\r\n if (ownOnly && !Object.prototype.hasOwnProperty.call(ob, prop)) continue;\r\n result.push(prop);\r\n }\r\n return result;\r\n}\r\n\r\n/*\r\n * Construct an array of the values of the enumerable\r\n * properties of a given object, optionally limited\r\n * to only the own properties.\r\n * ob: the object\r\n * ownOnly: boolean, get own properties only\r\n */\r\nexport function valuesArray<T>(ob: Record<string, T>, ownOnly?: boolean): T[] {\r\n const result = [];\r\n for (const prop in ob) {\r\n if (ownOnly && !Object.prototype.hasOwnProperty.call(ob, prop)) continue;\r\n result.push(ob[prop]);\r\n }\r\n return result;\r\n}\r\n\r\nexport function forInOwnNonNullProperties(ob: Record<string, unknown>, fn: (prop: string) => void): void {\r\n for (const prop in ob) {\r\n if (Object.prototype.hasOwnProperty.call(ob, prop) && ob[prop]) {\r\n fn(prop);\r\n }\r\n }\r\n}\r\n\r\nexport function allSame(arr: Array<Record<string, unknown>>, prop: string): boolean {\r\n if (arr.length === 0) {\r\n return true;\r\n }\r\n const first = arr[0][prop];\r\n return arr.every(function (item) {\r\n return item[prop] === first;\r\n });\r\n}\r\n\r\nexport enum Format {\r\n msgpack = 'msgpack',\r\n json = 'json',\r\n}\r\n\r\nexport function arrPopRandomElement<T>(arr: Array<T>): T {\r\n return arr.splice(randomPosn(arr), 1)[0];\r\n}\r\n\r\nexport function toQueryString(params?: Record<string, string> | null): string {\r\n const parts = [];\r\n if (params) {\r\n for (const key in params) parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));\r\n }\r\n return parts.length ? '?' + parts.join('&') : '';\r\n}\r\n\r\nexport function parseQueryString(query: string): Record<string, string> {\r\n let match;\r\n const search = /([^?&=]+)=?([^&]*)/g;\r\n const result: Record<string, string> = {};\r\n\r\n while ((match = search.exec(query))) result[decodeURIComponent(match[1])] = decodeURIComponent(match[2]);\r\n\r\n return result;\r\n}\r\n\r\nexport function isErrorInfoOrPartialErrorInfo(err: unknown): err is ErrorInfo | PartialErrorInfo {\r\n return typeof err == 'object' && err !== null && (err instanceof ErrorInfo || err instanceof PartialErrorInfo);\r\n}\r\n\r\nexport function inspectError(err: unknown): string {\r\n if (\r\n err instanceof Error ||\r\n (err as ErrorInfo)?.constructor?.name === 'ErrorInfo' ||\r\n (err as PartialErrorInfo)?.constructor?.name === 'PartialErrorInfo'\r\n )\r\n return (err as Error).toString();\r\n return Platform.Config.inspect(err);\r\n}\r\n\r\nexport function inspectBody(body: unknown): string {\r\n if (Platform.BufferUtils.isBuffer(body)) {\r\n return (body as any).toString();\r\n } else if (typeof body === 'string') {\r\n return body;\r\n } else {\r\n return Platform.Config.inspect(body);\r\n }\r\n}\r\n\r\n/**\r\n * Data is assumed to be either a string, a number, a boolean or a buffer.\r\n *\r\n * Returns the byte size of the provided data based on the spec:\r\n * - TM6a - size of the string is byte length of the string\r\n * - TM6c - size of the buffer is its size in bytes\r\n * - OD3d - size of a number is 8 bytes\r\n * - OD3b - size of a boolean is 1 byte\r\n */\r\nexport function dataSizeBytes(data: string | number | boolean | Bufferlike): number {\r\n if (Platform.BufferUtils.isBuffer(data)) {\r\n return Platform.BufferUtils.byteLength(data);\r\n }\r\n if (typeof data === 'string') {\r\n return Platform.Config.stringByteSize(data);\r\n }\r\n if (typeof data === 'number') {\r\n return 8;\r\n }\r\n if (typeof data === 'boolean') {\r\n return 1;\r\n }\r\n throw new Error(\r\n `Expected input of Utils.dataSizeBytes to be a string, a number, a boolean or a buffer, but was: ${typeof data}`,\r\n );\r\n}\r\n\r\nexport function cheapRandStr(): string {\r\n return String(Math.random()).substr(2);\r\n}\r\n\r\n/* Takes param the minimum number of bytes of entropy the string must\r\n * include, not the length of the string. String length produced is not\r\n * guaranteed. */\r\nexport const randomString = async (numBytes: number): Promise<string> => {\r\n const buffer = await Platform.Config.getRandomArrayBuffer(numBytes);\r\n return Platform.BufferUtils.base64Encode(buffer);\r\n};\r\n\r\n/* Pick n elements at random without replacement from an array */\r\nexport function arrChooseN<T>(arr: Array<T>, n: number): Array<T> {\r\n const numItems = Math.min(n, arr.length),\r\n mutableArr = arr.slice(),\r\n result: Array<T> = [];\r\n for (let i = 0; i < numItems; i++) {\r\n result.push(arrPopRandomElement(mutableArr));\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Uses a callback to communicate the result of a `Promise`. The first argument passed to the callback will be either an error (when the promise is rejected) or `null` (when the promise is fulfilled). In the case where the promise is fulfilled, the resulting value will be passed to the callback as a second argument.\r\n */\r\nexport function whenPromiseSettles<T, E = unknown>(\r\n promise: Promise<T>,\r\n callback?: (err: E | null, result?: T) => void,\r\n) {\r\n promise\r\n .then((result) => {\r\n callback?.(null, result);\r\n })\r\n .catch((err: unknown) => {\r\n // We make no guarantees about the type of the error that gets passed to the callback. Issue https://github.com/ably/ably-js/issues/1617 will think about how to correctly handle error types.\r\n callback?.(err as E);\r\n });\r\n}\r\n\r\nexport function decodeBody<T>(body: unknown, MsgPack: MsgPack | null, format?: Format | null): T {\r\n if (format == 'msgpack') {\r\n if (!MsgPack) {\r\n throwMissingPluginError('MsgPack');\r\n }\r\n return MsgPack.decode(body as Buffer);\r\n }\r\n\r\n return JSON.parse(String(body));\r\n}\r\n\r\nexport function encodeBody(body: unknown, MsgPack: MsgPack | null, format?: Format): string | Buffer {\r\n if (format == 'msgpack') {\r\n if (!MsgPack) {\r\n throwMissingPluginError('MsgPack');\r\n }\r\n return MsgPack.encode(body, true) as Buffer;\r\n }\r\n\r\n return JSON.stringify(body);\r\n}\r\n\r\nexport function allToLowerCase(arr: Array<string>): Array<string> {\r\n return arr.map(function (element) {\r\n return element && element.toLowerCase();\r\n });\r\n}\r\n\r\nexport function allToUpperCase(arr: Array<string>): Array<string> {\r\n return arr.map(function (element) {\r\n return element && element.toUpperCase();\r\n });\r\n}\r\n\r\nexport function getBackoffCoefficient(count: number) {\r\n return Math.min((count + 2) / 3, 2);\r\n}\r\n\r\nexport function getJitterCoefficient() {\r\n return 1 - Math.random() * 0.2;\r\n}\r\n\r\n/**\r\n *\r\n * @param initialTimeout initial timeout value\r\n * @param retryAttempt integer indicating retryAttempt\r\n * @returns RetryTimeout value for given timeout and retryAttempt.\r\n * If x is the value generated then,\r\n * Upper bound = min((retryAttempt + 2) / 3, 2) * initialTimeout,\r\n * Lower bound = 0.8 * Upper bound,\r\n * Lower bound < x < Upper bound\r\n */\r\nexport function getRetryTime(initialTimeout: number, retryAttempt: number) {\r\n return initialTimeout * getBackoffCoefficient(retryAttempt) * getJitterCoefficient();\r\n}\r\n\r\nexport function getGlobalObject() {\r\n if (typeof global !== 'undefined') {\r\n return global;\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n return window;\r\n }\r\n\r\n return self;\r\n}\r\n\r\nexport function shallowEquals(source: Record<string, unknown>, target: Record<string, unknown>) {\r\n return (\r\n Object.keys(source).every((key) => source[key] === target[key]) &&\r\n Object.keys(target).every((key) => target[key] === source[key])\r\n );\r\n}\r\n\r\nexport function matchDerivedChannel(name: string) {\r\n /**\r\n * This regex check is to retain existing channel params if any e.g [?rewind=1]foo to\r\n * [filter=xyz?rewind=1]foo. This is to keep channel compatibility around use of\r\n * channel params that work with derived channels.\r\n *\r\n * This eslint unsafe regex warning is triggered because the RegExp uses nested quantifiers,\r\n * but it does not create any situation where the regex engine has to\r\n * explore a large number of possible matches so it\u2019s safe to ignore\r\n */\r\n const regex = /^(\\[([^?]*)(?:(.*))\\])?(.+)$/; // eslint-disable-line\r\n const match = name.match(regex);\r\n if (!match || !match.length || match.length < 5) {\r\n throw new ErrorInfo('regex match failed', 400, 40010);\r\n }\r\n // Fail if there is already a channel qualifier, eg [meta]foo should fail instead of just overriding with [filter=xyz]foo\r\n if (match![2]) {\r\n throw new ErrorInfo(`cannot use a derived option with a ${match[2]} channel`, 400, 40010);\r\n }\r\n // Return match values to be added to derive channel quantifier.\r\n return {\r\n qualifierParam: match[3] || '',\r\n channelName: match[4],\r\n };\r\n}\r\n\r\nexport function toBase64(str: string) {\r\n const bufferUtils = Platform.BufferUtils;\r\n const textBuffer = bufferUtils.utf8Encode(str);\r\n return bufferUtils.base64Encode(textBuffer);\r\n}\r\n\r\nexport function arrEquals(a: any[], b: any[]) {\r\n return (\r\n a.length === b.length &&\r\n a.every(function (val, i) {\r\n return val === b[i];\r\n })\r\n );\r\n}\r\n\r\nexport function createMissingPluginError(pluginName: keyof ModularPlugins): ErrorInfo {\r\n return new ErrorInfo(`${pluginName} plugin not provided`, 40019, 400);\r\n}\r\n\r\nexport function throwMissingPluginError(pluginName: keyof ModularPlugins): never {\r\n throw createMissingPluginError(pluginName);\r\n}\r\n\r\nexport async function withTimeoutAsync<A>(promise: Promise<A>, timeout = 5000, err = 'Timeout expired'): Promise<A> {\r\n const e = new ErrorInfo(err, 50000, 500);\r\n return Promise.race([promise, new Promise<A>((_resolve, reject) => setTimeout(() => reject(e), timeout))]);\r\n}\r\n\r\ntype NonFunctionKeyNames<A> = { [P in keyof A]: A[P] extends Function ? never : P }[keyof A];\r\nexport type Properties<A> = Pick<A, NonFunctionKeyNames<A>>;\r\n", "import Platform from 'common/platform';\nimport * as Utils from '../util/utils';\nimport * as API from '../../../../ably';\n\nexport interface IPartialErrorInfo extends Error {\n code: number | null;\n statusCode?: number;\n cause?: string | Error | ErrorInfo;\n href?: string;\n}\n\nfunction toString(err: ErrorInfo | PartialErrorInfo) {\n let result = '[' + err.constructor.name;\n if (err.message) result += ': ' + err.message;\n if (err.statusCode) result += '; statusCode=' + err.statusCode;\n if (err.code) result += '; code=' + err.code;\n if (err.cause) result += '; cause=' + Utils.inspectError(err.cause);\n if (err.href && !(err.message && err.message.indexOf('help.ably.io') > -1)) result += '; see ' + err.href + ' ';\n result += ']';\n return result;\n}\n\nexport interface IConvertibleToErrorInfo {\n message: string;\n code: number;\n statusCode: number;\n}\n\nexport interface IConvertibleToPartialErrorInfo {\n message: string;\n code: number | null;\n statusCode?: number;\n}\n\nexport default class ErrorInfo extends Error implements IPartialErrorInfo, API.ErrorInfo {\n code: number;\n statusCode: number;\n cause?: string | Error | ErrorInfo;\n href?: string;\n\n constructor(message: string, code: number, statusCode: number, cause?: string | Error | ErrorInfo) {\n super(message);\n if (typeof Object.setPrototypeOf !== 'undefined') {\n Object.setPrototypeOf(this, ErrorInfo.prototype);\n }\n this.code = code;\n this.statusCode = statusCode;\n this.cause = cause;\n }\n\n toString(): string {\n return toString(this);\n }\n\n static fromValues(values: IConvertibleToErrorInfo): ErrorInfo {\n const { message, code, statusCode } = values;\n if (typeof message !== 'string' || typeof code !== 'number' || typeof statusCode !== 'number') {\n throw new Error('ErrorInfo.fromValues(): invalid values: ' + Platform.Config.inspect(values));\n }\n const result = Object.assign(new ErrorInfo(message, code, statusCode), values);\n if (result.code && !result.href) {\n result.href = 'https://help.ably.io/error/' + result.code;\n }\n return result;\n }\n}\n\nexport class PartialErrorInfo extends Error implements IPartialErrorInfo {\n code: number | null;\n statusCode?: number;\n cause?: string | Error | ErrorInfo;\n href?: string;\n\n constructor(message: string, code: number | null, statusCode?: number, cause?: string | Error | ErrorInfo) {\n super(message);\n if (typeof Object.setPrototypeOf !== 'undefined') {\n Object.setPrototypeOf(this, PartialErrorInfo.prototype);\n }\n this.code = code;\n this.statusCode = statusCode;\n this.cause = cause;\n }\n\n toString(): string {\n return toString(this);\n }\n\n static fromValues(values: IConvertibleToPartialErrorInfo): PartialErrorInfo {\n const { message, code, statusCode } = values;\n if (\n typeof message !== 'string' ||\n (!Utils.isNil(code) && typeof code !== 'number') ||\n (!Utils.isNil(statusCode) && typeof statusCode !== 'number')\n ) {\n throw new Error('PartialErrorInfo.fromValues(): invalid values: ' + Platform.Config.inspect(values));\n }\n const result = Object.assign(new PartialErrorInfo(message, code, statusCode), values);\n if (result.code && !result.href) {\n result.href = 'https://help.ably.io/error/' + result.code;\n }\n return result;\n }\n}\n", "{\r\n \"name\": \"ably\",\r\n \"description\": \"Realtime client library for Ably, the realtime messaging service\",\r\n \"version\": \"2.10.1\",\r\n \"license\": \"Apache-2.0\",\r\n \"bugs\": {\r\n \"url\": \"https://github.com/ably/ably-js/issues\",\r\n \"email\": \"support@ably.com\"\r\n },\r\n \"main\": \"./build/ably-node.js\",\r\n \"browser\": \"./build/ably.js\",\r\n \"react-native\": \"./build/ably-reactnative.js\",\r\n \"typings\": \"./ably.d.ts\",\r\n \"exports\": {\r\n \".\": {\r\n \"types\": \"./ably.d.ts\",\r\n \"node\": \"./build/ably-node.js\",\r\n \"react-native\": \"./build/ably-reactnative.js\",\r\n \"default\": \"./build/ably.js\"\r\n },\r\n \"./modular\": {\r\n \"types\": \"./modular.d.ts\",\r\n \"import\": \"./build/modular/index.mjs\"\r\n },\r\n \"./react\": {\r\n \"require\": \"./react/cjs/index.js\",\r\n \"import\": \"./react/mjs/index.js\"\r\n },\r\n \"./push\": {\r\n \"types\": \"./push.d.ts\",\r\n \"import\": \"./build/push.js\"\r\n },\r\n \"./objects\": {\r\n \"types\": \"./objects.d.ts\",\r\n \"import\": \"./build/objects.js\"\r\n }\r\n },\r\n \"files\": [\r\n \"build/**\",\r\n \"ably.d.ts\",\r\n \"objects.d.ts\",\r\n \"modular.d.ts\",\r\n \"push.d.ts\",\r\n \"resources/**\",\r\n \"src/**\",\r\n \"react/**\"\r\n ],\r\n \"dependencies\": {\r\n \"@ably/msgpack-js\": \"^0.4.0\",\r\n \"dequal\": \"^2.0.3\",\r\n \"fastestsmallesttextencoderdecoder\": \"^1.0.22\",\r\n \"got\": \"^11.8.5\",\r\n \"ulid\": \"^2.3.0\",\r\n \"ws\": \"^8.17.1\"\r\n },\r\n \"peerDependencies\": {\r\n \"react\": \">=16.8.0\",\r\n \"react-dom\": \">=16.8.0\"\r\n },\r\n \"peerDependenciesMeta\": {\r\n \"react\": {\r\n \"optional\": true\r\n },\r\n \"react-dom\": {\r\n \"optional\": true\r\n }\r\n },\r\n \"devDependencies\": {\r\n \"@ably/vcdiff-decoder\": \"1.0.6\",\r\n \"@arethetypeswrong/cli\": \"^0.13.1\",\r\n \"@babel/generator\": \"^7.23.6\",\r\n \"@babel/parser\": \"^7.23.6\",\r\n \"@babel/traverse\": \"^7.23.7\",\r\n \"@testing-library/react\": \"^13.3.0\",\r\n \"@types/cli-table\": \"^0.3.4\",\r\n \"@types/jmespath\": \"^0.15.2\",\r\n \"@types/node\": \"^18.0.0\",\r\n \"@types/request\": \"^2.48.7\",\r\n \"@types/ws\": \"^8.2.0\",\r\n \"@typescript-eslint/eslint-plugin\": \"^5.59.6\",\r\n \"@typescript-eslint/parser\": \"^5.59.6\",\r\n \"@vitejs/plugin-react\": \"^1.3.2\",\r\n \"async\": \"ably-forks/async#requirejs\",\r\n \"aws-sdk\": \"^2.1413.0\",\r\n \"chai\": \"^4.2.0\",\r\n \"cli-table\": \"^0.3.11\",\r\n \"cors\": \"^2.8.5\",\r\n \"csv\": \"^6.3.9\",\r\n \"dox\": \"^1.0.0\",\r\n \"esbuild\": \"^0.18.10\",\r\n \"esbuild-plugin-umd-wrapper\": \"ably-forks/esbuild-plugin-umd-wrapper#1.0.7-optional-amd-named-module\",\r\n \"esbuild-runner\": \"^2.2.2\",\r\n \"eslint\": \"^7.13.0\",\r\n \"eslint-plugin-import\": \"^2.28.0\",\r\n \"eslint-plugin-jsdoc\": \"^40.0.0\",\r\n \"eslint-plugin-react\": \"^7.32.2\",\r\n \"eslint-plugin-react-hooks\": \"^4.6.0\",\r\n \"eslint-plugin-security\": \"^1.4.0\",\r\n \"express\": \"^4.17.1\",\r\n \"glob\": \"^10.4.2\",\r\n \"grunt\": \"^1.6.1\",\r\n \"grunt-cli\": \"~1.2.0\",\r\n \"grunt-shell\": \"~1.1\",\r\n \"grunt-webpack\": \"^5.0.0\",\r\n \"hexy\": \"~0.2\",\r\n \"jmespath\": \"^0.16.0\",\r\n \"jsdom\": \"^20.0.0\",\r\n \"minimist\": \"^1.2.5\",\r\n \"mocha\": \"^8.1.3\",\r\n \"mocha-junit-reporter\": \"^2.2.1\",\r\n \"path-browserify\": \"^1.0.1\",\r\n \"playwright\": \"^1.39.0\",\r\n \"prettier\": \"^3.3.3\",\r\n \"process\": \"^0.11.10\",\r\n \"react\": \">=18.1.0\",\r\n \"react-dom\": \">=18.1.0\",\r\n \"requirejs\": \"~2.1\",\r\n \"shelljs\": \"~0.8\",\r\n \"source-map-explorer\": \"^2.5.2\",\r\n \"source-map-support\": \"^0.5.21\",\r\n \"stream-browserify\": \"^3.0.0\",\r\n \"ts-loader\": \"^9.4.2\",\r\n \"tsconfig-paths-webpack-plugin\": \"^4.0.1\",\r\n \"tslib\": \"^2.3.1\",\r\n \"typedoc\": \"^0.24.7\",\r\n \"typescript\": \"^4.9.5\",\r\n \"vite\": \"^4.4.9\",\r\n \"vitest\": \"^0.18.0\",\r\n \"webpack\": \"^5.79.0\",\r\n \"webpack-cli\": \"^5.0.1\"\r\n },\r\n \"engines\": {\r\n \"node\": \">=16\"\r\n },\r\n \"repository\": \"ably/ably-js\",\r\n \"jspm\": {\r\n \"registry\": \"npm\",\r\n \"directories\": {\r\n \"lib\": \"build\"\r\n },\r\n \"main\": \"ably\"\r\n },\r\n \"scripts\": {\r\n \"start:react\": \"npx vite serve\",\r\n \"grunt\": \"grunt\",\r\n \"test\": \"npm run test:node\",\r\n \"test:node\": \"npm run build:node && npm run build:push && npm run build:objects && mocha\",\r\n \"test:grep\": \"npm run build:node && npm run build:push && npm run build:objects && mocha --grep\",\r\n \"test:node:skip-build\": \"mocha\",\r\n \"test:webserver\": \"grunt test:webserver\",\r\n \"test:playwright\": \"node test/support/runPlaywrightTests.js\",\r\n \"test:react\": \"vitest run\",\r\n \"test:package\": \"grunt test:package\",\r\n \"concat\": \"grunt concat\",\r\n \"build\": \"grunt build:all && npm run build:react\",\r\n \"build:node\": \"grunt build:node\",\r\n \"build:browser\": \"grunt build:browser\",\r\n \"build:react\": \"npm run build:react:mjs && npm run build:react:cjs && cp src/platform/react-hooks/res/package.react.json react/package.json\",\r\n \"build:react:mjs\": \"tsc --project src/platform/react-hooks/tsconfig.mjs.json && cp src/platform/react-hooks/res/package.mjs.json react/mjs/package.json\",\r\n \"build:react:cjs\": \"tsc --project src/platform/react-hooks/tsconfig.cjs.json && cp src/platform/react-hooks/res/package.cjs.json react/cjs/package.json\",\r\n \"build:push\": \"grunt build:push\",\r\n \"build:objects\": \"grunt build:objects\",\r\n \"requirejs\": \"grunt requirejs\",\r\n \"lint\": \"eslint .\",\r\n \"lint:fix\": \"eslint --fix .\",\r\n \"prepare\": \"npm run build\",\r\n \"format\": \"prettier --write .\",\r\n \"format:check\": \"prettier --check .\",\r\n \"sourcemap\": \"source-map-explorer build/ably.min.js\",\r\n \"modulereport\": \"tsc --noEmit --esModuleInterop scripts/moduleReport.ts && esr scripts/moduleReport.ts\",\r\n \"speccoveragereport\": \"tsc --noEmit --esModuleInterop --target ES2017 --moduleResolution node scripts/specCoverageReport.ts && esr scripts/specCoverageReport.ts\",\r\n \"process-private-api-data\": \"tsc --noEmit --esModuleInterop --strictNullChecks scripts/processPrivateApiData/run.ts && esr scripts/processPrivateApiData/run.ts\",\r\n \"docs\": \"typedoc\"\r\n }\r\n}\r\n", "import Platform from 'common/platform';\nimport * as Utils from './utils';\nimport Logger from './logger';\nimport ErrorInfo from 'common/lib/types/errorinfo';\nimport { version } from '../../../../package.json';\nimport ClientOptions, { NormalisedClientOptions } from 'common/types/ClientOptions';\nimport IDefaults from '../../types/IDefaults';\nimport { MsgPack } from 'common/types/msgpack';\nimport { IUntypedCryptoStatic } from 'common/types/ICryptoStatic';\nimport { ChannelOptions } from 'common/types/channel';\nimport { ModularPlugins } from '../client/modularplugins';\n\nlet agent = 'ably-js/' + version;\n\ntype CompleteDefaults = IDefaults & {\n ENDPOINT: string;\n ENVIRONMENT: string;\n REST_HOST: string;\n REALTIME_HOST: string;\n FALLBACK_HOSTS: string[];\n PORT: number;\n TLS_PORT: number;\n TIMEOUTS: {\n disconnectedRetryTimeout: number;\n suspendedRetryTimeout: number;\n httpRequestTimeout: number;\n httpMaxRetryDuration: number;\n channelRetryTimeout: number;\n fallbackRetryTimeout: number;\n connectionStateTtl: number;\n realtimeRequestTimeout: number;\n recvTimeout: number;\n webSocketConnectTimeout: number;\n webSocketSlowTimeout: number;\n };\n httpMaxRetryCount: number;\n maxMessageSize: number;\n version: string;\n protocolVersion: number;\n agent: string;\n getPort(options: ClientOptions, tls?: boolean): number | undefined;\n getHttpScheme(options: ClientOptions): string;\n getPrimaryDomainFromEndpoint(endpoint: string): string;\n getEndpointFallbackHosts(endpoint: string): string[];\n getFallbackHosts(options: NormalisedClientOptions): string[];\n getHosts(options: NormalisedClientOptions, ws?: boolean): string[];\n checkHost(host: string): void;\n objectifyOptions(\n options: undefined | ClientOptions | string,\n allowKeyOrToken: boolean,\n sourceForErrorMessage: string,\n logger: Logger,\n modularPluginsToInclude?: ModularPlugins,\n ): ClientOptions;\n normaliseOptions(options: ClientOptions, MsgPack: MsgPack | null, logger: Logger | null): NormalisedClientOptions;\n defaultGetHeaders(options: NormalisedClientOptions, headersOptions?: HeadersOptions): Record<string, string>;\n defaultPostHeaders(options: NormalisedClientOptions, headersOptions?: HeadersOptions): Record<string, string>;\n};\n\nconst Defaults = {\n ENDPOINT: 'main',\n ENVIRONMENT: '',\n REST_HOST: 'rest.ably.io',\n REALTIME_HOST: 'realtime.ably.io',\n FALLBACK_HOSTS: [\n 'main.a.fallback.ably-realtime.com',\n 'main.b.fallback.ably-realtime.com',\n 'main.c.fallback.ably-realtime.com',\n 'main.d.fallback.ably-realtime.com',\n 'main.e.fallback.ably-realtime.com',\n ],\n PORT: 80,\n TLS_PORT: 443,\n TIMEOUTS: {\n /* Documented as options params: */\n disconnectedRetryTimeout: 15000,\n suspendedRetryTimeout: 30000,\n /* Undocumented, but part of the api and can be used by customers: */\n httpRequestTimeout: 10000,\n httpMaxRetryDuration: 15000,\n channelRetryTimeout: 15000,\n fallbackRetryTimeout: 600000,\n /* For internal / test use only: */\n connectionStateTtl: 120000,\n realtimeRequestTimeout: 10000,\n recvTimeout: 90000,\n webSocketConnectTimeout: 10000,\n webSocketSlowTimeout: 4000,\n },\n httpMaxRetryCount: 3,\n maxMessageSize: 65536,\n\n version,\n protocolVersion: 3,\n agent,\n getPort,\n getHttpScheme,\n getPrimaryDomainFromEndpoint,\n getEndpointFallbackHosts,\n getFallbackHosts,\n getHosts,\n checkHost,\n objectifyOptions,\n normaliseOptions,\n defaultGetHeaders,\n defaultPostHeaders,\n};\n\nexport function getPort(options: ClientOptions, tls?: boolean): number | undefined {\n return tls || options.tls ? options.tlsPort : options.port;\n}\n\nexport function getHttpScheme(options: ClientOptions): string {\n return options.tls ? 'https://' : 'http://';\n}\n\n/**\n * REC1b2\n */\nfunction isFqdnIpOrLocalhost(endpoint: string): boolean {\n return endpoint.includes('.') || endpoint.includes('::') || endpoint === 'localhost';\n}\n\n/**\n * REC1b\n */\nexport function getPrimaryDomainFromEndpoint(endpoint: string): string {\n // REC1b2 (endpoint is a valid hostname)\n if (isFqdnIpOrLocalhost(endpoint)) return endpoint;\n\n // REC1b3 (endpoint in form \"nonprod:[id]\")\n if (endpoint.startsWith('nonprod:')) {\n const routingPolicyId = endpoint.replace('nonprod:', '');\n return `${routingPolicyId}.realtime.ably-nonprod.net`;\n }\n\n // REC1b4 (endpoint in form \"[id]\")\n return `${endpoint}.realtime.ably.net`;\n}\n\n/**\n * REC2c\n *\n * @returns default callbacks based on endpoint client option\n */\nexport function getEndpointFallbackHosts(endpoint: string): string[] {\n // REC2c2\n if (isFqdnIpOrLocalhost(endpoint)) return [];\n\n // REC2c3\n if (endpoint.startsWith('nonprod:')) {\n const routingPolicyId = endpoint.replace('nonprod:', '');\n return endpointFallbacks(routingPolicyId, 'ably-realtime-nonprod.com');\n }\n\n // REC2c1\n return endpointFallbacks(endpoint, 'ably-realtime.com');\n}\n\nexport function endpointFallbacks(routingPolicyId: string, domain: string): string[] {\n return ['a', 'b', 'c', 'd', 'e'].map((id) => `${routingPolicyId}.${id}.fallback.${domain}`);\n}\n\nexport function getFallbackHosts(options: NormalisedClientOptions): string[] {\n const fallbackHosts = options.fallbackHosts,\n httpMaxRetryCount =\n typeof options.httpMaxRetryCount !== 'undefined' ? options.httpMaxRetryCount : Defaults.httpMaxRetryCount;\n\n return fallbackHosts ? Utils.arrChooseN(fallbackHosts, httpMaxRetryCount) : [];\n}\n\nexport function getHosts(options: NormalisedClientOptions): string[] {\n return [options.primaryDomain].concat(getFallbackHosts(options));\n}\n\nfunction checkHost(host: string): void {\n if (typeof host !== 'string') {\n throw new ErrorInfo('host must be a string; was a ' + typeof host, 40000, 400);\n }\n if (!host.length) {\n throw new ErrorInfo('host must not be zero-length', 40000, 400);\n }\n}\n\nfunction getTimeouts(options: ClientOptions) {\n /* Allow values passed in options to override default timeouts */\n const timeouts: Record<string, number> = {};\n for (const prop in Defaults.TIMEOUTS) {\n timeouts[prop] = (options as Record<string, number>)[prop] || (Defaults.TIMEOUTS as Record<string, number>)[prop];\n }\n return timeouts;\n}\n\nexport function getAgentString(options: ClientOptions): string {\n let agentStr = Defaults.agent;\n if (options.agents) {\n for (var agent in options.agents) {\n agentStr += ' ' + agent + '/' + options.agents[agent];\n }\n }\n return agentStr;\n}\n\nexport function objectifyOptions(\n options: undefined | ClientOptions | string,\n allowKeyOrToken: boolean,\n sourceForErrorMessage: string,\n logger: Logger,\n modularPluginsToInclude?: ModularPlugins,\n): ClientOptions {\n if (options === undefined) {\n const msg = allowKeyOrToken\n ? `${sourceForErrorMessage} must be initialized with either a client options object, an Ably API key, or an Ably Token`\n : `${sourceForErrorMessage} must be initialized with a client options object`;\n Logger.logAction(logger, Logger.LOG_ERROR, `${sourceForErrorMessage}()`, msg);\n throw new Error(msg);\n }\n\n let optionsObj: ClientOptions;\n\n if (typeof options === 'string') {\n if (options.indexOf(':') == -1) {\n if (!allowKeyOrToken) {\n const msg = `${sourceForErrorMessage} cannot be initialized with just an Ably Token; you must provide a client options object with a \\`plugins\\` property. (Set this Ably Token as the object\u2019s \\`token\\` property.)`;\n Logger.logAction(logger, Logger.LOG_ERROR, `${sourceForErrorMessage}()`, msg);\n throw new Error(msg);\n }\n\n optionsObj = { token: options };\n } else {\n if (!allowKeyOrToken) {\n const msg = `${sourceForErrorMessage} cannot be initialized with just an Ably API key; you must provide a client options object with a \\`plugins\\` property. (Set this Ably API key as the object\u2019s \\`key\\` property.)`;\n Logger.logAction(logger, Logger.LOG_ERROR, `${sourceForErrorMessage}()`, msg);\n throw new Error(msg);\n }\n\n optionsObj = { key: options };\n }\n } else {\n optionsObj = options;\n }\n\n if (modularPluginsToInclude) {\n optionsObj = { ...optionsObj, plugins: { ...modularPluginsToInclude, ...optionsObj.plugins } };\n }\n\n return optionsObj;\n}\n\nfunction checkIfClientOptionsAreValid(options: ClientOptions) {\n // REC1b\n if (options.endpoint && (options.environment || options.restHost || options.realtimeHost)) {\n // RSC1b\n throw new ErrorInfo(\n 'The `endpoint` option cannot be used in conjunction with the `environment`, `restHost`, or `realtimeHost` options.',\n 40106,\n 400,\n );\n }\n\n // REC1c\n if (options.environment && (options.restHost || options.realtimeHost)) {\n // RSC1b\n throw new ErrorInfo(\n 'The `environment` option cannot be used in conjunction with the `restHost`, or `realtimeHost` options.',\n 40106,\n 400,\n );\n }\n}\n\nexport function normaliseOptions(\n options: ClientOptions,\n MsgPack: MsgPack | null,\n logger: Logger | null, // should only be omitted by tests\n): NormalisedClientOptions {\n const loggerToUse = logger ?? Logger.defaultLogger;\n\n // Deprecated options\n if (options.environment) {\n loggerToUse.deprecated('The `environment` client option', 'Use the `endpoint` client option instead.');\n }\n if (options.restHost) {\n loggerToUse.deprecated('The `restHost` client option', 'Use the `endpoint` client option instead.');\n }\n if (options.realtimeHost) {\n loggerToUse.deprecated('The `realtimeHost` client option', 'Use the `endpoint` client option instead.');\n }\n\n checkIfClientOptionsAreValid(options);\n\n if (typeof options.recover === 'function' && options.closeOnUnload === true) {\n Logger.logAction(\n loggerToUse,\n Logger.LOG_ERROR,\n 'Defaults.normaliseOptions',\n 'closeOnUnload was true and a session recovery function was set - these are mutually exclusive, so unsetting the latter',\n );\n options.recover = undefined;\n }\n\n if (!('closeOnUnload' in options)) {\n /* Have closeOnUnload default to true unless we have any indication that\n * the user may want to recover the connection */\n options.closeOnUnload = !options.recover;\n }\n\n if (!('queueMessages' in options)) options.queueMessages = true;\n\n /* infer hosts and fallbacks based on the specified endpoint */\n const endpoint = options.endpoint || Defaults.ENDPOINT;\n\n if (!options.fallbackHosts && !options.restHost && !options.realtimeHost && !options.port && !options.tlsPort) {\n options.fallbackHosts = getEndpointFallbackHosts(options.environment || endpoint);\n }\n\n const primaryDomainFromEnvironment = options.environment && `${options.environment}.realtime.ably.net`;\n const primaryDomainFromLegacyOptions = options.restHost || options.realtimeHost || primaryDomainFromEnvironment;\n\n const primaryDomain = primaryDomainFromLegacyOptions || getPrimaryDomainFromEndpoint(endpoint);\n\n (options.fallbackHosts || []).concat(primaryDomain).forEach(checkHost);\n\n options.port = options.port || Defaults.PORT;\n options.tlsPort = options.tlsPort || Defaults.TLS_PORT;\n if (!('tls' in options)) options.tls = true;\n\n const timeouts = getTimeouts(options);\n\n if (MsgPack) {\n if ('useBinaryProtocol' in options) {\n options.useBinaryProtocol = Platform.Config.supportsBinary && options.useBinaryProtocol;\n } else {\n options.useBinaryProtocol = Platform.Config.preferBinary;\n }\n } else {\n options.useBinaryProtocol = false;\n }\n\n const headers: Record<string, string> = {};\n if (options.clientId) {\n headers['X-Ably-ClientId'] = Platform.BufferUtils.base64Encode(Platform.BufferUtils.utf8Encode(options.clientId));\n }\n\n if (!('idempotentRestPublishing' in options)) {\n options.idempotentRestPublishing = true;\n }\n\n let connectivityCheckParams = null;\n let connectivityCheckUrl = options.connectivityCheckUrl;\n if (options.connectivityCheckUrl) {\n let [uri, qs] = options.connectivityCheckUrl.split('?');\n connectivityCheckParams = qs ? Utils.parseQueryString(qs) : {};\n if (uri.indexOf('://') === -1) {\n uri = 'https://' + uri;\n }\n connectivityCheckUrl = uri;\n }\n\n let wsConnectivityCheckUrl = options.wsConnectivityCheckUrl;\n if (wsConnectivityCheckUrl && wsConnectivityCheckUrl.indexOf('://') === -1) {\n wsConnectivityCheckUrl = 'wss://' + wsConnectivityCheckUrl;\n }\n\n return {\n ...options,\n primaryDomain: primaryDomain,\n maxMessageSize: options.maxMessageSize || Defaults.maxMessageSize,\n timeouts,\n connectivityCheckParams,\n connectivityCheckUrl,\n wsConnectivityCheckUrl,\n headers,\n };\n}\n\nexport function normaliseChannelOptions(Crypto: IUntypedCryptoStatic | null, logger: Logger, options?: ChannelOptions) {\n const channelOptions = options || {};\n if (channelOptions.cipher) {\n if (!Crypto) Utils.throwMissingPluginError('Crypto');\n const cipher = Crypto.getCipher(channelOptions.cipher, logger);\n channelOptions.cipher = cipher.cipherParams;\n channelOptions.channelCipher = cipher.cipher;\n } else if ('cipher' in channelOptions) {\n /* Don't deactivate an existing cipher unless options\n * has a 'cipher' key that's falsey */\n channelOptions.cipher = undefined;\n channelOptions.channelCipher = null;\n }\n return channelOptions;\n}\n\nconst contentTypes = {\n json: 'application/json',\n xml: 'application/xml',\n html: 'text/html',\n msgpack: 'application/x-msgpack',\n text: 'text/plain',\n};\n\nexport interface HeadersOptions {\n format?: Utils.Format | 'xml' | 'html' | 'text';\n protocolVersion?: number;\n}\n\nconst defaultHeadersOptions: Required<HeadersOptions> = {\n format: Utils.Format.json,\n protocolVersion: Defaults.protocolVersion,\n};\n\nexport function defaultGetHeaders(\n options: NormalisedClientOptions,\n {\n format = defaultHeadersOptions.format,\n protocolVersion = defaultHeadersOptions.protocolVersion,\n }: HeadersOptions = {},\n): Record<string, string> {\n const accept = contentTypes[format];\n return {\n accept: accept,\n 'X-Ably-Version': protocolVersion.toString(),\n 'Ably-Agent': getAgentString(options),\n };\n}\n\nexport function defaultPostHeaders(\n options: NormalisedClientOptions,\n {\n format = defaultHeadersOptions.format,\n protocolVersion = defaultHeadersOptions.protocolVersion,\n }: HeadersOptions = {},\n): Record<string, string> {\n let contentType;\n const accept = (contentType = contentTypes[format]);\n\n return {\n accept: accept,\n 'content-type': contentType,\n 'X-Ably-Version': protocolVersion.toString(),\n 'Ably-Agent': getAgentString(options),\n };\n}\n\nexport default Defaults as CompleteDefaults;\n\nexport function getDefaults(platformDefaults: IDefaults) {\n return Object.assign(Defaults, platformDefaults);\n}\n", "import { StandardCallback } from 'common/types/utils';\nimport ErrorInfo from 'common/lib/types/errorinfo';\nimport Logger from './logger';\n\nexport interface MulticasterInstance<T> extends Function {\n (err?: ErrorInfo | null, result?: T): void;\n push: (fn: StandardCallback<T>) => void;\n /**\n * Creates a promise that will be resolved or rejected when this instance is called.\n */\n createPromise: () => Promise<T>;\n /**\n * Syntatic sugar for when working in a context that uses promises; equivalent to calling as a function with arguments (null, result).\n */\n resolveAll(result: T): void;\n /**\n * Syntatic sugar for when working in a context that uses promises; equivalent to calling as a function with arguments (err).\n */\n rejectAll(err: ErrorInfo): void;\n}\n\nclass Multicaster<T> {\n members: Array<StandardCallback<T>>;\n\n // Private constructor; use static Multicaster.create instead\n private constructor(\n private readonly logger: Logger,\n members?: Array<StandardCallback<T> | undefined>,\n ) {\n this.members = (members as Array<StandardCallback<T>>) || [];\n }\n\n private call(err?: ErrorInfo | null, result?: T): void {\n for (const member of this.members) {\n if (member) {\n try {\n member(err, result);\n } catch (e) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'Multicaster multiple callback handler',\n 'Unexpected exception: ' + e + '; stack = ' + (e as Error).stack,\n );\n }\n }\n }\n }\n\n push(...args: Array<StandardCallback<T>>): void {\n this.members.push(...args);\n }\n\n createPromise(): Promise<T> {\n return new Promise((resolve, reject) => {\n this.push((err, result) => {\n err ? reject(err) : resolve(result!);\n });\n });\n }\n\n resolveAll(result: T) {\n this.call(null, result);\n }\n\n rejectAll(err: ErrorInfo) {\n this.call(err);\n }\n\n static create<T>(logger: Logger, members?: Array<StandardCallback<T> | undefined>): MulticasterInstance<T> {\n const instance = new Multicaster(logger, members);\n return Object.assign((err?: ErrorInfo | null, result?: T) => instance.call(err, result), {\n push: (fn: StandardCallback<T>) => instance.push(fn),\n createPromise: () => instance.createPromise(),\n resolveAll: (result: T) => instance.resolveAll(result),\n rejectAll: (err: ErrorInfo) => instance.rejectAll(err),\n });\n }\n}\n\nexport default Multicaster;\n", "enum HttpMethods {\n Get = 'get',\n Delete = 'delete',\n Post = 'post',\n Put = 'put',\n Patch = 'patch',\n}\n\nexport default HttpMethods;\n", "enum HttpStatusCodes {\n Success = 200,\n NoContent = 204,\n BadRequest = 400,\n Unauthorized = 401,\n Forbidden = 403,\n RequestTimeout = 408,\n InternalServerError = 500,\n}\n\nexport function isSuccessCode(statusCode: number) {\n return statusCode >= HttpStatusCodes.Success && statusCode < HttpStatusCodes.BadRequest;\n}\n\nexport default HttpStatusCodes;\n", "import Logger from '../util/logger';\nimport * as Utils from '../util/utils';\nimport Multicaster, { MulticasterInstance } from '../util/multicaster';\nimport ErrorInfo, { IPartialErrorInfo } from '../types/errorinfo';\nimport { RequestResultError, RequestParams, RequestResult } from '../../types/http';\nimport * as API from '../../../../ably';\nimport BaseClient from './baseclient';\nimport BaseRealtime from './baserealtime';\nimport ClientOptions from '../../types/ClientOptions';\nimport HttpMethods from '../../constants/HttpMethods';\nimport HttpStatusCodes from 'common/constants/HttpStatusCodes';\nimport Platform, { Bufferlike } from '../../platform';\nimport Defaults from '../util/defaults';\n\ntype BatchResult<T> = API.BatchResult<T>;\ntype TokenRevocationTargetSpecifier = API.TokenRevocationTargetSpecifier;\ntype TokenRevocationOptions = API.TokenRevocationOptions;\ntype TokenRevocationSuccessResult = API.TokenRevocationSuccessResult;\ntype TokenRevocationFailureResult = API.TokenRevocationFailureResult;\ntype TokenRevocationResult = BatchResult<TokenRevocationSuccessResult | TokenRevocationFailureResult>;\n\nconst MAX_TOKEN_LENGTH = Math.pow(2, 17);\nfunction random() {\n return ('000000' + Math.floor(Math.random() * 1e16)).slice(-16);\n}\n\nfunction isRealtime(client: BaseClient): client is BaseRealtime {\n return !!(client as BaseRealtime).connection;\n}\n\n/* A client auth callback may give errors in any number of formats; normalise to an ErrorInfo or PartialErrorInfo */\nfunction normaliseAuthcallbackError(err: any) {\n if (!Utils.isErrorInfoOrPartialErrorInfo(err)) {\n return new ErrorInfo(Utils.inspectError(err), err.code || 40170, err.statusCode || 401);\n }\n /* network errors will not have an inherent error code */\n if (!err.code) {\n if (err.statusCode === 403) {\n err.code = 40300;\n } else {\n err.code = 40170;\n /* normalise statusCode to 401 per RSA4e */\n err.statusCode = 401;\n }\n }\n return err;\n}\n\nlet hmac = (text: string, key: string): string => {\n const bufferUtils = Platform.BufferUtils;\n\n const textBuffer = bufferUtils.utf8Encode(text);\n const keyBuffer = bufferUtils.utf8Encode(key);\n\n const digest = bufferUtils.hmacSha256(textBuffer, keyBuffer);\n\n return bufferUtils.base64Encode(digest);\n};\n\nfunction c14n(capability?: string | Record<string, Array<string>>) {\n if (!capability) return '';\n\n if (typeof capability == 'string') capability = JSON.parse(capability);\n\n const c14nCapability: Record<string, Array<string>> = Object.create(null);\n const keys = Utils.keysArray(capability as Record<string, Array<string>>, true);\n if (!keys) return '';\n keys.sort();\n for (let i = 0; i < keys.length; i++) {\n c14nCapability[keys[i]] = (capability as Record<string, Array<string>>)[keys[i]].sort();\n }\n return JSON.stringify(c14nCapability);\n}\n\nfunction logAndValidateTokenAuthMethod(authOptions: AuthOptions, logger: Logger) {\n if (authOptions.authCallback) {\n Logger.logAction(logger, Logger.LOG_MINOR, 'Auth()', 'using token auth with authCallback');\n } else if (authOptions.authUrl) {\n Logger.logAction(logger, Logger.LOG_MINOR, 'Auth()', 'using token auth with authUrl');\n } else if (authOptions.key) {\n Logger.logAction(logger, Logger.LOG_MINOR, 'Auth()', 'using token auth with client-side signing');\n } else if (authOptions.tokenDetails) {\n Logger.logAction(logger, Logger.LOG_MINOR, 'Auth()', 'using token auth with supplied token only');\n } else {\n const msg = 'authOptions must include valid authentication parameters';\n Logger.logAction(logger, Logger.LOG_ERROR, 'Auth()', msg);\n throw new Error(msg);\n }\n}\n\nfunction basicAuthForced(options: ClientOptions) {\n return 'useTokenAuth' in options && !options.useTokenAuth;\n}\n\n/* RSA4 */\nexport function useTokenAuth(options: ClientOptions) {\n return (\n options.useTokenAuth ||\n (!basicAuthForced(options) && (options.authCallback || options.authUrl || options.token || options.tokenDetails))\n );\n}\n\n/* RSA4a */\nfunction noWayToRenew(options: ClientOptions) {\n return !options.key && !options.authCallback && !options.authUrl;\n}\n\nlet trId = 0;\nfunction getTokenRequestId() {\n return trId++;\n}\n\n/**\n * Auth options used only for testing.\n */\ntype PrivateAuthOptions = {\n requestHeaders?: Record<string, string>;\n suppressMaxLengthCheck?: boolean;\n};\n\ntype AuthOptions = API.AuthOptions & PrivateAuthOptions;\n\nclass Auth {\n client: BaseClient;\n tokenParams: API.TokenParams;\n currentTokenRequestId: number | null;\n waitingForTokenRequest: MulticasterInstance<API.TokenDetails> | null;\n // This initialization is always overwritten and only used to prevent a TypeScript compiler error\n authOptions: AuthOptions = {} as AuthOptions;\n tokenDetails?: API.TokenDetails | null;\n method?: string;\n key?: string;\n basicKey?: string;\n clientId?: string | null;\n\n constructor(client: BaseClient, options: ClientOptions) {\n this.client = client;\n this.tokenParams = options.defaultTokenParams || {};\n /* The id of the current token request if one is in progress, else null */\n this.currentTokenRequestId = null;\n this.waitingForTokenRequest = null;\n\n if (useTokenAuth(options)) {\n /* Token auth */\n if (noWayToRenew(options)) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'Auth()',\n 'Warning: library initialized with a token literal without any way to renew the token when it expires (no authUrl, authCallback, or key). See https://help.ably.io/error/40171 for help',\n );\n }\n this._saveTokenOptions(options.defaultTokenParams as API.TokenDetails, options);\n logAndValidateTokenAuthMethod(this.authOptions, this.logger);\n } else {\n /* Basic auth */\n if (!options.key) {\n const msg =\n 'No authentication options provided; need one of: key, authUrl, or authCallback (or for testing only, token or tokenDetails)';\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth()', msg);\n throw new ErrorInfo(msg, 40160, 401);\n }\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth()', 'anonymous, using basic auth');\n this._saveBasicOptions(options);\n }\n }\n\n get logger(): Logger {\n return this.client.logger;\n }\n\n /**\n * Instructs the library to get a token immediately and ensures Token Auth\n * is used for all future requests, storing the tokenParams and authOptions\n * given as the new defaults for subsequent use.\n */\n async authorize(): Promise<API.TokenDetails>;\n\n /**\n * Instructs the library to get a token immediately and ensures Token Auth\n * is used for all future requests, storing the tokenParams and authOptions\n * given as the new defaults for subsequent use.\n *\n * @param tokenParams\n * an object containing the parameters for the requested token:\n *\n * - ttl: (optional) the requested life of any new token in ms. If none\n * is specified a default of 1 hour is provided. The maximum lifetime\n * is 24hours; any request exceeding that lifetime will be rejected\n * with an error.\n *\n * - capability: (optional) the capability to associate with the access token.\n * If none is specified, a token will be requested with all of the\n * capabilities of the specified key.\n *\n * - clientId: (optional) a client ID to associate with the token\n *\n * - timestamp: (optional) the time in ms since the epoch. If none is specified,\n * the system will be queried for a time value to use.\n */\n async authorize(tokenParams: API.TokenParams | null): Promise<API.TokenDetails>;\n\n /**\n * Instructs the library to get a token immediately and ensures Token Auth\n * is used for all future requests, storing the tokenParams and authOptions\n * given as the new defaults for subsequent use.\n *\n * @param tokenParams\n * an object containing the parameters for the requested token:\n *\n * - ttl: (optional) the requested life of any new token in ms. If none\n * is specified a default of 1 hour is provided. The maximum lifetime\n * is 24hours; any request exceeding that lifetime will be rejected\n * with an error.\n *\n * - capability: (optional) the capability to associate with the access token.\n * If none is specified, a token will be requested with all of the\n * capabilities of the specified key.\n *\n * - clientId: (optional) a client ID to associate with the token\n *\n * - timestamp: (optional) the time in ms since the epoch. If none is specified,\n * the system will be queried for a time value to use.\n *\n * @param authOptions\n * an object containing auth options relevant to token auth:\n *\n * - queryTime (optional) boolean indicating that the Ably system should be\n * queried for the current time when none is specified explicitly.\n *\n * - tokenDetails: (optional) object: An authenticated TokenDetails object.\n *\n * - token: (optional) string: the `token` property of a tokenDetails object\n *\n * - authCallback: (optional) a JavaScript callback to be called to get auth information.\n * authCallback should be a function of (tokenParams, callback) that calls\n * the callback with (err, result), where result is any of:\n * - a tokenRequest object (ie the result of a rest.auth.createTokenRequest call),\n * - a tokenDetails object (ie the result of a rest.auth.requestToken call),\n * - a token string\n *\n * - authUrl: (optional) a URL to be used to GET or POST a set of token request\n * params, to obtain a signed token request.\n *\n * - authHeaders: (optional) a set of application-specific headers to be added to any request\n * made to the authUrl.\n *\n * - authParams: (optional) a set of application-specific query params to be added to any\n * request made to the authUrl.\n *\n *\n * - requestHeaders (optional, unsupported, for testing only) extra headers to add to the\n * requestToken request\n */\n async authorize(tokenParams: API.TokenParams | null, authOptions: AuthOptions | null): Promise<API.TokenDetails>;\n\n async authorize(\n tokenParams?: Record<string, any> | null,\n authOptions?: AuthOptions | null,\n ): Promise<API.TokenDetails> {\n /* RSA10a: authorize() call implies token auth. If a key is passed it, we\n * just check if it doesn't clash and assume we're generating a token from it */\n if (authOptions && authOptions.key && this.authOptions.key !== authOptions.key) {\n throw new ErrorInfo('Unable to update auth options with incompatible key', 40102, 401);\n }\n\n try {\n let tokenDetails = await this._forceNewToken(tokenParams ?? null, authOptions ?? null);\n\n /* RTC8\n * - When authorize called by an end user and have a realtime connection,\n * don't call back till new token has taken effect.\n * - Use this.client.connection as a proxy for (this.client instanceof BaseRealtime),\n * which doesn't work in node as BaseRealtime isn't part of the vm context for Rest clients */\n if (isRealtime(this.client)) {\n return new Promise((resolve, reject) => {\n (this.client as BaseRealtime).connection.connectionManager.onAuthUpdated(\n tokenDetails,\n (err: unknown, tokenDetails?: API.TokenDetails) => (err ? reject(err) : resolve(tokenDetails!)),\n );\n });\n } else {\n return tokenDetails;\n }\n } catch (err) {\n if ((this.client as BaseRealtime).connection && (err as ErrorInfo).statusCode === HttpStatusCodes.Forbidden) {\n /* Per RSA4d & RSA4d1, if the auth server explicitly repudiates our right to\n * stay connecticed by returning a 403, we actively disconnect the connection\n * even though we may well still have time left in the old token. */\n (this.client as BaseRealtime).connection.connectionManager.actOnErrorFromAuthorize(err as ErrorInfo);\n }\n throw err;\n }\n }\n\n /* For internal use, eg by connectionManager - useful when want to call back\n * as soon as we have the new token, rather than waiting for it to take\n * effect on the connection as #authorize does */\n async _forceNewToken(\n tokenParams: API.TokenParams | null,\n authOptions: AuthOptions | null,\n ): Promise<API.TokenDetails> {\n /* get rid of current token even if still valid */\n this.tokenDetails = null;\n\n /* _save normalises the tokenParams and authOptions and updates the auth\n * object. All subsequent operations should use the values on `this`,\n * not the passed in ones. */\n this._saveTokenOptions(tokenParams, authOptions);\n\n logAndValidateTokenAuthMethod(this.authOptions, this.logger);\n\n try {\n return this._ensureValidAuthCredentials(true);\n } finally {\n /* RSA10g */\n delete this.tokenParams.timestamp;\n delete this.authOptions.queryTime;\n }\n }\n\n /**\n * Request an access token\n */\n async requestToken(): Promise<API.TokenDetails>;\n\n /**\n * Request an access token\n * @param tokenParams\n * an object containing the parameters for the requested token:\n * - ttl: (optional) the requested life of the token in milliseconds. If none is specified\n * a default of 1 hour is provided. The maximum lifetime is 24hours; any request\n * exceeding that lifetime will be rejected with an error.\n *\n * - capability: (optional) the capability to associate with the access token.\n * If none is specified, a token will be requested with all of the\n * capabilities of the specified key.\n *\n * - clientId: (optional) a client ID to associate with the token; if not\n * specified, a clientId passed in constructing the Rest interface will be used\n *\n * - timestamp: (optional) the time in ms since the epoch. If none is specified,\n * the system will be queried for a time value to use.\n */\n async requestToken(tokenParams: API.TokenParams | null): Promise<API.TokenDetails>;\n\n /**\n * Request an access token\n * @param tokenParams\n * an object containing the parameters for the requested token:\n * - ttl: (optional) the requested life of the token in milliseconds. If none is specified\n * a default of 1 hour is provided. The maximum lifetime is 24hours; any request\n * exceeding that lifetime will be rejected with an error.\n *\n * - capability: (optional) the capability to associate with the access token.\n * If none is specified, a token will be requested with all of the\n * capabilities of the specified key.\n *\n * - clientId: (optional) a client ID to associate with the token; if not\n * specified, a clientId passed in constructing the Rest interface will be used\n *\n * - timestamp: (optional) the time in ms since the epoch. If none is specified,\n * the system will be queried for a time value to use.\n *\n * @param authOptions\n * an object containing the request options:\n * - key: the key to use.\n *\n * - authCallback: (optional) a JavaScript callback to be called to get auth information.\n * authCallback should be a function of (tokenParams, callback) that calls\n * the callback with (err, result), where result is any of:\n * - a tokenRequest object (ie the result of a rest.auth.createTokenRequest call),\n * - a tokenDetails object (ie the result of a rest.auth.requestToken call),\n * - a token string\n *\n * - authUrl: (optional) a URL to be used to GET or POST a set of token request\n * params, to obtain a signed token request.\n *\n * - authHeaders: (optional) a set of application-specific headers to be added to any request\n * made to the authUrl.\n *\n * - authParams: (optional) a set of application-specific query params to be added to any\n * request made to the authUrl.\n *\n * - queryTime (optional) boolean indicating that the ably system should be\n * queried for the current time when none is specified explicitly\n *\n * - requestHeaders (optional, unsupported, for testing only) extra headers to add to the\n * requestToken request\n */\n async requestToken(tokenParams: API.TokenParams | null, authOptions: AuthOptions): Promise<API.TokenDetails>;\n\n async requestToken(tokenParams?: API.TokenParams | null, authOptions?: AuthOptions): Promise<API.TokenDetails> {\n /* RSA8e: if authOptions passed in, they're used instead of stored, don't merge them */\n const resolvedAuthOptions = authOptions || this.authOptions;\n const resolvedTokenParams = tokenParams || Utils.copy(this.tokenParams);\n\n /* first set up whatever callback will be used to get signed\n * token requests */\n let tokenRequestCallback: (\n data: API.TokenParams,\n callback: (\n error: API.ErrorInfo | RequestResultError | string | null,\n tokenRequestOrDetails: API.TokenDetails | API.TokenRequest | string | null,\n contentType?: string,\n ) => void,\n ) => void,\n client = this.client;\n\n if (resolvedAuthOptions.authCallback) {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.requestToken()', 'using token auth with authCallback');\n tokenRequestCallback = resolvedAuthOptions.authCallback;\n } else if (resolvedAuthOptions.authUrl) {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.requestToken()', 'using token auth with authUrl');\n tokenRequestCallback = (params, cb) => {\n const authHeaders = Utils.mixin(\n { accept: 'application/json, text/plain' },\n resolvedAuthOptions.authHeaders,\n ) as Record<string, string>;\n const usePost = resolvedAuthOptions.authMethod && resolvedAuthOptions.authMethod.toLowerCase() === 'post';\n let providedQsParams;\n /* Combine authParams with any qs params given in the authUrl */\n const queryIdx = resolvedAuthOptions.authUrl!.indexOf('?');\n if (queryIdx > -1) {\n providedQsParams = Utils.parseQueryString(resolvedAuthOptions.authUrl!.slice(queryIdx));\n resolvedAuthOptions.authUrl = resolvedAuthOptions.authUrl!.slice(0, queryIdx);\n if (!usePost) {\n /* In case of conflict, authParams take precedence over qs params in the authUrl */\n resolvedAuthOptions.authParams = Utils.mixin(\n providedQsParams,\n resolvedAuthOptions.authParams,\n ) as typeof resolvedAuthOptions.authParams;\n }\n }\n /* RSA8c2 */\n const authParams = Utils.mixin({}, resolvedAuthOptions.authParams || {}, params) as RequestParams;\n const authUrlRequestCallback = (result: RequestResult) => {\n let body = (result.body ?? null) as string | Bufferlike | API.TokenDetails | API.TokenRequest | null;\n\n let contentType: string | null = null;\n if (result.error) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'Auth.requestToken().tokenRequestCallback',\n 'Received Error: ' + Utils.inspectError(result.error),\n );\n } else {\n const contentTypeHeaderOrHeaders = result.headers!['content-type'] ?? null;\n if (Array.isArray(contentTypeHeaderOrHeaders)) {\n // Combine multiple header values into a comma-separated list per https://datatracker.ietf.org/doc/html/rfc9110#section-5.2; see https://github.com/ably/ably-js/issues/1616 for doing this consistently across the codebase.\n contentType = contentTypeHeaderOrHeaders.join(', ');\n } else {\n contentType = contentTypeHeaderOrHeaders;\n }\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'Auth.requestToken().tokenRequestCallback',\n 'Received; content-type: ' + contentType + '; body: ' + Utils.inspectBody(body),\n );\n }\n if (result.error) {\n cb(result.error, null);\n return;\n }\n if (result.unpacked) {\n cb(null, body as Exclude<typeof body, Bufferlike>);\n return;\n }\n if (Platform.BufferUtils.isBuffer(body)) body = body.toString();\n if (!contentType) {\n cb(new ErrorInfo('authUrl response is missing a content-type header', 40170, 401), null);\n return;\n }\n const json = contentType.indexOf('application/json') > -1,\n text = contentType.indexOf('text/plain') > -1 || contentType.indexOf('application/jwt') > -1;\n if (!json && !text) {\n cb(\n new ErrorInfo(\n 'authUrl responded with unacceptable content-type ' +\n contentType +\n ', should be either text/plain, application/jwt or application/json',\n 40170,\n 401,\n ),\n null,\n );\n return;\n }\n if (json) {\n if ((body as string).length > MAX_TOKEN_LENGTH) {\n cb(new ErrorInfo('authUrl response exceeded max permitted length', 40170, 401), null);\n return;\n }\n try {\n body = JSON.parse(body as string);\n } catch (e) {\n cb(\n new ErrorInfo(\n 'Unexpected error processing authURL response; err = ' + (e as Error).message,\n 40170,\n 401,\n ),\n null,\n );\n return;\n }\n }\n cb(null, body as Exclude<typeof body, Bufferlike>, contentType);\n };\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'Auth.requestToken().tokenRequestCallback',\n 'Requesting token from ' +\n resolvedAuthOptions.authUrl +\n '; Params: ' +\n JSON.stringify(authParams) +\n '; method: ' +\n (usePost ? 'POST' : 'GET'),\n );\n if (usePost) {\n /* send body form-encoded */\n const headers = authHeaders || {};\n headers['content-type'] = 'application/x-www-form-urlencoded';\n const body = Utils.toQueryString(authParams).slice(1); /* slice is to remove the initial '?' */\n Utils.whenPromiseSettles(\n this.client.http.doUri(\n HttpMethods.Post,\n resolvedAuthOptions.authUrl!,\n headers,\n body,\n providedQsParams as Record<string, string>,\n ),\n (err: any, result) =>\n err\n ? authUrlRequestCallback(err) // doUri isn\u2019t meant to throw an error, but handle any just in case\n : authUrlRequestCallback(result!),\n );\n } else {\n Utils.whenPromiseSettles(\n this.client.http.doUri(HttpMethods.Get, resolvedAuthOptions.authUrl!, authHeaders || {}, null, authParams),\n (err: any, result) =>\n err\n ? authUrlRequestCallback(err) // doUri isn\u2019t meant to throw an error, but handle any just in case\n : authUrlRequestCallback(result!),\n );\n }\n };\n } else if (resolvedAuthOptions.key) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'Auth.requestToken()',\n 'using token auth with client-side signing',\n );\n tokenRequestCallback = (params, cb) => {\n Utils.whenPromiseSettles(this.createTokenRequest(params, resolvedAuthOptions), (err, result) =>\n cb(err as string | ErrorInfo | null, result ?? null),\n );\n };\n } else {\n const msg =\n 'Need a new token, but authOptions does not include any way to request one (no authUrl, authCallback, or key)';\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'Auth()',\n 'library initialized with a token literal without any way to renew the token when it expires (no authUrl, authCallback, or key). See https://help.ably.io/error/40171 for help',\n );\n throw new ErrorInfo(msg, 40171, 403);\n }\n\n /* normalise token params */\n if ('capability' in (resolvedTokenParams as Record<string, any>))\n (resolvedTokenParams as Record<string, any>).capability = c14n(\n (resolvedTokenParams as Record<string, any>).capability,\n );\n\n const tokenRequest = (\n signedTokenParams: Record<string, any>,\n tokenCb: (err: RequestResultError | null, tokenResponse?: API.TokenDetails | string, unpacked?: boolean) => void,\n ) => {\n const keyName = signedTokenParams.keyName,\n path = '/keys/' + keyName + '/requestToken',\n tokenUri = function (host: string) {\n return client.baseUri(host) + path;\n };\n\n const requestHeaders = Defaults.defaultPostHeaders(this.client.options);\n if (resolvedAuthOptions.requestHeaders) Utils.mixin(requestHeaders, resolvedAuthOptions.requestHeaders);\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'Auth.requestToken().requestToken',\n 'Sending POST to ' + path + '; Token params: ' + JSON.stringify(signedTokenParams),\n );\n Utils.whenPromiseSettles(\n this.client.http.do(HttpMethods.Post, tokenUri, requestHeaders, JSON.stringify(signedTokenParams), null),\n (err: any, result) =>\n err\n ? tokenCb(err) // doUri isn\u2019t meant to throw an error, but handle any just in case\n : tokenCb(result!.error, result!.body as API.TokenDetails | string | undefined, result!.unpacked),\n );\n };\n\n return new Promise((resolve, reject) => {\n let tokenRequestCallbackTimeoutExpired = false,\n timeoutLength = this.client.options.timeouts.realtimeRequestTimeout,\n tokenRequestCallbackTimeout = setTimeout(() => {\n tokenRequestCallbackTimeoutExpired = true;\n const msg = 'Token request callback timed out after ' + timeoutLength / 1000 + ' seconds';\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth.requestToken()', msg);\n reject(new ErrorInfo(msg, 40170, 401));\n }, timeoutLength);\n\n tokenRequestCallback!(resolvedTokenParams, (err, tokenRequestOrDetails, contentType) => {\n if (tokenRequestCallbackTimeoutExpired) return;\n clearTimeout(tokenRequestCallbackTimeout);\n\n if (err) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'Auth.requestToken()',\n 'token request signing call returned error; err = ' + Utils.inspectError(err),\n );\n reject(normaliseAuthcallbackError(err));\n return;\n }\n /* the response from the callback might be a token string, a signed request or a token details */\n if (typeof tokenRequestOrDetails === 'string') {\n if (tokenRequestOrDetails.length === 0) {\n reject(new ErrorInfo('Token string is empty', 40170, 401));\n } else if (tokenRequestOrDetails.length > MAX_TOKEN_LENGTH) {\n reject(\n new ErrorInfo(\n 'Token string exceeded max permitted length (was ' + tokenRequestOrDetails.length + ' bytes)',\n 40170,\n 401,\n ),\n );\n } else if (tokenRequestOrDetails === 'undefined' || tokenRequestOrDetails === 'null') {\n /* common failure mode with poorly-implemented authCallbacks */\n reject(new ErrorInfo('Token string was literal null/undefined', 40170, 401));\n } else if (\n tokenRequestOrDetails[0] === '{' &&\n !(contentType && contentType.indexOf('application/jwt') > -1)\n ) {\n reject(\n new ErrorInfo(\n \"Token was double-encoded; make sure you're not JSON-encoding an already encoded token request or details\",\n 40170,\n 401,\n ),\n );\n } else {\n resolve({ token: tokenRequestOrDetails } as API.TokenDetails);\n }\n return;\n }\n if (typeof tokenRequestOrDetails !== 'object' || tokenRequestOrDetails === null) {\n const msg =\n 'Expected token request callback to call back with a token string or token request/details object, but got a ' +\n typeof tokenRequestOrDetails;\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth.requestToken()', msg);\n reject(new ErrorInfo(msg, 40170, 401));\n return;\n }\n const objectSize = JSON.stringify(tokenRequestOrDetails).length;\n if (objectSize > MAX_TOKEN_LENGTH && !resolvedAuthOptions.suppressMaxLengthCheck) {\n reject(\n new ErrorInfo(\n 'Token request/details object exceeded max permitted stringified size (was ' + objectSize + ' bytes)',\n 40170,\n 401,\n ),\n );\n return;\n }\n if ('issued' in tokenRequestOrDetails) {\n /* a tokenDetails object */\n resolve(tokenRequestOrDetails);\n return;\n }\n if (!('keyName' in tokenRequestOrDetails)) {\n const msg =\n 'Expected token request callback to call back with a token string, token request object, or token details object';\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth.requestToken()', msg);\n reject(new ErrorInfo(msg, 40170, 401));\n return;\n }\n /* it's a token request, so make the request */\n tokenRequest(tokenRequestOrDetails, (err, tokenResponse, unpacked) => {\n if (err) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'Auth.requestToken()',\n 'token request API call returned error; err = ' + Utils.inspectError(err),\n );\n reject(normaliseAuthcallbackError(err));\n return;\n }\n if (!unpacked) tokenResponse = JSON.parse(tokenResponse as string);\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.getToken()', 'token received');\n resolve(tokenResponse as API.TokenDetails);\n });\n });\n });\n }\n\n /**\n * Create and sign a token request based on the given options.\n * NOTE this can only be used when the key value is available locally.\n * Otherwise, signed token requests must be obtained from the key\n * owner (either using the token request callback or url).\n *\n * @param authOptions\n * an object containing the request options:\n * - key: the key to use. If not specified, a key passed in constructing\n * the Rest interface will be used\n *\n * - queryTime (optional) boolean indicating that the ably system should be\n * queried for the current time when none is specified explicitly\n *\n * - requestHeaders (optional, unsupported, for testing only) extra headers to add to the\n * requestToken request\n *\n * @param tokenParams\n * an object containing the parameters for the requested token:\n * - ttl: (optional) the requested life of the token in ms. If none is specified\n * a default of 1 hour is provided. The maximum lifetime is 24hours; any request\n * exceeding that lifetime will be rejected with an error.\n *\n * - capability: (optional) the capability to associate with the access token.\n * If none is specified, a token will be requested with all of the\n * capabilities of the specified key.\n *\n * - clientId: (optional) a client ID to associate with the token; if not\n * specified, a clientId passed in constructing the Rest interface will be used\n *\n * - timestamp: (optional) the time in ms since the epoch. If none is specified,\n * the system will be queried for a time value to use.\n */\n async createTokenRequest(tokenParams: API.TokenParams | null, authOptions: any): Promise<API.TokenRequest> {\n /* RSA9h: if authOptions passed in, they're used instead of stored, don't merge them */\n authOptions = authOptions || this.authOptions;\n tokenParams = tokenParams || Utils.copy<API.TokenParams>(this.tokenParams);\n\n const key = authOptions.key;\n if (!key) {\n throw new ErrorInfo('No key specified', 40101, 403);\n }\n const keyParts = key.split(':'),\n keyName = keyParts[0],\n keySecret = keyParts[1];\n\n if (!keySecret) {\n throw new ErrorInfo('Invalid key specified', 40101, 403);\n }\n\n if (tokenParams.clientId === '') {\n throw new ErrorInfo('clientId can\u2019t be an empty string', 40012, 400);\n }\n\n if ('capability' in tokenParams) {\n tokenParams.capability = c14n(tokenParams.capability);\n }\n\n const request: Partial<API.TokenRequest> = Utils.mixin({ keyName: keyName }, tokenParams),\n clientId = tokenParams.clientId || '',\n ttl = tokenParams.ttl || '',\n capability = tokenParams.capability || '';\n\n if (!request.timestamp) {\n request.timestamp = await this._getTimestamp(authOptions && authOptions.queryTime);\n }\n\n /* nonce */\n /* NOTE: there is no expectation that the client\n * specifies the nonce; this is done by the library\n * However, this can be overridden by the client\n * simply for testing purposes. */\n const nonce = request.nonce || (request.nonce = random()),\n timestamp = request.timestamp;\n\n const signText =\n request.keyName + '\\n' + ttl + '\\n' + capability + '\\n' + clientId + '\\n' + timestamp + '\\n' + nonce + '\\n';\n\n /* mac */\n /* NOTE: there is no expectation that the client\n * specifies the mac; this is done by the library\n * However, this can be overridden by the client\n * simply for testing purposes. */\n request.mac = request.mac || hmac(signText, keySecret);\n\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.getTokenRequest()', 'generated signed request');\n\n return request as API.TokenRequest;\n }\n\n /**\n * Get the auth query params to use for a websocket connection,\n * based on the current auth parameters\n */\n async getAuthParams(): Promise<Record<string, string>> {\n if (this.method == 'basic') return { key: this.key! };\n else {\n let tokenDetails = await this._ensureValidAuthCredentials(false);\n if (!tokenDetails) {\n throw new Error('Auth.getAuthParams(): _ensureValidAuthCredentials returned no error or tokenDetails');\n }\n return { access_token: tokenDetails.token };\n }\n }\n\n /**\n * Get the authorization header to use for a REST or comet request,\n * based on the current auth parameters\n */\n async getAuthHeaders(): Promise<Record<string, string>> {\n if (this.method == 'basic') {\n return { authorization: 'Basic ' + this.basicKey };\n } else {\n const tokenDetails = await this._ensureValidAuthCredentials(false);\n if (!tokenDetails) {\n throw new Error('Auth.getAuthParams(): _ensureValidAuthCredentials returned no error or tokenDetails');\n }\n return { authorization: 'Bearer ' + Utils.toBase64(tokenDetails.token) };\n }\n }\n\n _saveBasicOptions(authOptions: AuthOptions) {\n this.method = 'basic';\n this.key = authOptions.key;\n this.basicKey = Utils.toBase64(authOptions.key as string);\n this.authOptions = authOptions || {};\n if ('clientId' in authOptions) {\n this._userSetClientId(authOptions.clientId);\n }\n }\n\n _saveTokenOptions(tokenParams: API.TokenParams | null, authOptions: AuthOptions | null) {\n this.method = 'token';\n\n if (tokenParams) {\n /* We temporarily persist tokenParams.timestamp in case a new token needs\n * to be requested, then null it out in the callback of\n * _ensureValidAuthCredentials for RSA10g compliance */\n this.tokenParams = tokenParams;\n }\n\n if (authOptions) {\n /* normalise */\n if (authOptions.token) {\n /* options.token may contain a token string or, for convenience, a TokenDetails */\n authOptions.tokenDetails =\n typeof authOptions.token === 'string'\n ? ({ token: authOptions.token } as API.TokenDetails)\n : authOptions.token;\n }\n\n if (authOptions.tokenDetails) {\n this.tokenDetails = authOptions.tokenDetails;\n }\n\n if ('clientId' in authOptions) {\n this._userSetClientId(authOptions.clientId);\n }\n\n this.authOptions = authOptions;\n }\n }\n\n /* @param forceSupersede: force a new token request even if there's one in\n * progress, making all pending callbacks wait for the new one */\n async _ensureValidAuthCredentials(forceSupersede: boolean): Promise<API.TokenDetails> {\n const token = this.tokenDetails;\n\n if (token) {\n if (this._tokenClientIdMismatch(token.clientId)) {\n /* 403 to trigger a permanently failed client - RSA15c */\n throw new ErrorInfo(\n 'Mismatch between clientId in token (' + token.clientId + ') and current clientId (' + this.clientId + ')',\n 40102,\n 403,\n );\n }\n /* RSA4b1 -- if we have a server time offset set already, we can\n * automatically remove expired tokens. Else just use the cached token. If it is\n * expired Ably will tell us and we'll discard it then. */\n if (!this.client.isTimeOffsetSet() || !token.expires || token.expires >= this.client.getTimestampUsingOffset()) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'Auth.getToken()',\n 'using cached token; expires = ' + token.expires,\n );\n return token;\n }\n /* expired, so remove and fallthrough to getting a new one */\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.getToken()', 'deleting expired token');\n this.tokenDetails = null;\n }\n\n const promise = (\n this.waitingForTokenRequest || (this.waitingForTokenRequest = Multicaster.create(this.logger))\n ).createPromise();\n if (this.currentTokenRequestId !== null && !forceSupersede) {\n return promise;\n }\n\n /* Request a new token */\n const tokenRequestId = (this.currentTokenRequestId = getTokenRequestId());\n\n let tokenResponse: API.TokenDetails,\n caughtError: ErrorInfo | null = null;\n try {\n tokenResponse = await this.requestToken(this.tokenParams, this.authOptions);\n } catch (err) {\n caughtError = err as ErrorInfo;\n }\n\n if ((this.currentTokenRequestId as number) > tokenRequestId) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'Auth._ensureValidAuthCredentials()',\n 'Discarding token request response; overtaken by newer one',\n );\n return promise;\n }\n\n this.currentTokenRequestId = null;\n const multicaster = this.waitingForTokenRequest;\n this.waitingForTokenRequest = null;\n if (caughtError) {\n multicaster?.rejectAll(caughtError);\n return promise;\n }\n multicaster?.resolveAll((this.tokenDetails = tokenResponse!));\n\n return promise;\n }\n\n /* User-set: check types, '*' is disallowed, throw any errors */\n _userSetClientId(clientId: string | undefined) {\n if (!(typeof clientId === 'string' || clientId === null)) {\n throw new ErrorInfo('clientId must be either a string or null', 40012, 400);\n } else if (clientId === '*') {\n throw new ErrorInfo(\n 'Can\u2019t use \"*\" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, instantiate the library with {defaultTokenParams: {clientId: \"*\"}}), or if calling authorize(), pass it in as a tokenParam: authorize({clientId: \"*\"}, authOptions)',\n 40012,\n 400,\n );\n } else {\n const err = this._uncheckedSetClientId(clientId);\n if (err) throw err;\n }\n }\n\n /* Ably-set: no typechecking, '*' is allowed but not set on this.clientId), return errors to the caller */\n _uncheckedSetClientId(clientId: string | undefined) {\n if (this._tokenClientIdMismatch(clientId)) {\n /* Should never happen in normal circumstances as realtime should\n * recognise mismatch and return an error */\n const msg = 'Unexpected clientId mismatch: client has ' + this.clientId + ', requested ' + clientId;\n const err = new ErrorInfo(msg, 40102, 401);\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth._uncheckedSetClientId()', msg);\n return err;\n } else {\n /* RSA7a4: if options.clientId is provided and is not\n * null, it overrides defaultTokenParams.clientId */\n this.clientId = this.tokenParams.clientId = clientId;\n return null;\n }\n }\n\n _tokenClientIdMismatch(tokenClientId?: string | null): boolean {\n return !!(\n this.clientId &&\n this.clientId !== '*' &&\n tokenClientId &&\n tokenClientId !== '*' &&\n this.clientId !== tokenClientId\n );\n }\n\n static isTokenErr(error: IPartialErrorInfo) {\n return error.code && error.code >= 40140 && error.code < 40150;\n }\n\n revokeTokens(\n specifiers: TokenRevocationTargetSpecifier[],\n options?: TokenRevocationOptions,\n ): Promise<TokenRevocationResult> {\n return this.client.rest.revokeTokens(specifiers, options);\n }\n\n /**\n * Same as {@link BaseClient.getTimestamp} but also takes into account {@link Auth.authOptions}\n */\n private async _getTimestamp(queryTime: boolean): Promise<number> {\n return this.client.getTimestamp(queryTime || !!this.authOptions.queryTime);\n }\n}\n\nexport default Auth;\n", "import Defaults from 'common/lib/util/defaults';\r\nimport Platform from 'common/platform';\r\nimport BaseRealtime from 'common/lib/client/baserealtime';\r\nimport HttpMethods from '../constants/HttpMethods';\r\nimport BaseClient from '../lib/client/baseclient';\r\nimport ErrorInfo, { IPartialErrorInfo } from '../lib/types/errorinfo';\r\nimport Logger from 'common/lib/util/logger';\r\nimport * as Utils from 'common/lib/util/utils';\r\n\r\nexport type PathParameter = string | ((host: string) => string);\r\nexport type ResponseHeaders = Partial<Record<string, string | string[]>>;\r\nexport type RequestResultError = ErrnoException | IPartialErrorInfo;\r\n\r\n/**\r\n * The `body`, `headers`, `unpacked`, and `statusCode` properties of a `RequestResult` may be populated even if its `error` property is non-null.\r\n */\r\nexport type RequestResult = {\r\n error: RequestResultError | null;\r\n body?: unknown;\r\n headers?: ResponseHeaders;\r\n unpacked?: boolean;\r\n statusCode?: number;\r\n};\r\n\r\nexport type RequestParams = Record<string, string> | null;\r\nexport type RequestBody =\r\n | Buffer // only on Node\r\n | ArrayBuffer // only on web\r\n | string;\r\n\r\nexport interface IPlatformHttpStatic {\r\n new (client?: BaseClient): IPlatformHttp;\r\n methods: Array<HttpMethods>;\r\n methodsWithBody: Array<HttpMethods>;\r\n methodsWithoutBody: Array<HttpMethods>;\r\n}\r\n\r\nexport interface IPlatformHttp {\r\n supportsAuthHeaders: boolean;\r\n supportsLinkHeaders: boolean;\r\n\r\n /**\r\n * This method should not throw any errors; rather, it should communicate any error by populating the {@link RequestResult.error} property of the returned {@link RequestResult}.\r\n */\r\n doUri(\r\n method: HttpMethods,\r\n uri: string,\r\n headers: Record<string, string> | null,\r\n body: RequestBody | null,\r\n params: RequestParams,\r\n ): Promise<RequestResult>;\r\n\r\n checkConnectivity?: () => Promise<boolean>;\r\n\r\n /**\r\n * @param error An error from the {@link RequestResult.error} property of a result returned by {@link doUri}.\r\n */\r\n shouldFallback(error: RequestResultError): boolean;\r\n}\r\n\r\nexport function paramString(params: Record<string, any> | null) {\r\n const paramPairs = [];\r\n if (params) {\r\n for (const needle in params) {\r\n paramPairs.push(needle + '=' + params[needle]);\r\n }\r\n }\r\n return paramPairs.join('&');\r\n}\r\n\r\nexport function appendingParams(uri: string, params: Record<string, any> | null) {\r\n return uri + (params ? '?' : '') + paramString(params);\r\n}\r\n\r\nfunction logResult(\r\n result: RequestResult,\r\n method: HttpMethods,\r\n uri: string,\r\n params: Record<string, string> | null,\r\n logger: Logger,\r\n) {\r\n if (result.error) {\r\n Logger.logActionNoStrip(\r\n logger,\r\n Logger.LOG_MICRO,\r\n 'Http.' + method + '()',\r\n 'Received Error; ' + appendingParams(uri, params) + '; Error: ' + Utils.inspectError(result.error),\r\n );\r\n } else {\r\n Logger.logActionNoStrip(\r\n logger,\r\n Logger.LOG_MICRO,\r\n 'Http.' + method + '()',\r\n 'Received; ' +\r\n appendingParams(uri, params) +\r\n '; Headers: ' +\r\n paramString(result.headers as Record<string, any>) +\r\n '; StatusCode: ' +\r\n result.statusCode +\r\n '; Body' +\r\n (Platform.BufferUtils.isBuffer(result.body)\r\n ? ' (Base64): ' + Platform.BufferUtils.base64Encode(result.body)\r\n : ': ' + result.body),\r\n );\r\n }\r\n}\r\n\r\nfunction logRequest(method: HttpMethods, uri: string, body: RequestBody | null, params: RequestParams, logger: Logger) {\r\n if (logger.shouldLog(Logger.LOG_MICRO)) {\r\n Logger.logActionNoStrip(\r\n logger,\r\n Logger.LOG_MICRO,\r\n 'Http.' + method + '()',\r\n 'Sending; ' +\r\n appendingParams(uri, params) +\r\n '; Body' +\r\n (Platform.BufferUtils.isBuffer(body) ? ' (Base64): ' + Platform.BufferUtils.base64Encode(body) : ': ' + body),\r\n );\r\n }\r\n}\r\n\r\nexport class Http {\r\n private readonly platformHttp: IPlatformHttp;\r\n checkConnectivity?: () => Promise<boolean>;\r\n\r\n constructor(private readonly client?: BaseClient) {\r\n this.platformHttp = new Platform.Http(client);\r\n\r\n this.checkConnectivity = this.platformHttp.checkConnectivity\r\n ? () => this.platformHttp.checkConnectivity!()\r\n : undefined;\r\n }\r\n\r\n get logger(): Logger {\r\n return this.client?.logger ?? Logger.defaultLogger;\r\n }\r\n\r\n get supportsAuthHeaders() {\r\n return this.platformHttp.supportsAuthHeaders;\r\n }\r\n\r\n get supportsLinkHeaders() {\r\n return this.platformHttp.supportsLinkHeaders;\r\n }\r\n\r\n _getHosts(client: BaseClient) {\r\n /* If we're a connected realtime client, try the endpoint we're connected\r\n * to first -- but still have fallbacks, being connected is not an absolute\r\n * guarantee that a datacenter has free capacity to service REST requests. */\r\n const connection = (client as BaseRealtime).connection,\r\n connectionHost = connection && connection.connectionManager.host;\r\n\r\n if (connectionHost) {\r\n return [connectionHost].concat(Defaults.getFallbackHosts(client.options));\r\n }\r\n\r\n return Defaults.getHosts(client.options);\r\n }\r\n\r\n /**\r\n * This method will not throw any errors; rather, it will communicate any error by populating the {@link RequestResult.error} property of the returned {@link RequestResult}.\r\n */\r\n async do(\r\n method: HttpMethods,\r\n path: PathParameter,\r\n headers: Record<string, string> | null,\r\n body: RequestBody | null,\r\n params: RequestParams,\r\n ): Promise<RequestResult> {\r\n try {\r\n /* Unlike for doUri, the presence of `this.client` here is mandatory, as it's used to generate the hosts */\r\n const client = this.client;\r\n if (!client) {\r\n return { error: new ErrorInfo('http.do called without client', 50000, 500) };\r\n }\r\n\r\n const uriFromHost =\r\n typeof path === 'function'\r\n ? path\r\n : function (host: string) {\r\n return client.baseUri(host) + path;\r\n };\r\n\r\n const currentFallback = client._currentFallback;\r\n if (currentFallback) {\r\n if (currentFallback.validUntil > Date.now()) {\r\n /* Use stored fallback */\r\n const result = await this.doUri(method, uriFromHost(currentFallback.host), headers, body, params);\r\n if (result.error && this.platformHttp.shouldFallback(result.error as ErrnoException)) {\r\n /* unstore the fallback and start from the top with the default sequence */\r\n client._currentFallback = null;\r\n return this.do(method, path, headers, body, params);\r\n }\r\n return result;\r\n } else {\r\n /* Fallback expired; remove it and fallthrough to normal sequence */\r\n client._currentFallback = null;\r\n }\r\n }\r\n\r\n const hosts = this._getHosts(client);\r\n\r\n /* see if we have one or more than one host */\r\n if (hosts.length === 1) {\r\n return this.doUri(method, uriFromHost(hosts[0]), headers, body, params);\r\n }\r\n\r\n let tryAHostStartedAt: Date | null = null;\r\n const tryAHost = async (candidateHosts: Array<string>, persistOnSuccess?: boolean): Promise<RequestResult> => {\r\n const host = candidateHosts.shift();\r\n tryAHostStartedAt = tryAHostStartedAt ?? new Date();\r\n const result = await this.doUri(method, uriFromHost(host as string), headers, body, params);\r\n if (result.error && this.platformHttp.shouldFallback(result.error as ErrnoException) && candidateHosts.length) {\r\n // TO3l6\r\n const elapsedTime = Date.now() - tryAHostStartedAt.getTime();\r\n if (elapsedTime > client.options.timeouts.httpMaxRetryDuration) {\r\n return {\r\n error: new ErrorInfo(\r\n `Timeout for trying fallback hosts retries. Total elapsed time exceeded the ${client.options.timeouts.httpMaxRetryDuration}ms limit`,\r\n 50003,\r\n 500,\r\n ),\r\n };\r\n }\r\n\r\n return tryAHost(candidateHosts, true);\r\n }\r\n if (persistOnSuccess) {\r\n /* RSC15f */\r\n client._currentFallback = {\r\n host: host as string,\r\n validUntil: Date.now() + client.options.timeouts.fallbackRetryTimeout,\r\n };\r\n }\r\n return result;\r\n };\r\n return tryAHost(hosts);\r\n } catch (err) {\r\n // Handle any unexpected error, to ensure we always meet our contract of not throwing any errors\r\n return { error: new ErrorInfo(`Unexpected error in Http.do: ${Utils.inspectError(err)}`, 500, 50000) };\r\n }\r\n }\r\n\r\n /**\r\n * This method will not throw any errors; rather, it will communicate any error by populating the {@link RequestResult.error} property of the returned {@link RequestResult}.\r\n */\r\n async doUri(\r\n method: HttpMethods,\r\n uri: string,\r\n headers: Record<string, string> | null,\r\n body: RequestBody | null,\r\n params: RequestParams,\r\n ): Promise<RequestResult> {\r\n try {\r\n logRequest(method, uri, body, params, this.logger);\r\n\r\n const result = await this.platformHttp.doUri(method, uri, headers, body, params);\r\n\r\n if (this.logger.shouldLog(Logger.LOG_MICRO)) {\r\n logResult(result, method, uri, params, this.logger);\r\n }\r\n\r\n return result;\r\n } catch (err) {\r\n // Handle any unexpected error, to ensure we always meet our contract of not throwing any errors\r\n return { error: new ErrorInfo(`Unexpected error in Http.doUri: ${Utils.inspectError(err)}`, 500, 50000) };\r\n }\r\n }\r\n}\r\n\r\nexport interface ErrnoException extends Error {\r\n errno?: number;\r\n code?: string;\r\n path?: string;\r\n syscall?: string;\r\n stack?: string;\r\n statusCode: number;\r\n}\r\n", "import * as Utils from './utils';\nimport Logger from './logger';\nimport Platform from 'common/platform';\n\n/* Call the listener, catch any exceptions and log, but continue operation*/\nfunction callListener(logger: Logger, eventThis: { event: string }, listener: Function, args: unknown[]) {\n try {\n listener.apply(eventThis, args);\n } catch (e) {\n Logger.logAction(\n logger,\n Logger.LOG_ERROR,\n 'EventEmitter.emit()',\n 'Unexpected listener exception: ' + e + '; stack = ' + (e && (e as Error).stack),\n );\n }\n}\n\n/**\n * Remove listeners that match listener\n * @param targetListeners is an array of listener arrays or event objects with arrays of listeners\n * @param listener the listener callback to remove\n * @param eventFilter (optional) event name instructing the function to only remove listeners for the specified event\n */\nfunction removeListener(targetListeners: any, listener: Function, eventFilter?: string) {\n let listeners: Record<string, unknown>;\n let index;\n let eventName;\n\n for (let targetListenersIndex = 0; targetListenersIndex < targetListeners.length; targetListenersIndex++) {\n listeners = targetListeners[targetListenersIndex];\n if (eventFilter) {\n listeners = listeners[eventFilter] as Record<string, unknown>;\n }\n\n if (Array.isArray(listeners)) {\n while ((index = listeners.indexOf(listener)) !== -1) {\n listeners.splice(index, 1);\n }\n /* If events object has an event name key with no listeners then\n\t\t\t\t\tremove the key to stop the list growing indefinitely */\n if (eventFilter && listeners.length === 0) {\n delete targetListeners[targetListenersIndex][eventFilter];\n }\n } else if (Utils.isObject(listeners)) {\n /* events */\n for (eventName in listeners) {\n if (Object.prototype.hasOwnProperty.call(listeners, eventName) && Array.isArray(listeners[eventName])) {\n removeListener([listeners], listener, eventName);\n }\n }\n }\n }\n}\n\nclass EventEmitter {\n any: Array<Function>;\n events: Record<string, Array<Function>>;\n anyOnce: Array<Function>;\n eventsOnce: Record<string, Array<Function>>;\n\n constructor(readonly logger: Logger) {\n this.any = [];\n this.events = Object.create(null);\n this.anyOnce = [];\n this.eventsOnce = Object.create(null);\n }\n\n /**\n * Add an event listener\n * @param listener the listener to be called\n */\n on(listener: Function): void;\n\n /**\n * Add an event listener\n * @param event (optional) the name of the event to listen to\n * @param listener the listener to be called\n */\n on(event: null | string | string[], listener: Function): void;\n\n on(...args: unknown[]) {\n if (args.length === 1) {\n const listener = args[0];\n if (typeof listener === 'function') {\n this.any.push(listener);\n } else {\n throw new Error('EventListener.on(): Invalid arguments: ' + Platform.Config.inspect(args));\n }\n }\n if (args.length === 2) {\n const [event, listener] = args;\n if (typeof listener !== 'function') {\n throw new Error('EventListener.on(): Invalid arguments: ' + Platform.Config.inspect(args));\n }\n if (Utils.isNil(event)) {\n this.any.push(listener);\n } else if (Array.isArray(event)) {\n event.forEach((eventName) => {\n this.on(eventName, listener);\n });\n } else {\n if (typeof event !== 'string') {\n throw new Error('EventListener.on(): Invalid arguments: ' + Platform.Config.inspect(args));\n }\n const listeners = this.events[event] || (this.events[event] = []);\n listeners.push(listener);\n }\n }\n }\n\n /**\n * Remove one or more event listeners\n * @param listener (optional) the listener to remove. If not\n * supplied, all listeners are removed.\n */\n off(listener?: Function): void;\n\n /**\n * Remove one or more event listeners\n * @param event (optional) the name of the event whose listener\n * is to be removed. If not supplied, the listener is\n * treated as an 'any' listener\n * @param listener (optional) the listener to remove. If not\n * supplied, all listeners are removed.\n */\n off(event: string | string[] | null, listener?: Function | null): void;\n\n off(...args: unknown[]) {\n if (args.length == 0 || (Utils.isNil(args[0]) && Utils.isNil(args[1]))) {\n this.any = [];\n this.events = Object.create(null);\n this.anyOnce = [];\n this.eventsOnce = Object.create(null);\n return;\n }\n const [firstArg, secondArg] = args;\n let listener: Function | null = null;\n let event: unknown = null;\n if (args.length === 1 || !secondArg) {\n if (typeof firstArg === 'function') {\n /* we take this to be the listener and treat the event as \"any\" .. */\n listener = firstArg;\n } else {\n event = firstArg;\n }\n /* ... or we take event to be the actual event name and listener to be all */\n } else {\n if (typeof secondArg !== 'function') {\n throw new Error('EventEmitter.off(): invalid arguments:' + Platform.Config.inspect(args));\n }\n [event, listener] = [firstArg, secondArg];\n }\n\n if (listener && Utils.isNil(event)) {\n removeListener([this.any, this.events, this.anyOnce, this.eventsOnce], listener);\n return;\n }\n\n if (Array.isArray(event)) {\n event.forEach((eventName) => {\n this.off(eventName, listener);\n });\n return;\n }\n\n /* \"normal\" case where event is an actual event */\n if (typeof event !== 'string') {\n throw new Error('EventEmitter.off(): invalid arguments:' + Platform.Config.inspect(args));\n }\n if (listener) {\n removeListener([this.events, this.eventsOnce], listener, event);\n } else {\n delete this.events[event];\n delete this.eventsOnce[event];\n }\n }\n\n /**\n * Get the array of listeners for a given event; excludes once events\n * @param event (optional) the name of the event, or none for 'any'\n * @return array of events, or null if none\n */\n listeners(event: string) {\n if (event) {\n const listeners = this.events[event] || [];\n if (this.eventsOnce[event]) Array.prototype.push.apply(listeners, this.eventsOnce[event]);\n return listeners.length ? listeners : null;\n }\n return this.any.length ? this.any : null;\n }\n\n /**\n * Emit an event\n * @param event the event name\n * @param args the arguments to pass to the listener\n */\n emit(event: string, ...args: unknown[] /* , args... */) {\n const eventThis = { event };\n const listeners: Function[] = [];\n\n if (this.anyOnce.length) {\n Array.prototype.push.apply(listeners, this.anyOnce);\n this.anyOnce = [];\n }\n if (this.any.length) {\n Array.prototype.push.apply(listeners, this.any);\n }\n const eventsOnceListeners = this.eventsOnce[event];\n if (eventsOnceListeners) {\n Array.prototype.push.apply(listeners, eventsOnceListeners);\n delete this.eventsOnce[event];\n }\n const eventsListeners = this.events[event];\n if (eventsListeners) {\n Array.prototype.push.apply(listeners, eventsListeners);\n }\n\n listeners.forEach((listener) => {\n callListener(this.logger, eventThis, listener, args);\n });\n }\n\n /**\n * Listen for a single occurrence of an event\n * @param event the name of the event to listen to\n */\n once(event: string): Promise<void>;\n\n /**\n * Listen for a single occurrence of any event\n * @param listener the listener to be called\n */\n once(listener: Function): void;\n\n /**\n * Listen for a single occurrence of an event\n * @param event the name of the event to listen to\n * @param listener the listener to be called\n */\n once(event?: string | string[] | null, listener?: Function): void;\n\n once(...args: unknown[]): void | Promise<void> {\n const argCount = args.length;\n if (argCount === 0 || (argCount === 1 && typeof args[0] !== 'function')) {\n const event = args[0];\n return new Promise((resolve) => {\n this.once(event as string | string[] | null, resolve);\n });\n }\n\n const [firstArg, secondArg] = args;\n if (args.length === 1 && typeof firstArg === 'function') {\n this.anyOnce.push(firstArg);\n } else if (Utils.isNil(firstArg)) {\n if (typeof secondArg !== 'function') {\n throw new Error('EventEmitter.once(): Invalid arguments:' + Platform.Config.inspect(args));\n }\n this.anyOnce.push(secondArg);\n } else if (Array.isArray(firstArg)) {\n const self = this;\n const listenerWrapper = function (this: any) {\n const innerArgs = Array.prototype.slice.call(arguments);\n firstArg.forEach(function (eventName) {\n self.off(eventName, listenerWrapper);\n });\n if (typeof secondArg !== 'function') {\n throw new Error('EventEmitter.once(): Invalid arguments:' + Platform.Config.inspect(args));\n }\n secondArg.apply(this, innerArgs);\n };\n firstArg.forEach(function (eventName) {\n self.on(eventName, listenerWrapper);\n });\n } else {\n if (typeof firstArg !== 'string') {\n throw new Error('EventEmitter.once(): Invalid arguments:' + Platform.Config.inspect(args));\n }\n const listeners = this.eventsOnce[firstArg] || (this.eventsOnce[firstArg] = []);\n if (secondArg) {\n if (typeof secondArg !== 'function') {\n throw new Error('EventEmitter.once(): Invalid arguments:' + Platform.Config.inspect(args));\n }\n listeners.push(secondArg);\n }\n }\n }\n\n /**\n * Listen for a single occurrence of a state event and fire immediately if currentState matches targetState\n * @param targetState the name of the state event to listen to\n * @param currentState the name of the current state of this object\n */\n async whenState(targetState: string, currentState: string) {\n if (typeof targetState !== 'string' || typeof currentState !== 'string') {\n throw new Error('whenState requires a valid state String argument');\n }\n if (targetState === currentState) {\n return null;\n } else {\n return this.once(targetState);\n }\n }\n}\n\nexport default EventEmitter;\n", "// constant definitions that can be imported by anyone without worrying about circular\r\n// deps\r\n\r\n// TR2\r\nexport const actions = {\r\n HEARTBEAT: 0,\r\n ACK: 1,\r\n NACK: 2,\r\n CONNECT: 3,\r\n CONNECTED: 4,\r\n DISCONNECT: 5,\r\n DISCONNECTED: 6,\r\n CLOSE: 7,\r\n CLOSED: 8,\r\n ERROR: 9,\r\n ATTACH: 10,\r\n ATTACHED: 11,\r\n DETACH: 12,\r\n DETACHED: 13,\r\n PRESENCE: 14,\r\n MESSAGE: 15,\r\n SYNC: 16,\r\n AUTH: 17,\r\n ACTIVATE: 18,\r\n OBJECT: 19,\r\n OBJECT_SYNC: 20,\r\n ANNOTATION: 21,\r\n};\r\n\r\nexport const ActionName: string[] = [];\r\nObject.keys(actions).forEach(function (name) {\r\n ActionName[(actions as { [key: string]: number })[name]] = name;\r\n});\r\n\r\n// TR3\r\nexport const flags: { [key: string]: number } = {\r\n /* Channel attach state flags */\r\n HAS_PRESENCE: 1 << 0,\r\n HAS_BACKLOG: 1 << 1,\r\n RESUMED: 1 << 2,\r\n TRANSIENT: 1 << 4,\r\n ATTACH_RESUME: 1 << 5,\r\n HAS_OBJECTS: 1 << 7,\r\n /* Channel mode flags */\r\n PRESENCE: 1 << 16,\r\n PUBLISH: 1 << 17,\r\n SUBSCRIBE: 1 << 18,\r\n PRESENCE_SUBSCRIBE: 1 << 19,\r\n ANNOTATION_PUBLISH: 1 << 21,\r\n ANNOTATION_SUBSCRIBE: 1 << 22,\r\n OBJECT_SUBSCRIBE: 1 << 24,\r\n OBJECT_PUBLISH: 1 << 25,\r\n};\r\n\r\nexport const flagNames = Object.keys(flags);\r\n\r\nflags.MODE_ALL =\r\n flags.PRESENCE |\r\n flags.PUBLISH |\r\n flags.SUBSCRIBE |\r\n flags.PRESENCE_SUBSCRIBE |\r\n flags.ANNOTATION_PUBLISH |\r\n flags.ANNOTATION_SUBSCRIBE |\r\n flags.OBJECT_SUBSCRIBE |\r\n flags.OBJECT_PUBLISH;\r\n\r\nexport const channelModes = [\r\n 'PRESENCE',\r\n 'PUBLISH',\r\n 'SUBSCRIBE',\r\n 'PRESENCE_SUBSCRIBE',\r\n 'ANNOTATION_PUBLISH',\r\n 'ANNOTATION_SUBSCRIBE',\r\n 'OBJECT_SUBSCRIBE',\r\n 'OBJECT_PUBLISH',\r\n];\r\n", "import Platform from 'common/platform';\r\nimport * as API from '../../../../ably';\r\nimport { Bufferlike as BrowserBufferlike } from '../../../platform/web/lib/util/bufferutils';\r\nimport Logger from '../util/logger';\r\nimport * as Utils from '../util/utils';\r\nimport ErrorInfo from './errorinfo';\r\nimport { actions } from './protocolmessagecommon';\r\n\r\nimport type { IUntypedCryptoStatic } from 'common/types/ICryptoStatic';\r\nimport type { ChannelOptions } from '../../types/channel';\r\nimport type ProtocolMessage from './protocolmessage';\r\n\r\nexport type CipherOptions = {\r\n channelCipher: {\r\n encrypt: Function;\r\n algorithm: 'aes';\r\n };\r\n cipher?: {\r\n channelCipher: {\r\n encrypt: Function;\r\n algorithm: 'aes';\r\n };\r\n };\r\n};\r\n\r\nexport type EncodingDecodingContext = {\r\n channelOptions: ChannelOptions;\r\n plugins: {\r\n vcdiff?: {\r\n decode: (delta: Uint8Array, source: Uint8Array) => Uint8Array;\r\n };\r\n };\r\n baseEncodedPreviousPayload?: Buffer | BrowserBufferlike;\r\n};\r\n\r\nfunction normaliseContext(context: CipherOptions | EncodingDecodingContext | ChannelOptions): EncodingDecodingContext {\r\n if (!context || !(context as EncodingDecodingContext).channelOptions) {\r\n return {\r\n channelOptions: context as ChannelOptions,\r\n plugins: {},\r\n baseEncodedPreviousPayload: undefined,\r\n };\r\n }\r\n return context as EncodingDecodingContext;\r\n}\r\n\r\nexport function normalizeCipherOptions(\r\n Crypto: IUntypedCryptoStatic | null,\r\n logger: Logger,\r\n options: API.ChannelOptions | null,\r\n): ChannelOptions {\r\n if (options && options.cipher) {\r\n if (!Crypto) Utils.throwMissingPluginError('Crypto');\r\n const cipher = Crypto.getCipher(options.cipher, logger);\r\n return {\r\n cipher: cipher.cipherParams,\r\n channelCipher: cipher.cipher,\r\n };\r\n }\r\n return options ?? {};\r\n}\r\n\r\nasync function encrypt<T extends BaseMessage>(msg: T, cipherOptions: CipherOptions): Promise<T> {\r\n const { data, encoding } = await encryptData(msg.data, msg.encoding, cipherOptions);\r\n msg.data = data;\r\n msg.encoding = encoding;\r\n return msg;\r\n}\r\n\r\nexport async function encryptData(\r\n data: any,\r\n encoding: string | null | undefined,\r\n cipherOptions: CipherOptions,\r\n): Promise<{ data: any; encoding: string | null | undefined }> {\r\n let cipher = cipherOptions.channelCipher;\r\n let dataToEncrypt = data;\r\n let finalEncoding = encoding ? encoding + '/' : '';\r\n\r\n if (!Platform.BufferUtils.isBuffer(dataToEncrypt)) {\r\n dataToEncrypt = Platform.BufferUtils.utf8Encode(String(dataToEncrypt));\r\n finalEncoding = finalEncoding + 'utf-8/';\r\n }\r\n\r\n const ciphertext = await cipher.encrypt(dataToEncrypt);\r\n finalEncoding = finalEncoding + 'cipher+' + cipher.algorithm;\r\n\r\n return {\r\n data: ciphertext,\r\n encoding: finalEncoding,\r\n };\r\n}\r\n\r\n/**\r\n * Encodes and encrypts message's payload. Mutates the message object.\r\n * Implements RSL4 and RSL5.\r\n */\r\nexport async function encode<T extends BaseMessage>(msg: T, options: unknown): Promise<T> {\r\n // RSL4a, supported types\r\n const isNativeDataType =\r\n typeof msg.data == 'string' ||\r\n Platform.BufferUtils.isBuffer(msg.data) ||\r\n msg.data === null ||\r\n msg.data === undefined;\r\n const { data, encoding } = encodeData(msg.data, msg.encoding, isNativeDataType);\r\n\r\n msg.data = data;\r\n msg.encoding = encoding;\r\n\r\n if (options != null && (options as CipherOptions).cipher) {\r\n return encrypt(msg, options as CipherOptions);\r\n } else {\r\n return msg;\r\n }\r\n}\r\n\r\nexport function encodeData(\r\n data: any,\r\n encoding: string | null | undefined,\r\n isNativeDataType: boolean,\r\n): { data: any; encoding: string | null | undefined } {\r\n if (isNativeDataType) {\r\n // nothing to do with the native data types at this point\r\n return {\r\n data,\r\n encoding,\r\n };\r\n }\r\n\r\n if (Utils.isObject(data) || Array.isArray(data)) {\r\n // RSL4c3 and RSL4d3, encode objects and arrays as strings\r\n return {\r\n data: JSON.stringify(data),\r\n encoding: encoding ? encoding + '/json' : 'json',\r\n };\r\n }\r\n\r\n // RSL4a, throw an error for unsupported types\r\n throw new ErrorInfo('Data type is unsupported', 40013, 400);\r\n}\r\n\r\nexport async function decode<T extends BaseMessage>(\r\n message: T,\r\n inputContext: CipherOptions | EncodingDecodingContext | ChannelOptions,\r\n): Promise<void> {\r\n // data can be decoded partially and throw an error on a later decoding step.\r\n // so we need to reassign the data and encoding values we got, and only then throw an error if there is one\r\n const { data, encoding, error } = await decodeData(message.data, message.encoding, inputContext);\r\n message.data = data;\r\n message.encoding = encoding;\r\n\r\n if (error) {\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Implements RSL6\r\n */\r\nexport async function decodeData(\r\n data: any,\r\n encoding: string | null | undefined,\r\n inputContext: CipherOptions | EncodingDecodingContext | ChannelOptions,\r\n): Promise<{\r\n error?: ErrorInfo;\r\n data: any;\r\n encoding: string | null | undefined;\r\n}> {\r\n const context = normaliseContext(inputContext);\r\n let lastPayload = data;\r\n let decodedData = data;\r\n let finalEncoding = encoding;\r\n let decodingError: ErrorInfo | undefined;\r\n\r\n if (encoding) {\r\n const xforms = encoding.split('/');\r\n let lastProcessedEncodingIndex;\r\n let encodingsToProcess = xforms.length;\r\n let xform = '';\r\n\r\n try {\r\n while ((lastProcessedEncodingIndex = encodingsToProcess) > 0) {\r\n // eslint-disable-next-line security/detect-unsafe-regex\r\n const match = xforms[--encodingsToProcess].match(/([-\\w]+)(\\+([\\w-]+))?/);\r\n if (!match) break;\r\n xform = match[1];\r\n switch (xform) {\r\n case 'base64':\r\n decodedData = Platform.BufferUtils.base64Decode(String(decodedData));\r\n if (lastProcessedEncodingIndex == xforms.length) {\r\n lastPayload = decodedData;\r\n }\r\n continue;\r\n case 'utf-8':\r\n decodedData = Platform.BufferUtils.utf8Decode(decodedData);\r\n continue;\r\n case 'json':\r\n decodedData = JSON.parse(decodedData);\r\n continue;\r\n case 'cipher':\r\n if (\r\n context.channelOptions != null &&\r\n context.channelOptions.cipher &&\r\n context.channelOptions.channelCipher\r\n ) {\r\n const xformAlgorithm = match[3],\r\n cipher = context.channelOptions.channelCipher;\r\n /* don't attempt to decrypt unless the cipher params are compatible */\r\n if (xformAlgorithm != cipher.algorithm) {\r\n throw new Error('Unable to decrypt message with given cipher; incompatible cipher params');\r\n }\r\n decodedData = await cipher.decrypt(decodedData);\r\n continue;\r\n } else {\r\n throw new Error('Unable to decrypt message; not an encrypted channel');\r\n }\r\n case 'vcdiff':\r\n if (!context.plugins || !context.plugins.vcdiff) {\r\n throw new ErrorInfo('Missing Vcdiff decoder (https://github.com/ably-forks/vcdiff-decoder)', 40019, 400);\r\n }\r\n if (typeof Uint8Array === 'undefined') {\r\n throw new ErrorInfo(\r\n 'Delta decoding not supported on this browser (need ArrayBuffer & Uint8Array)',\r\n 40020,\r\n 400,\r\n );\r\n }\r\n try {\r\n let deltaBase = context.baseEncodedPreviousPayload;\r\n if (typeof deltaBase === 'string') {\r\n deltaBase = Platform.BufferUtils.utf8Encode(deltaBase);\r\n }\r\n\r\n // vcdiff expects Uint8Arrays, can't copy with ArrayBuffers.\r\n const deltaBaseBuffer = Platform.BufferUtils.toBuffer(deltaBase as Buffer);\r\n decodedData = Platform.BufferUtils.toBuffer(decodedData);\r\n\r\n decodedData = Platform.BufferUtils.arrayBufferViewToBuffer(\r\n context.plugins.vcdiff.decode(decodedData, deltaBaseBuffer),\r\n );\r\n lastPayload = decodedData;\r\n } catch (e) {\r\n throw new ErrorInfo('Vcdiff delta decode failed with ' + e, 40018, 400);\r\n }\r\n continue;\r\n default:\r\n throw new Error('Unknown encoding');\r\n }\r\n }\r\n } catch (e) {\r\n const err = e as ErrorInfo;\r\n decodingError = new ErrorInfo(\r\n `Error processing the ${xform} encoding, decoder returned \u2018${err.message}\u2019`,\r\n err.code || 40013,\r\n 400,\r\n );\r\n } finally {\r\n finalEncoding =\r\n (lastProcessedEncodingIndex as number) <= 0 ? null : xforms.slice(0, lastProcessedEncodingIndex).join('/');\r\n }\r\n }\r\n\r\n if (decodingError) {\r\n return {\r\n error: decodingError,\r\n data: decodedData,\r\n encoding: finalEncoding,\r\n };\r\n }\r\n\r\n context.baseEncodedPreviousPayload = lastPayload;\r\n return {\r\n data: decodedData,\r\n encoding: finalEncoding,\r\n };\r\n}\r\n\r\nexport function wireToJSON(this: BaseMessage, ...args: any[]): any {\r\n // encode message data for wire transmission. we can infer the format used by client by inspecting with what arguments this method was called.\r\n // if JSON encoding is being used, the JSON.stringify() will be called and this toJSON() method will have a non-empty arguments list.\r\n // MSGPack encoding implementation also calls toJSON(), but with an empty arguments list.\r\n const format = args.length > 0 ? Utils.Format.json : Utils.Format.msgpack;\r\n const { data, encoding } = encodeDataForWire(this.data, this.encoding, format);\r\n\r\n return Object.assign({}, this, { encoding, data });\r\n}\r\n\r\n/**\r\n * Prepares the payload data to be transmitted over the wire to Ably.\r\n * Encodes the data depending on the selected protocol format.\r\n *\r\n * Implements RSL4c1 and RSL4d1\r\n */\r\nexport function encodeDataForWire(\r\n data: any,\r\n encoding: string | null | undefined,\r\n format: Utils.Format,\r\n): { data: any; encoding: string | null | undefined } {\r\n if (!data || !Platform.BufferUtils.isBuffer(data)) {\r\n // no encoding required for non-buffer payloads\r\n return {\r\n data,\r\n encoding,\r\n };\r\n }\r\n\r\n if (format === Utils.Format.msgpack) {\r\n // RSL4c1\r\n // BufferUtils.toBuffer returns a datatype understandable by that platform's msgpack implementation:\r\n // Buffer in node, Uint8Array in browsers\r\n return {\r\n data: Platform.BufferUtils.toBuffer(data),\r\n encoding,\r\n };\r\n }\r\n\r\n // RSL4d1, encode binary payload as base64 string\r\n return {\r\n data: Platform.BufferUtils.base64Encode(data),\r\n encoding: encoding ? encoding + '/base64' : 'base64',\r\n };\r\n}\r\n\r\nexport const MessageEncoding = {\r\n encryptData,\r\n encodeData,\r\n encodeDataForWire,\r\n decodeData,\r\n};\r\n\r\n// in-place, generally called on the protocol message before decoding\r\nexport function populateFieldsFromParent(parent: ProtocolMessage) {\r\n const { id, connectionId, timestamp } = parent;\r\n\r\n let msgs: BaseMessage[];\r\n switch (parent.action) {\r\n case actions.MESSAGE: {\r\n msgs = parent.messages!;\r\n break;\r\n }\r\n case actions.PRESENCE:\r\n case actions.SYNC:\r\n msgs = parent.presence!;\r\n break;\r\n case actions.ANNOTATION:\r\n msgs = parent.annotations!;\r\n break;\r\n case actions.OBJECT:\r\n case actions.OBJECT_SYNC:\r\n msgs = parent.state!;\r\n break;\r\n default:\r\n throw new ErrorInfo('Unexpected action ' + parent.action, 40000, 400);\r\n }\r\n\r\n for (let i = 0; i < msgs.length; i++) {\r\n const msg = msgs[i];\r\n if (!msg.connectionId) {\r\n msg.connectionId = connectionId;\r\n }\r\n if (!msg.timestamp) {\r\n msg.timestamp = timestamp;\r\n }\r\n if (id && !msg.id) {\r\n msg.id = id + ':' + i;\r\n }\r\n }\r\n}\r\n\r\nexport function strMsg(m: any, cls: string) {\r\n let result = '[' + cls;\r\n for (const attr in m) {\r\n if (attr === 'data') {\r\n if (typeof m.data == 'string') {\r\n result += '; data=' + m.data;\r\n } else if (Platform.BufferUtils.isBuffer(m.data)) {\r\n result += '; data (buffer)=' + Platform.BufferUtils.base64Encode(m.data);\r\n } else if (typeof m.data !== 'undefined') {\r\n result += '; data (json)=' + JSON.stringify(m.data);\r\n }\r\n } else if (attr && (attr === 'extras' || attr === 'operation')) {\r\n result += '; ' + attr + '=' + JSON.stringify(m[attr]);\r\n } else if (m[attr] !== undefined) {\r\n result += '; ' + attr + '=' + m[attr];\r\n }\r\n }\r\n result += ']';\r\n return result;\r\n}\r\n\r\nexport abstract class BaseMessage {\r\n id?: string;\r\n timestamp?: number;\r\n clientId?: string;\r\n connectionId?: string;\r\n data?: any;\r\n encoding?: string | null;\r\n extras?: any;\r\n size?: number;\r\n}\r\n", "import Logger, { LoggerOptions } from '../util/logger';\nimport Defaults from '../util/defaults';\nimport Auth from './auth';\nimport { HttpPaginatedResponse, PaginatedResult } from './paginatedresource';\nimport ErrorInfo from '../types/errorinfo';\nimport Stats from '../types/stats';\nimport { Http, RequestParams } from '../../types/http';\nimport ClientOptions, { NormalisedClientOptions } from '../../types/ClientOptions';\nimport * as API from '../../../../ably';\nimport * as Utils from '../util/utils';\n\nimport Platform from '../../platform';\nimport { Rest } from './rest';\nimport { IUntypedCryptoStatic } from 'common/types/ICryptoStatic';\nimport { AnnotationsPlugin } from './modularplugins';\nimport { throwMissingPluginError } from '../util/utils';\nimport { MsgPack } from 'common/types/msgpack';\nimport { HTTPRequestImplementations } from 'platform/web/lib/http/http';\nimport { FilteredSubscriptions } from './filteredsubscriptions';\nimport type { LocalDevice } from 'plugins/push/pushactivation';\nimport EventEmitter from '../util/eventemitter';\nimport { MessageEncoding } from '../types/basemessage';\n\ntype BatchResult<T> = API.BatchResult<T>;\ntype BatchPublishSpec = API.BatchPublishSpec;\ntype BatchPublishSuccessResult = API.BatchPublishSuccessResult;\ntype BatchPublishFailureResult = API.BatchPublishFailureResult;\ntype BatchPublishResult = BatchResult<BatchPublishSuccessResult | BatchPublishFailureResult>;\ntype BatchPresenceSuccessResult = API.BatchPresenceSuccessResult;\ntype BatchPresenceFailureResult = API.BatchPresenceFailureResult;\ntype BatchPresenceResult = BatchResult<BatchPresenceSuccessResult | BatchPresenceFailureResult>;\n\n/**\n `BaseClient` acts as the base class for all of the client classes exported by the SDK. It is an implementation detail and this class is not advertised publicly.\n */\nclass BaseClient {\n options: NormalisedClientOptions;\n _currentFallback: null | {\n host: string;\n validUntil: number;\n };\n serverTimeOffset: number | null;\n http: Http;\n auth: Auth;\n\n private readonly _rest: Rest | null;\n readonly _Crypto: IUntypedCryptoStatic | null;\n readonly _MsgPack: MsgPack | null;\n // Extra HTTP request implementations available to this client, in addition to those in web\u2019s Http.bundledRequestImplementations\n readonly _additionalHTTPRequestImplementations: HTTPRequestImplementations | null;\n private readonly __FilteredSubscriptions: typeof FilteredSubscriptions | null;\n readonly _Annotations: AnnotationsPlugin | null;\n readonly logger: Logger;\n _device?: LocalDevice;\n\n constructor(options: ClientOptions) {\n this._additionalHTTPRequestImplementations = options.plugins ?? null;\n\n this.logger = new Logger();\n this.logger.setLog(options.logLevel, options.logHandler);\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'BaseClient()',\n 'initialized with clientOptions ' + Platform.Config.inspect(options),\n );\n\n this._MsgPack = options.plugins?.MsgPack ?? null;\n const normalOptions = (this.options = Defaults.normaliseOptions(options, this._MsgPack, this.logger));\n\n /* process options */\n if (normalOptions.key) {\n const keyMatch = normalOptions.key.match(/^([^:\\s]+):([^:.\\s]+)$/);\n if (!keyMatch) {\n const msg = 'invalid key parameter';\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'BaseClient()', msg);\n throw new ErrorInfo(msg, 40400, 404);\n }\n normalOptions.keyName = keyMatch[1];\n normalOptions.keySecret = keyMatch[2];\n }\n\n if ('clientId' in normalOptions) {\n if (!(typeof normalOptions.clientId === 'string' || normalOptions.clientId === null))\n throw new ErrorInfo('clientId must be either a string or null', 40012, 400);\n else if (normalOptions.clientId === '*')\n throw new ErrorInfo(\n 'Can\u2019t use \"*\" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, use {defaultTokenParams: {clientId: \"*\"}})',\n 40012,\n 400,\n );\n }\n\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'BaseClient()', 'started; version = ' + Defaults.version);\n\n this._currentFallback = null;\n\n this.serverTimeOffset = null;\n this.http = new Http(this);\n this.auth = new Auth(this, normalOptions);\n\n this._rest = options.plugins?.Rest ? new options.plugins.Rest(this) : null;\n this._Crypto = options.plugins?.Crypto ?? null;\n this.__FilteredSubscriptions = options.plugins?.MessageInteractions ?? null;\n this._Annotations = options.plugins?.Annotations ?? null;\n }\n\n get rest(): Rest {\n if (!this._rest) {\n throwMissingPluginError('Rest');\n }\n return this._rest;\n }\n\n get _FilteredSubscriptions(): typeof FilteredSubscriptions {\n if (!this.__FilteredSubscriptions) {\n throwMissingPluginError('MessageInteractions');\n }\n return this.__FilteredSubscriptions;\n }\n\n get channels() {\n return this.rest.channels;\n }\n\n get push() {\n return this.rest.push;\n }\n\n /** RSH8 */\n device(): LocalDevice & API.LocalDevice {\n if (!this.options.plugins?.Push || !this.push.LocalDevice) {\n throwMissingPluginError('Push');\n }\n if (!this._device) {\n this._device = this.push.LocalDevice.load(this);\n }\n return this._device;\n }\n\n baseUri(host: string) {\n return Defaults.getHttpScheme(this.options) + host + ':' + Defaults.getPort(this.options, false);\n }\n\n async stats(params: RequestParams): Promise<PaginatedResult<Stats>> {\n return this.rest.stats(params);\n }\n\n async time(params?: RequestParams): Promise<number> {\n return this.rest.time(params);\n }\n\n async request(\n method: string,\n path: string,\n version: number,\n params: RequestParams,\n body: unknown,\n customHeaders: Record<string, string>,\n ): Promise<HttpPaginatedResponse<unknown>> {\n return this.rest.request(method, path, version, params, body, customHeaders);\n }\n\n batchPublish<T extends BatchPublishSpec | BatchPublishSpec[]>(\n specOrSpecs: T,\n ): Promise<T extends BatchPublishSpec ? BatchPublishResult : BatchPublishResult[]> {\n return this.rest.batchPublish(specOrSpecs);\n }\n\n batchPresence(channels: string[]): Promise<BatchPresenceResult> {\n return this.rest.batchPresence(channels);\n }\n\n setLog(logOptions: LoggerOptions): void {\n this.logger.setLog(logOptions.level, logOptions.handler);\n }\n\n /**\n * Get the current time based on the local clock,\n * or if the option queryTime is true, return the server time.\n * The server time offset from the local time is stored so that\n * only one request to the server to get the time is ever needed\n */\n async getTimestamp(queryTime: boolean): Promise<number> {\n if (!this.isTimeOffsetSet() && queryTime) {\n return this.time();\n }\n\n return this.getTimestampUsingOffset();\n }\n\n getTimestampUsingOffset(): number {\n return Date.now() + (this.serverTimeOffset || 0);\n }\n\n isTimeOffsetSet(): boolean {\n return this.serverTimeOffset !== null;\n }\n\n static Platform = Platform;\n\n /**\n * These exports are for use by UMD plugins; reason being so that constructors and static methods can be accessed by these plugins without needing to import the classes directly and result in the class existing in both the plugin and the core library.\n */\n Platform = Platform;\n ErrorInfo = ErrorInfo;\n Logger = Logger;\n Defaults = Defaults;\n Utils = Utils;\n EventEmitter = EventEmitter;\n MessageEncoding = MessageEncoding;\n}\n\nexport default BaseClient;\n", "import { MsgPack } from 'common/types/msgpack';\nimport type { LocalDevice } from 'plugins/push/pushactivation';\nimport * as Utils from '../util/utils';\nimport ErrorInfo, { IConvertibleToErrorInfo } from './errorinfo';\n\nexport enum DeviceFormFactor {\n Phone = 'phone',\n Tablet = 'tablet',\n Desktop = 'desktop',\n TV = 'tv',\n Watch = 'watch',\n Car = 'car',\n Embedded = 'embedded',\n Other = 'other',\n}\n\nexport enum DevicePlatform {\n Android = 'android',\n IOS = 'ios',\n Browser = 'browser',\n}\n\ntype DevicePushState = 'ACTIVE' | 'FAILING' | 'FAILED';\n\ninterface WebPushEncryptionKey {\n p256dh: string;\n auth: string;\n}\n\ninterface WebPushRecipient {\n transportType: 'web';\n targetUrl: string;\n encryptionKey: WebPushEncryptionKey;\n publicVapidKey: string;\n}\n\ninterface PushChannelRecipient {\n transportType: 'ablyChannel';\n channel: string;\n ablyKey: string;\n ablyUrl: string;\n}\n\ntype PushRecipient = WebPushRecipient | PushChannelRecipient;\n\nexport type DevicePushDetails = {\n error?: ErrorInfo;\n recipient?: PushRecipient;\n state?: DevicePushState;\n metadata?: string;\n};\n\nclass DeviceDetails {\n id?: string;\n clientId?: string;\n deviceSecret?: string;\n formFactor?: DeviceFormFactor;\n platform?: DevicePlatform;\n push?: DevicePushDetails;\n metadata?: string;\n deviceIdentityToken?: string;\n\n toJSON(): DeviceDetails {\n return {\n id: this.id,\n deviceSecret: this.deviceSecret,\n platform: this.platform,\n formFactor: this.formFactor,\n clientId: this.clientId,\n metadata: this.metadata,\n deviceIdentityToken: this.deviceIdentityToken,\n push: {\n recipient: this.push?.recipient,\n state: this.push?.state,\n error: this.push?.error,\n },\n } as DeviceDetails;\n }\n\n toString(): string {\n let result = '[DeviceDetails';\n if (this.id) result += '; id=' + this.id;\n if (this.platform) result += '; platform=' + this.platform;\n if (this.formFactor) result += '; formFactor=' + this.formFactor;\n if (this.clientId) result += '; clientId=' + this.clientId;\n if (this.metadata) result += '; metadata=' + this.metadata;\n if (this.deviceIdentityToken) result += '; deviceIdentityToken=' + JSON.stringify(this.deviceIdentityToken);\n if (this.push?.recipient) result += '; push.recipient=' + JSON.stringify(this.push.recipient);\n if (this.push?.state) result += '; push.state=' + this.push.state;\n if (this.push?.error) result += '; push.error=' + JSON.stringify(this.push.error);\n if (this.push?.metadata) result += '; push.metadata=' + this.push.metadata;\n result += ']';\n return result;\n }\n\n static toRequestBody(body: unknown, MsgPack: MsgPack | null, format?: Utils.Format) {\n return Utils.encodeBody(body, MsgPack, format);\n }\n\n static fromResponseBody(\n body: Array<Record<string, unknown>> | Record<string, unknown>,\n MsgPack: MsgPack | null,\n format?: Utils.Format,\n ): DeviceDetails | DeviceDetails[] {\n if (format) {\n body = Utils.decodeBody(body, MsgPack, format);\n }\n\n if (Array.isArray(body)) {\n return DeviceDetails.fromValuesArray(body);\n } else {\n return DeviceDetails.fromValues(body);\n }\n }\n\n static fromValues(values: Record<string, unknown>): DeviceDetails {\n values.error = values.error && ErrorInfo.fromValues(values.error as IConvertibleToErrorInfo);\n return Object.assign(new DeviceDetails(), values);\n }\n\n static fromLocalDevice(device: LocalDevice): DeviceDetails {\n return Object.assign(new DeviceDetails(), device);\n }\n\n static fromValuesArray(values: Array<Record<string, unknown>>): DeviceDetails[] {\n const count = values.length,\n result = new Array(count);\n for (let i = 0; i < count; i++) result[i] = DeviceDetails.fromValues(values[i]);\n return result;\n }\n}\n\nexport default DeviceDetails;\n", "import Platform from '../../platform';\nimport * as Utils from '../util/utils';\nimport Logger from '../util/logger';\nimport Auth from './auth';\nimport HttpMethods from '../../constants/HttpMethods';\nimport ErrorInfo, { IPartialErrorInfo, PartialErrorInfo } from '../types/errorinfo';\nimport BaseClient from './baseclient';\nimport { MsgPack } from 'common/types/msgpack';\nimport { RequestBody, ResponseHeaders, appendingParams as urlFromPathAndParams, paramString } from 'common/types/http';\nimport httpStatusCodes from '../../constants/HttpStatusCodes';\n\nasync function withAuthDetails<T>(\n client: BaseClient,\n headers: ResponseHeaders | undefined,\n params: Record<string, any>,\n opCallback: Function,\n): Promise<ResourceResult<T>> {\n if (client.http.supportsAuthHeaders) {\n const authHeaders = await client.auth.getAuthHeaders();\n return opCallback(Utils.mixin(authHeaders!, headers), params);\n } else {\n const authParams = await client.auth.getAuthParams();\n return opCallback(headers, Utils.mixin(authParams!, params));\n }\n}\n\nfunction unenvelope<T>(\n result: ResourceResult<T>,\n MsgPack: MsgPack | null,\n format: Utils.Format | null,\n): ResourceResult<T> {\n if (result.err && !result.body) {\n return { err: result.err };\n }\n\n if (result.statusCode === httpStatusCodes.NoContent) {\n return { ...result, body: [] as any, unpacked: true };\n }\n\n let body = result.body;\n\n if (!result.unpacked) {\n try {\n body = Utils.decodeBody(body, MsgPack, format);\n } catch (e) {\n if (Utils.isErrorInfoOrPartialErrorInfo(e)) {\n return { err: e };\n } else {\n return { err: new PartialErrorInfo(Utils.inspectError(e), null) };\n }\n }\n }\n\n if (!body) {\n return { err: new PartialErrorInfo('unenvelope(): Response body is missing', null) };\n }\n\n const { statusCode: wrappedStatusCode, response, headers: wrappedHeaders } = body as Record<string, any>;\n\n if (wrappedStatusCode === undefined) {\n /* Envelope already unwrapped by the transport */\n return { ...result, body, unpacked: true };\n }\n\n if (wrappedStatusCode < 200 || wrappedStatusCode >= 300) {\n /* handle wrapped errors */\n let wrappedErr = (response && response.error) || result.err;\n if (!wrappedErr) {\n wrappedErr = new Error('Error in unenveloping ' + body);\n wrappedErr.statusCode = wrappedStatusCode;\n }\n return { err: wrappedErr, body: response, headers: wrappedHeaders, unpacked: true, statusCode: wrappedStatusCode };\n }\n\n return { err: result.err, body: response, headers: wrappedHeaders, unpacked: true, statusCode: wrappedStatusCode };\n}\n\nfunction logResult<T>(\n result: ResourceResult<T>,\n method: HttpMethods,\n path: string,\n params: Record<string, string>,\n logger: Logger,\n) {\n if (result.err) {\n Logger.logAction(\n logger,\n Logger.LOG_MICRO,\n 'Resource.' + method + '()',\n 'Received Error; ' + urlFromPathAndParams(path, params) + '; Error: ' + Utils.inspectError(result.err),\n );\n } else {\n Logger.logAction(\n logger,\n Logger.LOG_MICRO,\n 'Resource.' + method + '()',\n 'Received; ' +\n urlFromPathAndParams(path, params) +\n '; Headers: ' +\n paramString(result.headers as Record<string, any>) +\n '; StatusCode: ' +\n result.statusCode +\n '; Body: ' +\n (Platform.BufferUtils.isBuffer(result.body)\n ? ' (Base64): ' + Platform.BufferUtils.base64Encode(result.body)\n : ': ' + Platform.Config.inspect(result.body)),\n );\n }\n}\n\nexport interface ResourceResponse<T> {\n body?: T;\n headers?: ResponseHeaders;\n unpacked?: boolean;\n statusCode?: number;\n}\n\nexport interface ResourceResult<T> extends ResourceResponse<T> {\n /**\n * Any error returned by the underlying HTTP client.\n */\n err: IPartialErrorInfo | null;\n}\n\nclass Resource {\n /**\n * @param throwError Whether to throw any error returned by the underlying HTTP client.\n *\n * If you specify `true`, then this method will return a `ResourceResponse<T>`, and if the underlying HTTP client returns an error, this method call will throw that error. If you specify `false`, then it will return a `ResourceResult<T>`, whose `err` property contains any error that was returned by the underlying HTTP client.\n */\n static async get<T = unknown>(\n client: BaseClient,\n path: string,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: true,\n ): Promise<ResourceResponse<T>>;\n static async get<T = unknown>(\n client: BaseClient,\n path: string,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: false,\n ): Promise<ResourceResult<T>>;\n static async get<T = unknown>(\n client: BaseClient,\n path: string,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: boolean,\n ): Promise<ResourceResponse<T> | ResourceResult<T>> {\n return Resource.do(HttpMethods.Get, client, path, null, headers, params, envelope, throwError ?? false);\n }\n\n /**\n * @param throwError Whether to throw any error returned by the underlying HTTP client.\n *\n * If you specify `true`, then this method will return a `ResourceResponse<T>`, and if the underlying HTTP client returns an error, this method call will throw that error. If you specify `false`, then it will return a `ResourceResult<T>`, whose `err` property contains any error that was returned by the underlying HTTP client.\n */\n static async delete<T = unknown>(\n client: BaseClient,\n path: string,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: true,\n ): Promise<ResourceResponse<T>>;\n static async delete<T = unknown>(\n client: BaseClient,\n path: string,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: false,\n ): Promise<ResourceResult<T>>;\n static async delete<T = unknown>(\n client: BaseClient,\n path: string,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: boolean,\n ): Promise<ResourceResponse<T> | ResourceResult<T>> {\n return Resource.do(HttpMethods.Delete, client, path, null, headers, params, envelope, throwError);\n }\n\n /**\n * @param throwError Whether to throw any error returned by the underlying HTTP client.\n *\n * If you specify `true`, then this method will return a `ResourceResponse<T>`, and if the underlying HTTP client returns an error, this method call will throw that error. If you specify `false`, then it will return a `ResourceResult<T>`, whose `err` property contains any error that was returned by the underlying HTTP client.\n */\n static async post<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: true,\n ): Promise<ResourceResponse<T>>;\n static async post<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: false,\n ): Promise<ResourceResult<T>>;\n static async post<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: boolean,\n ): Promise<ResourceResponse<T> | ResourceResult<T>> {\n return Resource.do(HttpMethods.Post, client, path, body, headers, params, envelope, throwError);\n }\n\n /**\n * @param throwError Whether to throw any error returned by the underlying HTTP client.\n *\n * If you specify `true`, then this method will return a `ResourceResponse<T>`, and if the underlying HTTP client returns an error, this method call will throw that error. If you specify `false`, then it will return a `ResourceResult<T>`, whose `err` property contains any error that was returned by the underlying HTTP client.\n */\n static async patch<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: true,\n ): Promise<ResourceResponse<T>>;\n static async patch<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: false,\n ): Promise<ResourceResult<T>>;\n static async patch<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: boolean,\n ): Promise<ResourceResponse<T> | ResourceResult<T>> {\n return Resource.do(HttpMethods.Patch, client, path, body, headers, params, envelope, throwError);\n }\n\n /**\n * @param throwError Whether to throw any error returned by the underlying HTTP client.\n *\n * If you specify `true`, then this method will return a `ResourceResponse<T>`, and if the underlying HTTP client returns an error, this method call will throw that error. If you specify `false`, then it will return a `ResourceResult<T>`, whose `err` property contains any error that was returned by the underlying HTTP client.\n */\n static async put<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: true,\n ): Promise<ResourceResponse<T>>;\n static async put<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: false,\n ): Promise<ResourceResult<T>>;\n static async put<T = unknown>(\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: boolean,\n ): Promise<ResourceResponse<T> | ResourceResult<T>> {\n return Resource.do(HttpMethods.Put, client, path, body, headers, params, envelope, throwError);\n }\n\n static async do<T>(\n method: HttpMethods,\n client: BaseClient,\n path: string,\n body: RequestBody | null,\n headers: Record<string, string>,\n params: Record<string, any>,\n envelope: Utils.Format | null,\n throwError: boolean,\n ): Promise<ResourceResponse<T> | ResourceResult<T>> {\n if (envelope) {\n (params = params || {})['envelope'] = envelope;\n }\n\n const logger = client.logger;\n\n async function doRequest(\n this: any,\n headers: Record<string, string>,\n params: Record<string, any>,\n ): Promise<ResourceResult<T>> {\n if (logger.shouldLog(Logger.LOG_MICRO)) {\n let decodedBody = body;\n if (headers['content-type']?.indexOf('msgpack') > 0) {\n try {\n if (!client._MsgPack) {\n Utils.throwMissingPluginError('MsgPack');\n }\n decodedBody = client._MsgPack.decode(body as Buffer);\n } catch (decodeErr) {\n Logger.logAction(\n logger,\n Logger.LOG_MICRO,\n 'Resource.' + method + '()',\n 'Sending MsgPack Decoding Error: ' + Utils.inspectError(decodeErr),\n );\n }\n }\n Logger.logAction(\n logger,\n Logger.LOG_MICRO,\n 'Resource.' + method + '()',\n 'Sending; ' + urlFromPathAndParams(path, params) + '; Body: ' + decodedBody,\n );\n }\n\n const httpResult = await client.http.do(method, path, headers, body, params);\n\n if (httpResult.error && Auth.isTokenErr(httpResult.error as ErrorInfo)) {\n /* token has expired, so get a new one */\n await client.auth.authorize(null, null);\n /* retry ... */\n return withAuthDetails(client, headers, params, doRequest);\n }\n\n return {\n err: httpResult.error as ErrorInfo,\n body: httpResult.body as T | undefined,\n headers: httpResult.headers,\n unpacked: httpResult.unpacked,\n statusCode: httpResult.statusCode,\n };\n }\n\n let result = await withAuthDetails<T>(client, headers, params, doRequest);\n\n if (envelope) {\n result = unenvelope(result, client._MsgPack, envelope);\n }\n\n if (logger.shouldLog(Logger.LOG_MICRO)) {\n logResult(result, method, path, params, logger);\n }\n\n if (throwError) {\n if (result.err) {\n throw result.err;\n } else {\n const response: Omit<ResourceResult<T>, 'err'> & Pick<Partial<ResourceResult<T>>, 'err'> = { ...result };\n delete response.err;\n return response;\n }\n }\n\n return result;\n }\n}\n\nexport default Resource;\n", "import * as Utils from '../util/utils';\nimport Logger from '../util/logger';\nimport Resource, { ResourceResult } from './resource';\nimport ErrorInfo, { IPartialErrorInfo } from '../types/errorinfo';\nimport BaseClient from './baseclient';\nimport { RequestBody, ResponseHeaders } from 'common/types/http';\nimport HttpStatusCodes from '../../constants/HttpStatusCodes';\n\nexport type BodyHandler = (body: unknown, headers: ResponseHeaders, unpacked?: boolean) => Promise<any>;\n\nfunction getRelParams(linkUrl: string) {\n const urlMatch = linkUrl.match(/^\\.\\/(\\w+)\\?(.*)$/);\n return urlMatch && urlMatch[2] && Utils.parseQueryString(urlMatch[2]);\n}\n\nfunction parseRelLinks(linkHeader: string | Array<string>) {\n if (typeof linkHeader == 'string') linkHeader = linkHeader.split(',');\n\n const relParams: Record<string, Record<string, string>> = {};\n for (let i = 0; i < linkHeader.length; i++) {\n const linkMatch = linkHeader[i].match(/^\\s*<(.+)>;\\s*rel=\"(\\w+)\"$/);\n if (linkMatch) {\n const params = getRelParams(linkMatch[1]);\n if (params) relParams[linkMatch[2]] = params;\n }\n }\n return relParams;\n}\n\nfunction returnErrOnly(err: IPartialErrorInfo, body: unknown, useHPR?: boolean) {\n /* If using httpPaginatedResponse, errors from Ably are returned as part of\n * the HPR, only throw `err` for network errors etc. which don't\n * return a body and/or have no ably-originated error code (non-numeric\n * error codes originate from node) */\n return !(useHPR && (body || typeof err.code === 'number'));\n}\n\nclass PaginatedResource {\n client: BaseClient;\n path: string;\n headers: Record<string, string>;\n envelope: Utils.Format | null;\n bodyHandler: BodyHandler;\n useHttpPaginatedResponse: boolean;\n\n constructor(\n client: BaseClient,\n path: string,\n headers: Record<string, string>,\n envelope: Utils.Format | undefined,\n bodyHandler: BodyHandler,\n useHttpPaginatedResponse?: boolean,\n ) {\n this.client = client;\n this.path = path;\n this.headers = headers;\n this.envelope = envelope ?? null;\n this.bodyHandler = bodyHandler;\n this.useHttpPaginatedResponse = useHttpPaginatedResponse || false;\n }\n\n get logger(): Logger {\n return this.client.logger;\n }\n\n async get<T1, T2>(params: Record<string, T2>): Promise<PaginatedResult<T1>> {\n const result = await Resource.get<T1>(this.client, this.path, this.headers, params, this.envelope, false);\n return this.handlePage(result);\n }\n\n async delete<T1, T2>(params: Record<string, T2>): Promise<PaginatedResult<T1>> {\n const result = await Resource.delete<T1>(this.client, this.path, this.headers, params, this.envelope, false);\n return this.handlePage(result);\n }\n\n async post<T1, T2>(params: Record<string, T2>, body: RequestBody | null): Promise<PaginatedResult<T1>> {\n const result = await Resource.post<T1>(this.client, this.path, body, this.headers, params, this.envelope, false);\n return this.handlePage(result);\n }\n\n async put<T1, T2>(params: Record<string, T2>, body: RequestBody | null): Promise<PaginatedResult<T1>> {\n const result = await Resource.put<T1>(this.client, this.path, body, this.headers, params, this.envelope, false);\n return this.handlePage(result);\n }\n\n async patch<T1, T2>(params: Record<string, T2>, body: RequestBody | null): Promise<PaginatedResult<T1>> {\n const result = await Resource.patch<T1>(this.client, this.path, body, this.headers, params, this.envelope, false);\n return this.handlePage(result);\n }\n\n async handlePage<T>(result: ResourceResult<T>): Promise<PaginatedResult<T>> {\n if (result.err && returnErrOnly(result.err, result.body, this.useHttpPaginatedResponse)) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'PaginatedResource.handlePage()',\n 'Unexpected error getting resource: err = ' + Utils.inspectError(result.err),\n );\n throw result.err;\n }\n\n let items, linkHeader, relParams;\n\n try {\n items =\n result.statusCode == HttpStatusCodes.NoContent\n ? []\n : await this.bodyHandler(result.body, result.headers || {}, result.unpacked);\n } catch (e) {\n /* If we got an error, the failure to parse the body is almost certainly\n * due to that, so throw that in preference over the parse error */\n throw result.err || e;\n }\n\n if (result.headers && (linkHeader = result.headers['Link'] || result.headers['link'])) {\n relParams = parseRelLinks(linkHeader);\n }\n\n if (this.useHttpPaginatedResponse) {\n return new HttpPaginatedResponse(\n this,\n items,\n result.headers || {},\n result.statusCode as number,\n relParams,\n result.err,\n );\n } else {\n return new PaginatedResult(this, items, relParams);\n }\n }\n}\n\nexport class PaginatedResult<T> {\n resource: PaginatedResource;\n items: T[];\n private _relParams?: Record<string, any>;\n\n constructor(resource: PaginatedResource, items: T[], relParams?: Record<string, any>) {\n this.resource = resource;\n this.items = items;\n this._relParams = relParams;\n }\n\n async first(): Promise<PaginatedResult<T>> {\n if (this.hasFirst()) {\n return this.get(this._relParams!.first);\n }\n\n throw new ErrorInfo('No link to the first page of results', 40400, 404);\n }\n\n async current(): Promise<PaginatedResult<T>> {\n if (this.hasCurrent()) {\n return this.get(this._relParams!.current);\n }\n\n throw new ErrorInfo('No link to the current page of results', 40400, 404);\n }\n\n async next(): Promise<PaginatedResult<T> | null> {\n if (this.hasNext()) {\n return this.get(this._relParams!.next);\n }\n\n return null;\n }\n\n hasFirst(): boolean {\n return this._relParams != null && 'first' in this._relParams;\n }\n\n hasCurrent(): boolean {\n return this._relParams != null && 'current' in this._relParams;\n }\n\n hasNext(): boolean {\n return this._relParams != null && 'next' in this._relParams;\n }\n\n isLast(): boolean {\n return !this.hasNext();\n }\n\n /* We assume that only the initial request can be a POST, and that accessing\n * the rest of a multipage set of results can always be done with GET */\n async get(params: any): Promise<PaginatedResult<T>> {\n const res = this.resource;\n const result = await Resource.get<T>(res.client, res.path, res.headers, params, res.envelope, false);\n return res.handlePage(result);\n }\n}\n\nexport class HttpPaginatedResponse<T> extends PaginatedResult<T> {\n statusCode: number;\n success: boolean;\n headers: ResponseHeaders;\n errorCode?: number | null;\n errorMessage?: string | null;\n\n constructor(\n resource: PaginatedResource,\n items: T[],\n headers: ResponseHeaders,\n statusCode: number,\n relParams: any,\n err: IPartialErrorInfo | null,\n ) {\n super(resource, items, relParams);\n this.statusCode = statusCode;\n this.success = statusCode < 300 && statusCode >= 200;\n this.headers = headers;\n this.errorCode = err && err.code;\n this.errorMessage = err && err.message;\n }\n\n toJSON() {\n return {\n items: this.items,\n statusCode: this.statusCode,\n success: this.success,\n headers: this.headers,\n errorCode: this.errorCode,\n errorMessage: this.errorMessage,\n };\n }\n}\n\nexport default PaginatedResource;\n", "import { MsgPack } from 'common/types/msgpack';\nimport * as Utils from '../util/utils';\n\ntype PushChannelSubscriptionObject = {\n channel: string;\n deviceId?: string;\n clientId?: string;\n};\n\nclass PushChannelSubscription {\n /** PCS4, the channel name associated with this subscription */\n channel!: string;\n /** PCS2, optional, populated for subscriptions made for a specific device registration */\n deviceId?: string;\n /** PCS3, optional, populated for subscriptions made for a specific clientId */\n clientId?: string;\n\n /**\n * Overload toJSON() to intercept JSON.stringify()\n * @return {*}\n */\n toJSON(): PushChannelSubscriptionObject {\n return {\n channel: this.channel,\n deviceId: this.deviceId,\n clientId: this.clientId,\n };\n }\n\n toString(): string {\n let result = '[PushChannelSubscription';\n if (this.channel) result += '; channel=' + this.channel;\n if (this.deviceId) result += '; deviceId=' + this.deviceId;\n if (this.clientId) result += '; clientId=' + this.clientId;\n result += ']';\n return result;\n }\n\n static toRequestBody = Utils.encodeBody;\n\n static fromResponseBody(\n body: Array<Record<string, unknown>> | Record<string, unknown>,\n MsgPack: MsgPack | null,\n format?: Utils.Format,\n ): PushChannelSubscription | PushChannelSubscription[] {\n if (format) {\n body = Utils.decodeBody(body, MsgPack, format) as Record<string, unknown>;\n }\n\n if (Array.isArray(body)) {\n return PushChannelSubscription.fromValuesArray(body);\n } else {\n return PushChannelSubscription.fromValues(body);\n }\n }\n\n static fromValues(values: Record<string, unknown>): PushChannelSubscription {\n return Object.assign(new PushChannelSubscription(), values);\n }\n\n static fromValuesArray(values: Array<Record<string, unknown>>): PushChannelSubscription[] {\n const count = values.length,\n result = new Array(count);\n for (let i = 0; i < count; i++) result[i] = PushChannelSubscription.fromValues(values[i]);\n return result;\n }\n}\n\nexport default PushChannelSubscription;\n", "import * as Utils from '../util/utils';\nimport DeviceDetails from '../types/devicedetails';\nimport Resource from './resource';\nimport PaginatedResource, { PaginatedResult } from './paginatedresource';\nimport ErrorInfo from '../types/errorinfo';\nimport PushChannelSubscription from '../types/pushchannelsubscription';\nimport BaseClient from './baseclient';\nimport Defaults from '../util/defaults';\nimport type {\n ActivationStateMachine,\n DeregisterCallback,\n LocalDeviceFactory,\n RegisterCallback,\n} from 'plugins/push/pushactivation';\nimport Platform from 'common/platform';\nimport type { ErrCallback } from 'common/types/utils';\n\nclass Push {\n client: BaseClient;\n admin: Admin;\n stateMachine?: ActivationStateMachine;\n LocalDevice?: LocalDeviceFactory;\n\n constructor(client: BaseClient) {\n this.client = client;\n this.admin = new Admin(client);\n if (Platform.Config.push && client.options.plugins?.Push) {\n this.stateMachine = new client.options.plugins.Push.ActivationStateMachine(client);\n this.LocalDevice = client.options.plugins.Push.localDeviceFactory(DeviceDetails);\n }\n }\n\n async activate(registerCallback?: RegisterCallback, updateFailedCallback?: ErrCallback) {\n await new Promise<void>((resolve, reject) => {\n if (!this.client.options.plugins?.Push) {\n reject(Utils.createMissingPluginError('Push'));\n return;\n }\n if (!this.stateMachine) {\n reject(new ErrorInfo('This platform is not supported as a target of push notifications', 40000, 400));\n return;\n }\n if (this.stateMachine.activatedCallback) {\n reject(new ErrorInfo('Activation already in progress', 40000, 400));\n return;\n }\n this.stateMachine.activatedCallback = (err: ErrorInfo) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n };\n this.stateMachine.updateFailedCallback = updateFailedCallback;\n this.stateMachine.handleEvent(\n new this.client.options.plugins.Push.CalledActivate(this.stateMachine, registerCallback),\n );\n });\n }\n\n async deactivate(deregisterCallback: DeregisterCallback) {\n await new Promise<void>((resolve, reject) => {\n if (!this.client.options.plugins?.Push) {\n reject(Utils.createMissingPluginError('Push'));\n return;\n }\n if (!this.stateMachine) {\n reject(new ErrorInfo('This platform is not supported as a target of push notifications', 40000, 400));\n return;\n }\n if (this.stateMachine.deactivatedCallback) {\n reject(new ErrorInfo('Deactivation already in progress', 40000, 400));\n return;\n }\n this.stateMachine.deactivatedCallback = (err: ErrorInfo) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n };\n this.stateMachine.handleEvent(\n new this.client.options.plugins.Push.CalledDeactivate(this.stateMachine, deregisterCallback),\n );\n });\n }\n}\n\nclass Admin {\n client: BaseClient;\n deviceRegistrations: DeviceRegistrations;\n channelSubscriptions: ChannelSubscriptions;\n\n constructor(client: BaseClient) {\n this.client = client;\n this.deviceRegistrations = new DeviceRegistrations(client);\n this.channelSubscriptions = new ChannelSubscriptions(client);\n }\n\n async publish(recipient: any, payload: any): Promise<void> {\n const client = this.client;\n const format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultPostHeaders(client.options, { format }),\n params = {};\n const body = Utils.mixin({ recipient: recipient }, payload);\n\n Utils.mixin(headers, client.options.headers);\n\n if (client.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' });\n\n const requestBody = Utils.encodeBody(body, client._MsgPack, format);\n await Resource.post(client, '/push/publish', requestBody, headers, params, null, true);\n }\n}\n\nclass DeviceRegistrations {\n client: BaseClient;\n\n constructor(client: BaseClient) {\n this.client = client;\n }\n\n async save(device: any): Promise<DeviceDetails> {\n const client = this.client;\n const body = DeviceDetails.fromValues(device);\n const format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultPostHeaders(client.options, { format }),\n params = {};\n\n Utils.mixin(headers, client.options.headers);\n\n if (client.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' });\n\n const requestBody = Utils.encodeBody(body, client._MsgPack, format);\n const response = await Resource.put(\n client,\n '/push/deviceRegistrations/' + encodeURIComponent(device.id),\n requestBody,\n headers,\n params,\n null,\n true,\n );\n\n return DeviceDetails.fromResponseBody(\n response.body as Record<string, unknown>,\n client._MsgPack,\n response.unpacked ? undefined : format,\n ) as DeviceDetails;\n }\n\n async get(deviceIdOrDetails: any): Promise<DeviceDetails> {\n const client = this.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultGetHeaders(client.options, { format }),\n deviceId = deviceIdOrDetails.id || deviceIdOrDetails;\n\n if (typeof deviceId !== 'string' || !deviceId.length) {\n throw new ErrorInfo(\n 'First argument to DeviceRegistrations#get must be a deviceId string or DeviceDetails',\n 40000,\n 400,\n );\n }\n\n Utils.mixin(headers, client.options.headers);\n\n const response = await Resource.get(\n client,\n '/push/deviceRegistrations/' + encodeURIComponent(deviceId),\n headers,\n {},\n null,\n true,\n );\n\n return DeviceDetails.fromResponseBody(\n response.body as Record<string, unknown>,\n client._MsgPack,\n response.unpacked ? undefined : format,\n ) as DeviceDetails;\n }\n\n async list(params: any): Promise<PaginatedResult<unknown>> {\n const client = this.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = this.client.http.supportsLinkHeaders ? undefined : format,\n headers = Defaults.defaultGetHeaders(client.options, { format });\n\n Utils.mixin(headers, client.options.headers);\n\n return new PaginatedResource(client, '/push/deviceRegistrations', headers, envelope, async function (\n body,\n headers,\n unpacked,\n ) {\n return DeviceDetails.fromResponseBody(\n body as Record<string, unknown>[],\n client._MsgPack,\n unpacked ? undefined : format,\n );\n }).get(params);\n }\n\n async remove(deviceIdOrDetails: any): Promise<void> {\n const client = this.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultGetHeaders(client.options, { format }),\n params = {},\n deviceId = deviceIdOrDetails.id || deviceIdOrDetails;\n\n if (typeof deviceId !== 'string' || !deviceId.length) {\n throw new ErrorInfo(\n 'First argument to DeviceRegistrations#remove must be a deviceId string or DeviceDetails',\n 40000,\n 400,\n );\n }\n\n Utils.mixin(headers, client.options.headers);\n\n if (client.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' });\n\n await Resource['delete'](\n client,\n '/push/deviceRegistrations/' + encodeURIComponent(deviceId),\n headers,\n params,\n null,\n true,\n );\n }\n\n async removeWhere(params: any): Promise<void> {\n const client = this.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultGetHeaders(client.options, { format });\n\n Utils.mixin(headers, client.options.headers);\n\n if (client.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' });\n\n await Resource['delete'](client, '/push/deviceRegistrations', headers, params, null, true);\n }\n}\n\nclass ChannelSubscriptions {\n client: BaseClient;\n\n constructor(client: BaseClient) {\n this.client = client;\n }\n\n async save(subscription: Record<string, unknown>): Promise<PushChannelSubscription> {\n const client = this.client;\n const body = PushChannelSubscription.fromValues(subscription);\n const format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultPostHeaders(client.options, { format }),\n params = {};\n\n Utils.mixin(headers, client.options.headers);\n\n if (client.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' });\n\n const requestBody = Utils.encodeBody(body, client._MsgPack, format);\n const response = await Resource.post(\n client,\n '/push/channelSubscriptions',\n requestBody,\n headers,\n params,\n null,\n true,\n );\n\n return PushChannelSubscription.fromResponseBody(\n response.body as Record<string, any>,\n client._MsgPack,\n response.unpacked ? undefined : format,\n ) as PushChannelSubscription;\n }\n\n async list(params: any): Promise<PaginatedResult<unknown>> {\n const client = this.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = this.client.http.supportsLinkHeaders ? undefined : format,\n headers = Defaults.defaultGetHeaders(client.options, { format });\n\n Utils.mixin(headers, client.options.headers);\n\n return new PaginatedResource(client, '/push/channelSubscriptions', headers, envelope, async function (\n body,\n headers,\n unpacked,\n ) {\n return PushChannelSubscription.fromResponseBody(\n body as Record<string, unknown>[],\n client._MsgPack,\n unpacked ? undefined : format,\n );\n }).get(params);\n }\n\n async removeWhere(params: any): Promise<void> {\n const client = this.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultGetHeaders(client.options, { format });\n\n Utils.mixin(headers, client.options.headers);\n\n if (client.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' });\n\n await Resource['delete'](client, '/push/channelSubscriptions', headers, params, null, true);\n }\n\n /* ChannelSubscriptions have no unique id; removing one is equivalent to removeWhere by its properties */\n remove = ChannelSubscriptions.prototype.removeWhere;\n\n async listChannels(params: any): Promise<PaginatedResult<unknown>> {\n const client = this.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = this.client.http.supportsLinkHeaders ? undefined : format,\n headers = Defaults.defaultGetHeaders(client.options, { format });\n\n Utils.mixin(headers, client.options.headers);\n\n if (client.options.pushFullWait) Utils.mixin(params, { fullWait: 'true' });\n\n return new PaginatedResource(client, '/push/channels', headers, envelope, async function (body, headers, unpacked) {\n const parsedBody = (\n !unpacked && format ? Utils.decodeBody(body, client._MsgPack, format) : body\n ) as Array<string>;\n\n for (let i = 0; i < parsedBody.length; i++) {\n parsedBody[i] = String(parsedBody[i]);\n }\n return parsedBody;\n }).get(params);\n }\n}\n\nexport default Push;\n", "import Logger from '../util/logger';\nimport { BaseMessage, encode, decode, wireToJSON, normalizeCipherOptions, CipherOptions, strMsg } from './basemessage';\nimport * as API from '../../../../ably';\nimport * as Utils from '../util/utils';\n\nimport type { IUntypedCryptoStatic } from 'common/types/ICryptoStatic';\nimport type { Properties } from '../util/utils';\nimport type RestChannel from '../client/restchannel';\nimport type RealtimeChannel from '../client/realtimechannel';\nimport type { ChannelOptions } from '../../types/channel';\ntype Channel = RestChannel | RealtimeChannel;\n\nconst actions = ['absent', 'present', 'enter', 'leave', 'update'];\n\nexport async function fromEncoded(\n logger: Logger,\n Crypto: IUntypedCryptoStatic | null,\n encoded: WirePresenceMessage,\n inputOptions?: API.ChannelOptions,\n): Promise<PresenceMessage> {\n const options = normalizeCipherOptions(Crypto, logger, inputOptions ?? null);\n const wpm = WirePresenceMessage.fromValues(encoded);\n return wpm.decode(options, logger);\n}\n\nexport async function fromEncodedArray(\n logger: Logger,\n Crypto: IUntypedCryptoStatic | null,\n encodedArray: WirePresenceMessage[],\n options?: API.ChannelOptions,\n): Promise<PresenceMessage[]> {\n return Promise.all(\n encodedArray.map(function (encoded) {\n return fromEncoded(logger, Crypto, encoded, options);\n }),\n );\n}\n\n// these forms of the functions are used internally when we have a channel instance\n// already, so don't need to normalise channel options\nexport async function _fromEncoded(\n encoded: Properties<WirePresenceMessage>,\n channel: Channel,\n): Promise<PresenceMessage> {\n return WirePresenceMessage.fromValues(encoded).decode(channel.channelOptions, channel.logger);\n}\n\nexport async function _fromEncodedArray(\n encodedArray: Properties<WirePresenceMessage>[],\n channel: Channel,\n): Promise<PresenceMessage[]> {\n return Promise.all(\n encodedArray.map(function (encoded) {\n return _fromEncoded(encoded, channel);\n }),\n );\n}\n\n// for tree-shakability\nexport function fromValues(values: Properties<PresenceMessage>) {\n return PresenceMessage.fromValues(values);\n}\n\nclass PresenceMessage extends BaseMessage {\n action?: string;\n\n /* Returns whether this presenceMessage is synthesized, i.e. was not actually\n * sent by the connection (usually means a leave event sent 15s after a\n * disconnection). This is useful because synthesized messages cannot be\n * compared for newness by id lexicographically - RTP2b1\n */\n isSynthesized(): boolean {\n if (!this.id || !this.connectionId) {\n return true;\n }\n return this.id.substring(this.connectionId.length, 0) !== this.connectionId;\n }\n\n /* RTP2b2 */\n parseId(): { connectionId: string; msgSerial: number; index: number } {\n if (!this.id) throw new Error('parseId(): Presence message does not contain an id');\n const parts = this.id.split(':');\n return {\n connectionId: parts[0],\n msgSerial: parseInt(parts[1], 10),\n index: parseInt(parts[2], 10),\n };\n }\n\n async encode(options: CipherOptions): Promise<WirePresenceMessage> {\n const res = Object.assign(new WirePresenceMessage(), this, {\n action: actions.indexOf(this.action || 'present'),\n });\n return encode(res, options);\n }\n\n static fromValues(values: Properties<PresenceMessage>): PresenceMessage {\n return Object.assign(new PresenceMessage(), values);\n }\n\n static fromValuesArray(values: Properties<PresenceMessage>[]): PresenceMessage[] {\n return values.map((v) => PresenceMessage.fromValues(v));\n }\n\n static fromData(data: any): PresenceMessage {\n if (data instanceof PresenceMessage) {\n return data;\n }\n return PresenceMessage.fromValues({\n data,\n });\n }\n\n toString() {\n return strMsg(this, 'PresenceMessage');\n }\n}\n\nexport class WirePresenceMessage extends BaseMessage {\n action?: number;\n\n toJSON(...args: any[]) {\n return wireToJSON.call(this, ...args);\n }\n\n static fromValues(values: Properties<WirePresenceMessage>): WirePresenceMessage {\n return Object.assign(new WirePresenceMessage(), values);\n }\n\n static fromValuesArray(values: Properties<WirePresenceMessage>[]): WirePresenceMessage[] {\n return values.map((v) => WirePresenceMessage.fromValues(v));\n }\n\n async decode(channelOptions: ChannelOptions, logger: Logger): Promise<PresenceMessage> {\n const res = Object.assign(new PresenceMessage(), {\n ...this,\n action: actions[this.action!],\n });\n try {\n await decode(res, channelOptions);\n } catch (e) {\n Logger.logAction(logger, Logger.LOG_ERROR, 'WirePresenceMessage.decode()', Utils.inspectError(e));\n }\n return res;\n }\n\n toString() {\n return strMsg(this, 'WirePresenceMessage');\n }\n}\n\nexport default PresenceMessage;\n", "import * as Utils from '../util/utils';\nimport Logger from '../util/logger';\nimport PaginatedResource, { PaginatedResult } from './paginatedresource';\nimport PresenceMessage, { WirePresenceMessage, _fromEncodedArray } from '../types/presencemessage';\nimport RestChannel from './restchannel';\nimport Defaults from '../util/defaults';\n\nclass RestPresence {\n channel: RestChannel;\n\n constructor(channel: RestChannel) {\n this.channel = channel;\n }\n\n get logger(): Logger {\n return this.channel.logger;\n }\n\n async get(params: any): Promise<PaginatedResult<PresenceMessage>> {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RestPresence.get()', 'channel = ' + this.channel.name);\n const client = this.channel.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = this.channel.client.http.supportsLinkHeaders ? undefined : format,\n headers = Defaults.defaultGetHeaders(client.options, { format });\n\n Utils.mixin(headers, client.options.headers);\n\n return new PaginatedResource(\n client,\n this.channel.client.rest.presenceMixin.basePath(this),\n headers,\n envelope,\n async (body, headers, unpacked) => {\n const decoded = (\n unpacked ? body : Utils.decodeBody(body, client._MsgPack, format)\n ) as Utils.Properties<WirePresenceMessage>[];\n\n return _fromEncodedArray(decoded, this.channel);\n },\n ).get(params);\n }\n\n async history(params: any): Promise<PaginatedResult<PresenceMessage>> {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RestPresence.history()', 'channel = ' + this.channel.name);\n return this.channel.client.rest.presenceMixin.history(this, params);\n }\n}\n\nexport default RestPresence;\n", "import Logger from '../util/logger';\nimport {\n BaseMessage,\n encode,\n decode,\n wireToJSON,\n normalizeCipherOptions,\n EncodingDecodingContext,\n CipherOptions,\n strMsg,\n} from './basemessage';\nimport * as Utils from '../util/utils';\nimport * as API from '../../../../ably';\n\nimport type { IUntypedCryptoStatic } from 'common/types/ICryptoStatic';\nimport type { ChannelOptions } from '../../types/channel';\nimport type { Properties } from '../util/utils';\nimport type RestChannel from '../client/restchannel';\nimport type RealtimeChannel from '../client/realtimechannel';\nimport type ErrorInfo from './errorinfo';\ntype Channel = RestChannel | RealtimeChannel;\n\nconst actions: API.MessageAction[] = ['message.create', 'message.update', 'message.delete', 'meta', 'message.summary'];\n\nfunction stringifyAction(action: number | undefined): string {\n return actions[action || 0] || 'unknown';\n}\n\nfunction getMessageSize(msg: WireMessage) {\n let size = 0;\n if (msg.name) {\n size += msg.name.length;\n }\n if (msg.clientId) {\n size += msg.clientId.length;\n }\n if (msg.extras) {\n size += JSON.stringify(msg.extras).length;\n }\n if (msg.data) {\n size += Utils.dataSizeBytes(msg.data);\n }\n return size;\n}\n\nexport async function fromEncoded(\n logger: Logger,\n Crypto: IUntypedCryptoStatic | null,\n encoded: Properties<WireMessage>,\n inputOptions?: API.ChannelOptions,\n): Promise<Message> {\n const options = normalizeCipherOptions(Crypto, logger, inputOptions ?? null);\n const wm = WireMessage.fromValues(encoded);\n return wm.decode(options, logger);\n}\n\nexport async function fromEncodedArray(\n logger: Logger,\n Crypto: IUntypedCryptoStatic | null,\n encodedArray: Array<WireMessage>,\n options?: API.ChannelOptions,\n): Promise<Message[]> {\n return Promise.all(\n encodedArray.map(function (encoded) {\n return fromEncoded(logger, Crypto, encoded, options);\n }),\n );\n}\n\n// these forms of the functions are used internally when we have a channel instance\n// already, so don't need to normalise channel options\nexport async function _fromEncoded(encoded: Properties<WireMessage>, channel: Channel): Promise<Message> {\n const wm = WireMessage.fromValues(encoded);\n return wm.decode(channel.channelOptions, channel.logger);\n}\n\nexport async function _fromEncodedArray(encodedArray: Properties<WireMessage>[], channel: Channel): Promise<Message[]> {\n return Promise.all(\n encodedArray.map(function (encoded) {\n return _fromEncoded(encoded, channel);\n }),\n );\n}\n\nexport async function encodeArray(messages: Array<Message>, options: CipherOptions): Promise<Array<WireMessage>> {\n return Promise.all(messages.map((message) => message.encode(options)));\n}\n\nexport const serialize = Utils.encodeBody;\n\n/* This should be called on encode()d (and encrypt()d) Messages (as it\n * assumes the data is a string or buffer) */\nexport function getMessagesSize(messages: WireMessage[]): number {\n let msg,\n total = 0;\n for (let i = 0; i < messages.length; i++) {\n msg = messages[i];\n total += msg.size || (msg.size = getMessageSize(msg));\n }\n return total;\n}\n\nclass Message extends BaseMessage {\n name?: string;\n connectionKey?: string;\n action?: API.MessageAction;\n serial?: string;\n refSerial?: string;\n refType?: string;\n createdAt?: number;\n version?: string;\n operation?: API.Operation;\n summary?: any; // TODO improve typings after summary structure is finalised\n\n expandFields() {\n if (this.action === 'message.create') {\n // TM2k\n if (this.version && !this.serial) {\n this.serial = this.version;\n }\n // TM2o\n if (this.timestamp && !this.createdAt) {\n this.createdAt = this.timestamp;\n }\n }\n }\n\n async encode(options: CipherOptions): Promise<WireMessage> {\n const res = Object.assign(new WireMessage(), this, {\n action: actions.indexOf(this.action || 'message.create'),\n });\n return encode(res, options);\n }\n\n static fromValues(values: Properties<Message>): Message {\n return Object.assign(new Message(), values);\n }\n\n static fromValuesArray(values: Properties<Message>[]): Message[] {\n return values.map((v) => Message.fromValues(v));\n }\n\n toString() {\n return strMsg(this, 'Message');\n }\n}\n\nexport class WireMessage extends BaseMessage {\n name?: string;\n connectionKey?: string;\n action?: number;\n serial?: string;\n refSerial?: string;\n refType?: string;\n createdAt?: number;\n version?: string;\n operation?: API.Operation;\n summary?: any;\n\n // Overload toJSON() to intercept JSON.stringify()\n toJSON(...args: any[]) {\n return wireToJSON.call(this, ...args);\n }\n\n static fromValues(values: Properties<WireMessage>): WireMessage {\n return Object.assign(new WireMessage(), values);\n }\n\n static fromValuesArray(values: Properties<WireMessage>[]): WireMessage[] {\n return values.map((v) => WireMessage.fromValues(v));\n }\n\n // for contexts where some decoding errors need to be handled specially by the caller\n async decodeWithErr(\n inputContext: CipherOptions | EncodingDecodingContext | ChannelOptions,\n logger: Logger,\n ): Promise<{ decoded: Message; err: ErrorInfo | undefined }> {\n const res: Message = Object.assign(new Message(), {\n ...this,\n action: stringifyAction(this.action),\n });\n let err: ErrorInfo | undefined;\n try {\n await decode(res, inputContext);\n } catch (e) {\n Logger.logAction(logger, Logger.LOG_ERROR, 'WireMessage.decode()', Utils.inspectError(e));\n err = e as ErrorInfo;\n }\n res.expandFields();\n return { decoded: res, err: err };\n }\n\n async decode(\n inputContext: CipherOptions | EncodingDecodingContext | ChannelOptions,\n logger: Logger,\n ): Promise<Message> {\n const { decoded } = await this.decodeWithErr(inputContext, logger);\n return decoded;\n }\n\n toString() {\n return strMsg(this, 'WireMessage');\n }\n}\n\nexport default Message;\n", "import * as Utils from '../util/utils';\nimport Logger from '../util/logger';\nimport RestPresence from './restpresence';\nimport Message, {\n serialize as serializeMessage,\n getMessagesSize,\n encodeArray as encodeMessagesArray,\n} from '../types/message';\nimport { CipherOptions } from '../types/basemessage';\nimport ErrorInfo from '../types/errorinfo';\nimport { PaginatedResult } from './paginatedresource';\nimport Resource from './resource';\nimport { ChannelOptions } from '../../types/channel';\nimport BaseRest from './baseclient';\nimport * as API from '../../../../ably';\nimport Defaults, { normaliseChannelOptions } from '../util/defaults';\nimport { RestHistoryParams } from './restchannelmixin';\nimport { RequestBody } from 'common/types/http';\nimport type { PushChannel } from 'plugins/push';\nimport type RestAnnotations from './restannotations';\n\nconst MSG_ID_ENTROPY_BYTES = 9;\n\nfunction allEmptyIds(messages: Array<Message>) {\n return messages.every(function (message: Message) {\n return !message.id;\n });\n}\n\nclass RestChannel {\n client: BaseRest;\n name: string;\n presence: RestPresence;\n channelOptions: ChannelOptions;\n _push?: PushChannel;\n private _annotations: RestAnnotations | null = null;\n get annotations(): RestAnnotations {\n if (!this._annotations) {\n Utils.throwMissingPluginError('Annotations');\n }\n return this._annotations;\n }\n\n constructor(client: BaseRest, name: string, channelOptions?: ChannelOptions) {\n Logger.logAction(client.logger, Logger.LOG_MINOR, 'RestChannel()', 'started; name = ' + name);\n this.name = name;\n this.client = client;\n this.presence = new RestPresence(this);\n this.channelOptions = normaliseChannelOptions(client._Crypto ?? null, this.logger, channelOptions);\n if (client.options.plugins?.Push) {\n this._push = new client.options.plugins.Push.PushChannel(this);\n }\n if (client._Annotations) {\n this._annotations = new client._Annotations.RestAnnotations(this);\n }\n }\n\n get push() {\n if (!this._push) {\n Utils.throwMissingPluginError('Push');\n }\n return this._push;\n }\n\n get logger(): Logger {\n return this.client.logger;\n }\n\n setOptions(options?: ChannelOptions): void {\n this.channelOptions = normaliseChannelOptions(this.client._Crypto ?? null, this.logger, options);\n }\n\n async history(params: RestHistoryParams | null): Promise<PaginatedResult<Message>> {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RestChannel.history()', 'channel = ' + this.name);\n return this.client.rest.channelMixin.history(this, params);\n }\n\n async publish(...args: any[]): Promise<void> {\n const first = args[0],\n second = args[1];\n let messages: Array<Message>;\n let params: any;\n\n if (typeof first === 'string' || first === null) {\n /* (name, data, ...) */\n messages = [Message.fromValues({ name: first, data: second })];\n params = args[2];\n } else if (Utils.isObject(first)) {\n messages = [Message.fromValues(first)];\n params = args[1];\n } else if (Array.isArray(first)) {\n messages = Message.fromValuesArray(first);\n params = args[1];\n } else {\n throw new ErrorInfo(\n 'The single-argument form of publish() expects a message object or an array of message objects',\n 40013,\n 400,\n );\n }\n\n if (!params) {\n /* No params supplied */\n params = {};\n }\n\n const client = this.client,\n options = client.options,\n format = options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n idempotentRestPublishing = client.options.idempotentRestPublishing,\n headers = Defaults.defaultPostHeaders(client.options, { format });\n\n Utils.mixin(headers, options.headers);\n\n if (idempotentRestPublishing && allEmptyIds(messages)) {\n const msgIdBase = await Utils.randomString(MSG_ID_ENTROPY_BYTES);\n messages.forEach(function (message, index) {\n message.id = msgIdBase + ':' + index.toString();\n });\n }\n\n const wireMessages = await encodeMessagesArray(messages, this.channelOptions as CipherOptions);\n\n /* RSL1i */\n const size = getMessagesSize(wireMessages),\n maxMessageSize = options.maxMessageSize;\n if (size > maxMessageSize) {\n throw new ErrorInfo(\n `Maximum size of messages that can be published at once exceeded (was ${size} bytes; limit is ${maxMessageSize} bytes)`,\n 40009,\n 400,\n );\n }\n\n await this._publish(serializeMessage(wireMessages, client._MsgPack, format), headers, params);\n }\n\n async _publish(requestBody: RequestBody | null, headers: Record<string, string>, params: any): Promise<void> {\n await Resource.post(\n this.client,\n this.client.rest.channelMixin.basePath(this) + '/messages',\n requestBody,\n headers,\n params,\n null,\n true,\n );\n }\n\n async status(): Promise<API.ChannelDetails> {\n return this.client.rest.channelMixin.status(this);\n }\n}\n\nexport default RestChannel;\n", "type StatsValues = {\n entries?: Partial<Record<string, number>>;\n schema?: string;\n appId?: string;\n inProgress?: never;\n unit?: never;\n intervalId?: never;\n};\n\nclass Stats {\n entries?: Partial<Record<string, number>>;\n schema?: string;\n appId?: string;\n inProgress?: never;\n unit?: never;\n intervalId?: never;\n\n constructor(values?: StatsValues) {\n this.entries = (values && values.entries) || undefined;\n this.schema = (values && values.schema) || undefined;\n this.appId = (values && values.appId) || undefined;\n this.inProgress = (values && values.inProgress) || undefined;\n this.unit = (values && values.unit) || undefined;\n this.intervalId = (values && values.intervalId) || undefined;\n }\n\n static fromValues(values: StatsValues): Stats {\n return new Stats(values);\n }\n}\n\nexport default Stats;\n", "import * as API from '../../../../ably';\nimport RestChannel from './restchannel';\nimport RealtimeChannel from './realtimechannel';\nimport * as Utils from '../util/utils';\nimport Message, { WireMessage, _fromEncodedArray } from '../types/message';\nimport Defaults from '../util/defaults';\nimport PaginatedResource, { PaginatedResult } from './paginatedresource';\nimport Resource from './resource';\n\nexport interface RestHistoryParams {\n start?: number;\n end?: number;\n direction?: string;\n limit?: number;\n}\n\nexport class RestChannelMixin {\n static basePath(channel: RestChannel | RealtimeChannel) {\n return '/channels/' + encodeURIComponent(channel.name);\n }\n\n static history(\n channel: RestChannel | RealtimeChannel,\n params: RestHistoryParams | null,\n ): Promise<PaginatedResult<Message>> {\n const client = channel.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = channel.client.http.supportsLinkHeaders ? undefined : format,\n headers = Defaults.defaultGetHeaders(client.options, { format });\n\n Utils.mixin(headers, client.options.headers);\n\n return new PaginatedResource(client, this.basePath(channel) + '/messages', headers, envelope, async function (\n body,\n headers,\n unpacked,\n ) {\n const decoded = (\n unpacked ? body : Utils.decodeBody(body, client._MsgPack, format)\n ) as Utils.Properties<WireMessage>[];\n\n return _fromEncodedArray(decoded, channel);\n }).get(params as Record<string, unknown>);\n }\n\n static async status(channel: RestChannel | RealtimeChannel): Promise<API.ChannelDetails> {\n const format = channel.client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json;\n const headers = Defaults.defaultPostHeaders(channel.client.options, { format });\n\n const response = await Resource.get<API.ChannelDetails>(\n channel.client,\n this.basePath(channel),\n headers,\n {},\n format,\n true,\n );\n\n return response.body!;\n }\n}\n", "import RestPresence from './restpresence';\nimport RealtimePresence from './realtimepresence';\nimport * as Utils from '../util/utils';\nimport Defaults from '../util/defaults';\nimport PaginatedResource, { PaginatedResult } from './paginatedresource';\nimport PresenceMessage, { WirePresenceMessage, _fromEncodedArray } from '../types/presencemessage';\nimport { RestChannelMixin } from './restchannelmixin';\n\nexport class RestPresenceMixin {\n static basePath(presence: RestPresence | RealtimePresence) {\n return RestChannelMixin.basePath(presence.channel) + '/presence';\n }\n\n static async history(\n presence: RestPresence | RealtimePresence,\n params: any,\n ): Promise<PaginatedResult<PresenceMessage>> {\n const client = presence.channel.client,\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = presence.channel.client.http.supportsLinkHeaders ? undefined : format,\n headers = Defaults.defaultGetHeaders(client.options, { format });\n\n Utils.mixin(headers, client.options.headers);\n\n return new PaginatedResource(\n client,\n this.basePath(presence) + '/history',\n headers,\n envelope,\n async (body, headers, unpacked) => {\n const decoded = (\n unpacked ? body : Utils.decodeBody(body, client._MsgPack, format)\n ) as Utils.Properties<WirePresenceMessage>[];\n\n return _fromEncodedArray(decoded, presence.channel);\n },\n ).get(params);\n }\n}\n", "import * as Utils from '../util/utils';\nimport Defaults from '../util/defaults';\nimport Push from './push';\nimport PaginatedResource, { HttpPaginatedResponse, PaginatedResult } from './paginatedresource';\nimport RestChannel from './restchannel';\nimport ErrorInfo from '../types/errorinfo';\nimport Stats from '../types/stats';\nimport HttpMethods from '../../constants/HttpMethods';\nimport { ChannelOptions } from '../../types/channel';\nimport { RequestBody, RequestParams } from '../../types/http';\nimport * as API from '../../../../ably';\nimport Resource from './resource';\n\nimport Platform from '../../platform';\nimport BaseClient from './baseclient';\nimport { useTokenAuth } from './auth';\nimport { RestChannelMixin } from './restchannelmixin';\nimport { RestPresenceMixin } from './restpresencemixin';\nimport DeviceDetails from '../types/devicedetails';\nimport PushChannelSubscription from '../types/pushchannelsubscription';\n\ntype BatchResult<T> = API.BatchResult<T>;\n\ntype BatchPublishSpec = API.BatchPublishSpec;\ntype BatchPublishSuccessResult = API.BatchPublishSuccessResult;\ntype BatchPublishFailureResult = API.BatchPublishFailureResult;\ntype BatchPublishResult = BatchResult<BatchPublishSuccessResult | BatchPublishFailureResult>;\ntype BatchPresenceSuccessResult = API.BatchPresenceSuccessResult;\ntype BatchPresenceFailureResult = API.BatchPresenceFailureResult;\ntype BatchPresenceResult = BatchResult<BatchPresenceSuccessResult | BatchPresenceFailureResult>;\n\ntype TokenRevocationTargetSpecifier = API.TokenRevocationTargetSpecifier;\ntype TokenRevocationOptions = API.TokenRevocationOptions;\ntype TokenRevocationSuccessResult = API.TokenRevocationSuccessResult;\ntype TokenRevocationFailureResult = API.TokenRevocationFailureResult;\ntype TokenRevocationResult = BatchResult<TokenRevocationSuccessResult | TokenRevocationFailureResult>;\n\nexport class Rest {\n private readonly client: BaseClient;\n readonly channels: Channels;\n readonly push: Push;\n\n readonly channelMixin = RestChannelMixin;\n readonly presenceMixin = RestPresenceMixin;\n\n // exposed for plugins but shouldn't be bundled with minimal realtime\n Resource = Resource;\n PaginatedResource = PaginatedResource;\n DeviceDetails = DeviceDetails;\n PushChannelSubscription = PushChannelSubscription;\n\n constructor(client: BaseClient) {\n this.client = client;\n this.channels = new Channels(this.client);\n this.push = new Push(this.client);\n }\n\n async stats(params: RequestParams): Promise<PaginatedResult<Stats>> {\n const headers = Defaults.defaultGetHeaders(this.client.options),\n format = this.client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = this.client.http.supportsLinkHeaders ? undefined : format;\n\n Utils.mixin(headers, this.client.options.headers);\n\n return new PaginatedResource(this.client, '/stats', headers, envelope, function (body, headers, unpacked) {\n const statsValues = unpacked ? body : JSON.parse(body as string);\n for (let i = 0; i < statsValues.length; i++) statsValues[i] = Stats.fromValues(statsValues[i]);\n return statsValues;\n }).get(params as Record<string, string>);\n }\n\n async time(params?: RequestParams): Promise<number> {\n const headers = Defaults.defaultGetHeaders(this.client.options);\n if (this.client.options.headers) Utils.mixin(headers, this.client.options.headers);\n const timeUri = (host: string) => {\n return this.client.baseUri(host) + '/time';\n };\n\n let { error, body, unpacked } = await this.client.http.do(\n HttpMethods.Get,\n timeUri,\n headers,\n null,\n params as RequestParams,\n );\n\n if (error) {\n throw error;\n }\n if (!unpacked) body = JSON.parse(body as string);\n const time = (body as number[])[0];\n if (!time) {\n throw new ErrorInfo('Internal error (unexpected result type from GET /time)', 50000, 500);\n }\n /* calculate time offset only once for this device by adding to the prototype */\n this.client.serverTimeOffset = time - Date.now();\n return time;\n }\n\n async request(\n method: string,\n path: string,\n version: number,\n params: RequestParams,\n body: unknown,\n customHeaders: Record<string, string>,\n ): Promise<HttpPaginatedResponse<unknown>> {\n const [encoder, decoder, format] = (() => {\n if (this.client.options.useBinaryProtocol) {\n if (!this.client._MsgPack) {\n Utils.throwMissingPluginError('MsgPack');\n }\n return [this.client._MsgPack.encode, this.client._MsgPack.decode, Utils.Format.msgpack];\n } else {\n return [JSON.stringify, JSON.parse, Utils.Format.json];\n }\n })();\n const envelope = this.client.http.supportsLinkHeaders ? undefined : format;\n params = params || {};\n const _method = method.toLowerCase() as HttpMethods;\n const headers =\n _method == 'get'\n ? Defaults.defaultGetHeaders(this.client.options, { format, protocolVersion: version })\n : Defaults.defaultPostHeaders(this.client.options, { format, protocolVersion: version });\n\n if (typeof body !== 'string') {\n body = encoder(body) ?? null;\n }\n Utils.mixin(headers, this.client.options.headers);\n if (customHeaders) {\n Utils.mixin(headers, customHeaders);\n }\n const paginatedResource = new PaginatedResource(\n this.client,\n path,\n headers,\n envelope,\n async function (resbody, headers, unpacked) {\n return Utils.ensureArray(unpacked ? resbody : decoder(resbody as string & Buffer));\n },\n /* useHttpPaginatedResponse: */ true,\n );\n\n if (!Platform.Http.methods.includes(_method)) {\n throw new ErrorInfo('Unsupported method ' + _method, 40500, 405);\n }\n\n if (Platform.Http.methodsWithBody.includes(_method)) {\n return paginatedResource[_method as HttpMethods.Post](params, body as RequestBody) as Promise<\n HttpPaginatedResponse<unknown>\n >;\n } else {\n return paginatedResource[_method as HttpMethods.Get | HttpMethods.Delete](params) as Promise<\n HttpPaginatedResponse<unknown>\n >;\n }\n }\n\n async batchPublish<T extends BatchPublishSpec | BatchPublishSpec[]>(\n specOrSpecs: T,\n ): Promise<T extends BatchPublishSpec ? BatchPublishResult : BatchPublishResult[]> {\n let requestBodyDTO: BatchPublishSpec[];\n let singleSpecMode: boolean;\n if (Array.isArray(specOrSpecs)) {\n requestBodyDTO = specOrSpecs;\n singleSpecMode = false;\n } else {\n requestBodyDTO = [specOrSpecs];\n singleSpecMode = true;\n }\n\n const format = this.client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultPostHeaders(this.client.options, { format });\n\n if (this.client.options.headers) Utils.mixin(headers, this.client.options.headers);\n\n const requestBody = Utils.encodeBody(requestBodyDTO, this.client._MsgPack, format);\n\n const response = await Resource.post(this.client, '/messages', requestBody, headers, {}, null, true);\n\n const batchResults = (\n response.unpacked ? response.body : Utils.decodeBody(response.body, this.client._MsgPack, format)\n ) as BatchPublishResult[];\n\n // I don't love the below type assertions but not sure how to avoid them\n if (singleSpecMode) {\n return batchResults[0] as T extends BatchPublishSpec ? BatchPublishResult : BatchPublishResult[];\n } else {\n return batchResults as T extends BatchPublishSpec ? BatchPublishResult : BatchPublishResult[];\n }\n }\n\n async batchPresence(channels: string[]): Promise<BatchPresenceResult> {\n const format = this.client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultPostHeaders(this.client.options, { format });\n\n if (this.client.options.headers) Utils.mixin(headers, this.client.options.headers);\n\n const channelsParam = channels.join(',');\n\n const response = await Resource.get(this.client, '/presence', headers, { channels: channelsParam }, null, true);\n\n return (\n response.unpacked ? response.body : Utils.decodeBody(response.body, this.client._MsgPack, format)\n ) as BatchPresenceResult;\n }\n\n async revokeTokens(\n specifiers: TokenRevocationTargetSpecifier[],\n options?: TokenRevocationOptions,\n ): Promise<TokenRevocationResult> {\n if (useTokenAuth(this.client.options)) {\n throw new ErrorInfo('Cannot revoke tokens when using token auth', 40162, 401);\n }\n\n const keyName = this.client.options.keyName!;\n\n let resolvedOptions = options ?? {};\n\n const requestBodyDTO = {\n targets: specifiers.map((specifier) => `${specifier.type}:${specifier.value}`),\n ...resolvedOptions,\n };\n\n const format = this.client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultPostHeaders(this.client.options, { format });\n\n if (this.client.options.headers) Utils.mixin(headers, this.client.options.headers);\n\n const requestBody = Utils.encodeBody(requestBodyDTO, this.client._MsgPack, format);\n\n const response = await Resource.post(\n this.client,\n `/keys/${keyName}/revokeTokens`,\n requestBody,\n headers,\n {},\n null,\n true,\n );\n\n return (\n response.unpacked ? response.body : Utils.decodeBody(response.body, this.client._MsgPack, format)\n ) as TokenRevocationResult;\n }\n}\n\nclass Channels {\n client: BaseClient;\n // RSN2\n all: Record<string, RestChannel>;\n\n constructor(client: BaseClient) {\n this.client = client;\n this.all = Object.create(null);\n }\n\n get(name: string, channelOptions?: ChannelOptions) {\n name = String(name);\n let channel = this.all[name];\n if (!channel) {\n this.all[name] = channel = new RestChannel(this.client, name, channelOptions);\n } else if (channelOptions) {\n channel.setOptions(channelOptions);\n }\n\n return channel;\n }\n\n /* Included to support certain niche use-cases; most users should ignore this.\n * Please do not use this unless you know what you're doing */\n release(name: string) {\n delete this.all[String(name)];\n }\n}\n", "import BaseClient from './baseclient';\nimport ClientOptions from '../../types/ClientOptions';\nimport { Rest } from './rest';\nimport Defaults from '../util/defaults';\nimport Logger from '../util/logger';\n\n/**\n `BaseRest` is an export of the tree-shakable version of the SDK, and acts as the base class for the `DefaultRest` class exported by the non tree-shakable version.\n\n It always includes the `Rest` plugin.\n */\nexport class BaseRest extends BaseClient {\n /*\n * The public typings declare that this only accepts an object, but since we want to emit a good error message in the case where a non-TypeScript user does one of these things:\n *\n * 1. passes a string (which is quite likely if they\u2019re e.g. migrating from the default variant to the modular variant)\n * 2. passes no argument at all\n *\n * tell the compiler that these cases are possible so that it forces us to handle them.\n */\n constructor(options?: ClientOptions | string) {\n super(Defaults.objectifyOptions(options, false, 'BaseRest', Logger.defaultLogger, { Rest }));\n }\n}\n", "import { Rest } from './rest';\r\nimport { IUntypedCryptoStatic } from '../../types/ICryptoStatic';\r\nimport { MsgPack } from 'common/types/msgpack';\r\nimport RealtimePresence from './realtimepresence';\r\nimport RealtimeAnnotations from './realtimeannotations';\r\nimport RestAnnotations from './restannotations';\r\nimport XHRRequest from 'platform/web/lib/http/request/xhrrequest';\r\nimport fetchRequest from 'platform/web/lib/http/request/fetchrequest';\r\nimport { FilteredSubscriptions } from './filteredsubscriptions';\r\nimport PresenceMessage, { WirePresenceMessage } from '../types/presencemessage';\r\nimport Annotation, { WireAnnotation } from '../types/annotation';\r\nimport { TransportCtor } from '../transport/transport';\r\nimport type * as PushPlugin from 'plugins/push';\r\nimport type * as ObjectsPlugin from 'plugins/objects';\r\n\r\nexport interface PresenceMessagePlugin {\r\n PresenceMessage: typeof PresenceMessage;\r\n WirePresenceMessage: typeof WirePresenceMessage;\r\n}\r\n\r\nexport type RealtimePresencePlugin = PresenceMessagePlugin & {\r\n RealtimePresence: typeof RealtimePresence;\r\n};\r\n\r\nexport type AnnotationsPlugin = {\r\n Annotation: typeof Annotation;\r\n WireAnnotation: typeof WireAnnotation;\r\n RealtimeAnnotations: typeof RealtimeAnnotations;\r\n RestAnnotations: typeof RestAnnotations;\r\n};\r\n\r\nexport interface ModularPlugins {\r\n Rest?: typeof Rest;\r\n Crypto?: IUntypedCryptoStatic;\r\n MsgPack?: MsgPack;\r\n RealtimePresence?: RealtimePresencePlugin;\r\n Annotations?: AnnotationsPlugin;\r\n WebSocketTransport?: TransportCtor;\r\n XHRPolling?: TransportCtor;\r\n XHRRequest?: typeof XHRRequest;\r\n FetchRequest?: typeof fetchRequest;\r\n MessageInteractions?: typeof FilteredSubscriptions;\r\n Push?: typeof PushPlugin;\r\n Objects?: typeof ObjectsPlugin; // PC5, PT2b\r\n}\r\n\r\nexport const allCommonModularPlugins: ModularPlugins = { Rest };\r\n", "import Message, { WireMessage, fromEncoded, fromEncodedArray } from './message';\nimport * as API from '../../../../ably';\nimport Platform from 'common/platform';\nimport Logger from '../util/logger';\nimport type { Properties } from '../util/utils';\n\n/**\n `DefaultMessage` is the class returned by `DefaultRest` and `DefaultRealtime`\u2019s `Message` static property. It introduces the static methods described in the `MessageStatic` interface of the public API of the non tree-shakable version of the library.\n */\nexport class DefaultMessage extends Message {\n static async fromEncoded(encoded: unknown, inputOptions?: API.ChannelOptions): Promise<Message> {\n return fromEncoded(Logger.defaultLogger, Platform.Crypto, encoded as WireMessage, inputOptions);\n }\n\n static async fromEncodedArray(encodedArray: Array<unknown>, options?: API.ChannelOptions): Promise<Message[]> {\n return fromEncodedArray(Logger.defaultLogger, Platform.Crypto, encodedArray as WireMessage[], options);\n }\n\n static fromValues(values: Properties<Message>): Message {\n return Message.fromValues(values);\n }\n}\n", "import * as API from '../../../../ably';\nimport Logger from '../util/logger';\nimport PresenceMessage, { fromEncoded, fromEncodedArray, WirePresenceMessage } from './presencemessage';\nimport Platform from 'common/platform';\nimport type { Properties } from '../util/utils';\n\n/**\n `DefaultPresenceMessage` is the class returned by `DefaultRest` and `DefaultRealtime`\u2019s `PresenceMessage` static property. It introduces the static methods described in the `PresenceMessageStatic` interface of the public API of the non tree-shakable version of the library.\n */\nexport class DefaultPresenceMessage extends PresenceMessage {\n static async fromEncoded(encoded: unknown, inputOptions?: API.ChannelOptions): Promise<PresenceMessage> {\n return fromEncoded(Logger.defaultLogger, Platform.Crypto, encoded as WirePresenceMessage, inputOptions);\n }\n\n static async fromEncodedArray(\n encodedArray: Array<unknown>,\n options?: API.ChannelOptions,\n ): Promise<PresenceMessage[]> {\n return fromEncodedArray(Logger.defaultLogger, Platform.Crypto, encodedArray as WirePresenceMessage[], options);\n }\n\n static fromValues(values: Properties<PresenceMessage>): PresenceMessage {\n return PresenceMessage.fromValues(values);\n }\n}\n", "import Logger from '../util/logger';\nimport { BaseMessage, encode, decode, wireToJSON, strMsg } from './basemessage';\nimport * as API from '../../../../ably';\nimport * as Utils from '../util/utils';\n\nimport type { Properties } from '../util/utils';\nimport type RestChannel from '../client/restchannel';\nimport type RealtimeChannel from '../client/realtimechannel';\nimport type { ChannelOptions } from '../../types/channel';\ntype Channel = RestChannel | RealtimeChannel;\n\nconst actions = ['annotation.create', 'annotation.delete'];\n\nexport async function fromEncoded(\n logger: Logger,\n encoded: WireAnnotation,\n options?: API.ChannelOptions,\n): Promise<Annotation> {\n const wa = WireAnnotation.fromValues(encoded);\n return wa.decode(options || {}, logger);\n}\n\nexport async function fromEncodedArray(\n logger: Logger,\n encodedArray: WireAnnotation[],\n options?: API.ChannelOptions,\n): Promise<Annotation[]> {\n return Promise.all(\n encodedArray.map(function (encoded) {\n return fromEncoded(logger, encoded, options);\n }),\n );\n}\n\n// these forms of the functions are used internally when we have a channel instance\n// already, so don't need to normalise channel options\nexport async function _fromEncoded(encoded: Properties<WireAnnotation>, channel: Channel): Promise<Annotation> {\n return WireAnnotation.fromValues(encoded).decode(channel.channelOptions, channel.logger);\n}\n\nexport async function _fromEncodedArray(\n encodedArray: Properties<WireAnnotation>[],\n channel: Channel,\n): Promise<Annotation[]> {\n return Promise.all(\n encodedArray.map(function (encoded) {\n return _fromEncoded(encoded, channel);\n }),\n );\n}\n\n// for tree-shakability\nexport function fromValues(values: Properties<Annotation>) {\n return Annotation.fromValues(values);\n}\n\nclass Annotation extends BaseMessage {\n action?: API.AnnotationAction;\n serial?: string;\n messageSerial?: string;\n type?: string;\n name?: string;\n count?: number;\n\n async encode(): Promise<WireAnnotation> {\n const res = Object.assign(new WireAnnotation(), this, {\n action: actions.indexOf(this.action || 'annotation.create'),\n });\n // note: we do not pass cipheroptions/channeloptions here as annotations are not\n // encrypted (as the data needs to be parsed by the server for summarisation)\n return encode(res, {});\n }\n\n static fromValues(values: Properties<Annotation>): Annotation {\n return Object.assign(new Annotation(), values);\n }\n\n static fromValuesArray(values: Properties<Annotation>[]): Annotation[] {\n return values.map((v) => Annotation.fromValues(v));\n }\n\n toString() {\n return strMsg(this, 'Annotation');\n }\n}\n\nexport class WireAnnotation extends BaseMessage {\n action?: number;\n serial?: string;\n messageSerial?: string;\n type?: string;\n name?: string;\n count?: number;\n\n toJSON(...args: any[]) {\n return wireToJSON.call(this, ...args);\n }\n\n static fromValues(values: Properties<WireAnnotation>): WireAnnotation {\n return Object.assign(new WireAnnotation(), values);\n }\n\n static fromValuesArray(values: Properties<WireAnnotation>[]): WireAnnotation[] {\n return values.map((v) => WireAnnotation.fromValues(v));\n }\n\n async decode(channelOptions: ChannelOptions, logger: Logger): Promise<Annotation> {\n const res = Object.assign(new Annotation(), {\n ...this,\n action: actions[this.action!],\n });\n try {\n await decode(res, channelOptions);\n } catch (e) {\n Logger.logAction(logger, Logger.LOG_ERROR, 'WireAnnotation.decode()', Utils.inspectError(e));\n }\n return res;\n }\n\n toString() {\n return strMsg(this, 'WireAnnotation');\n }\n}\n\nexport default Annotation;\n", "import * as API from '../../../../ably';\nimport Logger from '../util/logger';\nimport Annotation, { fromEncoded, fromEncodedArray, WireAnnotation } from './annotation';\nimport type { Properties } from '../util/utils';\n\n/**\n `DefaultAnnotation` is the class returned by `DefaultRest` and `DefaultRealtime`\u2019s `Annotation` static property. It introduces the static methods described in the `AnnotationStatic` interface of the public API of the non tree-shakable version of the library.\n */\nexport class DefaultAnnotation extends Annotation {\n static async fromEncoded(encoded: unknown, inputOptions?: API.ChannelOptions): Promise<Annotation> {\n return fromEncoded(Logger.defaultLogger, encoded as WireAnnotation, inputOptions);\n }\n\n static async fromEncodedArray(encodedArray: Array<unknown>, options?: API.ChannelOptions): Promise<Annotation[]> {\n return fromEncodedArray(Logger.defaultLogger, encodedArray as WireAnnotation[], options);\n }\n\n static fromValues(values: Properties<Annotation>): Annotation {\n return Annotation.fromValues(values);\n }\n}\n", "import * as Utils from '../util/utils';\nimport Annotation, { WireAnnotation, _fromEncodedArray } from '../types/annotation';\nimport type Message from '../types/message';\nimport type RestChannel from './restchannel';\nimport type RealtimeChannel from './realtimechannel';\nimport Defaults from '../util/defaults';\nimport PaginatedResource, { PaginatedResult } from './paginatedresource';\nimport Resource from './resource';\nimport type { Properties } from '../util/utils';\nimport ErrorInfo from '../types/errorinfo';\n\nexport interface RestGetAnnotationsParams {\n limit?: number;\n}\n\nexport function serialFromMsgOrSerial(msgOrSerial: string | Message): string {\n let messageSerial: string | undefined;\n switch (typeof msgOrSerial) {\n case 'string':\n messageSerial = msgOrSerial;\n break;\n case 'object':\n messageSerial = msgOrSerial.serial;\n break;\n }\n if (!messageSerial || typeof messageSerial !== 'string') {\n throw new ErrorInfo(\n 'First argument of annotations.publish() must be either a Message (or at least an object with a string `serial` property) or a message serial (string)',\n 40003,\n 400,\n );\n }\n return messageSerial;\n}\n\nexport function constructValidateAnnotation(\n msgOrSerial: string | Message,\n annotationValues: Partial<Properties<Annotation>>,\n): Annotation {\n const messageSerial = serialFromMsgOrSerial(msgOrSerial);\n\n if (!annotationValues || typeof annotationValues !== 'object') {\n throw new ErrorInfo(\n 'Second argument of annotations.publish() must be an object (the intended annotation to publish)',\n 40003,\n 400,\n );\n }\n\n const annotation = Annotation.fromValues(annotationValues);\n annotation.messageSerial = messageSerial;\n if (!annotation.action) {\n annotation.action = 'annotation.create';\n }\n return annotation;\n}\n\nfunction basePathForSerial(channel: RestChannel | RealtimeChannel, serial: string) {\n return (\n channel.client.rest.channelMixin.basePath(channel) + '/messages/' + encodeURIComponent(serial) + '/annotations'\n );\n}\n\nclass RestAnnotations {\n private channel: RestChannel;\n\n constructor(channel: RestChannel) {\n this.channel = channel;\n }\n\n async publish(msgOrSerial: string | Message, annotationValues: Partial<Properties<Annotation>>): Promise<void> {\n const annotation = constructValidateAnnotation(msgOrSerial, annotationValues);\n const wireAnnotation = await annotation.encode();\n\n const client = this.channel.client,\n options = client.options,\n format = options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n headers = Defaults.defaultPostHeaders(client.options, { format }),\n params = {};\n\n Utils.mixin(headers, client.options.headers);\n\n const requestBody = Utils.encodeBody([wireAnnotation], client._MsgPack, format);\n\n await Resource.post(\n client,\n basePathForSerial(this.channel, annotation.messageSerial!),\n requestBody,\n headers,\n params,\n null,\n true,\n );\n }\n\n async delete(msgOrSerial: string | Message, annotationValues: Partial<Properties<Annotation>>): Promise<void> {\n annotationValues.action = 'annotation.delete';\n return this.publish(msgOrSerial, annotationValues);\n }\n\n async get(\n msgOrSerial: string | Message,\n params: RestGetAnnotationsParams | null,\n ): Promise<PaginatedResult<Annotation>> {\n const client = this.channel.client,\n messageSerial = serialFromMsgOrSerial(msgOrSerial),\n format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json,\n envelope = client.http.supportsLinkHeaders ? undefined : format,\n headers = Defaults.defaultGetHeaders(client.options, { format });\n\n Utils.mixin(headers, client.options.headers);\n\n return new PaginatedResource(\n client,\n basePathForSerial(this.channel, messageSerial),\n headers,\n envelope,\n async (body, _, unpacked) => {\n const decoded = (\n unpacked ? body : Utils.decodeBody(body, client._MsgPack, format)\n ) as Utils.Properties<WireAnnotation>[];\n\n return _fromEncodedArray(decoded, this.channel);\n },\n ).get(params as Record<string, unknown>);\n }\n}\n\nexport default RestAnnotations;\n", "import { MsgPack } from 'common/types/msgpack';\r\nimport * as API from '../../../../ably';\r\nimport { PresenceMessagePlugin } from '../client/modularplugins';\r\nimport { AnnotationsPlugin } from '../client/modularplugins';\r\nimport * as Utils from '../util/utils';\r\nimport ErrorInfo from './errorinfo';\r\nimport { WireMessage } from './message';\r\nimport PresenceMessage, { WirePresenceMessage } from './presencemessage';\r\nimport Annotation, { WireAnnotation } from './annotation';\r\nimport RealtimeAnnotations from '../client/realtimeannotations';\r\nimport RestAnnotations from '../client/restannotations';\r\nimport { flags, flagNames, channelModes, ActionName } from './protocolmessagecommon';\r\nimport type { Properties } from '../util/utils';\r\nimport type * as ObjectsPlugin from 'plugins/objects';\r\nimport { MessageEncoding } from './basemessage';\r\n\r\nexport const serialize = Utils.encodeBody;\r\n\r\nfunction toStringArray(array?: any[]): string {\r\n const result = [];\r\n if (array) {\r\n for (let i = 0; i < array.length; i++) {\r\n result.push(array[i].toString());\r\n }\r\n }\r\n return '[ ' + result.join(', ') + ' ]';\r\n}\r\n\r\nexport function deserialize(\r\n serialized: unknown,\r\n MsgPack: MsgPack | null,\r\n presenceMessagePlugin: PresenceMessagePlugin | null,\r\n annotationsPlugin: AnnotationsPlugin | null,\r\n objectsPlugin: typeof ObjectsPlugin | null,\r\n format?: Utils.Format,\r\n): ProtocolMessage {\r\n const deserialized = Utils.decodeBody<Record<string, unknown>>(serialized, MsgPack, format);\r\n return fromDeserialized(deserialized, presenceMessagePlugin, annotationsPlugin, objectsPlugin);\r\n}\r\n\r\nexport function fromDeserialized(\r\n deserialized: Record<string, unknown>,\r\n presenceMessagePlugin: PresenceMessagePlugin | null,\r\n annotationsPlugin: AnnotationsPlugin | null,\r\n objectsPlugin: typeof ObjectsPlugin | null,\r\n): ProtocolMessage {\r\n let error: ErrorInfo | undefined;\r\n if (deserialized.error) {\r\n error = ErrorInfo.fromValues(deserialized.error as ErrorInfo);\r\n }\r\n\r\n let messages: WireMessage[] | undefined;\r\n if (deserialized.messages) {\r\n messages = WireMessage.fromValuesArray(deserialized.messages as Array<Properties<WireMessage>>);\r\n }\r\n\r\n let presence: WirePresenceMessage[] | undefined;\r\n if (presenceMessagePlugin && deserialized.presence) {\r\n presence = presenceMessagePlugin.WirePresenceMessage.fromValuesArray(\r\n deserialized.presence as Array<Properties<WirePresenceMessage>>,\r\n );\r\n }\r\n\r\n let annotations: WireAnnotation[] | undefined;\r\n if (annotationsPlugin && deserialized.annotations) {\r\n annotations = annotationsPlugin.WireAnnotation.fromValuesArray(\r\n deserialized.annotations as Array<Properties<WireAnnotation>>,\r\n );\r\n }\r\n\r\n let state: ObjectsPlugin.ObjectMessage[] | undefined;\r\n if (objectsPlugin && deserialized.state) {\r\n state = objectsPlugin.ObjectMessage.fromValuesArray(\r\n deserialized.state as ObjectsPlugin.ObjectMessage[],\r\n Utils,\r\n MessageEncoding,\r\n );\r\n }\r\n\r\n return Object.assign(new ProtocolMessage(), { ...deserialized, presence, messages, annotations, state, error });\r\n}\r\n\r\n/**\r\n * Used internally by the tests.\r\n *\r\n * ObjectsPlugin code can't be included as part of the core library to prevent size growth,\r\n * so if a test needs to build object messages, then it must provide the plugin upon call.\r\n */\r\nexport function makeFromDeserializedWithDependencies(dependencies?: { ObjectsPlugin: typeof ObjectsPlugin | null }) {\r\n return (deserialized: Record<string, unknown>): ProtocolMessage => {\r\n return fromDeserialized(\r\n deserialized,\r\n {\r\n PresenceMessage,\r\n WirePresenceMessage,\r\n },\r\n { Annotation, WireAnnotation, RealtimeAnnotations, RestAnnotations },\r\n dependencies?.ObjectsPlugin ?? null,\r\n );\r\n };\r\n}\r\n\r\nexport function fromValues(values: Properties<ProtocolMessage>): ProtocolMessage {\r\n return Object.assign(new ProtocolMessage(), values);\r\n}\r\n\r\nexport function stringify(\r\n msg: any,\r\n presenceMessagePlugin: PresenceMessagePlugin | null,\r\n annotationsPlugin: AnnotationsPlugin | null,\r\n objectsPlugin: typeof ObjectsPlugin | null,\r\n): string {\r\n let result = '[ProtocolMessage';\r\n if (msg.action !== undefined) result += '; action=' + ActionName[msg.action] || msg.action;\r\n\r\n const simpleAttributes = ['id', 'channel', 'channelSerial', 'connectionId', 'count', 'msgSerial', 'timestamp'];\r\n let attribute;\r\n for (let attribIndex = 0; attribIndex < simpleAttributes.length; attribIndex++) {\r\n attribute = simpleAttributes[attribIndex];\r\n if (msg[attribute] !== undefined) result += '; ' + attribute + '=' + msg[attribute];\r\n }\r\n\r\n if (msg.messages) result += '; messages=' + toStringArray(WireMessage.fromValuesArray(msg.messages));\r\n if (msg.presence && presenceMessagePlugin)\r\n result += '; presence=' + toStringArray(presenceMessagePlugin.WirePresenceMessage.fromValuesArray(msg.presence));\r\n if (msg.annotations && annotationsPlugin) {\r\n result += '; annotations=' + toStringArray(annotationsPlugin.WireAnnotation.fromValuesArray(msg.annotations));\r\n }\r\n if (msg.state && objectsPlugin) {\r\n result +=\r\n '; state=' + toStringArray(objectsPlugin.ObjectMessage.fromValuesArray(msg.state, Utils, MessageEncoding));\r\n }\r\n if (msg.error) result += '; error=' + ErrorInfo.fromValues(msg.error).toString();\r\n if (msg.auth && msg.auth.accessToken) result += '; token=' + msg.auth.accessToken;\r\n if (msg.flags) result += '; flags=' + flagNames.filter(msg.hasFlag).join(',');\r\n if (msg.params) {\r\n let stringifiedParams = '';\r\n Utils.forInOwnNonNullProperties(msg.params, function (prop: string) {\r\n if (stringifiedParams.length > 0) {\r\n stringifiedParams += '; ';\r\n }\r\n stringifiedParams += prop + '=' + msg.params[prop];\r\n });\r\n if (stringifiedParams.length > 0) {\r\n result += '; params=[' + stringifiedParams + ']';\r\n }\r\n }\r\n result += ']';\r\n return result;\r\n}\r\n\r\nclass ProtocolMessage {\r\n action?: number;\r\n flags?: number;\r\n id?: string;\r\n timestamp?: number;\r\n count?: number;\r\n error?: ErrorInfo;\r\n connectionId?: string;\r\n channel?: string;\r\n channelSerial?: string | null;\r\n msgSerial?: number;\r\n messages?: WireMessage[];\r\n /**\r\n * This will be undefined if we skipped decoding this property due to user not requesting Presence functionality \u2014 see {@link fromDeserialized}\r\n */\r\n presence?: WirePresenceMessage[];\r\n annotations?: WireAnnotation[];\r\n /**\r\n * This will be undefined if we skipped decoding this property due to user not requesting Objects functionality \u2014 see {@link fromDeserialized}\r\n */\r\n state?: ObjectsPlugin.ObjectMessage[]; // TR4r\r\n auth?: unknown;\r\n connectionDetails?: Record<string, unknown>;\r\n params?: Record<string, string>;\r\n\r\n hasFlag = (flag: string): boolean => {\r\n return ((this.flags as number) & flags[flag]) > 0;\r\n };\r\n\r\n setFlag(flag: keyof typeof flags): number {\r\n return (this.flags = (this.flags as number) | flags[flag]);\r\n }\r\n\r\n getMode(): number {\r\n return (this.flags || 0) & flags.MODE_ALL;\r\n }\r\n\r\n encodeModesToFlags(modes: API.ChannelMode[]): void {\r\n modes.forEach((mode) => this.setFlag(mode));\r\n }\r\n\r\n decodeModesFromFlags(): string[] | undefined {\r\n const modes: string[] = [];\r\n channelModes.forEach((mode) => {\r\n if (this.hasFlag(mode)) {\r\n modes.push(mode);\r\n }\r\n });\r\n return modes.length > 0 ? modes : undefined;\r\n }\r\n}\r\n\r\nexport default ProtocolMessage;\r\n", "import ErrorInfo from '../types/errorinfo';\n\nclass ChannelStateChange {\n previous: string;\n current: string;\n resumed?: boolean;\n reason?: string | Error | ErrorInfo;\n hasBacklog?: boolean;\n\n constructor(\n previous: string,\n current: string,\n resumed?: boolean,\n hasBacklog?: boolean,\n reason?: string | Error | ErrorInfo | null,\n ) {\n this.previous = previous;\n this.current = current;\n if (current === 'attached') {\n this.resumed = resumed;\n this.hasBacklog = hasBacklog;\n }\n if (reason) this.reason = reason;\n }\n}\n\nexport default ChannelStateChange;\n", "import { actions, channelModes } from '../types/protocolmessagecommon';\r\nimport ProtocolMessage, { fromValues as protocolMessageFromValues } from '../types/protocolmessage';\r\nimport EventEmitter from '../util/eventemitter';\r\nimport * as Utils from '../util/utils';\r\nimport Logger from '../util/logger';\r\nimport { EncodingDecodingContext, CipherOptions, populateFieldsFromParent } from '../types/basemessage';\r\nimport Message, { getMessagesSize, encodeArray as encodeMessagesArray } from '../types/message';\r\nimport ChannelStateChange from './channelstatechange';\r\nimport ErrorInfo, { PartialErrorInfo } from '../types/errorinfo';\r\nimport * as API from '../../../../ably';\r\nimport ConnectionManager from '../transport/connectionmanager';\r\nimport ConnectionStateChange from './connectionstatechange';\r\nimport { StandardCallback } from '../../types/utils';\r\nimport BaseRealtime from './baserealtime';\r\nimport { ChannelOptions } from '../../types/channel';\r\nimport { normaliseChannelOptions } from '../util/defaults';\r\nimport { PaginatedResult } from './paginatedresource';\r\nimport type { PushChannel } from 'plugins/push';\r\nimport type { WirePresenceMessage } from '../types/presencemessage';\r\nimport type { Objects, ObjectMessage } from 'plugins/objects';\r\nimport type RealtimePresence from './realtimepresence';\r\nimport type RealtimeAnnotations from './realtimeannotations';\r\n\r\ninterface RealtimeHistoryParams {\r\n start?: number;\r\n end?: number;\r\n direction?: string;\r\n limit?: number;\r\n untilAttach?: boolean;\r\n from_serial?: string;\r\n}\r\n\r\nconst noop = function () {};\r\n\r\nfunction validateChannelOptions(options?: API.ChannelOptions) {\r\n if (options && 'params' in options && !Utils.isObject(options.params)) {\r\n return new ErrorInfo('options.params must be an object', 40000, 400);\r\n }\r\n if (options && 'modes' in options) {\r\n if (!Array.isArray(options.modes)) {\r\n return new ErrorInfo('options.modes must be an array', 40000, 400);\r\n }\r\n for (let i = 0; i < options.modes.length; i++) {\r\n const currentMode = options.modes[i];\r\n if (\r\n !currentMode ||\r\n typeof currentMode !== 'string' ||\r\n !channelModes.includes(String.prototype.toUpperCase.call(currentMode))\r\n ) {\r\n return new ErrorInfo('Invalid channel mode: ' + currentMode, 40000, 400);\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass RealtimeChannel extends EventEmitter {\r\n name: string;\r\n channelOptions: ChannelOptions;\r\n client: BaseRealtime;\r\n private _presence: RealtimePresence | null;\r\n private _annotations: RealtimeAnnotations | null = null;\r\n get presence(): RealtimePresence {\r\n if (!this._presence) {\r\n Utils.throwMissingPluginError('RealtimePresence');\r\n }\r\n return this._presence;\r\n }\r\n get annotations(): RealtimeAnnotations {\r\n if (!this._annotations) {\r\n Utils.throwMissingPluginError('Annotations');\r\n }\r\n return this._annotations;\r\n }\r\n connectionManager: ConnectionManager;\r\n state: API.ChannelState;\r\n subscriptions: EventEmitter;\r\n filteredSubscriptions?: Map<API.messageCallback<Message>, Map<API.MessageFilter, API.messageCallback<Message>[]>>;\r\n syncChannelSerial?: string | null;\r\n properties: {\r\n attachSerial: string | null | undefined;\r\n channelSerial: string | null | undefined;\r\n };\r\n errorReason: ErrorInfo | string | null;\r\n _mode = 0;\r\n _attachResume: boolean;\r\n _decodingContext: EncodingDecodingContext;\r\n _lastPayload: {\r\n messageId?: string | null;\r\n protocolMessageChannelSerial?: string | null;\r\n decodeFailureRecoveryInProgress: null | boolean;\r\n };\r\n _allChannelChanges: EventEmitter;\r\n params?: Record<string, any>;\r\n modes: API.ChannelMode[] | undefined;\r\n stateTimer?: number | NodeJS.Timeout | null;\r\n retryTimer?: number | NodeJS.Timeout | null;\r\n retryCount: number = 0;\r\n _push?: PushChannel;\r\n _objects?: Objects;\r\n\r\n constructor(client: BaseRealtime, name: string, options?: API.ChannelOptions) {\r\n super(client.logger);\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'RealtimeChannel()', 'started; name = ' + name);\r\n this.name = name;\r\n this.channelOptions = normaliseChannelOptions(client._Crypto ?? null, this.logger, options);\r\n this.client = client;\r\n this._presence = client._RealtimePresence ? new client._RealtimePresence.RealtimePresence(this) : null;\r\n if (client._Annotations) {\r\n this._annotations = new client._Annotations.RealtimeAnnotations(this);\r\n }\r\n this.connectionManager = client.connection.connectionManager;\r\n this.state = 'initialized';\r\n this.subscriptions = new EventEmitter(this.logger);\r\n this.syncChannelSerial = undefined;\r\n this.properties = {\r\n attachSerial: undefined,\r\n channelSerial: undefined,\r\n };\r\n this.setOptions(options);\r\n this.errorReason = null;\r\n this._attachResume = false;\r\n this._decodingContext = {\r\n channelOptions: this.channelOptions,\r\n plugins: client.options.plugins || {},\r\n baseEncodedPreviousPayload: undefined,\r\n };\r\n this._lastPayload = {\r\n messageId: null,\r\n protocolMessageChannelSerial: null,\r\n decodeFailureRecoveryInProgress: null,\r\n };\r\n /* Only differences between this and the public event emitter is that this emits an\r\n * update event for all ATTACHEDs, whether resumed or not */\r\n this._allChannelChanges = new EventEmitter(this.logger);\r\n\r\n if (client.options.plugins?.Push) {\r\n this._push = new client.options.plugins.Push.PushChannel(this);\r\n }\r\n\r\n if (client.options.plugins?.Objects) {\r\n this._objects = new client.options.plugins.Objects.Objects(this);\r\n }\r\n }\r\n\r\n get push() {\r\n if (!this._push) {\r\n Utils.throwMissingPluginError('Push');\r\n }\r\n return this._push;\r\n }\r\n\r\n /** @spec RTL27 */\r\n get objects() {\r\n if (!this._objects) {\r\n Utils.throwMissingPluginError('Objects'); // RTL27b\r\n }\r\n return this._objects; // RTL27a\r\n }\r\n\r\n invalidStateError(): ErrorInfo {\r\n return new ErrorInfo(\r\n 'Channel operation failed as channel state is ' + this.state,\r\n 90001,\r\n 400,\r\n this.errorReason || undefined,\r\n );\r\n }\r\n\r\n static processListenerArgs(args: unknown[]): any[] {\r\n /* [event], listener */\r\n args = Array.prototype.slice.call(args);\r\n if (typeof args[0] === 'function') {\r\n args.unshift(null);\r\n }\r\n return args;\r\n }\r\n\r\n async setOptions(options?: API.ChannelOptions): Promise<void> {\r\n const previousChannelOptions = this.channelOptions;\r\n const err = validateChannelOptions(options);\r\n if (err) {\r\n throw err;\r\n }\r\n this.channelOptions = normaliseChannelOptions(this.client._Crypto ?? null, this.logger, options);\r\n if (this._decodingContext) this._decodingContext.channelOptions = this.channelOptions;\r\n if (this._shouldReattachToSetOptions(options, previousChannelOptions)) {\r\n /* This does not just do _attach(true, null, callback) because that would put us\r\n * into the 'attaching' state until we receive the new attached, which is\r\n * conceptually incorrect: we are still attached, we just have a pending request to\r\n * change some channel params. Per RTL17 going into the attaching state would mean\r\n * rejecting messages until we have confirmation that the options have changed,\r\n * which would unnecessarily lose message continuity. */\r\n this.attachImpl();\r\n return new Promise((resolve, reject) => {\r\n // Ignore 'attaching' -- could be just due to to a resume & reattach, should not\r\n // call back setOptions until we're definitely attached with the new options (or\r\n // else in a terminal state)\r\n this._allChannelChanges.once(\r\n ['attached', 'update', 'detached', 'failed'],\r\n function (this: { event: string }, stateChange: ConnectionStateChange) {\r\n switch (this.event) {\r\n case 'update':\r\n case 'attached':\r\n resolve();\r\n break;\r\n default:\r\n reject(stateChange.reason);\r\n }\r\n },\r\n );\r\n });\r\n }\r\n }\r\n\r\n _shouldReattachToSetOptions(options: API.ChannelOptions | undefined, prevOptions: API.ChannelOptions) {\r\n if (!(this.state === 'attached' || this.state === 'attaching')) {\r\n return false;\r\n }\r\n if (options?.params) {\r\n // Don't check against the `agent` param - it isn't returned in the ATTACHED message\r\n const requestedParams = omitAgent(options.params);\r\n const existingParams = omitAgent(prevOptions.params);\r\n\r\n if (Object.keys(requestedParams).length !== Object.keys(existingParams).length) {\r\n return true;\r\n }\r\n\r\n if (!Utils.shallowEquals(existingParams, requestedParams)) {\r\n return true;\r\n }\r\n }\r\n if (options?.modes) {\r\n if (!prevOptions.modes || !Utils.arrEquals(options.modes, prevOptions.modes)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n async publish(...args: any[]): Promise<void> {\r\n let messages: Message[];\r\n let argCount = args.length;\r\n\r\n if (argCount == 1) {\r\n if (Utils.isObject(args[0])) {\r\n messages = [Message.fromValues(args[0])];\r\n } else if (Array.isArray(args[0])) {\r\n messages = Message.fromValuesArray(args[0]);\r\n } else {\r\n throw new ErrorInfo(\r\n 'The single-argument form of publish() expects a message object or an array of message objects',\r\n 40013,\r\n 400,\r\n );\r\n }\r\n } else {\r\n messages = [Message.fromValues({ name: args[0], data: args[1] })];\r\n }\r\n const maxMessageSize = this.client.options.maxMessageSize;\r\n // TODO get rid of CipherOptions type assertion, indicates channeloptions types are broken\r\n const wireMessages = await encodeMessagesArray(messages, this.channelOptions as CipherOptions);\r\n /* RSL1i */\r\n const size = getMessagesSize(wireMessages);\r\n if (size > maxMessageSize) {\r\n throw new ErrorInfo(\r\n `Maximum size of messages that can be published at once exceeded (was ${size} bytes; limit is ${maxMessageSize} bytes)`,\r\n 40009,\r\n 400,\r\n );\r\n }\r\n\r\n this.throwIfUnpublishableState();\r\n\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'RealtimeChannel.publish()',\r\n 'sending message; channel state is ' + this.state + ', message count = ' + wireMessages.length,\r\n );\r\n\r\n const pm = protocolMessageFromValues({ action: actions.MESSAGE, channel: this.name, messages: wireMessages });\r\n return this.sendMessage(pm);\r\n }\r\n\r\n throwIfUnpublishableState(): void {\r\n if (!this.connectionManager.activeState()) {\r\n throw this.connectionManager.getError();\r\n }\r\n if (this.state === 'failed' || this.state === 'suspended') {\r\n throw this.invalidStateError();\r\n }\r\n }\r\n\r\n onEvent(messages: Array<any>): void {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.onEvent()', 'received message');\r\n const subscriptions = this.subscriptions;\r\n for (let i = 0; i < messages.length; i++) {\r\n const message = messages[i];\r\n subscriptions.emit(message.name, message);\r\n }\r\n }\r\n\r\n async attach(): Promise<ChannelStateChange | null> {\r\n if (this.state === 'attached') {\r\n return null;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n this._attach(false, null, (err, result) => (err ? reject(err) : resolve(result!)));\r\n });\r\n }\r\n\r\n _attach(\r\n forceReattach: boolean,\r\n attachReason: ErrorInfo | null,\r\n callback?: StandardCallback<ChannelStateChange>,\r\n ): void {\r\n if (!callback) {\r\n callback = (err?: ErrorInfo | null) => {\r\n if (err) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_ERROR,\r\n 'RealtimeChannel._attach()',\r\n 'Channel attach failed: ' + err.toString(),\r\n );\r\n }\r\n };\r\n }\r\n\r\n const connectionManager = this.connectionManager;\r\n if (!connectionManager.activeState()) {\r\n callback(connectionManager.getError());\r\n return;\r\n }\r\n\r\n if (this.state !== 'attaching' || forceReattach) {\r\n this.requestState('attaching', attachReason);\r\n }\r\n\r\n this.once(function (this: { event: string }, stateChange: ChannelStateChange) {\r\n switch (this.event) {\r\n case 'attached':\r\n callback?.(null, stateChange);\r\n break;\r\n case 'detached':\r\n case 'suspended':\r\n case 'failed':\r\n callback?.(\r\n stateChange.reason ||\r\n connectionManager.getError() ||\r\n new ErrorInfo('Unable to attach; reason unknown; state = ' + this.event, 90000, 500),\r\n );\r\n break;\r\n case 'detaching':\r\n callback?.(new ErrorInfo('Attach request superseded by a subsequent detach request', 90000, 409));\r\n break;\r\n }\r\n });\r\n }\r\n\r\n attachImpl(): void {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.attachImpl()', 'sending ATTACH message');\r\n const attachMsg = protocolMessageFromValues({\r\n action: actions.ATTACH,\r\n channel: this.name,\r\n params: this.channelOptions.params,\r\n // RTL4c1: Includes the channel serial to resume from a previous message\r\n // or attachment.\r\n channelSerial: this.properties.channelSerial,\r\n });\r\n if (this.channelOptions.modes) {\r\n attachMsg.encodeModesToFlags(Utils.allToUpperCase(this.channelOptions.modes) as API.ChannelMode[]);\r\n }\r\n if (this._attachResume) {\r\n attachMsg.setFlag('ATTACH_RESUME');\r\n }\r\n if (this._lastPayload.decodeFailureRecoveryInProgress) {\r\n attachMsg.channelSerial = this._lastPayload.protocolMessageChannelSerial;\r\n }\r\n this.sendMessage(attachMsg).catch(noop);\r\n }\r\n\r\n async detach(): Promise<void> {\r\n const connectionManager = this.connectionManager;\r\n if (!connectionManager.activeState()) {\r\n throw connectionManager.getError();\r\n }\r\n switch (this.state) {\r\n case 'suspended':\r\n this.notifyState('detached');\r\n return;\r\n case 'detached':\r\n return;\r\n case 'failed':\r\n throw new ErrorInfo('Unable to detach; channel state = failed', 90001, 400);\r\n default:\r\n this.requestState('detaching');\r\n // eslint-disable-next-line no-fallthrough\r\n case 'detaching':\r\n return new Promise((resolve, reject) => {\r\n this.once(function (this: { event: string }, stateChange: ChannelStateChange) {\r\n switch (this.event) {\r\n case 'detached':\r\n resolve();\r\n break;\r\n case 'attached':\r\n case 'suspended':\r\n case 'failed':\r\n reject(\r\n stateChange.reason ||\r\n connectionManager.getError() ||\r\n new ErrorInfo('Unable to detach; reason unknown; state = ' + this.event, 90000, 500),\r\n );\r\n break;\r\n case 'attaching':\r\n reject(new ErrorInfo('Detach request superseded by a subsequent attach request', 90000, 409));\r\n break;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n detachImpl(): void {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.detach()', 'sending DETACH message');\r\n const msg = protocolMessageFromValues({ action: actions.DETACH, channel: this.name });\r\n this.sendMessage(msg).catch(noop);\r\n }\r\n\r\n async subscribe(...args: unknown[] /* [event], listener */): Promise<ChannelStateChange | null> {\r\n const [event, listener] = RealtimeChannel.processListenerArgs(args);\r\n\r\n if (this.state === 'failed') {\r\n throw ErrorInfo.fromValues(this.invalidStateError());\r\n }\r\n\r\n // Filtered\r\n if (event && typeof event === 'object' && !Array.isArray(event)) {\r\n this.client._FilteredSubscriptions.subscribeFilter(this, event, listener);\r\n } else {\r\n this.subscriptions.on(event, listener);\r\n }\r\n\r\n // (RTL7g)\r\n if (this.channelOptions.attachOnSubscribe !== false) {\r\n return this.attach();\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n unsubscribe(...args: unknown[] /* [event], listener */): void {\r\n const [event, listener] = RealtimeChannel.processListenerArgs(args);\r\n\r\n // If we either have a filtered listener, a filter or both we need to do additional processing to find the original function(s)\r\n if ((typeof event === 'object' && !listener) || this.filteredSubscriptions?.has(listener)) {\r\n this.client._FilteredSubscriptions\r\n .getAndDeleteFilteredSubscriptions(this, event, listener)\r\n .forEach((l) => this.subscriptions.off(l));\r\n return;\r\n }\r\n\r\n this.subscriptions.off(event, listener);\r\n }\r\n\r\n sync(): void {\r\n /* check preconditions */\r\n switch (this.state) {\r\n case 'initialized':\r\n case 'detaching':\r\n case 'detached':\r\n throw new PartialErrorInfo('Unable to sync to channel; not attached', 40000);\r\n default:\r\n }\r\n const connectionManager = this.connectionManager;\r\n if (!connectionManager.activeState()) {\r\n throw connectionManager.getError();\r\n }\r\n\r\n /* send sync request */\r\n const syncMessage = protocolMessageFromValues({ action: actions.SYNC, channel: this.name });\r\n if (this.syncChannelSerial) {\r\n syncMessage.channelSerial = this.syncChannelSerial;\r\n }\r\n connectionManager.send(syncMessage);\r\n }\r\n\r\n async sendMessage(msg: ProtocolMessage): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n this.connectionManager.send(msg, this.client.options.queueMessages, (err) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n resolve();\r\n }\r\n });\r\n });\r\n }\r\n\r\n async sendPresence(presence: WirePresenceMessage[]): Promise<void> {\r\n const msg = protocolMessageFromValues({\r\n action: actions.PRESENCE,\r\n channel: this.name,\r\n presence: presence,\r\n });\r\n return this.sendMessage(msg);\r\n }\r\n\r\n sendState(objectMessages: ObjectMessage[]): Promise<void> {\r\n const msg = protocolMessageFromValues({\r\n action: actions.OBJECT,\r\n channel: this.name,\r\n state: objectMessages,\r\n });\r\n return this.sendMessage(msg);\r\n }\r\n\r\n // Access to this method is synchronised by ConnectionManager#processChannelMessage, in order to synchronise access to the state stored in _decodingContext.\r\n async processMessage(message: ProtocolMessage): Promise<void> {\r\n if (\r\n message.action === actions.ATTACHED ||\r\n message.action === actions.MESSAGE ||\r\n message.action === actions.PRESENCE ||\r\n message.action === actions.OBJECT ||\r\n message.action === actions.ANNOTATION\r\n ) {\r\n // RTL15b\r\n this.setChannelSerial(message.channelSerial);\r\n }\r\n\r\n let syncChannelSerial,\r\n isSync = false;\r\n switch (message.action) {\r\n case actions.ATTACHED: {\r\n this.properties.attachSerial = message.channelSerial;\r\n this._mode = message.getMode();\r\n this.params = (message as any).params || {};\r\n const modesFromFlags = message.decodeModesFromFlags();\r\n this.modes = (modesFromFlags && (Utils.allToLowerCase(modesFromFlags) as API.ChannelMode[])) || undefined;\r\n const resumed = message.hasFlag('RESUMED');\r\n const hasPresence = message.hasFlag('HAS_PRESENCE');\r\n const hasBacklog = message.hasFlag('HAS_BACKLOG');\r\n const hasObjects = message.hasFlag('HAS_OBJECTS');\r\n if (this.state === 'attached') {\r\n if (!resumed) {\r\n // we have lost continuity.\r\n // the presence set needs to be re-synced\r\n if (this._presence) {\r\n this._presence.onAttached(hasPresence);\r\n }\r\n // the Objects tree needs to be re-synced\r\n if (this._objects) {\r\n this._objects.onAttached(hasObjects);\r\n }\r\n }\r\n const change = new ChannelStateChange(this.state, this.state, resumed, hasBacklog, message.error);\r\n this._allChannelChanges.emit('update', change);\r\n if (!resumed || this.channelOptions.updateOnAttached) {\r\n this.emit('update', change);\r\n }\r\n } else if (this.state === 'detaching') {\r\n /* RTL5i: re-send DETACH and remain in the 'detaching' state */\r\n this.checkPendingState();\r\n } else {\r\n this.notifyState('attached', message.error, resumed, hasPresence, hasBacklog, hasObjects);\r\n }\r\n break;\r\n }\r\n\r\n case actions.DETACHED: {\r\n const detachErr = message.error\r\n ? ErrorInfo.fromValues(message.error)\r\n : new ErrorInfo('Channel detached', 90001, 404);\r\n if (this.state === 'detaching') {\r\n this.notifyState('detached', detachErr);\r\n } else if (this.state === 'attaching') {\r\n /* Only retry immediately if we were previously attached. If we were\r\n * attaching, go into suspended, fail messages, and wait a few seconds\r\n * before retrying */\r\n this.notifyState('suspended', detachErr);\r\n } else if (this.state === 'attached' || this.state === 'suspended') {\r\n // RTL13a\r\n this.requestState('attaching', detachErr);\r\n }\r\n // else no action (detached in initialized, detached, or failed state is a noop)\r\n break;\r\n }\r\n\r\n case actions.SYNC:\r\n /* syncs can have channelSerials, but might not if the sync is one page long */\r\n isSync = true;\r\n syncChannelSerial = this.syncChannelSerial = message.channelSerial;\r\n /* syncs can happen on channels with no presence data as part of connection\r\n * resuming, in which case protocol message has no presence property */\r\n if (!message.presence) break;\r\n // eslint-disable-next-line no-fallthrough\r\n case actions.PRESENCE: {\r\n if (!message.presence) {\r\n break;\r\n }\r\n\r\n populateFieldsFromParent(message);\r\n const options = this.channelOptions;\r\n if (this._presence) {\r\n const presenceMessages = await Promise.all(\r\n message.presence.map((wpm) => {\r\n return wpm.decode(options, this.logger);\r\n }),\r\n );\r\n\r\n this._presence.setPresence(presenceMessages, isSync, syncChannelSerial as any);\r\n }\r\n break;\r\n }\r\n\r\n // RTL1\r\n // OBJECT and OBJECT_SYNC message processing share most of the logic, so group them together\r\n case actions.OBJECT:\r\n case actions.OBJECT_SYNC: {\r\n if (!this._objects || !message.state) {\r\n return;\r\n }\r\n\r\n populateFieldsFromParent(message);\r\n const objectMessages = message.state;\r\n // need to use the active protocol format instead of just client's useBinaryProtocol option,\r\n // as comet transport does not support msgpack and will default to json without changing useBinaryProtocol.\r\n // message processing is done in the same event loop tick up until this point,\r\n // so we can reliably expect an active protocol to exist and be the one that received the object message.\r\n const format = this.client.connection.connectionManager.getActiveTransportFormat()!;\r\n await Promise.all(\r\n objectMessages.map((om) =>\r\n this.client._objectsPlugin!.ObjectMessage.decode(om, this.client, this.logger, Logger, Utils, format),\r\n ),\r\n );\r\n\r\n if (message.action === actions.OBJECT) {\r\n this._objects.handleObjectMessages(objectMessages);\r\n } else {\r\n this._objects.handleObjectSyncMessages(objectMessages, message.channelSerial);\r\n }\r\n\r\n break;\r\n }\r\n\r\n case actions.MESSAGE: {\r\n //RTL17\r\n if (this.state !== 'attached') {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MAJOR,\r\n 'RealtimeChannel.processMessage()',\r\n 'Message \"' +\r\n message.id +\r\n '\" skipped as this channel \"' +\r\n this.name +\r\n '\" state is not \"attached\" (state is \"' +\r\n this.state +\r\n '\").',\r\n );\r\n return;\r\n }\r\n\r\n populateFieldsFromParent(message);\r\n\r\n const encoded = message.messages!,\r\n firstMessage = encoded[0],\r\n lastMessage = encoded[encoded.length - 1];\r\n\r\n if (\r\n firstMessage.extras &&\r\n firstMessage.extras.delta &&\r\n firstMessage.extras.delta.from !== this._lastPayload.messageId\r\n ) {\r\n const msg =\r\n 'Delta message decode failure - previous message not available for message \"' +\r\n message.id +\r\n '\" on this channel \"' +\r\n this.name +\r\n '\".';\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'RealtimeChannel.processMessage()', msg);\r\n this._startDecodeFailureRecovery(new ErrorInfo(msg, 40018, 400));\r\n break;\r\n }\r\n\r\n let messages: Message[] = [];\r\n for (let i = 0; i < encoded.length; i++) {\r\n const { decoded, err } = await encoded[i].decodeWithErr(this._decodingContext, this.logger);\r\n messages[i] = decoded;\r\n\r\n if (err) {\r\n switch (err.code) {\r\n case 40018:\r\n /* decode failure */\r\n this._startDecodeFailureRecovery(err);\r\n return;\r\n\r\n case 40019: /* No vcdiff plugin passed in - no point recovering, give up */\r\n case 40021:\r\n /* Browser does not support deltas, similarly no point recovering */\r\n this.notifyState('failed', err);\r\n return;\r\n\r\n default:\r\n // do nothing, continue decoding\r\n }\r\n }\r\n }\r\n\r\n this._lastPayload.messageId = lastMessage.id;\r\n this._lastPayload.protocolMessageChannelSerial = message.channelSerial;\r\n this.onEvent(messages);\r\n break;\r\n }\r\n\r\n case actions.ANNOTATION: {\r\n populateFieldsFromParent(message);\r\n const options = this.channelOptions;\r\n if (this._annotations) {\r\n const annotations = await Promise.all(\r\n (message.annotations || []).map((wpm) => {\r\n return wpm.decode(options, this.logger);\r\n }),\r\n );\r\n\r\n this._annotations._processIncoming(annotations);\r\n }\r\n break;\r\n }\r\n\r\n case actions.ERROR: {\r\n /* there was a channel-specific error */\r\n const err = message.error as ErrorInfo;\r\n if (err && err.code == 80016) {\r\n /* attach/detach operation attempted on superseded transport handle */\r\n this.checkPendingState();\r\n } else {\r\n this.notifyState('failed', ErrorInfo.fromValues(err));\r\n }\r\n break;\r\n }\r\n\r\n default:\r\n // RSF1, should handle unrecognized message actions gracefully and don't abort the realtime connection to ensure forward compatibility\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MAJOR,\r\n 'RealtimeChannel.processMessage()',\r\n 'Protocol error: unrecognised message action (' + message.action + ')',\r\n );\r\n }\r\n }\r\n\r\n _startDecodeFailureRecovery(reason: ErrorInfo): void {\r\n if (!this._lastPayload.decodeFailureRecoveryInProgress) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MAJOR,\r\n 'RealtimeChannel.processMessage()',\r\n 'Starting decode failure recovery process.',\r\n );\r\n this._lastPayload.decodeFailureRecoveryInProgress = true;\r\n this._attach(true, reason, () => {\r\n this._lastPayload.decodeFailureRecoveryInProgress = false;\r\n });\r\n }\r\n }\r\n\r\n onAttached(): void {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'RealtimeChannel.onAttached',\r\n 'activating channel; name = ' + this.name,\r\n );\r\n }\r\n\r\n notifyState(\r\n state: API.ChannelState,\r\n reason?: ErrorInfo | null,\r\n resumed?: boolean,\r\n hasPresence?: boolean,\r\n hasBacklog?: boolean,\r\n hasObjects?: boolean,\r\n ): void {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'RealtimeChannel.notifyState',\r\n 'name = ' + this.name + ', current state = ' + this.state + ', notifying state ' + state,\r\n );\r\n this.clearStateTimer();\r\n\r\n // RTP5a1\r\n if (['detached', 'suspended', 'failed'].includes(state)) {\r\n this.properties.channelSerial = null;\r\n }\r\n\r\n if (state === this.state) {\r\n return;\r\n }\r\n if (this._presence) {\r\n this._presence.actOnChannelState(state, hasPresence, reason);\r\n }\r\n if (this._objects) {\r\n this._objects.actOnChannelState(state, hasObjects);\r\n }\r\n if (state === 'suspended' && this.connectionManager.state.sendEvents) {\r\n this.startRetryTimer();\r\n } else {\r\n this.cancelRetryTimer();\r\n }\r\n if (reason) {\r\n this.errorReason = reason;\r\n }\r\n const change = new ChannelStateChange(this.state, state, resumed, hasBacklog, reason);\r\n const action = 'Channel state for channel \"' + this.name + '\"';\r\n const message = state + (reason ? '; reason: ' + reason : '');\r\n if (state === 'failed') {\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, action, message);\r\n } else {\r\n Logger.logAction(this.logger, Logger.LOG_MAJOR, action, message);\r\n }\r\n\r\n if (state !== 'attaching' && state !== 'suspended') {\r\n this.retryCount = 0;\r\n }\r\n\r\n /* Note: we don't set inProgress for pending states until the request is actually in progress */\r\n if (state === 'attached') {\r\n this.onAttached();\r\n }\r\n\r\n if (state === 'attached') {\r\n this._attachResume = true;\r\n } else if (state === 'detaching' || state === 'failed') {\r\n this._attachResume = false;\r\n }\r\n\r\n this.state = state;\r\n this._allChannelChanges.emit(state, change);\r\n this.emit(state, change);\r\n }\r\n\r\n requestState(state: API.ChannelState, reason?: ErrorInfo | null): void {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'RealtimeChannel.requestState',\r\n 'name = ' + this.name + ', state = ' + state,\r\n );\r\n this.notifyState(state, reason);\r\n /* send the event and await response */\r\n this.checkPendingState();\r\n }\r\n\r\n checkPendingState(): void {\r\n /* if can't send events, do nothing */\r\n const cmState = this.connectionManager.state;\r\n if (!cmState.sendEvents) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'RealtimeChannel.checkPendingState',\r\n 'sendEvents is false; state is ' + this.connectionManager.state.state,\r\n );\r\n return;\r\n }\r\n\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'RealtimeChannel.checkPendingState',\r\n 'name = ' + this.name + ', state = ' + this.state,\r\n );\r\n /* Only start the state timer running when actually sending the event */\r\n switch (this.state) {\r\n case 'attaching':\r\n this.startStateTimerIfNotRunning();\r\n this.attachImpl();\r\n break;\r\n case 'detaching':\r\n this.startStateTimerIfNotRunning();\r\n this.detachImpl();\r\n break;\r\n case 'attached':\r\n /* resume any sync operation that was in progress */\r\n this.sync();\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n timeoutPendingState(): void {\r\n switch (this.state) {\r\n case 'attaching': {\r\n const err = new ErrorInfo('Channel attach timed out', 90007, 408);\r\n this.notifyState('suspended', err);\r\n break;\r\n }\r\n case 'detaching': {\r\n const err = new ErrorInfo('Channel detach timed out', 90007, 408);\r\n this.notifyState('attached', err);\r\n break;\r\n }\r\n default:\r\n this.checkPendingState();\r\n break;\r\n }\r\n }\r\n\r\n startStateTimerIfNotRunning(): void {\r\n if (!this.stateTimer) {\r\n this.stateTimer = setTimeout(() => {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'RealtimeChannel.startStateTimerIfNotRunning', 'timer expired');\r\n this.stateTimer = null;\r\n this.timeoutPendingState();\r\n }, this.client.options.timeouts.realtimeRequestTimeout);\r\n }\r\n }\r\n\r\n clearStateTimer(): void {\r\n const stateTimer = this.stateTimer;\r\n if (stateTimer) {\r\n clearTimeout(stateTimer);\r\n this.stateTimer = null;\r\n }\r\n }\r\n\r\n startRetryTimer(): void {\r\n if (this.retryTimer) return;\r\n\r\n this.retryCount++;\r\n const retryDelay = Utils.getRetryTime(this.client.options.timeouts.channelRetryTimeout, this.retryCount);\r\n\r\n this.retryTimer = setTimeout(() => {\r\n /* If connection is not connected, just leave in suspended, a reattach\r\n * will be triggered once it connects again */\r\n if (this.state === 'suspended' && this.connectionManager.state.sendEvents) {\r\n this.retryTimer = null;\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'RealtimeChannel retry timer expired',\r\n 'attempting a new attach',\r\n );\r\n this.requestState('attaching');\r\n }\r\n }, retryDelay);\r\n }\r\n\r\n cancelRetryTimer(): void {\r\n if (this.retryTimer) {\r\n clearTimeout(this.retryTimer as NodeJS.Timeout);\r\n this.retryTimer = null;\r\n }\r\n }\r\n\r\n history = async function (\r\n this: RealtimeChannel,\r\n params: RealtimeHistoryParams | null,\r\n ): Promise<PaginatedResult<Message>> {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.history()', 'channel = ' + this.name);\r\n\r\n // We fetch this first so that any plugin-not-provided error takes priority over other errors\r\n const restMixin = this.client.rest.channelMixin;\r\n\r\n if (params && params.untilAttach) {\r\n if (this.state !== 'attached') {\r\n throw new ErrorInfo('option untilAttach requires the channel to be attached', 40000, 400);\r\n }\r\n if (!this.properties.attachSerial) {\r\n throw new ErrorInfo(\r\n 'untilAttach was specified and channel is attached, but attachSerial is not defined',\r\n 40000,\r\n 400,\r\n );\r\n }\r\n delete params.untilAttach;\r\n params.from_serial = this.properties.attachSerial;\r\n }\r\n\r\n return restMixin.history(this, params);\r\n } as any;\r\n\r\n whenState = ((state: string) => {\r\n return EventEmitter.prototype.whenState.call(this, state, this.state);\r\n }) as any;\r\n\r\n /* @returns null (if can safely be released) | ErrorInfo (if cannot) */\r\n getReleaseErr(): ErrorInfo | null {\r\n const s = this.state;\r\n if (s === 'initialized' || s === 'detached' || s === 'failed') {\r\n return null;\r\n }\r\n return new ErrorInfo(\r\n 'Can only release a channel in a state where there is no possibility of further updates from the server being received (initialized, detached, or failed); was ' +\r\n s,\r\n 90001,\r\n 400,\r\n );\r\n }\r\n\r\n setChannelSerial(channelSerial?: string | null): void {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'RealtimeChannel.setChannelSerial()',\r\n 'Updating channel serial; serial = ' + channelSerial + '; previous = ' + this.properties.channelSerial,\r\n );\r\n\r\n // RTP17h: Only update the channel serial if its present (it won't always\r\n // be set).\r\n if (channelSerial) {\r\n this.properties.channelSerial = channelSerial;\r\n }\r\n }\r\n\r\n async status(): Promise<API.ChannelDetails> {\r\n return this.client.rest.channelMixin.status(this);\r\n }\r\n}\r\n\r\nfunction omitAgent(channelParams?: API.ChannelParams) {\r\n const { agent: _, ...paramsWithoutAgent } = channelParams || {};\r\n return paramsWithoutAgent;\r\n}\r\n\r\nexport default RealtimeChannel;\r\n", "import EventEmitter from '../util/eventemitter';\nimport Logger from '../util/logger';\nimport Annotation from '../types/annotation';\nimport { actions, flags } from '../types/protocolmessagecommon';\nimport { fromValues as protocolMessageFromValues } from '../types/protocolmessage';\nimport ErrorInfo from '../types/errorinfo';\nimport RealtimeChannel from './realtimechannel';\nimport RestAnnotations, { RestGetAnnotationsParams, constructValidateAnnotation } from './restannotations';\nimport type { PaginatedResult } from './paginatedresource';\nimport type Message from '../types/message';\nimport type { Properties } from '../util/utils';\n\nclass RealtimeAnnotations {\n private channel: RealtimeChannel;\n private logger: Logger;\n private subscriptions: EventEmitter;\n\n constructor(channel: RealtimeChannel) {\n this.channel = channel;\n this.logger = channel.logger;\n this.subscriptions = new EventEmitter(this.logger);\n }\n\n async publish(msgOrSerial: string | Message, annotationValues: Partial<Properties<Annotation>>): Promise<void> {\n const channelName = this.channel.name;\n const annotation = constructValidateAnnotation(msgOrSerial, annotationValues);\n const wireAnnotation = await annotation.encode();\n\n this.channel.throwIfUnpublishableState();\n\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'RealtimeAnnotations.publish()',\n 'channelName = ' +\n channelName +\n ', sending annotation with messageSerial = ' +\n annotation.messageSerial +\n ', type = ' +\n annotation.type,\n );\n\n const pm = protocolMessageFromValues({\n action: actions.ANNOTATION,\n channel: channelName,\n annotations: [wireAnnotation],\n });\n return this.channel.sendMessage(pm);\n }\n\n async delete(msgOrSerial: string | Message, annotationValues: Partial<Properties<Annotation>>): Promise<void> {\n annotationValues.action = 'annotation.delete';\n return this.publish(msgOrSerial, annotationValues);\n }\n\n async subscribe(..._args: unknown[] /* [type], listener */): Promise<void> {\n const args = RealtimeChannel.processListenerArgs(_args);\n const event = args[0];\n const listener = args[1];\n const channel = this.channel;\n\n if (channel.state === 'failed') {\n throw ErrorInfo.fromValues(channel.invalidStateError());\n }\n\n this.subscriptions.on(event, listener);\n\n if (this.channel.channelOptions.attachOnSubscribe !== false) {\n await channel.attach();\n }\n\n // explicit check for attach state in caes attachOnSubscribe=false\n if ((this.channel.state === 'attached' && this.channel._mode & flags.ANNOTATION_SUBSCRIBE) === 0) {\n throw new ErrorInfo(\n \"You are trying to add an annotation listener, but you haven't requested the annotation_subscribe channel mode in ChannelOptions, so this won't do anything (we only deliver annotations to clients who have explicitly requested them)\",\n 93001,\n 400,\n );\n }\n }\n\n unsubscribe(..._args: unknown[] /* [event], listener */): void {\n const args = RealtimeChannel.processListenerArgs(_args);\n const event = args[0];\n const listener = args[1];\n this.subscriptions.off(event, listener);\n }\n\n _processIncoming(annotations: Annotation[]): void {\n for (const annotation of annotations) {\n this.subscriptions.emit(annotation.type || '', annotation);\n }\n }\n\n async get(\n msgOrSerial: string | Message,\n params: RestGetAnnotationsParams | null,\n ): Promise<PaginatedResult<Annotation>> {\n return RestAnnotations.prototype.get.call(this, msgOrSerial, params);\n }\n}\n\nexport default RealtimeAnnotations;\n", "import { BaseRest } from './baserest';\nimport ClientOptions from '../../types/ClientOptions';\nimport { allCommonModularPlugins } from './modularplugins';\nimport Platform from 'common/platform';\nimport { DefaultMessage } from '../types/defaultmessage';\nimport { MsgPack } from 'common/types/msgpack';\nimport { DefaultPresenceMessage } from '../types/defaultpresencemessage';\nimport { DefaultAnnotation } from '../types/defaultannotation';\nimport { Http } from 'common/types/http';\nimport RealtimeAnnotations from './realtimeannotations';\nimport RestAnnotations from './restannotations';\nimport Annotation, { WireAnnotation } from '../types/annotation';\nimport Defaults from '../util/defaults';\nimport Logger from '../util/logger';\n\n/**\n `DefaultRest` is the class that the non tree-shakable version of the SDK exports as `Rest`. It ensures that this version of the SDK includes all of the functionality which is optionally available in the tree-shakable version.\n */\nexport class DefaultRest extends BaseRest {\n // The public typings declare that this requires an argument to be passed, but since we want to emit a good error message in the case where a non-TypeScript user does not pass an argument, tell the compiler that this is possible so that it forces us to handle it.\n constructor(options?: ClientOptions | string) {\n const MsgPack = DefaultRest._MsgPack;\n if (!MsgPack) {\n throw new Error('Expected DefaultRest._MsgPack to have been set');\n }\n\n super(\n Defaults.objectifyOptions(options, true, 'Rest', Logger.defaultLogger, {\n ...allCommonModularPlugins,\n Crypto: DefaultRest.Crypto ?? undefined,\n MsgPack: DefaultRest._MsgPack ?? undefined,\n Annotations: {\n Annotation,\n WireAnnotation,\n RealtimeAnnotations,\n RestAnnotations,\n },\n }),\n );\n }\n\n private static _Crypto: typeof Platform.Crypto = null;\n static get Crypto() {\n if (this._Crypto === null) {\n throw new Error('Encryption not enabled; use ably.encryption.js instead');\n }\n\n return this._Crypto;\n }\n static set Crypto(newValue: typeof Platform.Crypto) {\n this._Crypto = newValue;\n }\n\n static Message = DefaultMessage;\n static PresenceMessage = DefaultPresenceMessage;\n static Annotation = DefaultAnnotation;\n\n static _MsgPack: MsgPack | null = null;\n\n // Used by tests\n static _Http = Http;\n}\n", "import ErrorInfo from '../types/errorinfo';\nimport EventEmitter from '../util/eventemitter';\nimport Logger from '../util/logger';\nimport { PendingMessage } from './protocol';\n\nclass MessageQueue extends EventEmitter {\n messages: Array<PendingMessage>;\n\n constructor(logger: Logger) {\n super(logger);\n this.messages = [];\n }\n\n count(): number {\n return this.messages.length;\n }\n\n push(message: PendingMessage): void {\n this.messages.push(message);\n }\n\n shift(): PendingMessage | undefined {\n return this.messages.shift();\n }\n\n last(): PendingMessage {\n return this.messages[this.messages.length - 1];\n }\n\n copyAll(): PendingMessage[] {\n return this.messages.slice();\n }\n\n append(messages: Array<PendingMessage>): void {\n this.messages.push.apply(this.messages, messages);\n }\n\n prepend(messages: Array<PendingMessage>): void {\n this.messages.unshift.apply(this.messages, messages);\n }\n\n completeMessages(serial: number, count: number, err?: ErrorInfo | null): void {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'MessageQueue.completeMessages()',\n 'serial = ' + serial + '; count = ' + count,\n );\n err = err || null;\n const messages = this.messages;\n if (messages.length === 0) {\n throw new Error('MessageQueue.completeMessages(): completeMessages called on any empty MessageQueue');\n }\n const first = messages[0];\n if (first) {\n const startSerial = first.message.msgSerial as number;\n const endSerial = serial + count; /* the serial of the first message that is *not* the subject of this call */\n if (endSerial > startSerial) {\n const completeMessages = messages.splice(0, endSerial - startSerial);\n for (const message of completeMessages) {\n (message.callback as Function)(err);\n }\n }\n if (messages.length == 0) this.emit('idle');\n }\n }\n\n completeAllMessages(err: ErrorInfo): void {\n this.completeMessages(0, Number.MAX_SAFE_INTEGER || Number.MAX_VALUE, err);\n }\n\n resetSendAttempted(): void {\n for (let msg of this.messages) {\n msg.sendAttempted = false;\n }\n }\n\n clear(): void {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'MessageQueue.clear()',\n 'clearing ' + this.messages.length + ' messages',\n );\n this.messages = [];\n this.emit('idle');\n }\n}\n\nexport default MessageQueue;\n", "import { actions } from '../types/protocolmessagecommon';\r\nimport ProtocolMessage, { stringify as stringifyProtocolMessage } from '../types/protocolmessage';\r\nimport * as Utils from '../util/utils';\r\nimport EventEmitter from '../util/eventemitter';\r\nimport Logger from '../util/logger';\r\nimport MessageQueue from './messagequeue';\r\nimport ErrorInfo from '../types/errorinfo';\r\nimport Transport from './transport';\r\nimport { ErrCallback } from '../../types/utils';\r\n\r\nexport class PendingMessage {\r\n message: ProtocolMessage;\r\n callback?: ErrCallback;\r\n merged: boolean;\r\n sendAttempted: boolean;\r\n ackRequired: boolean;\r\n\r\n constructor(message: ProtocolMessage, callback?: ErrCallback) {\r\n this.message = message;\r\n this.callback = callback;\r\n this.merged = false;\r\n const action = message.action;\r\n this.sendAttempted = false;\r\n this.ackRequired =\r\n typeof action === 'number' &&\r\n [actions.MESSAGE, actions.PRESENCE, actions.ANNOTATION, actions.OBJECT].includes(action);\r\n }\r\n}\r\n\r\nclass Protocol extends EventEmitter {\r\n transport: Transport;\r\n messageQueue: MessageQueue;\r\n\r\n constructor(transport: Transport) {\r\n super(transport.logger);\r\n this.transport = transport;\r\n this.messageQueue = new MessageQueue(this.logger);\r\n transport.on('ack', (serial: number, count: number) => {\r\n this.onAck(serial, count);\r\n });\r\n transport.on('nack', (serial: number, count: number, err: ErrorInfo) => {\r\n this.onNack(serial, count, err);\r\n });\r\n }\r\n\r\n onAck(serial: number, count: number): void {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'Protocol.onAck()', 'serial = ' + serial + '; count = ' + count);\r\n this.messageQueue.completeMessages(serial, count);\r\n }\r\n\r\n onNack(serial: number, count: number, err: ErrorInfo): void {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_ERROR,\r\n 'Protocol.onNack()',\r\n 'serial = ' + serial + '; count = ' + count + '; err = ' + Utils.inspectError(err),\r\n );\r\n if (!err) {\r\n err = new ErrorInfo('Unable to send message; channel not responding', 50001, 500);\r\n }\r\n this.messageQueue.completeMessages(serial, count, err);\r\n }\r\n\r\n onceIdle(listener: ErrCallback): void {\r\n const messageQueue = this.messageQueue;\r\n if (messageQueue.count() === 0) {\r\n listener();\r\n return;\r\n }\r\n messageQueue.once('idle', listener);\r\n }\r\n\r\n send(pendingMessage: PendingMessage): void {\r\n if (pendingMessage.ackRequired) {\r\n this.messageQueue.push(pendingMessage);\r\n }\r\n if (this.logger.shouldLog(Logger.LOG_MICRO)) {\r\n Logger.logActionNoStrip(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'Protocol.send()',\r\n 'sending msg; ' +\r\n stringifyProtocolMessage(\r\n pendingMessage.message,\r\n this.transport.connectionManager.realtime._RealtimePresence,\r\n this.transport.connectionManager.realtime._Annotations,\r\n this.transport.connectionManager.realtime._objectsPlugin,\r\n ),\r\n );\r\n }\r\n pendingMessage.sendAttempted = true;\r\n this.transport.send(pendingMessage.message);\r\n }\r\n\r\n getTransport(): Transport {\r\n return this.transport;\r\n }\r\n\r\n getPendingMessages(): PendingMessage[] {\r\n return this.messageQueue.copyAll();\r\n }\r\n\r\n clearPendingMessages(): void {\r\n return this.messageQueue.clear();\r\n }\r\n\r\n finish(): void {\r\n const transport = this.transport;\r\n this.onceIdle(function () {\r\n transport.disconnect();\r\n });\r\n }\r\n}\r\n\r\nexport default Protocol;\r\n", "import { IPartialErrorInfo } from '../types/errorinfo';\n\nclass ConnectionStateChange {\n previous?: string;\n current?: string;\n retryIn?: number;\n reason?: IPartialErrorInfo;\n\n constructor(previous?: string, current?: string, retryIn?: number | null, reason?: IPartialErrorInfo) {\n this.previous = previous;\n this.current = current;\n if (retryIn) this.retryIn = retryIn;\n if (reason) this.reason = reason;\n }\n}\n\nexport default ConnectionStateChange;\n", "import ErrorInfo from '../types/errorinfo';\n\nconst ConnectionErrorCodes = {\n DISCONNECTED: 80003,\n SUSPENDED: 80002,\n FAILED: 80000,\n CLOSING: 80017,\n CLOSED: 80017,\n UNKNOWN_CONNECTION_ERR: 50002,\n UNKNOWN_CHANNEL_ERR: 50001,\n};\n\nconst ConnectionErrors = {\n disconnected: () =>\n ErrorInfo.fromValues({\n statusCode: 400,\n code: ConnectionErrorCodes.DISCONNECTED,\n message: 'Connection to server temporarily unavailable',\n }),\n suspended: () =>\n ErrorInfo.fromValues({\n statusCode: 400,\n code: ConnectionErrorCodes.SUSPENDED,\n message: 'Connection to server unavailable',\n }),\n failed: () =>\n ErrorInfo.fromValues({\n statusCode: 400,\n code: ConnectionErrorCodes.FAILED,\n message: 'Connection failed or disconnected by server',\n }),\n closing: () =>\n ErrorInfo.fromValues({\n statusCode: 400,\n code: ConnectionErrorCodes.CLOSING,\n message: 'Connection closing',\n }),\n closed: () =>\n ErrorInfo.fromValues({\n statusCode: 400,\n code: ConnectionErrorCodes.CLOSED,\n message: 'Connection closed',\n }),\n unknownConnectionErr: () =>\n ErrorInfo.fromValues({\n statusCode: 500,\n code: ConnectionErrorCodes.UNKNOWN_CONNECTION_ERR,\n message: 'Internal connection error',\n }),\n unknownChannelErr: () =>\n ErrorInfo.fromValues({\n statusCode: 500,\n code: ConnectionErrorCodes.UNKNOWN_CONNECTION_ERR,\n message: 'Internal channel error',\n }),\n};\n\nexport function isRetriable(err: ErrorInfo) {\n if (!err.statusCode || !err.code || err.statusCode >= 500) {\n return true;\n }\n return Object.values(ConnectionErrorCodes).includes(err.code);\n}\n\nexport default ConnectionErrors;\n", "import { actions } from '../types/protocolmessagecommon';\r\nimport ProtocolMessage, {\r\n fromValues as protocolMessageFromValues,\r\n stringify as stringifyProtocolMessage,\r\n} from '../types/protocolmessage';\r\nimport * as Utils from '../util/utils';\r\nimport EventEmitter from '../util/eventemitter';\r\nimport Logger from '../util/logger';\r\nimport ConnectionErrors from './connectionerrors';\r\nimport ErrorInfo from '../types/errorinfo';\r\nimport Auth from '../client/auth';\r\nimport * as API from '../../../../ably';\r\nimport ConnectionManager, { TransportParams } from './connectionmanager';\r\nimport Platform from 'common/platform';\r\nimport TransportName from 'common/constants/TransportName';\r\n\r\nexport type TryConnectCallback = (\r\n wrappedErr: { error: ErrorInfo; event: string } | null,\r\n transport?: Transport,\r\n) => void;\r\n\r\nexport interface TransportCtor {\r\n new (\r\n connectionManager: ConnectionManager,\r\n auth: Auth,\r\n params: TransportParams,\r\n forceJsonProtocol?: boolean,\r\n ): Transport;\r\n\r\n isAvailable(): boolean;\r\n}\r\n\r\nconst closeMessage = protocolMessageFromValues({ action: actions.CLOSE });\r\nconst disconnectMessage = protocolMessageFromValues({ action: actions.DISCONNECT });\r\n\r\n/*\r\n * Transport instances inherit from EventEmitter and emit the following events:\r\n *\r\n * event name data\r\n * closed error\r\n * failed error\r\n * disposed\r\n * connected null error, connectionSerial, connectionId, connectionDetails\r\n * event channel message object\r\n */\r\n\r\nabstract class Transport extends EventEmitter {\r\n connectionManager: ConnectionManager;\r\n auth: Auth;\r\n params: TransportParams;\r\n timeouts: Record<string, number>;\r\n format?: Utils.Format;\r\n isConnected: boolean;\r\n isFinished: boolean;\r\n isDisposed: boolean;\r\n maxIdleInterval: number | null;\r\n idleTimer: NodeJS.Timeout | number | null;\r\n lastActivity: number | null;\r\n\r\n constructor(connectionManager: ConnectionManager, auth: Auth, params: TransportParams, forceJsonProtocol?: boolean) {\r\n super(connectionManager.logger);\r\n if (forceJsonProtocol) {\r\n params.format = undefined;\r\n params.heartbeats = true;\r\n }\r\n this.connectionManager = connectionManager;\r\n this.auth = auth;\r\n this.params = params;\r\n this.timeouts = params.options.timeouts;\r\n this.format = params.format;\r\n this.isConnected = false;\r\n this.isFinished = false;\r\n this.isDisposed = false;\r\n this.maxIdleInterval = null;\r\n this.idleTimer = null;\r\n this.lastActivity = null;\r\n }\r\n\r\n abstract shortName: TransportName;\r\n abstract send(message: ProtocolMessage): void;\r\n\r\n connect(): void {}\r\n\r\n close(): void {\r\n if (this.isConnected) {\r\n this.requestClose();\r\n }\r\n this.finish('closed', ConnectionErrors.closed());\r\n }\r\n\r\n disconnect(err?: Error | ErrorInfo): void {\r\n /* Used for network/transport issues that need to result in the transport\r\n * being disconnected, but should not transition the connection to 'failed' */\r\n if (this.isConnected) {\r\n this.requestDisconnect();\r\n }\r\n this.finish('disconnected', err || ConnectionErrors.disconnected());\r\n }\r\n\r\n fail(err: ErrorInfo): void {\r\n /* Used for client-side-detected fatal connection issues */\r\n if (this.isConnected) {\r\n this.requestDisconnect();\r\n }\r\n this.finish('failed', err || ConnectionErrors.failed());\r\n }\r\n\r\n finish(event: string, err?: Error | ErrorInfo): void {\r\n if (this.isFinished) {\r\n return;\r\n }\r\n\r\n this.isFinished = true;\r\n this.isConnected = false;\r\n this.maxIdleInterval = null;\r\n clearTimeout(this.idleTimer ?? undefined);\r\n this.idleTimer = null;\r\n this.emit(event, err);\r\n this.dispose();\r\n }\r\n\r\n onProtocolMessage(message: ProtocolMessage): void {\r\n if (this.logger.shouldLog(Logger.LOG_MICRO)) {\r\n Logger.logActionNoStrip(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'Transport.onProtocolMessage()',\r\n 'received on ' +\r\n this.shortName +\r\n ': ' +\r\n stringifyProtocolMessage(\r\n message,\r\n this.connectionManager.realtime._RealtimePresence,\r\n this.connectionManager.realtime._Annotations,\r\n this.connectionManager.realtime._objectsPlugin,\r\n ) +\r\n '; connectionId = ' +\r\n this.connectionManager.connectionId,\r\n );\r\n }\r\n this.onActivity();\r\n\r\n switch (message.action) {\r\n case actions.HEARTBEAT:\r\n Logger.logActionNoStrip(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'Transport.onProtocolMessage()',\r\n this.shortName + ' heartbeat; connectionId = ' + this.connectionManager.connectionId,\r\n );\r\n this.emit('heartbeat', message.id);\r\n break;\r\n case actions.CONNECTED:\r\n this.onConnect(message);\r\n this.emit('connected', message.error, message.connectionId, message.connectionDetails, message);\r\n break;\r\n case actions.CLOSED:\r\n this.onClose(message);\r\n break;\r\n case actions.DISCONNECTED:\r\n this.onDisconnect(message);\r\n break;\r\n case actions.ACK:\r\n this.emit('ack', message.msgSerial, message.count);\r\n break;\r\n case actions.NACK:\r\n this.emit('nack', message.msgSerial, message.count, message.error);\r\n break;\r\n case actions.SYNC:\r\n this.connectionManager.onChannelMessage(message, this);\r\n break;\r\n case actions.ACTIVATE:\r\n // Ignored.\r\n break;\r\n case actions.AUTH:\r\n Utils.whenPromiseSettles(this.auth.authorize(), (err: ErrorInfo | null) => {\r\n if (err) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_ERROR,\r\n 'Transport.onProtocolMessage()',\r\n 'Ably requested re-authentication, but unable to obtain a new token: ' + Utils.inspectError(err),\r\n );\r\n }\r\n });\r\n break;\r\n case actions.ERROR:\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'Transport.onProtocolMessage()',\r\n 'received error action; connectionId = ' +\r\n this.connectionManager.connectionId +\r\n '; err = ' +\r\n Platform.Config.inspect(message.error) +\r\n (message.channel ? ', channel: ' + message.channel : ''),\r\n );\r\n if (message.channel === undefined) {\r\n this.onFatalError(message);\r\n break;\r\n }\r\n /* otherwise it's a channel-specific error, so handle it in the channel */\r\n this.connectionManager.onChannelMessage(message, this);\r\n break;\r\n default:\r\n /* all other actions are channel-specific */\r\n this.connectionManager.onChannelMessage(message, this);\r\n }\r\n }\r\n\r\n onConnect(message: ProtocolMessage): void {\r\n this.isConnected = true;\r\n if (!message.connectionDetails) {\r\n throw new Error('Transport.onConnect(): Connect message recieved without connectionDetails');\r\n }\r\n const maxPromisedIdle = message.connectionDetails.maxIdleInterval as number;\r\n if (maxPromisedIdle) {\r\n this.maxIdleInterval = maxPromisedIdle + this.timeouts.realtimeRequestTimeout;\r\n this.onActivity();\r\n }\r\n /* else Realtime declines to guarantee any maximum idle interval - CD2h */\r\n }\r\n\r\n onDisconnect(message: ProtocolMessage): void {\r\n /* Used for when the server has disconnected the client (usually with a\r\n * DISCONNECTED action) */\r\n const err = message && message.error;\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.onDisconnect()', 'err = ' + Utils.inspectError(err));\r\n this.finish('disconnected', err);\r\n }\r\n\r\n onFatalError(message: ProtocolMessage): void {\r\n /* On receipt of a fatal connection error, we can assume that the server\r\n * will close the connection and the transport, and do not need to request\r\n * a disconnection - RTN15i */\r\n const err = message && message.error;\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.onFatalError()', 'err = ' + Utils.inspectError(err));\r\n this.finish('failed', err);\r\n }\r\n\r\n onClose(message: ProtocolMessage): void {\r\n const err = message && message.error;\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.onClose()', 'err = ' + Utils.inspectError(err));\r\n this.finish('closed', err);\r\n }\r\n\r\n requestClose(): void {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.requestClose()', '');\r\n this.send(closeMessage);\r\n }\r\n\r\n requestDisconnect(): void {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.requestDisconnect()', '');\r\n this.send(disconnectMessage);\r\n }\r\n\r\n ping(id: string): void {\r\n const msg: Record<string, number | string> = { action: actions.HEARTBEAT };\r\n if (id) msg.id = id;\r\n this.send(protocolMessageFromValues(msg));\r\n }\r\n\r\n dispose(): void {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.dispose()', '');\r\n this.isDisposed = true;\r\n this.off();\r\n }\r\n\r\n onActivity(): void {\r\n if (!this.maxIdleInterval) {\r\n return;\r\n }\r\n this.lastActivity = this.connectionManager.lastActivity = Date.now();\r\n this.setIdleTimer(this.maxIdleInterval + 100);\r\n }\r\n\r\n setIdleTimer(timeout: number): void {\r\n if (!this.idleTimer) {\r\n this.idleTimer = setTimeout(() => {\r\n this.onIdleTimerExpire();\r\n }, timeout);\r\n }\r\n }\r\n\r\n onIdleTimerExpire(): void {\r\n if (!this.lastActivity || !this.maxIdleInterval) {\r\n throw new Error('Transport.onIdleTimerExpire(): lastActivity/maxIdleInterval not set');\r\n }\r\n this.idleTimer = null;\r\n const sinceLast = Date.now() - this.lastActivity;\r\n const timeRemaining = this.maxIdleInterval - sinceLast;\r\n if (timeRemaining <= 0) {\r\n const msg = 'No activity seen from realtime in ' + sinceLast + 'ms; assuming connection has dropped';\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'Transport.onIdleTimerExpire()', msg);\r\n this.disconnect(new ErrorInfo(msg, 80003, 408));\r\n } else {\r\n this.setIdleTimer(timeRemaining + 100);\r\n }\r\n }\r\n\r\n static tryConnect(\r\n transportCtor: TransportCtor,\r\n connectionManager: ConnectionManager,\r\n auth: Auth,\r\n transportParams: TransportParams,\r\n callback: TryConnectCallback,\r\n ): Transport {\r\n const transport = new transportCtor(connectionManager, auth, transportParams);\r\n\r\n let transportAttemptTimer: NodeJS.Timeout | number;\r\n\r\n const errorCb = function (this: { event: string }, err: ErrorInfo) {\r\n clearTimeout(transportAttemptTimer);\r\n callback({ event: this.event, error: err });\r\n };\r\n\r\n const realtimeRequestTimeout = connectionManager.options.timeouts.realtimeRequestTimeout;\r\n transportAttemptTimer = setTimeout(() => {\r\n transport.off(['preconnect', 'disconnected', 'failed']);\r\n transport.dispose();\r\n errorCb.call(\r\n { event: 'disconnected' },\r\n new ErrorInfo('Timeout waiting for transport to indicate itself viable', 50000, 500),\r\n );\r\n }, realtimeRequestTimeout);\r\n\r\n transport.on(['failed', 'disconnected'], errorCb);\r\n transport.on('preconnect', function () {\r\n Logger.logAction(\r\n connectionManager.logger,\r\n Logger.LOG_MINOR,\r\n 'Transport.tryConnect()',\r\n 'viable transport ' + transport,\r\n );\r\n clearTimeout(transportAttemptTimer);\r\n transport.off(['failed', 'disconnected'], errorCb);\r\n callback(null, transport);\r\n });\r\n transport.connect();\r\n return transport;\r\n }\r\n\r\n onAuthUpdated?: (tokenDetails: API.TokenDetails) => void;\r\n\r\n static isAvailable(): boolean {\r\n throw new ErrorInfo('isAvailable not implemented for transport', 50000, 500);\r\n }\r\n}\r\n\r\nexport default Transport;\r\n", "export namespace TransportNames {\n export const WebSocket = 'web_socket' as const;\n export const Comet = 'comet' as const;\n export const XhrPolling = 'xhr_polling' as const;\n}\n\ntype TransportName = typeof TransportNames.WebSocket | typeof TransportNames.Comet | typeof TransportNames.XhrPolling;\n\nexport default TransportName;\n", "import { actions } from '../types/protocolmessagecommon';\r\nimport ProtocolMessage, {\r\n stringify as stringifyProtocolMessage,\r\n fromValues as protocolMessageFromValues,\r\n} from 'common/lib/types/protocolmessage';\r\nimport * as Utils from 'common/lib/util/utils';\r\nimport Protocol, { PendingMessage } from './protocol';\r\nimport Defaults, { getAgentString } from 'common/lib/util/defaults';\r\nimport Platform, { TransportImplementations } from 'common/platform';\r\nimport EventEmitter from '../util/eventemitter';\r\nimport MessageQueue from './messagequeue';\r\nimport Logger from '../util/logger';\r\nimport ConnectionStateChange from 'common/lib/client/connectionstatechange';\r\nimport ConnectionErrors, { isRetriable } from './connectionerrors';\r\nimport ErrorInfo, { IPartialErrorInfo, PartialErrorInfo } from 'common/lib/types/errorinfo';\r\nimport Auth from 'common/lib/client/auth';\r\nimport Message, { getMessagesSize } from 'common/lib/types/message';\r\nimport Multicaster, { MulticasterInstance } from 'common/lib/util/multicaster';\r\nimport Transport, { TransportCtor } from './transport';\r\nimport * as API from '../../../../ably';\r\nimport { ErrCallback } from 'common/types/utils';\r\nimport HttpStatusCodes from 'common/constants/HttpStatusCodes';\r\nimport BaseRealtime from '../client/baserealtime';\r\nimport { NormalisedClientOptions } from 'common/types/ClientOptions';\r\nimport TransportName, { TransportNames } from 'common/constants/TransportName';\r\n\r\nlet globalObject = typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : self;\r\n\r\nconst haveWebStorage = () => typeof Platform.WebStorage !== 'undefined' && Platform.WebStorage?.localSupported;\r\nconst haveSessionStorage = () => typeof Platform.WebStorage !== 'undefined' && Platform.WebStorage?.sessionSupported;\r\nconst noop = function () {};\r\nconst transportPreferenceName = 'ably-transport-preference';\r\n\r\nfunction bundleWith(dest: ProtocolMessage, src: ProtocolMessage, maxSize: number) {\r\n let action;\r\n if (dest.channel !== src.channel) {\r\n /* RTL6d3 */\r\n return false;\r\n }\r\n if ((action = dest.action) !== actions.PRESENCE && action !== actions.MESSAGE) {\r\n /* RTL6d - can only bundle messages or presence */\r\n return false;\r\n }\r\n if (action !== src.action) {\r\n /* RTL6d4 */\r\n return false;\r\n }\r\n const kind = action === actions.PRESENCE ? 'presence' : 'messages',\r\n proposed = (dest as Record<string, any>)[kind].concat((src as Record<string, any>)[kind]),\r\n size = getMessagesSize(proposed);\r\n if (size > maxSize) {\r\n /* RTL6d1 */\r\n return false;\r\n }\r\n if (!Utils.allSame(proposed, 'clientId')) {\r\n /* RTL6d2 */\r\n return false;\r\n }\r\n if (\r\n !proposed.every(function (msg: Message) {\r\n return !msg.id;\r\n })\r\n ) {\r\n /* RTL6d7 */\r\n return false;\r\n }\r\n /* we're good to go! */\r\n (dest as Record<string, any>)[kind] = proposed;\r\n return true;\r\n}\r\n\r\ntype RecoveryContext = {\r\n connectionKey: string;\r\n msgSerial: number;\r\n channelSerials: { [name: string]: string };\r\n};\r\n\r\nfunction decodeRecoveryKey(recoveryKey: NormalisedClientOptions['recover']): RecoveryContext | null {\r\n try {\r\n return JSON.parse(recoveryKey as string);\r\n } catch (e) {\r\n return null;\r\n }\r\n}\r\n\r\nexport class TransportParams {\r\n options: NormalisedClientOptions;\r\n host: string | null;\r\n mode: string;\r\n format?: Utils.Format;\r\n connectionKey?: string;\r\n stream?: any;\r\n heartbeats?: boolean;\r\n\r\n constructor(options: NormalisedClientOptions, host: string | null, mode: string, connectionKey?: string) {\r\n this.options = options;\r\n this.host = host;\r\n this.mode = mode;\r\n this.connectionKey = connectionKey;\r\n this.format = options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json;\r\n }\r\n\r\n getConnectParams(authParams: Record<string, unknown>): Record<string, string> {\r\n const params = authParams ? Utils.copy(authParams) : {};\r\n const options = this.options;\r\n switch (this.mode) {\r\n case 'resume':\r\n params.resume = this.connectionKey as string;\r\n break;\r\n case 'recover': {\r\n const recoveryContext = decodeRecoveryKey(options.recover);\r\n if (recoveryContext) {\r\n params.recover = recoveryContext.connectionKey;\r\n }\r\n break;\r\n }\r\n default:\r\n }\r\n if (options.clientId !== undefined) {\r\n params.clientId = options.clientId;\r\n }\r\n if (options.echoMessages === false) {\r\n params.echo = 'false';\r\n }\r\n if (this.format !== undefined) {\r\n params.format = this.format;\r\n }\r\n if (this.stream !== undefined) {\r\n params.stream = this.stream;\r\n }\r\n if (this.heartbeats !== undefined) {\r\n params.heartbeats = this.heartbeats;\r\n }\r\n params.v = Defaults.protocolVersion;\r\n params.agent = getAgentString(this.options);\r\n if (options.transportParams !== undefined) {\r\n Utils.mixin(params, options.transportParams);\r\n }\r\n return params as Record<string, string>;\r\n }\r\n\r\n toString(): string {\r\n let result = '[mode=' + this.mode;\r\n if (this.host) {\r\n result += ',host=' + this.host;\r\n }\r\n if (this.connectionKey) {\r\n result += ',connectionKey=' + this.connectionKey;\r\n }\r\n if (this.format) {\r\n result += ',format=' + this.format;\r\n }\r\n result += ']';\r\n\r\n return result;\r\n }\r\n}\r\n\r\ntype ConnectionState = {\r\n state: string;\r\n terminal?: boolean;\r\n queueEvents?: boolean;\r\n sendEvents?: boolean;\r\n failState?: string;\r\n retryDelay?: number;\r\n retryImmediately?: boolean;\r\n error?: IPartialErrorInfo;\r\n};\r\n\r\nclass ConnectionManager extends EventEmitter {\r\n supportedTransports: Partial<Record<TransportName, TransportCtor>> = {};\r\n realtime: BaseRealtime;\r\n options: NormalisedClientOptions;\r\n states: Record<string, ConnectionState>;\r\n state: ConnectionState;\r\n errorReason: IPartialErrorInfo | null;\r\n queuedMessages: MessageQueue;\r\n msgSerial: number;\r\n connectionDetails?: Record<string, any>;\r\n connectionId?: string;\r\n connectionKey?: string;\r\n connectionStateTtl: number;\r\n maxIdleInterval: number | null;\r\n transports: TransportName[];\r\n baseTransport?: TransportName;\r\n webSocketTransportAvailable?: true;\r\n transportPreference: string | null;\r\n domains: string[];\r\n activeProtocol: null | Protocol;\r\n pendingTransport?: Transport;\r\n proposedTransport?: Transport;\r\n host: string | null;\r\n lastAutoReconnectAttempt: number | null;\r\n lastActivity: number | null;\r\n forceFallbackHost: boolean;\r\n transitionTimer?: number | NodeJS.Timeout | null;\r\n suspendTimer?: number | NodeJS.Timeout | null;\r\n retryTimer?: number | NodeJS.Timeout | null;\r\n disconnectedRetryCount: number = 0;\r\n pendingChannelMessagesState: {\r\n // Whether a message is currently being processed\r\n isProcessing: boolean;\r\n // The messages remaining to be processed (excluding any message currently being processed)\r\n queue: { message: ProtocolMessage; transport: Transport }[];\r\n } = { isProcessing: false, queue: [] };\r\n webSocketSlowTimer: NodeJS.Timeout | null;\r\n wsCheckResult: boolean | null;\r\n webSocketGiveUpTimer: NodeJS.Timeout | null;\r\n abandonedWebSocket: boolean;\r\n connectCounter: number;\r\n\r\n constructor(realtime: BaseRealtime, options: NormalisedClientOptions) {\r\n super(realtime.logger);\r\n this.realtime = realtime;\r\n this.initTransports();\r\n this.options = options;\r\n const timeouts = options.timeouts;\r\n /* connectingTimeout: leave webSocketConnectTimeout (~6s) to try the\r\n * websocket transport, then realtimeRequestTimeout (~10s) to establish\r\n * the base transport in case that fails */\r\n const connectingTimeout = timeouts.webSocketConnectTimeout + timeouts.realtimeRequestTimeout;\r\n this.states = {\r\n initialized: {\r\n state: 'initialized',\r\n terminal: false,\r\n queueEvents: true,\r\n sendEvents: false,\r\n failState: 'disconnected',\r\n },\r\n connecting: {\r\n state: 'connecting',\r\n terminal: false,\r\n queueEvents: true,\r\n sendEvents: false,\r\n retryDelay: connectingTimeout,\r\n failState: 'disconnected',\r\n },\r\n connected: {\r\n state: 'connected',\r\n terminal: false,\r\n queueEvents: false,\r\n sendEvents: true,\r\n failState: 'disconnected',\r\n },\r\n disconnected: {\r\n state: 'disconnected',\r\n terminal: false,\r\n queueEvents: true,\r\n sendEvents: false,\r\n retryDelay: timeouts.disconnectedRetryTimeout,\r\n failState: 'disconnected',\r\n },\r\n suspended: {\r\n state: 'suspended',\r\n terminal: false,\r\n queueEvents: false,\r\n sendEvents: false,\r\n retryDelay: timeouts.suspendedRetryTimeout,\r\n failState: 'suspended',\r\n },\r\n closing: {\r\n state: 'closing',\r\n terminal: false,\r\n queueEvents: false,\r\n sendEvents: false,\r\n retryDelay: timeouts.realtimeRequestTimeout,\r\n failState: 'closed',\r\n },\r\n closed: { state: 'closed', terminal: true, queueEvents: false, sendEvents: false, failState: 'closed' },\r\n failed: { state: 'failed', terminal: true, queueEvents: false, sendEvents: false, failState: 'failed' },\r\n };\r\n this.state = this.states.initialized;\r\n this.errorReason = null;\r\n\r\n this.queuedMessages = new MessageQueue(this.logger);\r\n this.msgSerial = 0;\r\n this.connectionDetails = undefined;\r\n this.connectionId = undefined;\r\n this.connectionKey = undefined;\r\n this.connectionStateTtl = timeouts.connectionStateTtl;\r\n this.maxIdleInterval = null;\r\n\r\n this.transports = Utils.intersect(options.transports || Defaults.defaultTransports, this.supportedTransports);\r\n this.transportPreference = null;\r\n\r\n if (this.transports.includes(TransportNames.WebSocket)) {\r\n this.webSocketTransportAvailable = true;\r\n }\r\n if (this.transports.includes(TransportNames.XhrPolling)) {\r\n this.baseTransport = TransportNames.XhrPolling;\r\n } else if (this.transports.includes(TransportNames.Comet)) {\r\n this.baseTransport = TransportNames.Comet;\r\n }\r\n\r\n this.domains = Defaults.getHosts(options);\r\n this.activeProtocol = null;\r\n this.host = null;\r\n this.lastAutoReconnectAttempt = null;\r\n this.lastActivity = null;\r\n this.forceFallbackHost = false;\r\n this.connectCounter = 0;\r\n this.wsCheckResult = null;\r\n this.webSocketSlowTimer = null;\r\n this.webSocketGiveUpTimer = null;\r\n this.abandonedWebSocket = false;\r\n\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Realtime.ConnectionManager()', 'started');\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'Realtime.ConnectionManager()',\r\n 'requested transports = [' + (options.transports || Defaults.defaultTransports) + ']',\r\n );\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'Realtime.ConnectionManager()',\r\n 'available transports = [' + this.transports + ']',\r\n );\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'Realtime.ConnectionManager()',\r\n 'http domains = [' + this.domains + ']',\r\n );\r\n\r\n if (!this.transports.length) {\r\n const msg = 'no requested transports available';\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'realtime.ConnectionManager()', msg);\r\n throw new Error(msg);\r\n }\r\n\r\n const addEventListener = Platform.Config.addEventListener;\r\n if (addEventListener) {\r\n /* intercept close event in browser to persist connection id if requested */\r\n if (haveSessionStorage() && typeof options.recover === 'function') {\r\n addEventListener('beforeunload', this.persistConnection.bind(this));\r\n }\r\n\r\n if (options.closeOnUnload === true) {\r\n addEventListener('beforeunload', () => {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MAJOR,\r\n 'Realtime.ConnectionManager()',\r\n 'beforeunload event has triggered the connection to close as closeOnUnload is true',\r\n );\r\n this.requestState({ state: 'closing' });\r\n });\r\n }\r\n\r\n /* Listen for online and offline events */\r\n addEventListener('online', () => {\r\n if (this.state == this.states.disconnected || this.state == this.states.suspended) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager caught browser \u2018online\u2019 event',\r\n 'reattempting connection',\r\n );\r\n this.requestState({ state: 'connecting' });\r\n } else if (this.state == this.states.connecting) {\r\n // RTN20c: if 'online' event recieved while CONNECTING, abandon connection attempt and retry\r\n this.pendingTransport?.off();\r\n this.disconnectAllTransports();\r\n\r\n this.startConnect();\r\n }\r\n });\r\n\r\n addEventListener('offline', () => {\r\n if (this.state == this.states.connected) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager caught browser \u2018offline\u2019 event',\r\n 'disconnecting active transport',\r\n );\r\n // Not sufficient to just go to the 'disconnected' state, want to\r\n // force all transports to reattempt the connection. Will immediately\r\n // retry.\r\n this.disconnectAllTransports();\r\n }\r\n });\r\n }\r\n }\r\n\r\n /*********************\r\n * transport management\r\n *********************/\r\n\r\n // Used by tests\r\n static supportedTransports(additionalImplementations: TransportImplementations) {\r\n const storage: TransportStorage = { supportedTransports: {} };\r\n this.initTransports(additionalImplementations, storage);\r\n return storage.supportedTransports;\r\n }\r\n\r\n private static initTransports(additionalImplementations: TransportImplementations, storage: TransportStorage) {\r\n const implementations = { ...Platform.Transports.bundledImplementations, ...additionalImplementations };\r\n\r\n [TransportNames.WebSocket, ...Platform.Transports.order].forEach((transportName) => {\r\n const transport = implementations[transportName];\r\n if (transport && transport.isAvailable()) {\r\n storage.supportedTransports[transportName] = transport;\r\n }\r\n });\r\n }\r\n\r\n initTransports() {\r\n ConnectionManager.initTransports(this.realtime._additionalTransportImplementations, this);\r\n }\r\n\r\n createTransportParams(host: string | null, mode: string): TransportParams {\r\n return new TransportParams(this.options, host, mode, this.connectionKey);\r\n }\r\n\r\n getTransportParams(callback: Function): void {\r\n const decideMode = (modeCb: Function) => {\r\n if (this.connectionKey) {\r\n modeCb('resume');\r\n return;\r\n }\r\n\r\n if (typeof this.options.recover === 'string') {\r\n modeCb('recover');\r\n return;\r\n }\r\n\r\n const recoverFn = this.options.recover,\r\n lastSessionData = this.getSessionRecoverData(),\r\n sessionRecoveryName = this.sessionRecoveryName();\r\n if (lastSessionData && typeof recoverFn === 'function') {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.getTransportParams()',\r\n 'Calling clientOptions-provided recover function with last session data (recovery scope: ' +\r\n sessionRecoveryName +\r\n ')',\r\n );\r\n recoverFn(lastSessionData, (shouldRecover?: boolean) => {\r\n if (shouldRecover) {\r\n this.options.recover = lastSessionData.recoveryKey;\r\n modeCb('recover');\r\n } else {\r\n modeCb('clean');\r\n }\r\n });\r\n return;\r\n }\r\n modeCb('clean');\r\n };\r\n\r\n decideMode((mode: string) => {\r\n const transportParams = this.createTransportParams(null, mode);\r\n if (mode === 'recover') {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.getTransportParams()',\r\n 'Transport recovery mode = recover; recoveryKey = ' + this.options.recover,\r\n );\r\n const recoveryContext = decodeRecoveryKey(this.options.recover);\r\n if (recoveryContext) {\r\n this.msgSerial = recoveryContext.msgSerial;\r\n }\r\n } else {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.getTransportParams()',\r\n 'Transport params = ' + transportParams.toString(),\r\n );\r\n }\r\n callback(transportParams);\r\n });\r\n }\r\n\r\n /**\r\n * Attempt to connect using a given transport\r\n * @param transportParams\r\n * @param candidate, the transport to try\r\n * @param callback\r\n */\r\n tryATransport(transportParams: TransportParams, candidate: TransportName, callback: Function): void {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.tryATransport()', 'trying ' + candidate);\r\n\r\n this.proposedTransport = Transport.tryConnect(\r\n this.supportedTransports[candidate]!,\r\n this,\r\n this.realtime.auth,\r\n transportParams,\r\n (wrappedErr: { error: ErrorInfo; event: string } | null, transport?: Transport) => {\r\n const state = this.state;\r\n if (state == this.states.closing || state == this.states.closed || state == this.states.failed) {\r\n if (transport) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.tryATransport()',\r\n 'connection ' + state.state + ' while we were attempting the transport; closing ' + transport,\r\n );\r\n transport.close();\r\n }\r\n callback(true);\r\n return;\r\n }\r\n\r\n if (wrappedErr) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.tryATransport()',\r\n 'transport ' + candidate + ' ' + wrappedErr.event + ', err: ' + wrappedErr.error.toString(),\r\n );\r\n\r\n /* Comet transport onconnect token errors can be dealt with here.\r\n * Websocket ones only happen after the transport claims to be viable,\r\n * so are dealt with as non-onconnect token errors */\r\n if (\r\n Auth.isTokenErr(wrappedErr.error) &&\r\n !(this.errorReason && Auth.isTokenErr(this.errorReason as ErrorInfo))\r\n ) {\r\n this.errorReason = wrappedErr.error;\r\n /* re-get a token and try again */\r\n Utils.whenPromiseSettles(this.realtime.auth._forceNewToken(null, null), (err: ErrorInfo | null) => {\r\n if (err) {\r\n this.actOnErrorFromAuthorize(err);\r\n return;\r\n }\r\n this.tryATransport(transportParams, candidate, callback);\r\n });\r\n } else if (wrappedErr.event === 'failed') {\r\n /* Error that's fatal to the connection */\r\n this.notifyState({ state: 'failed', error: wrappedErr.error });\r\n callback(true);\r\n } else if (wrappedErr.event === 'disconnected') {\r\n if (!isRetriable(wrappedErr.error)) {\r\n /* Error received from the server that does not call for trying a fallback host, eg a rate limit */\r\n this.notifyState({ state: this.states.connecting.failState as string, error: wrappedErr.error });\r\n callback(true);\r\n } else {\r\n /* Error with that transport only; continue trying other fallback hosts */\r\n callback(false);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.tryATransport()',\r\n 'viable transport ' + candidate + '; setting pending',\r\n );\r\n this.setTransportPending(transport as Transport, transportParams);\r\n callback(null, transport);\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * Called when a transport is indicated to be viable, and the ConnectionManager\r\n * expects to activate this transport as soon as it is connected.\r\n * @param transport\r\n * @param transportParams\r\n */\r\n setTransportPending(transport: Transport, transportParams: TransportParams): void {\r\n const mode = transportParams.mode;\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.setTransportPending()',\r\n 'transport = ' + transport + '; mode = ' + mode,\r\n );\r\n\r\n this.pendingTransport = transport;\r\n\r\n this.cancelWebSocketSlowTimer();\r\n this.cancelWebSocketGiveUpTimer();\r\n\r\n transport.once('connected', (error: ErrorInfo, connectionId: string, connectionDetails: Record<string, any>) => {\r\n this.activateTransport(error, transport, connectionId, connectionDetails);\r\n\r\n if (mode === 'recover' && this.options.recover) {\r\n /* After a successful recovery, we unpersist, as a recovery key cannot\r\n * be used more than once */\r\n delete this.options.recover;\r\n this.unpersistConnection();\r\n }\r\n });\r\n\r\n const self = this;\r\n transport.on(['disconnected', 'closed', 'failed'], function (this: { event: string }, error: ErrorInfo) {\r\n self.deactivateTransport(transport, this.event, error);\r\n });\r\n\r\n this.emit('transport.pending', transport);\r\n }\r\n\r\n /**\r\n * Called when a transport is connected, and the connectionmanager decides that\r\n * it will now be the active transport. Returns whether or not it activated\r\n * the transport (if the connection is closing/closed it will choose not to).\r\n * @param transport the transport instance\r\n * @param connectionId the id of the new active connection\r\n * @param connectionDetails the details of the new active connection\r\n */\r\n activateTransport(\r\n error: ErrorInfo,\r\n transport: Transport,\r\n connectionId: string,\r\n connectionDetails: Record<string, any>,\r\n ): boolean {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.activateTransport()',\r\n 'transport = ' + transport,\r\n );\r\n if (error) {\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'ConnectionManager.activateTransport()', 'error = ' + error);\r\n }\r\n if (connectionId) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.activateTransport()',\r\n 'connectionId = ' + connectionId,\r\n );\r\n }\r\n if (connectionDetails) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.activateTransport()',\r\n 'connectionDetails = ' + JSON.stringify(connectionDetails),\r\n );\r\n }\r\n\r\n this.persistTransportPreference(transport);\r\n\r\n /* if the connectionmanager moved to the closing/closed state before this\r\n * connection event, then we won't activate this transport */\r\n const existingState = this.state,\r\n connectedState = this.states.connected.state;\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.activateTransport()',\r\n 'current state = ' + existingState.state,\r\n );\r\n if (\r\n existingState.state == this.states.closing.state ||\r\n existingState.state == this.states.closed.state ||\r\n existingState.state == this.states.failed.state\r\n ) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.activateTransport()',\r\n 'Disconnecting transport and abandoning',\r\n );\r\n transport.disconnect();\r\n return false;\r\n }\r\n\r\n delete this.pendingTransport;\r\n\r\n /* if the transport is not connected then don't activate it */\r\n if (!transport.isConnected) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.activateTransport()',\r\n 'Declining to activate transport ' + transport + ' since it appears to no longer be connected',\r\n );\r\n return false;\r\n }\r\n\r\n /* the given transport is connected; this will immediately\r\n * take over as the active transport */\r\n const existingActiveProtocol = this.activeProtocol;\r\n this.activeProtocol = new Protocol(transport);\r\n this.host = transport.params.host;\r\n\r\n const connectionKey = connectionDetails.connectionKey;\r\n if (connectionKey && this.connectionKey != connectionKey) {\r\n this.setConnection(connectionId, connectionDetails, !!error);\r\n }\r\n\r\n /* Rebroadcast any new connectionDetails from the active transport, which\r\n * can come at any time (eg following a reauth), and emit an RTN24 UPDATE\r\n * event. (Listener added on nextTick because we're in a transport.on('connected')\r\n * callback at the moment; if we add it now we'll be adding it to the end\r\n * of the listeners array and it'll be called immediately) */\r\n this.onConnectionDetailsUpdate(connectionDetails, transport);\r\n Platform.Config.nextTick(() => {\r\n transport.on(\r\n 'connected',\r\n (connectedErr: ErrorInfo, _connectionId: string, connectionDetails: Record<string, any>) => {\r\n this.onConnectionDetailsUpdate(connectionDetails, transport);\r\n this.emit('update', new ConnectionStateChange(connectedState, connectedState, null, connectedErr));\r\n },\r\n );\r\n });\r\n\r\n /* If previously not connected, notify the state change (including any\r\n * error). */\r\n if (existingState.state === this.states.connected.state) {\r\n if (error) {\r\n this.errorReason = this.realtime.connection.errorReason = error;\r\n this.emit('update', new ConnectionStateChange(connectedState, connectedState, null, error));\r\n }\r\n } else {\r\n this.notifyState({ state: 'connected', error: error });\r\n this.errorReason = this.realtime.connection.errorReason = error || null;\r\n }\r\n\r\n /* Send after the connection state update, as Channels hooks into this to\r\n * resend attaches on a new transport if necessary */\r\n this.emit('transport.active', transport);\r\n\r\n /* Gracefully terminate existing protocol */\r\n if (existingActiveProtocol) {\r\n if (existingActiveProtocol.messageQueue.count() > 0) {\r\n /* We could just requeue pending messages on the new transport, but\r\n * actually this should never happen: transports should only take over\r\n * from other active transports when upgrading, and upgrading waits for\r\n * the old transport to be idle. So log an error. */\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_ERROR,\r\n 'ConnectionManager.activateTransport()',\r\n 'Previous active protocol (for transport ' +\r\n existingActiveProtocol.transport.shortName +\r\n ', new one is ' +\r\n transport.shortName +\r\n ') finishing with ' +\r\n existingActiveProtocol.messageQueue.count() +\r\n ' messages still pending',\r\n );\r\n }\r\n if (existingActiveProtocol.transport === transport) {\r\n const msg =\r\n 'Assumption violated: activating a transport that was also the transport for the previous active protocol; transport = ' +\r\n transport.shortName +\r\n '; stack = ' +\r\n new Error().stack;\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'ConnectionManager.activateTransport()', msg);\r\n } else {\r\n existingActiveProtocol.finish();\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Called when a transport is no longer the active transport. This can occur\r\n * in any transport connection state.\r\n * @param transport\r\n */\r\n deactivateTransport(transport: Transport, state: string, error: ErrorInfo): void {\r\n const currentProtocol = this.activeProtocol,\r\n wasActive = currentProtocol && currentProtocol.getTransport() === transport,\r\n wasPending = transport === this.pendingTransport,\r\n noTransportsScheduledForActivation = this.noTransportsScheduledForActivation();\r\n\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.deactivateTransport()',\r\n 'transport = ' + transport,\r\n );\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.deactivateTransport()',\r\n 'state = ' +\r\n state +\r\n (wasActive ? '; was active' : wasPending ? '; was pending' : '') +\r\n (noTransportsScheduledForActivation ? '' : '; another transport is scheduled for activation'),\r\n );\r\n if (error && error.message)\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.deactivateTransport()',\r\n 'reason = ' + error.message,\r\n );\r\n\r\n if (wasActive) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.deactivateTransport()',\r\n 'Getting, clearing, and requeuing ' +\r\n (this.activeProtocol as Protocol).messageQueue.count() +\r\n ' pending messages',\r\n );\r\n this.queuePendingMessages((currentProtocol as Protocol).getPendingMessages());\r\n /* Clear any messages we requeue to allow the protocol to become idle.*/\r\n (currentProtocol as Protocol).clearPendingMessages();\r\n this.activeProtocol = this.host = null;\r\n }\r\n\r\n this.emit('transport.inactive', transport);\r\n\r\n /* this transport state change is a state change for the connectionmanager if\r\n * - the transport was the active transport and there are no transports\r\n * which are connected and scheduled for activation, just waiting for the\r\n * active transport to finish what its doing; or\r\n * - the transport was the active transport and the error was fatal (so\r\n * unhealable by another transport); or\r\n * - there is no active transport, and this is the last remaining\r\n * pending transport (so we were in the connecting state)\r\n */\r\n if (\r\n (wasActive && noTransportsScheduledForActivation) ||\r\n (wasActive && state === 'failed') ||\r\n state === 'closed' ||\r\n (currentProtocol === null && wasPending)\r\n ) {\r\n /* If we're disconnected with a 5xx we need to try fallback hosts\r\n * (RTN14d), but (a) due to how the upgrade sequence works, the\r\n * host/transport selection sequence only cares about getting to\r\n * `preconnect` (eg establishing a websocket) getting a `disconnected`\r\n * protocol message afterwards is too late; and (b) host retry only\r\n * applies to connectBase unless the stored preference transport doesn't\r\n * work. We solve this by unpersisting the transport preference and\r\n * setting an instance variable to force fallback hosts to be used (if\r\n * any) here. Bit of a kludge, but no real better alternatives without\r\n * rewriting the entire thing */\r\n if (state === 'disconnected' && error && (error.statusCode as number) > 500 && this.domains.length > 1) {\r\n this.unpersistTransportPreference();\r\n this.forceFallbackHost = true;\r\n /* and try to connect again to try a fallback host without waiting for the usual 15s disconnectedRetryTimeout */\r\n this.notifyState({ state: state, error: error, retryImmediately: true });\r\n return;\r\n }\r\n\r\n /* TODO remove below line once realtime sends token errors as DISCONNECTEDs */\r\n const newConnectionState = state === 'failed' && Auth.isTokenErr(error) ? 'disconnected' : state;\r\n this.notifyState({ state: newConnectionState, error: error });\r\n return;\r\n }\r\n }\r\n\r\n /* Helper that returns true if there are no transports which are pending,\r\n * have been connected, and are just waiting for onceNoPending to fire before\r\n * being activated */\r\n noTransportsScheduledForActivation(): boolean {\r\n return !this.pendingTransport || !this.pendingTransport.isConnected;\r\n }\r\n\r\n setConnection(connectionId: string, connectionDetails: Record<string, any>, hasConnectionError?: boolean): void {\r\n /* if connectionKey changes but connectionId stays the same, then just a\r\n * transport change on the same connection. If connectionId changes, we're\r\n * on a new connection, with implications for msgSerial and channel state */\r\n /* If no previous connectionId, don't reset the msgSerial as it may have\r\n * been set by recover data (unless the recover failed) */\r\n const prevConnId = this.connectionId,\r\n connIdChanged = prevConnId && prevConnId !== connectionId,\r\n recoverFailure = !prevConnId && hasConnectionError;\r\n if (connIdChanged || recoverFailure) {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.setConnection()', 'Resetting msgSerial');\r\n this.msgSerial = 0;\r\n // RTN19a2: In the event of a new connectionId, previous msgSerials are\r\n // meaningless.\r\n this.queuedMessages.resetSendAttempted();\r\n }\r\n if (this.connectionId !== connectionId) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.setConnection()',\r\n 'New connectionId; reattaching any attached channels',\r\n );\r\n }\r\n this.realtime.connection.id = this.connectionId = connectionId;\r\n this.realtime.connection.key = this.connectionKey = connectionDetails.connectionKey;\r\n }\r\n\r\n clearConnection(): void {\r\n this.realtime.connection.id = this.connectionId = undefined;\r\n this.realtime.connection.key = this.connectionKey = undefined;\r\n this.msgSerial = 0;\r\n this.unpersistConnection();\r\n }\r\n\r\n createRecoveryKey(): string | null {\r\n // RTN16g2.\r\n if (!this.connectionKey) {\r\n return null;\r\n }\r\n\r\n return JSON.stringify({\r\n connectionKey: this.connectionKey,\r\n msgSerial: this.msgSerial,\r\n channelSerials: this.realtime.channels.channelSerials(),\r\n });\r\n }\r\n\r\n checkConnectionStateFreshness(): void {\r\n if (!this.lastActivity || !this.connectionId) {\r\n return;\r\n }\r\n\r\n const sinceLast = Date.now() - this.lastActivity;\r\n if (sinceLast > this.connectionStateTtl + (this.maxIdleInterval as number)) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.checkConnectionStateFreshness()',\r\n 'Last known activity from realtime was ' + sinceLast + 'ms ago; discarding connection state',\r\n );\r\n this.clearConnection();\r\n this.states.connecting.failState = 'suspended';\r\n }\r\n }\r\n\r\n /**\r\n * Called when the connectionmanager wants to persist transport\r\n * state for later recovery. Only applicable in the browser context.\r\n */\r\n persistConnection(): void {\r\n if (haveSessionStorage()) {\r\n const recoveryKey = this.createRecoveryKey();\r\n if (recoveryKey) {\r\n this.setSessionRecoverData({\r\n recoveryKey: recoveryKey,\r\n disconnectedAt: Date.now(),\r\n location: globalObject.location,\r\n clientId: this.realtime.auth.clientId,\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Called when the connectionmanager wants to persist transport\r\n * state for later recovery. Only applicable in the browser context.\r\n */\r\n unpersistConnection(): void {\r\n this.clearSessionRecoverData();\r\n }\r\n\r\n getActiveTransportFormat(): Utils.Format | undefined {\r\n return this.activeProtocol?.getTransport().format;\r\n }\r\n\r\n /*********************\r\n * state management\r\n *********************/\r\n\r\n getError(): IPartialErrorInfo | string {\r\n if (this.errorReason) {\r\n // create new PartialErrorInfo so it has the correct stack trace\r\n // which points to the place which caused us to return this error.\r\n const newError = PartialErrorInfo.fromValues(this.errorReason);\r\n newError.cause = this.errorReason;\r\n return newError;\r\n }\r\n\r\n return this.getStateError();\r\n }\r\n\r\n getStateError(): ErrorInfo {\r\n return (ConnectionErrors as Record<string, () => ErrorInfo>)[this.state.state]?.();\r\n }\r\n\r\n activeState(): boolean | void {\r\n return this.state.queueEvents || this.state.sendEvents;\r\n }\r\n\r\n enactStateChange(stateChange: ConnectionStateChange): void {\r\n const action = 'Connection state';\r\n const message = stateChange.current + (stateChange.reason ? '; reason: ' + stateChange.reason : '');\r\n if (stateChange.current === 'failed') {\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, action, message);\r\n } else {\r\n Logger.logAction(this.logger, Logger.LOG_MAJOR, action, message);\r\n }\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.enactStateChange',\r\n 'setting new state: ' +\r\n stateChange.current +\r\n '; reason = ' +\r\n (stateChange.reason && (stateChange.reason as ErrorInfo).message),\r\n );\r\n const newState = (this.state = this.states[stateChange.current as string]);\r\n if (stateChange.reason) {\r\n this.errorReason = stateChange.reason;\r\n // TODO remove this type assertion after fixing https://github.com/ably/ably-js/issues/1405\r\n this.realtime.connection.errorReason = stateChange.reason as ErrorInfo;\r\n }\r\n if (newState.terminal || newState.state === 'suspended') {\r\n /* suspended is nonterminal, but once in the suspended state, realtime\r\n * will have discarded our connection state, so futher connection\r\n * attempts should start from scratch */\r\n this.clearConnection();\r\n }\r\n this.emit('connectionstate', stateChange);\r\n }\r\n\r\n /****************************************\r\n * ConnectionManager connection lifecycle\r\n ****************************************/\r\n\r\n startTransitionTimer(transitionState: ConnectionState): void {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.startTransitionTimer()',\r\n 'transitionState: ' + transitionState.state,\r\n );\r\n\r\n if (this.transitionTimer) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.startTransitionTimer()',\r\n 'clearing already-running timer',\r\n );\r\n clearTimeout(this.transitionTimer as number);\r\n }\r\n\r\n this.transitionTimer = setTimeout(() => {\r\n if (this.transitionTimer) {\r\n this.transitionTimer = null;\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager ' + transitionState.state + ' timer expired',\r\n 'requesting new state: ' + transitionState.failState,\r\n );\r\n this.notifyState({ state: transitionState.failState as string });\r\n }\r\n }, transitionState.retryDelay);\r\n }\r\n\r\n cancelTransitionTimer(): void {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.cancelTransitionTimer()', '');\r\n if (this.transitionTimer) {\r\n clearTimeout(this.transitionTimer as number);\r\n this.transitionTimer = null;\r\n }\r\n }\r\n\r\n startSuspendTimer(): void {\r\n if (this.suspendTimer) return;\r\n this.suspendTimer = setTimeout(() => {\r\n if (this.suspendTimer) {\r\n this.suspendTimer = null;\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager suspend timer expired',\r\n 'requesting new state: suspended',\r\n );\r\n this.states.connecting.failState = 'suspended';\r\n this.notifyState({ state: 'suspended' });\r\n }\r\n }, this.connectionStateTtl);\r\n }\r\n\r\n checkSuspendTimer(state: string): void {\r\n if (state !== 'disconnected' && state !== 'suspended' && state !== 'connecting') this.cancelSuspendTimer();\r\n }\r\n\r\n cancelSuspendTimer(): void {\r\n this.states.connecting.failState = 'disconnected';\r\n if (this.suspendTimer) {\r\n clearTimeout(this.suspendTimer as number);\r\n this.suspendTimer = null;\r\n }\r\n }\r\n\r\n startRetryTimer(interval: number): void {\r\n this.retryTimer = setTimeout(() => {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager retry timer expired', 'retrying');\r\n this.retryTimer = null;\r\n this.requestState({ state: 'connecting' });\r\n }, interval);\r\n }\r\n\r\n cancelRetryTimer(): void {\r\n if (this.retryTimer) {\r\n clearTimeout(this.retryTimer as NodeJS.Timeout);\r\n this.retryTimer = null;\r\n }\r\n }\r\n\r\n startWebSocketSlowTimer() {\r\n this.webSocketSlowTimer = setTimeout(() => {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager WebSocket slow timer',\r\n 'checking connectivity',\r\n );\r\n this.checkWsConnectivity()\r\n .then(() => {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager WebSocket slow timer',\r\n 'ws connectivity check succeeded',\r\n );\r\n this.wsCheckResult = true;\r\n })\r\n .catch(() => {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MAJOR,\r\n 'ConnectionManager WebSocket slow timer',\r\n 'ws connectivity check failed',\r\n );\r\n this.wsCheckResult = false;\r\n });\r\n if (this.realtime.http.checkConnectivity) {\r\n Utils.whenPromiseSettles(this.realtime.http.checkConnectivity(), (err, connectivity) => {\r\n if (err || !connectivity) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MAJOR,\r\n 'ConnectionManager WebSocket slow timer',\r\n 'http connectivity check failed',\r\n );\r\n this.cancelWebSocketGiveUpTimer();\r\n this.notifyState({\r\n state: 'disconnected',\r\n error: new ErrorInfo('Unable to connect (network unreachable)', 80003, 404),\r\n });\r\n } else {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager WebSocket slow timer',\r\n 'http connectivity check succeeded',\r\n );\r\n }\r\n });\r\n }\r\n }, this.options.timeouts.webSocketSlowTimeout);\r\n }\r\n\r\n cancelWebSocketSlowTimer() {\r\n if (this.webSocketSlowTimer) {\r\n clearTimeout(this.webSocketSlowTimer);\r\n this.webSocketSlowTimer = null;\r\n }\r\n }\r\n\r\n startWebSocketGiveUpTimer(transportParams: TransportParams) {\r\n this.webSocketGiveUpTimer = setTimeout(() => {\r\n if (!this.wsCheckResult) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager WebSocket give up timer',\r\n 'websocket connection took more than 10s; ' + (this.baseTransport ? 'trying base transport' : ''),\r\n );\r\n if (this.baseTransport) {\r\n this.abandonedWebSocket = true;\r\n this.proposedTransport?.dispose();\r\n this.pendingTransport?.dispose();\r\n this.connectBase(transportParams, ++this.connectCounter);\r\n } else {\r\n // if we don't have a base transport to fallback to, just let the websocket connection attempt time out\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MAJOR,\r\n 'ConnectionManager WebSocket give up timer',\r\n 'websocket connectivity appears to be unavailable but no other transports to try',\r\n );\r\n }\r\n }\r\n }, this.options.timeouts.webSocketConnectTimeout);\r\n }\r\n\r\n cancelWebSocketGiveUpTimer() {\r\n if (this.webSocketGiveUpTimer) {\r\n clearTimeout(this.webSocketGiveUpTimer);\r\n this.webSocketGiveUpTimer = null;\r\n }\r\n }\r\n\r\n notifyState(indicated: ConnectionState): void {\r\n const state = indicated.state;\r\n\r\n /* We retry immediately if:\r\n * - something disconnects us while we're connected, or\r\n * - a viable (but not yet active) transport fails due to a token error (so\r\n * this.errorReason will be set, and startConnect will do a forced\r\n * authorize). If this.errorReason is already set (to a token error),\r\n * then there has been at least one previous attempt to connect that also\r\n * failed for a token error, so by RTN14b we go to DISCONNECTED and wait\r\n * before trying again */\r\n const retryImmediately =\r\n state === 'disconnected' &&\r\n (this.state === this.states.connected ||\r\n indicated.retryImmediately ||\r\n (this.state === this.states.connecting &&\r\n indicated.error &&\r\n Auth.isTokenErr(indicated.error) &&\r\n !(this.errorReason && Auth.isTokenErr(this.errorReason as ErrorInfo))));\r\n\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.notifyState()',\r\n 'new state: ' + state + (retryImmediately ? '; will retry connection immediately' : ''),\r\n );\r\n /* do nothing if we're already in the indicated state */\r\n if (state == this.state.state) return;\r\n\r\n /* kill timers (possibly excepting suspend timer depending on the notified\r\n * state), as these are superseded by this notification */\r\n this.cancelTransitionTimer();\r\n this.cancelRetryTimer();\r\n this.cancelWebSocketSlowTimer();\r\n this.cancelWebSocketGiveUpTimer();\r\n this.checkSuspendTimer(indicated.state);\r\n\r\n if (state === 'suspended' || state === 'connected') {\r\n this.disconnectedRetryCount = 0;\r\n }\r\n\r\n /* do nothing if we're unable to move from the current state */\r\n if (this.state.terminal) return;\r\n\r\n /* process new state */\r\n const newState = this.states[indicated.state];\r\n\r\n let retryDelay = newState.retryDelay;\r\n if (newState.state === 'disconnected') {\r\n this.disconnectedRetryCount++;\r\n retryDelay = Utils.getRetryTime(newState.retryDelay as number, this.disconnectedRetryCount);\r\n }\r\n\r\n const change = new ConnectionStateChange(\r\n this.state.state,\r\n newState.state,\r\n retryDelay,\r\n indicated.error || (ConnectionErrors as Partial<Record<string, () => ErrorInfo>>)[newState.state]?.(),\r\n );\r\n\r\n if (retryImmediately) {\r\n const autoReconnect = () => {\r\n if (this.state === this.states.disconnected) {\r\n this.lastAutoReconnectAttempt = Date.now();\r\n this.requestState({ state: 'connecting' });\r\n }\r\n };\r\n const sinceLast = this.lastAutoReconnectAttempt && Date.now() - this.lastAutoReconnectAttempt + 1;\r\n if (sinceLast && sinceLast < 1000) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.notifyState()',\r\n 'Last reconnect attempt was only ' +\r\n sinceLast +\r\n 'ms ago, waiting another ' +\r\n (1000 - sinceLast) +\r\n 'ms before trying again',\r\n );\r\n setTimeout(autoReconnect, 1000 - sinceLast);\r\n } else {\r\n Platform.Config.nextTick(autoReconnect);\r\n }\r\n } else if (state === 'disconnected' || state === 'suspended') {\r\n this.startRetryTimer(retryDelay as number);\r\n }\r\n\r\n /* If going into disconnect/suspended (and not retrying immediately), or a\r\n * terminal state, ensure there are no orphaned transports hanging around. */\r\n if ((state === 'disconnected' && !retryImmediately) || state === 'suspended' || newState.terminal) {\r\n /* Wait till the next tick so the connection state change is enacted,\r\n * so aborting transports doesn't trigger redundant state changes */\r\n Platform.Config.nextTick(() => {\r\n this.disconnectAllTransports();\r\n });\r\n }\r\n\r\n if (state == 'connected' && !this.activeProtocol) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_ERROR,\r\n 'ConnectionManager.notifyState()',\r\n 'Broken invariant: attempted to go into connected state, but there is no active protocol',\r\n );\r\n }\r\n\r\n /* implement the change and notify */\r\n this.enactStateChange(change);\r\n if (this.state.sendEvents) {\r\n this.sendQueuedMessages();\r\n } else if (!this.state.queueEvents) {\r\n this.realtime.channels.propogateConnectionInterruption(state, change.reason);\r\n this.failQueuedMessages(change.reason as ErrorInfo); // RTN7c\r\n }\r\n }\r\n\r\n requestState(request: any): void {\r\n const state = request.state;\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.requestState()',\r\n 'requested state: ' + state + '; current state: ' + this.state.state,\r\n );\r\n if (state == this.state.state) return; /* silently do nothing */\r\n\r\n /* kill running timers, as this request supersedes them */\r\n this.cancelWebSocketSlowTimer();\r\n this.cancelWebSocketGiveUpTimer();\r\n this.cancelTransitionTimer();\r\n this.cancelRetryTimer();\r\n /* for suspend timer check rather than cancel -- eg requesting a connecting\r\n * state should not reset the suspend timer */\r\n this.checkSuspendTimer(state);\r\n\r\n if (state == 'connecting' && this.state.state == 'connected') return;\r\n if (state == 'closing' && this.state.state == 'closed') return;\r\n\r\n const newState = this.states[state],\r\n change = new ConnectionStateChange(\r\n this.state.state,\r\n newState.state,\r\n null,\r\n request.error || (ConnectionErrors as Partial<Record<string, () => ErrorInfo>>)[newState.state]?.(),\r\n );\r\n\r\n this.enactStateChange(change);\r\n\r\n if (state == 'connecting') {\r\n Platform.Config.nextTick(() => {\r\n this.startConnect();\r\n });\r\n }\r\n if (state == 'closing') {\r\n this.closeImpl();\r\n }\r\n }\r\n\r\n startConnect(): void {\r\n if (this.state !== this.states.connecting) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.startConnect()',\r\n 'Must be in connecting state to connect, but was ' + this.state.state,\r\n );\r\n return;\r\n }\r\n\r\n const auth = this.realtime.auth;\r\n\r\n /* The point of the connectCounter mechanism is to ensure that the\r\n * connection procedure can be cancelled. We want disconnectAllTransports\r\n * to be able to stop any in-progress connection, even before it gets to\r\n * the stage of having a pending (or even a proposed) transport that it can\r\n * dispose() of. So we check that it's still current after any async stage,\r\n * up until the stage that is synchronous with instantiating a transport */\r\n const connectCount = ++this.connectCounter;\r\n\r\n const connect = () => {\r\n this.checkConnectionStateFreshness();\r\n this.getTransportParams((transportParams: TransportParams) => {\r\n if (transportParams.mode === 'recover' && transportParams.options.recover) {\r\n const recoveryContext = decodeRecoveryKey(transportParams.options.recover);\r\n if (recoveryContext) {\r\n this.realtime.channels.recoverChannels(recoveryContext.channelSerials);\r\n }\r\n }\r\n\r\n if (connectCount !== this.connectCounter) {\r\n return;\r\n }\r\n this.connectImpl(transportParams, connectCount);\r\n });\r\n };\r\n\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.startConnect()', 'starting connection');\r\n this.startSuspendTimer();\r\n this.startTransitionTimer(this.states.connecting);\r\n\r\n if (auth.method === 'basic') {\r\n connect();\r\n } else {\r\n const authCb = (err: ErrorInfo | null) => {\r\n if (connectCount !== this.connectCounter) {\r\n return;\r\n }\r\n if (err) {\r\n this.actOnErrorFromAuthorize(err);\r\n } else {\r\n connect();\r\n }\r\n };\r\n if (this.errorReason && Auth.isTokenErr(this.errorReason as ErrorInfo)) {\r\n /* Force a refetch of a new token */\r\n Utils.whenPromiseSettles(auth._forceNewToken(null, null), authCb);\r\n } else {\r\n Utils.whenPromiseSettles(auth._ensureValidAuthCredentials(false), authCb);\r\n }\r\n }\r\n }\r\n\r\n /*\r\n * there are, at most, two transports available with which a connection may\r\n * be attempted: web_socket and/or a base transport (xhr_polling in browsers,\r\n * comet in nodejs). web_socket is always preferred, and the base transport is\r\n * only used in case web_socket connectivity appears to be unavailable.\r\n *\r\n * connectImpl begins the transport selection process by checking which transports\r\n * are available, and if there is a cached preference. It then defers to the\r\n * transport-specific connect methods: connectWs and connectBase.\r\n *\r\n * It is also responsible for invalidating the cache in the case that a base\r\n * transport preference is stored but web socket connectivity is now available.\r\n *\r\n * handling of the case where we need to failover from web_socket to the base\r\n * transport is implemented in the connectWs method.\r\n */\r\n connectImpl(transportParams: TransportParams, connectCount: number): void {\r\n const state = this.state.state;\r\n if (state !== this.states.connecting.state) {\r\n /* Only keep trying as long as in the 'connecting' state (or 'connected'\r\n * for upgrading). Any operation can put us into 'disconnected' to cancel\r\n * connection attempts and wait before retrying, or 'failed' to fail. */\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.connectImpl()',\r\n 'Must be in connecting state to connect, but was ' + state,\r\n );\r\n return;\r\n }\r\n\r\n const transportPreference = this.getTransportPreference();\r\n\r\n // If transport preference is for a non-ws transport but websocket is now available, unpersist the preference for next time\r\n if (transportPreference && transportPreference === this.baseTransport && this.webSocketTransportAvailable) {\r\n this.checkWsConnectivity()\r\n .then(() => {\r\n this.unpersistTransportPreference();\r\n if (this.state === this.states.connecting) {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.connectImpl():',\r\n 'web socket connectivity available, cancelling connection attempt with ' + this.baseTransport,\r\n );\r\n this.disconnectAllTransports();\r\n this.connectWs(transportParams, ++this.connectCounter);\r\n }\r\n })\r\n .catch(noop);\r\n }\r\n\r\n if (\r\n (transportPreference && transportPreference === this.baseTransport) ||\r\n (this.baseTransport && !this.webSocketTransportAvailable)\r\n ) {\r\n this.connectBase(transportParams, connectCount);\r\n } else {\r\n this.connectWs(transportParams, connectCount);\r\n }\r\n }\r\n\r\n /*\r\n * connectWs starts two timers to monitor the success of a web_socket connection attempt:\r\n * - webSocketSlowTimer: if this timer fires before the connection succeeds,\r\n * cm will simultaneously check websocket and http/xhr connectivity. if the http\r\n * connectivity check fails, we give up the connection sequence entirely and\r\n * transition to disconnected. if the websocket connectivity check fails then\r\n * we assume no ws connectivity and failover to base transport. in the case that\r\n * the checks succeed, we continue with websocket and wait for it to try fallback hosts\r\n * and, if unsuccessful, ultimately transition to disconnected.\r\n * - webSocketGiveUpTimer: if this timer fires, and the preceding websocket\r\n * connectivity check is still pending then we assume that there is an issue\r\n * with the transport and fallback to base transport.\r\n */\r\n connectWs(transportParams: TransportParams, connectCount: number) {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.connectWs()');\r\n this.wsCheckResult = null;\r\n this.abandonedWebSocket = false;\r\n this.startWebSocketSlowTimer();\r\n this.startWebSocketGiveUpTimer(transportParams);\r\n\r\n this.tryTransportWithFallbacks('web_socket', transportParams, true, connectCount, () => {\r\n return this.wsCheckResult !== false && !this.abandonedWebSocket;\r\n });\r\n }\r\n\r\n connectBase(transportParams: TransportParams, connectCount: number) {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.connectBase()');\r\n if (this.baseTransport) {\r\n this.tryTransportWithFallbacks(this.baseTransport, transportParams, false, connectCount, () => true);\r\n } else {\r\n this.notifyState({\r\n state: 'disconnected',\r\n error: new ErrorInfo('No transports left to try', 80000, 404),\r\n });\r\n }\r\n }\r\n\r\n tryTransportWithFallbacks(\r\n transportName: TransportName,\r\n transportParams: TransportParams,\r\n ws: boolean,\r\n connectCount: number,\r\n shouldContinue: () => boolean,\r\n ): void {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.tryTransportWithFallbacks()',\r\n transportName,\r\n );\r\n const giveUp = (err: IPartialErrorInfo) => {\r\n this.notifyState({ state: this.states.connecting.failState as string, error: err });\r\n };\r\n\r\n const candidateHosts = this.domains.slice();\r\n\r\n const hostAttemptCb = (fatal: boolean, transport: Transport) => {\r\n if (connectCount !== this.connectCounter) {\r\n return;\r\n }\r\n if (!shouldContinue()) {\r\n if (transport) {\r\n transport.dispose();\r\n }\r\n return;\r\n }\r\n if (!transport && !fatal) {\r\n tryFallbackHosts();\r\n }\r\n };\r\n\r\n /* first try to establish a connection with the priority host with http transport */\r\n const host = candidateHosts.shift();\r\n if (!host) {\r\n giveUp(new ErrorInfo('Unable to connect (no available host)', 80003, 404));\r\n return;\r\n }\r\n transportParams.host = host;\r\n\r\n /* this is what we'll be doing if the attempt for the main host fails */\r\n const tryFallbackHosts = () => {\r\n /* if there aren't any fallback hosts, fail */\r\n if (!candidateHosts.length) {\r\n giveUp(new ErrorInfo('Unable to connect (and no more fallback hosts to try)', 80003, 404));\r\n return;\r\n }\r\n /* before trying any fallback (or any remaining fallback) we decide if\r\n * there is a problem with the ably host, or there is a general connectivity\r\n * problem */\r\n if (!this.realtime.http.checkConnectivity) {\r\n giveUp(new PartialErrorInfo('Internal error: Http.checkConnectivity not set', null, 500));\r\n return;\r\n }\r\n Utils.whenPromiseSettles(\r\n this.realtime.http.checkConnectivity(),\r\n (err?: ErrorInfo | null, connectivity?: boolean) => {\r\n if (connectCount !== this.connectCounter) {\r\n return;\r\n }\r\n if (!shouldContinue()) {\r\n return;\r\n }\r\n /* we know err won't happen but handle it here anyway */\r\n if (err) {\r\n giveUp(err);\r\n return;\r\n }\r\n if (!connectivity) {\r\n /* the internet isn't reachable, so don't try the fallback hosts */\r\n giveUp(new ErrorInfo('Unable to connect (network unreachable)', 80003, 404));\r\n return;\r\n }\r\n /* the network is there, so there's a problem with the main host, or\r\n * its dns. Try the fallback hosts. We could try them simultaneously but\r\n * that would potentially cause a huge spike in load on the load balancer */\r\n transportParams.host = Utils.arrPopRandomElement(candidateHosts);\r\n this.tryATransport(transportParams, transportName, hostAttemptCb);\r\n },\r\n );\r\n };\r\n\r\n if (this.forceFallbackHost && candidateHosts.length) {\r\n this.forceFallbackHost = false;\r\n tryFallbackHosts();\r\n return;\r\n }\r\n\r\n this.tryATransport(transportParams, transportName, hostAttemptCb);\r\n }\r\n\r\n closeImpl(): void {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.closeImpl()', 'closing connection');\r\n this.cancelSuspendTimer();\r\n this.startTransitionTimer(this.states.closing);\r\n\r\n if (this.pendingTransport) {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.closeImpl()',\r\n 'Closing pending transport: ' + this.pendingTransport,\r\n );\r\n this.pendingTransport.close();\r\n }\r\n\r\n if (this.activeProtocol) {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.closeImpl()',\r\n 'Closing active transport: ' + this.activeProtocol.getTransport(),\r\n );\r\n this.activeProtocol.getTransport().close();\r\n }\r\n\r\n /* If there was an active transport, this will probably be\r\n * preempted by the notifyState call in deactivateTransport */\r\n this.notifyState({ state: 'closed' });\r\n }\r\n\r\n onAuthUpdated(tokenDetails: API.TokenDetails, callback: Function): void {\r\n switch (this.state.state) {\r\n case 'connected': {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.onAuthUpdated()',\r\n 'Sending AUTH message on active transport',\r\n );\r\n\r\n /* Do any transport-specific new-token action */\r\n const activeTransport = this.activeProtocol?.getTransport();\r\n if (activeTransport && activeTransport.onAuthUpdated) {\r\n activeTransport.onAuthUpdated(tokenDetails);\r\n }\r\n\r\n const authMsg = protocolMessageFromValues({\r\n action: actions.AUTH,\r\n auth: {\r\n accessToken: tokenDetails.token,\r\n },\r\n });\r\n this.send(authMsg);\r\n\r\n /* The answer will come back as either a connectiondetails event\r\n * (realtime sends a CONNECTED to acknowledge the reauth) or a\r\n * statechange to failed */\r\n const successListener = () => {\r\n this.off(failureListener);\r\n callback(null, tokenDetails);\r\n };\r\n const failureListener = (stateChange: ConnectionStateChange) => {\r\n if (stateChange.current === 'failed') {\r\n this.off(successListener);\r\n this.off(failureListener);\r\n callback(stateChange.reason || this.getStateError());\r\n }\r\n };\r\n this.once('connectiondetails', successListener);\r\n this.on('connectionstate', failureListener);\r\n break;\r\n }\r\n\r\n case 'connecting':\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.onAuthUpdated()',\r\n 'Aborting current connection attempts in order to start again with the new auth details',\r\n );\r\n this.disconnectAllTransports();\r\n /* fallthrough to add statechange listener */\r\n\r\n default: {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.onAuthUpdated()',\r\n 'Connection state is ' + this.state.state + '; waiting until either connected or failed',\r\n );\r\n const listener = (stateChange: ConnectionStateChange) => {\r\n switch (stateChange.current) {\r\n case 'connected':\r\n this.off(listener);\r\n callback(null, tokenDetails);\r\n break;\r\n case 'failed':\r\n case 'closed':\r\n case 'suspended':\r\n this.off(listener);\r\n callback(stateChange.reason || this.getStateError());\r\n break;\r\n default:\r\n /* ignore till we get either connected or failed */\r\n break;\r\n }\r\n };\r\n this.on('connectionstate', listener);\r\n if (this.state.state === 'connecting') {\r\n /* can happen if in the connecting state but no transport was pending\r\n * yet, so disconnectAllTransports did not trigger a disconnected state */\r\n this.startConnect();\r\n } else {\r\n this.requestState({ state: 'connecting' });\r\n }\r\n }\r\n }\r\n }\r\n\r\n disconnectAllTransports(): void {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MINOR,\r\n 'ConnectionManager.disconnectAllTransports()',\r\n 'Disconnecting all transports',\r\n );\r\n\r\n /* This will prevent any connection procedure in an async part of one of its early stages from continuing */\r\n this.connectCounter++;\r\n\r\n if (this.pendingTransport) {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.disconnectAllTransports()',\r\n 'Disconnecting pending transport: ' + this.pendingTransport,\r\n );\r\n this.pendingTransport.disconnect();\r\n }\r\n delete this.pendingTransport;\r\n\r\n if (this.proposedTransport) {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.disconnectAllTransports()',\r\n 'Disconnecting proposed transport: ' + this.pendingTransport,\r\n );\r\n this.proposedTransport.disconnect();\r\n }\r\n delete this.pendingTransport;\r\n\r\n if (this.activeProtocol) {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.disconnectAllTransports()',\r\n 'Disconnecting active transport: ' + this.activeProtocol.getTransport(),\r\n );\r\n this.activeProtocol.getTransport().disconnect();\r\n }\r\n /* No need to notify state disconnected; disconnecting the active transport\r\n * will have that effect */\r\n }\r\n\r\n /******************\r\n * event queueing\r\n ******************/\r\n\r\n send(msg: ProtocolMessage, queueEvent?: boolean, callback?: ErrCallback): void {\r\n callback = callback || noop;\r\n const state = this.state;\r\n\r\n if (state.sendEvents) {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.send()', 'sending event');\r\n this.sendImpl(new PendingMessage(msg, callback));\r\n return;\r\n }\r\n const shouldQueue = queueEvent && state.queueEvents;\r\n if (!shouldQueue) {\r\n const err = 'rejecting event, queueEvent was ' + queueEvent + ', state was ' + state.state;\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.send()', err);\r\n callback(this.errorReason || new ErrorInfo(err, 90000, 400));\r\n return;\r\n }\r\n if (this.logger.shouldLog(Logger.LOG_MICRO)) {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.send()',\r\n 'queueing msg; ' +\r\n stringifyProtocolMessage(\r\n msg,\r\n this.realtime._RealtimePresence,\r\n this.realtime._Annotations,\r\n this.realtime._objectsPlugin,\r\n ),\r\n );\r\n }\r\n this.queue(msg, callback);\r\n }\r\n\r\n sendImpl(pendingMessage: PendingMessage): void {\r\n const msg = pendingMessage.message;\r\n /* If have already attempted to send this, resend with the same msgSerial,\r\n * so Ably can dedup if the previous send succeeded */\r\n if (pendingMessage.ackRequired && !pendingMessage.sendAttempted) {\r\n msg.msgSerial = this.msgSerial++;\r\n }\r\n try {\r\n (this.activeProtocol as Protocol).send(pendingMessage);\r\n } catch (e) {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_ERROR,\r\n 'ConnectionManager.sendImpl()',\r\n 'Unexpected exception in transport.send(): ' + (e as Error).stack,\r\n );\r\n }\r\n }\r\n\r\n queue(msg: ProtocolMessage, callback: ErrCallback): void {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.queue()', 'queueing event');\r\n const lastQueued = this.queuedMessages.last();\r\n const maxSize = this.options.maxMessageSize;\r\n /* If have already attempted to send a message, don't merge more messages\r\n * into it, as if the previous send actually succeeded and realtime ignores\r\n * the dup, they'll be lost */\r\n if (lastQueued && !lastQueued.sendAttempted && bundleWith(lastQueued.message, msg, maxSize)) {\r\n if (!lastQueued.merged) {\r\n lastQueued.callback = Multicaster.create(this.logger, [lastQueued.callback]);\r\n lastQueued.merged = true;\r\n }\r\n (lastQueued.callback as MulticasterInstance<void>).push(callback);\r\n } else {\r\n this.queuedMessages.push(new PendingMessage(msg, callback));\r\n }\r\n }\r\n\r\n sendQueuedMessages(): void {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.sendQueuedMessages()',\r\n 'sending ' + this.queuedMessages.count() + ' queued messages',\r\n );\r\n let pendingMessage;\r\n while ((pendingMessage = this.queuedMessages.shift())) this.sendImpl(pendingMessage);\r\n }\r\n\r\n queuePendingMessages(pendingMessages: Array<PendingMessage>): void {\r\n if (pendingMessages && pendingMessages.length) {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_MICRO,\r\n 'ConnectionManager.queuePendingMessages()',\r\n 'queueing ' + pendingMessages.length + ' pending messages',\r\n );\r\n this.queuedMessages.prepend(pendingMessages);\r\n }\r\n }\r\n\r\n failQueuedMessages(err: ErrorInfo): void {\r\n const numQueued = this.queuedMessages.count();\r\n if (numQueued > 0) {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_ERROR,\r\n 'ConnectionManager.failQueuedMessages()',\r\n 'failing ' + numQueued + ' queued messages, err = ' + Utils.inspectError(err),\r\n );\r\n this.queuedMessages.completeAllMessages(err);\r\n }\r\n }\r\n\r\n onChannelMessage(message: ProtocolMessage, transport: Transport): void {\r\n this.pendingChannelMessagesState.queue.push({ message, transport });\r\n\r\n if (!this.pendingChannelMessagesState.isProcessing) {\r\n this.processNextPendingChannelMessage();\r\n }\r\n }\r\n\r\n private processNextPendingChannelMessage() {\r\n if (this.pendingChannelMessagesState.queue.length > 0) {\r\n this.pendingChannelMessagesState.isProcessing = true;\r\n\r\n const pendingChannelMessage = this.pendingChannelMessagesState.queue.shift()!;\r\n this.processChannelMessage(pendingChannelMessage.message)\r\n .catch((err) => {\r\n Logger.logAction(\r\n this.logger,\r\n\r\n Logger.LOG_ERROR,\r\n 'ConnectionManager.processNextPendingChannelMessage() received error ',\r\n err,\r\n );\r\n })\r\n .finally(() => {\r\n this.pendingChannelMessagesState.isProcessing = false;\r\n this.processNextPendingChannelMessage();\r\n });\r\n }\r\n }\r\n\r\n private async processChannelMessage(message: ProtocolMessage) {\r\n await this.realtime.channels.processChannelMessage(message);\r\n }\r\n\r\n async ping(): Promise<number> {\r\n if (this.state.state !== 'connected') {\r\n throw new ErrorInfo('Unable to ping service; not connected', 40000, 400);\r\n }\r\n\r\n const transport = this.activeProtocol?.getTransport();\r\n if (!transport) {\r\n throw this.getStateError();\r\n }\r\n\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.ping()', 'transport = ' + transport);\r\n\r\n const pingStart = Date.now();\r\n const id = Utils.cheapRandStr();\r\n\r\n return Utils.withTimeoutAsync<number>(\r\n new Promise((resolve) => {\r\n const onHeartbeat = (responseId: string) => {\r\n if (responseId === id) {\r\n transport.off('heartbeat', onHeartbeat);\r\n resolve(Date.now() - pingStart);\r\n }\r\n };\r\n transport.on('heartbeat', onHeartbeat);\r\n transport.ping(id);\r\n }),\r\n this.options.timeouts.realtimeRequestTimeout,\r\n 'Timeout waiting for heartbeat response',\r\n );\r\n }\r\n\r\n abort(error: ErrorInfo): void {\r\n (this.activeProtocol as Protocol).getTransport().fail(error);\r\n }\r\n\r\n getTransportPreference(): TransportName {\r\n return this.transportPreference || (haveWebStorage() && Platform.WebStorage?.get?.(transportPreferenceName));\r\n }\r\n\r\n persistTransportPreference(transport: Transport): void {\r\n this.transportPreference = transport.shortName;\r\n if (haveWebStorage()) {\r\n Platform.WebStorage?.set?.(transportPreferenceName, transport.shortName);\r\n }\r\n }\r\n\r\n unpersistTransportPreference(): void {\r\n this.transportPreference = null;\r\n if (haveWebStorage()) {\r\n Platform.WebStorage?.remove?.(transportPreferenceName);\r\n }\r\n }\r\n\r\n /* This method is only used during connection attempts, so implements RSA4c1, RSA4c2,\r\n * and RSA4d. It is generally not invoked for serverside-triggered reauths or manual\r\n * reauths, so RSA4c3 does not apply, except (per per RSA4d1) in the case that the auth\r\n * server returns 403. */\r\n actOnErrorFromAuthorize(err: ErrorInfo): void {\r\n if (err.code === 40171) {\r\n /* No way to reauth */\r\n this.notifyState({ state: 'failed', error: err });\r\n } else if (err.code === 40102) {\r\n this.notifyState({ state: 'failed', error: err });\r\n } else if (err.statusCode === HttpStatusCodes.Forbidden) {\r\n const msg = 'Client configured authentication provider returned 403; failing the connection';\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'ConnectionManager.actOnErrorFromAuthorize()', msg);\r\n this.notifyState({ state: 'failed', error: new ErrorInfo(msg, 80019, 403, err) });\r\n } else {\r\n const msg = 'Client configured authentication provider request failed';\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.actOnErrorFromAuthorize', msg);\r\n this.notifyState({ state: this.state.failState as string, error: new ErrorInfo(msg, 80019, 401, err) });\r\n }\r\n }\r\n\r\n onConnectionDetailsUpdate(connectionDetails: Record<string, any>, transport: Transport): void {\r\n if (!connectionDetails) {\r\n return;\r\n }\r\n this.connectionDetails = connectionDetails;\r\n if (connectionDetails.maxMessageSize) {\r\n this.options.maxMessageSize = connectionDetails.maxMessageSize;\r\n }\r\n const clientId = connectionDetails.clientId;\r\n if (clientId) {\r\n const err = this.realtime.auth._uncheckedSetClientId(clientId);\r\n if (err) {\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'ConnectionManager.onConnectionDetailsUpdate()', err.message);\r\n /* Errors setting the clientId are fatal to the connection */\r\n transport.fail(err);\r\n return;\r\n }\r\n }\r\n const connectionStateTtl = connectionDetails.connectionStateTtl;\r\n if (connectionStateTtl) {\r\n this.connectionStateTtl = connectionStateTtl;\r\n }\r\n this.maxIdleInterval = connectionDetails.maxIdleInterval;\r\n this.emit('connectiondetails', connectionDetails);\r\n }\r\n\r\n checkWsConnectivity() {\r\n const wsConnectivityCheckUrl = this.options.wsConnectivityCheckUrl || Defaults.wsConnectivityCheckUrl;\r\n const ws = new Platform.Config.WebSocket(wsConnectivityCheckUrl);\r\n return new Promise<void>((resolve, reject) => {\r\n let finished = false;\r\n ws.onopen = () => {\r\n if (!finished) {\r\n finished = true;\r\n resolve();\r\n ws.close();\r\n }\r\n };\r\n\r\n ws.onclose = ws.onerror = () => {\r\n if (!finished) {\r\n finished = true;\r\n reject();\r\n }\r\n };\r\n });\r\n }\r\n\r\n sessionRecoveryName() {\r\n return this.options.recoveryKeyStorageName || 'ably-connection-recovery';\r\n }\r\n\r\n getSessionRecoverData() {\r\n return haveSessionStorage() && Platform.WebStorage?.getSession?.(this.sessionRecoveryName());\r\n }\r\n setSessionRecoverData(value: any) {\r\n return haveSessionStorage() && Platform.WebStorage?.setSession?.(this.sessionRecoveryName(), value);\r\n }\r\n clearSessionRecoverData() {\r\n return haveSessionStorage() && Platform.WebStorage?.removeSession?.(this.sessionRecoveryName());\r\n }\r\n}\r\n\r\nexport default ConnectionManager;\r\n\r\nexport interface TransportStorage {\r\n supportedTransports: Partial<Record<TransportName, TransportCtor>>;\r\n}\r\n", "import EventEmitter from '../util/eventemitter';\nimport ConnectionManager from '../transport/connectionmanager';\nimport Logger from '../util/logger';\nimport ConnectionStateChange from './connectionstatechange';\nimport ErrorInfo from '../types/errorinfo';\nimport { NormalisedClientOptions } from '../../types/ClientOptions';\nimport BaseRealtime from './baserealtime';\nimport Platform from 'common/platform';\n\nclass Connection extends EventEmitter {\n ably: BaseRealtime;\n connectionManager: ConnectionManager;\n state: string;\n key?: string;\n id?: string;\n errorReason: ErrorInfo | null;\n\n constructor(ably: BaseRealtime, options: NormalisedClientOptions) {\n super(ably.logger);\n this.ably = ably;\n this.connectionManager = new ConnectionManager(ably, options);\n this.state = this.connectionManager.state.state;\n this.key = undefined;\n this.id = undefined;\n this.errorReason = null;\n\n this.connectionManager.on('connectionstate', (stateChange: ConnectionStateChange) => {\n const state = (this.state = stateChange.current as string);\n Platform.Config.nextTick(() => {\n this.emit(state, stateChange);\n });\n });\n this.connectionManager.on('update', (stateChange: ConnectionStateChange) => {\n Platform.Config.nextTick(() => {\n this.emit('update', stateChange);\n });\n });\n }\n\n whenState = ((state: string) => {\n return EventEmitter.prototype.whenState.call(this, state, this.state);\n }) as any;\n\n connect(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Connection.connect()', '');\n this.connectionManager.requestState({ state: 'connecting' });\n }\n\n async ping(): Promise<number> {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Connection.ping()', '');\n return this.connectionManager.ping();\n }\n\n close(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Connection.close()', 'connectionKey = ' + this.key);\n this.connectionManager.requestState({ state: 'closing' });\n }\n\n get recoveryKey(): string | null {\n this.logger.deprecationWarning(\n 'The `Connection.recoveryKey` attribute has been replaced by the `Connection.createRecoveryKey()` method. Replace your usage of `recoveryKey` with the return value of `createRecoveryKey()`. `recoveryKey` will be removed in a future version.',\n );\n return this.createRecoveryKey();\n }\n\n createRecoveryKey(): string | null {\n return this.connectionManager.createRecoveryKey();\n }\n}\n\nexport default Connection;\n", "import * as Utils from '../util/utils';\nimport BaseClient from './baseclient';\nimport EventEmitter from '../util/eventemitter';\nimport Logger from '../util/logger';\nimport Connection from './connection';\nimport RealtimeChannel from './realtimechannel';\nimport ErrorInfo from '../types/errorinfo';\nimport ProtocolMessage from '../types/protocolmessage';\nimport { ChannelOptions } from '../../types/channel';\nimport ClientOptions from '../../types/ClientOptions';\nimport * as API from '../../../../ably';\nimport { ModularPlugins, RealtimePresencePlugin } from './modularplugins';\nimport { TransportNames } from 'common/constants/TransportName';\nimport { TransportImplementations } from 'common/platform';\nimport Defaults from '../util/defaults';\nimport type * as ObjectsPlugin from 'plugins/objects';\n\n/**\n `BaseRealtime` is an export of the tree-shakable version of the SDK, and acts as the base class for the `DefaultRealtime` class exported by the non tree-shakable version.\n */\nclass BaseRealtime extends BaseClient {\n readonly _RealtimePresence: RealtimePresencePlugin | null;\n readonly _objectsPlugin: typeof ObjectsPlugin | null;\n // Extra transport implementations available to this client, in addition to those in Platform.Transports.bundledImplementations\n readonly _additionalTransportImplementations: TransportImplementations;\n _channels: any;\n connection: Connection;\n\n // internal API to make EventEmitter usable in other SDKs\n static readonly EventEmitter = EventEmitter;\n\n /*\n * The public typings declare that this only accepts an object, but since we want to emit a good error message in the case where a non-TypeScript user does one of these things:\n *\n * 1. passes a string (which is quite likely if they\u2019re e.g. migrating from the default variant to the modular variant)\n * 2. passes no argument at all\n *\n * tell the compiler that these cases are possible so that it forces us to handle them.\n */\n constructor(options?: ClientOptions | string) {\n super(Defaults.objectifyOptions(options, false, 'BaseRealtime', Logger.defaultLogger));\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Realtime()', '');\n\n // currently we cannot support using Ably.Realtime instances in Vercel Edge runtime.\n // this error can be removed after fixing https://github.com/ably/ably-js/issues/1731,\n // and https://github.com/ably/ably-js/issues/1732\n // @ts-ignore\n if (typeof EdgeRuntime === 'string') {\n throw new ErrorInfo(\n `Ably.Realtime instance cannot be used in Vercel Edge runtime.` +\n ` If you are running Vercel Edge functions, please replace your` +\n ` \"new Ably.Realtime()\" with \"new Ably.Rest()\" and use Ably Rest API` +\n ` instead of the Realtime API. If you are server-rendering your application` +\n ` in the Vercel Edge runtime, please use the condition \"if (typeof EdgeRuntime === 'string')\"` +\n ` to prevent instantiating Ably.Realtime instance during SSR in the Vercel Edge runtime.`,\n 40000,\n 400,\n );\n }\n\n this._additionalTransportImplementations = BaseRealtime.transportImplementationsFromPlugins(this.options.plugins);\n this._RealtimePresence = this.options.plugins?.RealtimePresence ?? null;\n this._objectsPlugin = this.options.plugins?.Objects ?? null;\n this.connection = new Connection(this, this.options);\n this._channels = new Channels(this);\n if (this.options.autoConnect !== false) this.connect();\n }\n\n private static transportImplementationsFromPlugins(plugins?: ModularPlugins) {\n const transports: TransportImplementations = {};\n\n if (plugins?.WebSocketTransport) {\n transports[TransportNames.WebSocket] = plugins.WebSocketTransport;\n }\n if (plugins?.XHRPolling) {\n transports[TransportNames.XhrPolling] = plugins.XHRPolling;\n }\n\n return transports;\n }\n\n get channels() {\n return this._channels;\n }\n\n connect(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Realtime.connect()', '');\n this.connection.connect();\n }\n\n close(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'Realtime.close()', '');\n this.connection.close();\n }\n}\n\nclass Channels extends EventEmitter {\n realtime: BaseRealtime;\n // RSN2\n all: Record<string, RealtimeChannel>;\n\n constructor(realtime: BaseRealtime) {\n super(realtime.logger);\n this.realtime = realtime;\n this.all = Object.create(null);\n realtime.connection.connectionManager.on('transport.active', () => {\n this.onTransportActive();\n });\n }\n\n channelSerials(): { [name: string]: string } {\n let serials: { [name: string]: string } = {};\n for (const name of Utils.keysArray(this.all, true)) {\n const channel = this.all[name];\n if (channel.properties.channelSerial) {\n serials[name] = channel.properties.channelSerial;\n }\n }\n return serials;\n }\n\n // recoverChannels gets the given channels and sets their channel serials.\n recoverChannels(channelSerials: { [name: string]: string }) {\n for (const name of Utils.keysArray(channelSerials, true)) {\n const channel = this.get(name);\n channel.properties.channelSerial = channelSerials[name];\n }\n }\n\n // Access to this method is synchronised by ConnectionManager#processChannelMessage.\n async processChannelMessage(msg: ProtocolMessage) {\n const channelName = msg.channel;\n if (channelName === undefined) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'Channels.processChannelMessage()',\n 'received event unspecified channel, action = ' + msg.action,\n );\n return;\n }\n const channel = this.all[channelName];\n if (!channel) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'Channels.processChannelMessage()',\n 'received event for non-existent channel: ' + channelName,\n );\n return;\n }\n await channel.processMessage(msg);\n }\n\n /* called when a transport becomes connected; reattempt attach/detach\n * for channels that are attaching or detaching. */\n onTransportActive() {\n for (const channelName in this.all) {\n const channel = this.all[channelName];\n if (channel.state === 'attaching' || channel.state === 'detaching') {\n channel.checkPendingState();\n } else if (channel.state === 'suspended') {\n channel._attach(false, null);\n } else if (channel.state === 'attached') {\n // Note explicity request the state, channel.attach() would do nothing\n // as its already attached.\n channel.requestState('attaching');\n }\n }\n }\n\n /* Connection interruptions (ie when the connection will no longer queue\n * events) imply connection state changes for any channel which is either\n * attached, pending, or will attempt to become attached in the future */\n propogateConnectionInterruption(connectionState: string, reason: ErrorInfo) {\n const connectionStateToChannelState: Record<string, API.ChannelState> = {\n closing: 'detached',\n closed: 'detached',\n failed: 'failed',\n suspended: 'suspended',\n };\n const fromChannelStates = ['attaching', 'attached', 'detaching', 'suspended'];\n const toChannelState = connectionStateToChannelState[connectionState];\n\n for (const channelId in this.all) {\n const channel = this.all[channelId];\n if (fromChannelStates.includes(channel.state)) {\n channel.notifyState(toChannelState, reason);\n }\n }\n }\n\n get(name: string, channelOptions?: ChannelOptions) {\n name = String(name);\n let channel = this.all[name];\n if (!channel) {\n channel = this.all[name] = new RealtimeChannel(this.realtime, name, channelOptions);\n } else if (channelOptions) {\n if (channel._shouldReattachToSetOptions(channelOptions, channel.channelOptions)) {\n throw new ErrorInfo(\n 'Channels.get() cannot be used to set channel options that would cause the channel to reattach. Please, use RealtimeChannel.setOptions() instead.',\n 40000,\n 400,\n );\n }\n channel.setOptions(channelOptions);\n }\n return channel;\n }\n\n getDerived(name: string, deriveOptions: API.DeriveOptions, channelOptions?: ChannelOptions) {\n if (deriveOptions.filter) {\n const filter = Utils.toBase64(deriveOptions.filter);\n const match = Utils.matchDerivedChannel(name);\n name = `[filter=${filter}${match.qualifierParam}]${match.channelName}`;\n }\n return this.get(name, channelOptions);\n }\n\n /* Included to support certain niche use-cases; most users should ignore this.\n * Please do not use this unless you know what you're doing */\n release(name: string) {\n name = String(name);\n const channel = this.all[name];\n if (!channel) {\n return;\n }\n const releaseErr = channel.getReleaseErr();\n if (releaseErr) {\n throw releaseErr;\n }\n delete this.all[name];\n }\n}\n\nexport default BaseRealtime;\n", "import * as Utils from '../util/utils';\nimport EventEmitter from '../util/eventemitter';\nimport Logger from '../util/logger';\nimport PresenceMessage from '../types/presencemessage';\n\nimport type RealtimePresence from './realtimepresence';\n\ntype compFn = (item: PresenceMessage, existing: PresenceMessage) => boolean;\n\nexport interface RealtimePresenceParams {\n waitForSync?: boolean;\n clientId?: string;\n connectionId?: string;\n}\n\nfunction newerThan(item: PresenceMessage, existing: PresenceMessage): boolean {\n /* RTP2b1: if either is synthesised, compare by timestamp */\n if (item.isSynthesized() || existing.isSynthesized()) {\n // RTP2b1a: if equal, prefer the newly-arrived one\n return (item.timestamp as number) >= (existing.timestamp as number);\n }\n\n /* RTP2b2 */\n const itemOrderings = item.parseId(),\n existingOrderings = existing.parseId();\n if (itemOrderings.msgSerial === existingOrderings.msgSerial) {\n return itemOrderings.index > existingOrderings.index;\n } else {\n return itemOrderings.msgSerial > existingOrderings.msgSerial;\n }\n}\n\nexport class PresenceMap extends EventEmitter {\n map: Record<string, PresenceMessage>;\n residualMembers: Record<string, PresenceMessage> | null;\n syncInProgress: boolean;\n presence: RealtimePresence;\n memberKey: (item: PresenceMessage) => string;\n newerThan: compFn;\n\n constructor(presence: RealtimePresence, memberKey: (item: PresenceMessage) => string, newer: compFn = newerThan) {\n super(presence.logger);\n this.presence = presence;\n this.map = Object.create(null);\n this.syncInProgress = false;\n this.residualMembers = null;\n this.memberKey = memberKey;\n this.newerThan = newer;\n }\n\n get(key: string) {\n return this.map[key];\n }\n\n getClient(clientId: string) {\n const map = this.map,\n result = [];\n for (const key in map) {\n const item = map[key];\n if (item.clientId == clientId && item.action != 'absent') result.push(item);\n }\n return result;\n }\n\n list(params: RealtimePresenceParams) {\n const map = this.map,\n clientId = params && params.clientId,\n connectionId = params && params.connectionId,\n result = [];\n\n for (const key in map) {\n const item = map[key];\n if (item.action === 'absent') continue;\n if (clientId && clientId != item.clientId) continue;\n if (connectionId && connectionId != item.connectionId) continue;\n result.push(item);\n }\n return result;\n }\n\n put(item: PresenceMessage) {\n if (item.action === 'enter' || item.action === 'update') {\n item = PresenceMessage.fromValues(item);\n item.action = 'present';\n }\n const map = this.map,\n key = this.memberKey(item);\n /* we've seen this member, so do not remove it at the end of sync */\n if (this.residualMembers) delete this.residualMembers[key];\n\n /* compare the timestamp of the new item with any existing member (or ABSENT witness) */\n const existingItem = map[key];\n if (existingItem && !this.newerThan(item, existingItem)) {\n return false;\n }\n map[key] = item;\n return true;\n }\n\n values() {\n const map = this.map,\n result = [];\n for (const key in map) {\n const item = map[key];\n if (item.action != 'absent') result.push(item);\n }\n return result;\n }\n\n remove(item: PresenceMessage) {\n const map = this.map,\n key = this.memberKey(item);\n const existingItem = map[key];\n\n if (existingItem && !this.newerThan(item, existingItem)) {\n return false;\n }\n\n /* RTP2f */\n if (this.syncInProgress) {\n item = PresenceMessage.fromValues(item);\n item.action = 'absent';\n map[key] = item;\n } else {\n delete map[key];\n }\n\n return !!existingItem;\n }\n\n startSync() {\n const map = this.map,\n syncInProgress = this.syncInProgress;\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'PresenceMap.startSync()',\n 'channel = ' + this.presence.channel.name + '; syncInProgress = ' + syncInProgress,\n );\n /* we might be called multiple times while a sync is in progress */\n if (!this.syncInProgress) {\n this.residualMembers = Utils.copy(map);\n this.setInProgress(true);\n }\n }\n\n endSync() {\n const map = this.map,\n syncInProgress = this.syncInProgress;\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'PresenceMap.endSync()',\n 'channel = ' + this.presence.channel.name + '; syncInProgress = ' + syncInProgress,\n );\n if (syncInProgress) {\n /* we can now strip out the ABSENT members, as we have\n * received all of the out-of-order sync messages */\n for (const memberKey in map) {\n const entry = map[memberKey];\n if (entry.action === 'absent') {\n delete map[memberKey];\n }\n }\n /* any members that were present at the start of the sync,\n * and have not been seen in sync, can be removed, and leave events emitted */\n this.presence._synthesizeLeaves(Utils.valuesArray(this.residualMembers as Record<string, PresenceMessage>));\n for (const memberKey in this.residualMembers) {\n delete map[memberKey];\n }\n this.residualMembers = null;\n\n /* finish, notifying any waiters */\n this.setInProgress(false);\n }\n this.emit('sync');\n }\n\n waitSync(callback: () => void) {\n const syncInProgress = this.syncInProgress;\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'PresenceMap.waitSync()',\n 'channel = ' + this.presence.channel.name + '; syncInProgress = ' + syncInProgress,\n );\n if (!syncInProgress) {\n callback();\n return;\n }\n this.once('sync', callback);\n }\n\n clear() {\n this.map = {};\n this.setInProgress(false);\n this.residualMembers = null;\n }\n\n setInProgress(inProgress: boolean) {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'PresenceMap.setInProgress()', 'inProgress = ' + inProgress);\n this.syncInProgress = inProgress;\n this.presence.syncComplete = !inProgress;\n }\n}\n", "import * as Utils from '../util/utils';\nimport EventEmitter from '../util/eventemitter';\nimport Logger from '../util/logger';\nimport PresenceMessage, { WirePresenceMessage } from '../types/presencemessage';\nimport type { CipherOptions } from '../types/basemessage';\nimport ErrorInfo, { PartialErrorInfo } from '../types/errorinfo';\nimport RealtimeChannel from './realtimechannel';\nimport Multicaster from '../util/multicaster';\nimport ChannelStateChange from './channelstatechange';\nimport { ErrCallback } from '../../types/utils';\nimport { PaginatedResult } from './paginatedresource';\nimport { PresenceMap, RealtimePresenceParams } from './presencemap';\n\ninterface RealtimeHistoryParams {\n start?: number;\n end?: number;\n direction?: string;\n limit?: number;\n untilAttach?: boolean;\n from_serial?: string | null;\n}\n\nfunction getClientId(realtimePresence: RealtimePresence) {\n return realtimePresence.channel.client.auth.clientId;\n}\n\nfunction isAnonymousOrWildcard(realtimePresence: RealtimePresence) {\n const realtime = realtimePresence.channel.client;\n /* If not currently connected, we can't assume that we're an anonymous\n * client, as realtime may inform us of our clientId in the CONNECTED\n * message. So assume we're not anonymous and leave it to realtime to\n * return an error if we are */\n const clientId = realtime.auth.clientId;\n return (!clientId || clientId === '*') && realtime.connection.state === 'connected';\n}\n\n/* Callback is called only in the event of an error */\nfunction waitAttached(channel: RealtimeChannel, callback: ErrCallback, action: () => void) {\n switch (channel.state) {\n case 'attached':\n case 'suspended':\n action();\n break;\n case 'initialized':\n case 'detached':\n case 'detaching':\n case 'attaching':\n Utils.whenPromiseSettles(channel.attach(), function (err: Error | null) {\n if (err) callback(err);\n else action();\n });\n break;\n default:\n callback(ErrorInfo.fromValues(channel.invalidStateError()));\n }\n}\n\nclass RealtimePresence extends EventEmitter {\n channel: RealtimeChannel;\n pendingPresence: { presence: WirePresenceMessage; callback: ErrCallback }[];\n syncComplete: boolean;\n members: PresenceMap;\n _myMembers: PresenceMap;\n subscriptions: EventEmitter;\n name?: string;\n\n constructor(channel: RealtimeChannel) {\n super(channel.logger);\n this.channel = channel;\n this.syncComplete = false;\n this.members = new PresenceMap(this, (item) => item.clientId + ':' + item.connectionId);\n // RTP17h: Store own members by clientId only.\n this._myMembers = new PresenceMap(this, (item) => item.clientId!);\n this.subscriptions = new EventEmitter(this.logger);\n this.pendingPresence = [];\n }\n\n async enter(data: unknown): Promise<void> {\n if (isAnonymousOrWildcard(this)) {\n throw new ErrorInfo('clientId must be specified to enter a presence channel', 40012, 400);\n }\n return this._enterOrUpdateClient(undefined, undefined, data, 'enter');\n }\n\n async update(data: unknown): Promise<void> {\n if (isAnonymousOrWildcard(this)) {\n throw new ErrorInfo('clientId must be specified to update presence data', 40012, 400);\n }\n return this._enterOrUpdateClient(undefined, undefined, data, 'update');\n }\n\n async enterClient(clientId: string, data: unknown): Promise<void> {\n return this._enterOrUpdateClient(undefined, clientId, data, 'enter');\n }\n\n async updateClient(clientId: string, data: unknown): Promise<void> {\n return this._enterOrUpdateClient(undefined, clientId, data, 'update');\n }\n\n async _enterOrUpdateClient(\n id: string | undefined,\n clientId: string | undefined,\n data: unknown,\n action: string,\n ): Promise<void> {\n const channel = this.channel;\n if (!channel.connectionManager.activeState()) {\n throw channel.connectionManager.getError();\n }\n\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'RealtimePresence.' + action + 'Client()',\n 'channel = ' + channel.name + ', id = ' + id + ', client = ' + (clientId || '(implicit) ' + getClientId(this)),\n );\n\n const presence = PresenceMessage.fromData(data);\n presence.action = action;\n if (id) {\n presence.id = id;\n }\n if (clientId) {\n presence.clientId = clientId;\n }\n const wirePresMsg = await presence.encode(channel.channelOptions as CipherOptions);\n\n switch (channel.state) {\n case 'attached':\n return channel.sendPresence([wirePresMsg]);\n case 'initialized':\n case 'detached':\n channel.attach();\n // eslint-disable-next-line no-fallthrough\n case 'attaching':\n return new Promise((resolve, reject) => {\n this.pendingPresence.push({\n presence: wirePresMsg,\n callback: (err) => (err ? reject(err) : resolve()),\n });\n });\n default: {\n const err = new PartialErrorInfo(\n 'Unable to ' + action + ' presence channel while in ' + channel.state + ' state',\n 90001,\n );\n err.code = 90001;\n throw err;\n }\n }\n }\n\n async leave(data: unknown): Promise<void> {\n if (isAnonymousOrWildcard(this)) {\n throw new ErrorInfo('clientId must have been specified to enter or leave a presence channel', 40012, 400);\n }\n return this.leaveClient(undefined, data);\n }\n\n async leaveClient(clientId?: string, data?: unknown): Promise<void> {\n const channel = this.channel;\n if (!channel.connectionManager.activeState()) {\n throw channel.connectionManager.getError();\n }\n\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'RealtimePresence.leaveClient()',\n 'leaving; channel = ' + this.channel.name + ', client = ' + clientId,\n );\n const presence = PresenceMessage.fromData(data);\n presence.action = 'leave';\n if (clientId) {\n presence.clientId = clientId;\n }\n const wirePresMsg = await presence.encode(channel.channelOptions as CipherOptions);\n\n switch (channel.state) {\n case 'attached':\n return channel.sendPresence([wirePresMsg]);\n case 'attaching':\n return new Promise((resolve, reject) => {\n this.pendingPresence.push({\n presence: wirePresMsg,\n callback: (err) => (err ? reject(err) : resolve()),\n });\n });\n case 'initialized':\n case 'failed': {\n /* we're not attached; therefore we let any entered status\n * timeout by itself instead of attaching just in order to leave */\n throw new PartialErrorInfo('Unable to leave presence channel (incompatible state)', 90001);\n }\n default:\n throw channel.invalidStateError();\n }\n }\n\n async get(params?: RealtimePresenceParams): Promise<PresenceMessage[]> {\n const waitForSync = !params || ('waitForSync' in params ? params.waitForSync : true);\n\n return new Promise((resolve, reject) => {\n function returnMembers(members: PresenceMap) {\n resolve(params ? members.list(params) : members.values());\n }\n\n /* Special-case the suspended state: can still get (stale) presence set if waitForSync is false */\n if (this.channel.state === 'suspended') {\n if (waitForSync) {\n reject(\n ErrorInfo.fromValues({\n statusCode: 400,\n code: 91005,\n message: 'Presence state is out of sync due to channel being in the SUSPENDED state',\n }),\n );\n } else {\n returnMembers(this.members);\n }\n return;\n }\n\n waitAttached(\n this.channel,\n (err) => reject(err),\n () => {\n const members = this.members;\n if (waitForSync) {\n members.waitSync(function () {\n returnMembers(members);\n });\n } else {\n returnMembers(members);\n }\n },\n );\n });\n }\n\n async history(params: RealtimeHistoryParams | null): Promise<PaginatedResult<PresenceMessage>> {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimePresence.history()', 'channel = ' + this.name);\n // We fetch this first so that any plugin-not-provided error takes priority over other errors\n const restMixin = this.channel.client.rest.presenceMixin;\n\n if (params && params.untilAttach) {\n if (this.channel.state === 'attached') {\n delete params.untilAttach;\n params.from_serial = this.channel.properties.attachSerial;\n } else {\n throw new ErrorInfo(\n 'option untilAttach requires the channel to be attached, was: ' + this.channel.state,\n 40000,\n 400,\n );\n }\n }\n\n return restMixin.history(this, params);\n }\n\n setPresence(presenceSet: PresenceMessage[], isSync: boolean, syncChannelSerial?: string): void {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'RealtimePresence.setPresence()',\n 'received presence for ' + presenceSet.length + ' participants; syncChannelSerial = ' + syncChannelSerial,\n );\n let syncCursor, match;\n const members = this.members,\n myMembers = this._myMembers,\n broadcastMessages = [],\n connId = this.channel.connectionManager.connectionId;\n\n if (isSync) {\n this.members.startSync();\n if (syncChannelSerial && (match = syncChannelSerial.match(/^[\\w-]+:(.*)$/))) {\n syncCursor = match[1];\n }\n }\n\n for (let presence of presenceSet) {\n switch (presence.action) {\n case 'leave':\n if (members.remove(presence)) {\n broadcastMessages.push(presence);\n }\n if (presence.connectionId === connId && !presence.isSynthesized()) {\n myMembers.remove(presence);\n }\n break;\n case 'enter':\n case 'present':\n case 'update':\n if (members.put(presence)) {\n broadcastMessages.push(presence);\n }\n if (presence.connectionId === connId) {\n myMembers.put(presence);\n }\n break;\n }\n }\n /* if this is the last (or only) message in a sequence of sync updates, end the sync */\n if (isSync && !syncCursor) {\n members.endSync();\n this.channel.syncChannelSerial = null;\n }\n\n /* broadcast to listeners */\n for (let i = 0; i < broadcastMessages.length; i++) {\n const presence = broadcastMessages[i];\n this.subscriptions.emit(presence.action!, presence);\n }\n }\n\n onAttached(hasPresence?: boolean): void {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'RealtimePresence.onAttached()',\n 'channel = ' + this.channel.name + ', hasPresence = ' + hasPresence,\n );\n\n if (hasPresence) {\n this.members.startSync();\n } else {\n this._synthesizeLeaves(this.members.values());\n this.members.clear();\n }\n\n // RTP17f: Re-enter own members when moving into the attached state.\n this._ensureMyMembersPresent();\n\n /* NB this must be after the _ensureMyMembersPresent call, which may add items to pendingPresence */\n const pendingPresence = this.pendingPresence,\n pendingPresCount = pendingPresence.length;\n\n if (pendingPresCount) {\n this.pendingPresence = [];\n const presenceArray = [];\n const multicaster = Multicaster.create(this.logger);\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'RealtimePresence.onAttached',\n 'sending ' + pendingPresCount + ' queued presence messages',\n );\n for (let i = 0; i < pendingPresCount; i++) {\n const event = pendingPresence[i];\n presenceArray.push(event.presence);\n multicaster.push(event.callback);\n }\n this.channel\n .sendPresence(presenceArray)\n .then(() => multicaster())\n .catch((err: ErrorInfo) => multicaster(err));\n }\n }\n\n actOnChannelState(state: string, hasPresence?: boolean, err?: ErrorInfo | null): void {\n switch (state) {\n case 'attached':\n this.onAttached(hasPresence);\n break;\n case 'detached':\n case 'failed':\n this._clearMyMembers();\n this.members.clear();\n /* falls through */\n case 'suspended':\n this.failPendingPresence(err);\n break;\n }\n }\n\n failPendingPresence(err?: ErrorInfo | null): void {\n if (this.pendingPresence.length) {\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'RealtimeChannel.failPendingPresence',\n 'channel; name = ' + this.channel.name + ', err = ' + Utils.inspectError(err),\n );\n for (let i = 0; i < this.pendingPresence.length; i++)\n try {\n this.pendingPresence[i].callback(err);\n // eslint-disable-next-line no-empty\n } catch (e) {}\n this.pendingPresence = [];\n }\n }\n\n _clearMyMembers(): void {\n this._myMembers.clear();\n }\n\n _ensureMyMembersPresent(): void {\n const myMembers = this._myMembers;\n const connId = this.channel.connectionManager.connectionId;\n\n for (const memberKey in myMembers.map) {\n const entry = myMembers.map[memberKey];\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n 'RealtimePresence._ensureMyMembersPresent()',\n 'Auto-reentering clientId \"' + entry.clientId + '\" into the presence set',\n );\n // RTP17g: Send ENTER containing the member id, clientId and data\n // attributes.\n // RTP17g1: suppress id if the connId has changed\n const id = entry.connectionId === connId ? entry.id : undefined;\n this._enterOrUpdateClient(id, entry.clientId, entry.data, 'enter').catch((err) => {\n const wrappedErr = new ErrorInfo('Presence auto re-enter failed', 91004, 400, err);\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'RealtimePresence._ensureMyMembersPresent()',\n 'Presence auto re-enter failed; reason = ' + Utils.inspectError(err),\n );\n const change = new ChannelStateChange(this.channel.state, this.channel.state, true, false, wrappedErr);\n this.channel.emit('update', change);\n });\n }\n }\n\n _synthesizeLeaves(items: PresenceMessage[]): void {\n const subscriptions = this.subscriptions;\n items.forEach(function (item) {\n const presence = PresenceMessage.fromValues({\n action: 'leave',\n connectionId: item.connectionId,\n clientId: item.clientId,\n data: item.data,\n encoding: item.encoding,\n timestamp: Date.now(),\n });\n subscriptions.emit('leave', presence);\n });\n }\n\n async subscribe(..._args: unknown[] /* [event], listener */): Promise<void> {\n const args = RealtimeChannel.processListenerArgs(_args);\n const event = args[0];\n const listener = args[1];\n const channel = this.channel;\n\n if (channel.state === 'failed') {\n throw ErrorInfo.fromValues(channel.invalidStateError());\n }\n\n this.subscriptions.on(event, listener);\n\n // (RTP6d)\n if (channel.channelOptions.attachOnSubscribe !== false) {\n await channel.attach();\n }\n }\n\n unsubscribe(..._args: unknown[] /* [event], listener */): void {\n const args = RealtimeChannel.processListenerArgs(_args);\n const event = args[0];\n const listener = args[1];\n this.subscriptions.off(event, listener);\n }\n}\n\nexport default RealtimePresence;\n", "import Platform from 'common/platform';\r\nimport * as Utils from '../util/utils';\r\nimport Transport from './transport';\r\nimport Defaults from '../util/defaults';\r\nimport Logger from '../util/logger';\r\nimport ProtocolMessage, {\r\n serialize as serializeProtocolMessage,\r\n deserialize as deserializeProtocolMessage,\r\n} from '../types/protocolmessage';\r\nimport ErrorInfo from '../types/errorinfo';\r\nimport NodeWebSocket from 'ws';\r\nimport ConnectionManager, { TransportParams } from './connectionmanager';\r\nimport Auth from '../client/auth';\r\nimport { TransportNames } from 'common/constants/TransportName';\r\n\r\nconst shortName = TransportNames.WebSocket;\r\n\r\nfunction isNodeWebSocket(ws: WebSocket | NodeWebSocket): ws is NodeWebSocket {\r\n return !!(ws as NodeWebSocket).on;\r\n}\r\n\r\nclass WebSocketTransport extends Transport {\r\n shortName = shortName;\r\n wsHost: string;\r\n uri?: string;\r\n wsConnection?: WebSocket | NodeWebSocket;\r\n\r\n constructor(connectionManager: ConnectionManager, auth: Auth, params: TransportParams) {\r\n super(connectionManager, auth, params);\r\n /* If is a browser, can't detect pings, so request protocol heartbeats */\r\n params.heartbeats = Platform.Config.useProtocolHeartbeats;\r\n this.wsHost = params.host as string;\r\n }\r\n\r\n static isAvailable() {\r\n return !!Platform.Config.WebSocket;\r\n }\r\n\r\n createWebSocket(uri: string, connectParams: Record<string, string>) {\r\n this.uri = uri + Utils.toQueryString(connectParams);\r\n return new Platform.Config.WebSocket(this.uri);\r\n }\r\n\r\n toString() {\r\n return 'WebSocketTransport; uri=' + this.uri;\r\n }\r\n\r\n connect() {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.connect()', 'starting');\r\n Transport.prototype.connect.call(this);\r\n const self = this,\r\n params = this.params,\r\n options = params.options;\r\n const wsScheme = options.tls ? 'wss://' : 'ws://';\r\n const wsUri = wsScheme + this.wsHost + ':' + Defaults.getPort(options) + '/';\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.connect()', 'uri: ' + wsUri);\r\n Utils.whenPromiseSettles(\r\n this.auth.getAuthParams(),\r\n function (err: ErrorInfo | null, authParams?: Record<string, string>) {\r\n if (self.isDisposed) {\r\n return;\r\n }\r\n let paramStr = '';\r\n for (const param in authParams) paramStr += ' ' + param + ': ' + authParams[param] + ';';\r\n Logger.logAction(\r\n self.logger,\r\n Logger.LOG_MINOR,\r\n 'WebSocketTransport.connect()',\r\n 'authParams:' + paramStr + ' err: ' + err,\r\n );\r\n if (err) {\r\n self.disconnect(err);\r\n return;\r\n }\r\n const connectParams = params.getConnectParams(authParams!);\r\n try {\r\n const wsConnection = (self.wsConnection = self.createWebSocket(wsUri, connectParams));\r\n wsConnection.binaryType = Platform.Config.binaryType;\r\n wsConnection.onopen = function () {\r\n self.onWsOpen();\r\n };\r\n wsConnection.onclose = function (ev: CloseEvent) {\r\n self.onWsClose(ev);\r\n };\r\n wsConnection.onmessage = function (ev: MessageEvent) {\r\n self.onWsData(ev.data);\r\n };\r\n wsConnection.onerror = function (ev: Event) {\r\n self.onWsError(ev as ErrorEvent);\r\n };\r\n if (isNodeWebSocket(wsConnection)) {\r\n /* node; browsers currently don't have a general eventemitter and can't detect\r\n * pings. Also, no need to reply with a pong explicitly, ws lib handles that */\r\n wsConnection.on('ping', function () {\r\n self.onActivity();\r\n });\r\n }\r\n } catch (e) {\r\n Logger.logAction(\r\n self.logger,\r\n Logger.LOG_ERROR,\r\n 'WebSocketTransport.connect()',\r\n 'Unexpected exception creating websocket: err = ' + ((e as Error).stack || (e as Error).message),\r\n );\r\n self.disconnect(e as Error);\r\n }\r\n },\r\n );\r\n }\r\n\r\n send(message: ProtocolMessage) {\r\n const wsConnection = this.wsConnection;\r\n if (!wsConnection) {\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'WebSocketTransport.send()', 'No socket connection');\r\n return;\r\n }\r\n try {\r\n (wsConnection as NodeWebSocket).send(\r\n serializeProtocolMessage(message, this.connectionManager.realtime._MsgPack, this.params.format),\r\n );\r\n } catch (e) {\r\n const msg = 'Exception from ws connection when trying to send: ' + Utils.inspectError(e);\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'WebSocketTransport.send()', msg);\r\n /* Don't try to request a disconnect, that'll just involve sending data\r\n * down the websocket again. Just finish the transport. */\r\n this.finish('disconnected', new ErrorInfo(msg, 50000, 500));\r\n }\r\n }\r\n\r\n onWsData(data: string) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MICRO,\r\n 'WebSocketTransport.onWsData()',\r\n 'data received; length = ' + data.length + '; type = ' + typeof data,\r\n );\r\n try {\r\n this.onProtocolMessage(\r\n deserializeProtocolMessage(\r\n data,\r\n this.connectionManager.realtime._MsgPack,\r\n this.connectionManager.realtime._RealtimePresence,\r\n this.connectionManager.realtime._Annotations,\r\n this.connectionManager.realtime._objectsPlugin,\r\n this.format,\r\n ),\r\n );\r\n } catch (e) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_ERROR,\r\n 'WebSocketTransport.onWsData()',\r\n 'Unexpected exception handing channel message: ' + (e as Error).stack,\r\n );\r\n }\r\n }\r\n\r\n onWsOpen() {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.onWsOpen()', 'opened WebSocket');\r\n this.emit('preconnect');\r\n }\r\n\r\n onWsClose(ev: number | CloseEvent) {\r\n let wasClean, code;\r\n if (typeof ev == 'object') {\r\n /* W3C spec-compatible */\r\n code = ev.code;\r\n // ev.wasClean is undefined in reactnative\r\n wasClean = ev.wasClean || code === 1000;\r\n } /*if(typeof(ev) == 'number')*/ else {\r\n /* ws in node */\r\n code = ev;\r\n wasClean = code == 1000;\r\n }\r\n delete this.wsConnection;\r\n if (wasClean) {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.onWsClose()', 'Cleanly closed WebSocket');\r\n const err = new ErrorInfo('Websocket closed', 80003, 400);\r\n this.finish('disconnected', err);\r\n } else {\r\n const msg = 'Unclean disconnection of WebSocket ; code = ' + code,\r\n err = new ErrorInfo(msg, 80003, 400);\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.onWsClose()', msg);\r\n this.finish('disconnected', err);\r\n }\r\n this.emit('disposed');\r\n }\r\n\r\n onWsError(err: ErrorEvent) {\r\n Logger.logAction(\r\n this.logger,\r\n Logger.LOG_MINOR,\r\n 'WebSocketTransport.onError()',\r\n 'Error from WebSocket: ' + err.message,\r\n );\r\n /* Wait a tick before aborting: if the websocket was connected, this event\r\n * will be immediately followed by an onclose event with a close code. Allow\r\n * that to close it (so we see the close code) rather than anticipating it */\r\n Platform.Config.nextTick(() => {\r\n this.disconnect(Error(err.message));\r\n });\r\n }\r\n\r\n dispose() {\r\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.dispose()', '');\r\n this.isDisposed = true;\r\n const wsConnection = this.wsConnection;\r\n if (wsConnection) {\r\n /* Ignore any messages that come through after dispose() is called but before\r\n * websocket is actually closed. (mostly would be harmless, but if it's a\r\n * CONNECTED, it'll re-tick isConnected and cause all sorts of havoc) */\r\n wsConnection.onmessage = function () {};\r\n delete this.wsConnection;\r\n /* defer until the next event loop cycle before closing the socket,\r\n * giving some implementations the opportunity to send any outstanding close message */\r\n Platform.Config.nextTick(() => {\r\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'WebSocketTransport.dispose()', 'closing websocket');\r\n if (!wsConnection) {\r\n throw new Error('WebSocketTransport.dispose(): wsConnection is not defined');\r\n }\r\n wsConnection.close();\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport default WebSocketTransport;\r\n", "import * as API from '../../../../ably';\nimport RealtimeChannel from './realtimechannel';\nimport Message from '../types/message';\n\nexport class FilteredSubscriptions {\n static subscribeFilter(channel: RealtimeChannel, filter: API.MessageFilter, listener: API.messageCallback<Message>) {\n const filteredListener = (m: Message) => {\n const mapping: { [key in keyof API.MessageFilter]: any } = {\n name: m.name,\n refTimeserial: m.extras?.ref?.timeserial,\n refType: m.extras?.ref?.type,\n isRef: !!m.extras?.ref?.timeserial,\n clientId: m.clientId,\n };\n // Check if any values are defined in the filter and if they match the value in the message object\n if (\n Object.entries(filter).find(([key, value]) =>\n value !== undefined ? mapping[key as keyof API.MessageFilter] !== value : false,\n )\n ) {\n return;\n }\n listener(m);\n };\n this.addFilteredSubscription(channel, filter, listener, filteredListener);\n channel.subscriptions.on(filteredListener);\n }\n\n // Adds a new filtered subscription\n static addFilteredSubscription(\n channel: RealtimeChannel,\n filter: API.MessageFilter,\n realListener: API.messageCallback<Message>,\n filteredListener: API.messageCallback<Message>,\n ) {\n if (!channel.filteredSubscriptions) {\n channel.filteredSubscriptions = new Map<\n API.messageCallback<Message>,\n Map<API.MessageFilter, API.messageCallback<Message>[]>\n >();\n }\n if (channel.filteredSubscriptions.has(realListener)) {\n const realListenerMap = channel.filteredSubscriptions.get(realListener) as Map<\n API.MessageFilter,\n API.messageCallback<Message>[]\n >;\n // Add the filtered listener to the map, or append to the array if this filter has already been used\n realListenerMap.set(filter, realListenerMap?.get(filter)?.concat(filteredListener) || [filteredListener]);\n } else {\n channel.filteredSubscriptions.set(\n realListener,\n new Map<API.MessageFilter, API.messageCallback<Message>[]>([[filter, [filteredListener]]]),\n );\n }\n }\n\n static getAndDeleteFilteredSubscriptions(\n channel: RealtimeChannel,\n filter: API.MessageFilter | undefined,\n realListener: API.messageCallback<Message> | undefined,\n ): API.messageCallback<Message>[] {\n // No filtered subscriptions map means there has been no filtered subscriptions yet, so return nothing\n if (!channel.filteredSubscriptions) {\n return [];\n }\n // Only a filter is passed in with no specific listener\n if (!realListener && filter) {\n // Return each listener which is attached to the specified filter object\n return Array.from(channel.filteredSubscriptions.entries())\n .map(([key, filterMaps]) => {\n // Get (then delete) the maps matching this filter\n let listenerMaps = filterMaps.get(filter);\n filterMaps.delete(filter);\n // Clear the parent if nothing is left\n if (filterMaps.size === 0) {\n channel.filteredSubscriptions?.delete(key);\n }\n return listenerMaps;\n })\n .reduce(\n (prev, cur) => (cur ? (prev as API.messageCallback<Message>[]).concat(...cur) : prev),\n [],\n ) as API.messageCallback<Message>[];\n }\n\n // No subscriptions for this listener\n if (!realListener || !channel.filteredSubscriptions.has(realListener)) {\n return [];\n }\n const realListenerMap = channel.filteredSubscriptions.get(realListener) as Map<\n API.MessageFilter,\n API.messageCallback<Message>[]\n >;\n // If no filter is specified return all listeners using that function\n if (!filter) {\n // array.flat is not available unless we support es2019 or higher\n const listeners = Array.from(realListenerMap.values()).reduce((prev, cur) => prev.concat(...cur), []);\n // remove the listener from the map\n channel.filteredSubscriptions.delete(realListener);\n return listeners;\n }\n\n let listeners = realListenerMap.get(filter);\n realListenerMap.delete(filter);\n\n return listeners || [];\n }\n}\n", "import BaseRealtime from './baserealtime';\nimport ClientOptions from '../../types/ClientOptions';\nimport { allCommonModularPlugins } from './modularplugins';\nimport * as Utils from '../util/utils';\nimport ConnectionManager from '../transport/connectionmanager';\nimport ProtocolMessage from '../types/protocolmessage';\nimport Platform from 'common/platform';\nimport { DefaultMessage } from '../types/defaultmessage';\nimport { MsgPack } from 'common/types/msgpack';\nimport RealtimePresence from './realtimepresence';\nimport { DefaultPresenceMessage } from '../types/defaultpresencemessage';\nimport { DefaultAnnotation } from '../types/defaultannotation';\nimport WebSocketTransport from '../transport/websockettransport';\nimport { FilteredSubscriptions } from './filteredsubscriptions';\nimport { PresenceMap } from './presencemap';\nimport PresenceMessage, { WirePresenceMessage } from '../types/presencemessage';\nimport RealtimeAnnotations from './realtimeannotations';\nimport RestAnnotations from './restannotations';\nimport Annotation, { WireAnnotation } from '../types/annotation';\nimport { Http } from 'common/types/http';\nimport Defaults from '../util/defaults';\nimport Logger from '../util/logger';\nimport { MessageEncoding } from '../types/basemessage';\n\n/**\n `DefaultRealtime` is the class that the non tree-shakable version of the SDK exports as `Realtime`. It ensures that this version of the SDK includes all of the functionality which is optionally available in the tree-shakable version.\n */\nexport class DefaultRealtime extends BaseRealtime {\n // The public typings declare that this requires an argument to be passed, but since we want to emit a good error message in the case where a non-TypeScript user does not pass an argument, tell the compiler that this is possible so that it forces us to handle it.\n constructor(options?: ClientOptions | string) {\n const MsgPack = DefaultRealtime._MsgPack;\n if (!MsgPack) {\n throw new Error('Expected DefaultRealtime._MsgPack to have been set');\n }\n\n super(\n Defaults.objectifyOptions(options, true, 'Realtime', Logger.defaultLogger, {\n ...allCommonModularPlugins,\n Crypto: DefaultRealtime.Crypto ?? undefined,\n MsgPack,\n RealtimePresence: {\n RealtimePresence,\n PresenceMessage,\n WirePresenceMessage,\n },\n Annotations: {\n Annotation,\n WireAnnotation,\n RealtimeAnnotations,\n RestAnnotations,\n },\n WebSocketTransport,\n MessageInteractions: FilteredSubscriptions,\n }),\n );\n }\n\n static Utils = Utils;\n static ConnectionManager = ConnectionManager;\n static ProtocolMessage = ProtocolMessage;\n\n private static _Crypto: typeof Platform.Crypto = null;\n static get Crypto() {\n if (this._Crypto === null) {\n throw new Error('Encryption not enabled; use ably.encryption.js instead');\n }\n\n return this._Crypto;\n }\n static set Crypto(newValue: typeof Platform.Crypto) {\n this._Crypto = newValue;\n }\n\n static Message = DefaultMessage;\n static PresenceMessage = DefaultPresenceMessage;\n static Annotation = DefaultAnnotation;\n\n static _MsgPack: MsgPack | null = null;\n\n // Used by tests\n static _Http = Http;\n static _PresenceMap = PresenceMap;\n static _MessageEncoding = MessageEncoding;\n}\n", "/**\n * Copied from https://gist.github.com/stevendesu/2d52f7b5e1f1184af3b667c0b5e054b8\n *\n * \"A simple, open-source, HMAC-SHA256 implementation in pure JavaScript. Designed for efficient minification.\"\n *\n * I asked about licensing, and the author said:\n *\n * > Feel free to use it however you'd like \uD83D\uDE04 As the gist title indicates,\n * > this is \"a simple open source implementation\". Feel free to choose whatever\n * > license you find most permissible, but I offer no warranty for the code.\n * > It's 100% free to do with as you please.\n */\n\n// To ensure cross-browser support even without a proper SubtleCrypto\n// impelmentation (or without access to the impelmentation, as is the case with\n// Chrome loaded over HTTP instead of HTTPS), this library can create SHA-256\n// HMAC signatures using nothing but raw JavaScript\n\n/* eslint-disable no-magic-numbers, id-length, no-param-reassign, new-cap */\n\n// By giving internal functions names that we can mangle, future calls to\n// them are reduced to a single byte (minor space savings in minified file)\nvar uint8Array = Uint8Array;\nvar uint32Array = Uint32Array;\nvar pow = Math.pow;\n\n// Will be initialized below\n// Using a Uint32Array instead of a simple array makes the minified code\n// a bit bigger (we lose our `unshift()` hack), but comes with huge\n// performance gains\nvar DEFAULT_STATE = new uint32Array(8);\nvar ROUND_CONSTANTS: number[] = [];\n\n// Reusable object for expanded message\n// Using a Uint32Array instead of a simple array makes the minified code\n// 7 bytes larger, but comes with huge performance gains\nvar M = new uint32Array(64);\n\n// After minification the code to compute the default state and round\n// constants is smaller than the output. More importantly, this serves as a\n// good educational aide for anyone wondering where the magic numbers come\n// from. No magic numbers FTW!\nfunction getFractionalBits(n: number) {\n return ((n - (n | 0)) * pow(2, 32)) | 0;\n}\n\nvar n = 2,\n nPrime = 0;\nwhile (nPrime < 64) {\n // isPrime() was in-lined from its original function form to save\n // a few bytes\n var isPrime = true;\n // Math.sqrt() was replaced with pow(n, 1/2) to save a few bytes\n // var sqrtN = pow(n, 1 / 2);\n // So technically to determine if a number is prime you only need to\n // check numbers up to the square root. However this function only runs\n // once and we're only computing the first 64 primes (up to 311), so on\n // any modern CPU this whole function runs in a couple milliseconds.\n // By going to n / 2 instead of sqrt(n) we net 8 byte savings and no\n // scaling performance cost\n for (var factor = 2; factor <= n / 2; factor++) {\n if (n % factor === 0) {\n isPrime = false;\n }\n }\n if (isPrime) {\n if (nPrime < 8) {\n DEFAULT_STATE[nPrime] = getFractionalBits(pow(n, 1 / 2));\n }\n ROUND_CONSTANTS[nPrime] = getFractionalBits(pow(n, 1 / 3));\n\n nPrime++;\n }\n\n n++;\n}\n\n// For cross-platform support we need to ensure that all 32-bit words are\n// in the same endianness. A UTF-8 TextEncoder will return BigEndian data,\n// so upon reading or writing to our ArrayBuffer we'll only swap the bytes\n// if our system is LittleEndian (which is about 99% of CPUs)\nvar LittleEndian = !!new uint8Array(new uint32Array([1]).buffer)[0];\n\nfunction convertEndian(word: number) {\n if (LittleEndian) {\n return (\n // byte 1 -> byte 4\n (word >>> 24) |\n // byte 2 -> byte 3\n (((word >>> 16) & 0xff) << 8) |\n // byte 3 -> byte 2\n ((word & 0xff00) << 8) |\n // byte 4 -> byte 1\n (word << 24)\n );\n } else {\n return word;\n }\n}\n\nfunction rightRotate(word: number, bits: number) {\n return (word >>> bits) | (word << (32 - bits));\n}\n\nexport function sha256(data: Uint8Array): Uint8Array {\n // Copy default state\n var STATE = DEFAULT_STATE.slice();\n\n // Caching this reduces occurrences of \".length\" in minified JavaScript\n // 3 more byte savings! :D\n var legth = data.length;\n\n // Pad data\n var bitLength = legth * 8;\n var newBitLength = 512 - ((bitLength + 64) % 512) - 1 + bitLength + 65;\n\n // \"bytes\" and \"words\" are stored BigEndian\n var bytes = new uint8Array(newBitLength / 8);\n var words = new uint32Array(bytes.buffer);\n\n bytes.set(data, 0);\n // Append a 1\n bytes[legth] = 0b10000000;\n // Store length in BigEndian\n words[words.length - 1] = convertEndian(bitLength);\n\n // Loop iterator (avoid two instances of \"var\") -- saves 2 bytes\n var round;\n\n // Process blocks (512 bits / 64 bytes / 16 words at a time)\n for (var block = 0; block < newBitLength / 32; block += 16) {\n var workingState = STATE.slice();\n\n // Rounds\n for (round = 0; round < 64; round++) {\n var MRound;\n // Expand message\n if (round < 16) {\n // Convert to platform Endianness for later math\n MRound = convertEndian(words[block + round]);\n } else {\n var gamma0x = M[round - 15];\n var gamma1x = M[round - 2];\n MRound =\n M[round - 7] +\n M[round - 16] +\n (rightRotate(gamma0x, 7) ^ rightRotate(gamma0x, 18) ^ (gamma0x >>> 3)) +\n (rightRotate(gamma1x, 17) ^ rightRotate(gamma1x, 19) ^ (gamma1x >>> 10));\n }\n\n // M array matches platform endianness\n M[round] = MRound |= 0;\n\n // Computation\n var t1 =\n (rightRotate(workingState[4], 6) ^ rightRotate(workingState[4], 11) ^ rightRotate(workingState[4], 25)) +\n ((workingState[4] & workingState[5]) ^ (~workingState[4] & workingState[6])) +\n workingState[7] +\n MRound +\n ROUND_CONSTANTS[round];\n var t2 =\n (rightRotate(workingState[0], 2) ^ rightRotate(workingState[0], 13) ^ rightRotate(workingState[0], 22)) +\n ((workingState[0] & workingState[1]) ^ (workingState[2] & (workingState[0] ^ workingState[1])));\n for (var i = 7; i > 0; i--) {\n workingState[i] = workingState[i - 1];\n }\n workingState[0] = (t1 + t2) | 0;\n workingState[4] = (workingState[4] + t1) | 0;\n }\n\n // Update state\n for (round = 0; round < 8; round++) {\n STATE[round] = (STATE[round] + workingState[round]) | 0;\n }\n }\n\n // Finally the state needs to be converted to BigEndian for output\n // And we want to return a Uint8Array, not a Uint32Array\n return new uint8Array(\n new uint32Array(\n STATE.map(function (val) {\n return convertEndian(val);\n }),\n ).buffer,\n );\n}\n\nexport function hmac(key: Uint8Array, data: Uint8Array): Uint8Array {\n if (key.length > 64) key = sha256(key);\n\n if (key.length < 64) {\n const tmp = new Uint8Array(64);\n tmp.set(key, 0);\n key = tmp;\n }\n\n // Generate inner and outer keys\n var innerKey = new Uint8Array(64);\n var outerKey = new Uint8Array(64);\n for (var i = 0; i < 64; i++) {\n innerKey[i] = 0x36 ^ key[i];\n outerKey[i] = 0x5c ^ key[i];\n }\n\n // Append the innerKey\n var msg = new Uint8Array(data.length + 64);\n msg.set(innerKey, 0);\n msg.set(data, 64);\n\n // Has the previous message and append the outerKey\n var result = new Uint8Array(64 + 32);\n result.set(outerKey, 0);\n result.set(sha256(msg), 64);\n\n // Hash the previous message\n return sha256(result);\n}\n", "import Platform from 'common/platform';\r\nimport IBufferUtils from 'common/types/IBufferUtils';\r\nimport { hmac as hmacSha256, sha256 } from './hmac-sha256';\r\n\r\n/* Most BufferUtils methods that return a binary object return an ArrayBuffer\r\n * The exception is toBuffer, which returns a Uint8Array */\r\n\r\nexport type Bufferlike = BufferSource;\r\nexport type Output = Bufferlike;\r\nexport type ToBufferOutput = Uint8Array;\r\n\r\nclass BufferUtils implements IBufferUtils<Bufferlike, Output, ToBufferOutput> {\r\n base64CharSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r\n hexCharSet = '0123456789abcdef';\r\n\r\n // https://gist.githubusercontent.com/jonleighton/958841/raw/f200e30dfe95212c0165ccf1ae000ca51e9de803/gistfile1.js\r\n private uint8ViewToBase64(bytes: Uint8Array): string {\r\n let base64 = '';\r\n const encodings = this.base64CharSet;\r\n\r\n const byteLength = bytes.byteLength;\r\n const byteRemainder = byteLength % 3;\r\n const mainLength = byteLength - byteRemainder;\r\n\r\n let a, b, c, d;\r\n let chunk;\r\n\r\n // Main loop deals with bytes in chunks of 3\r\n for (let i = 0; i < mainLength; i = i + 3) {\r\n // Combine the three bytes into a single integer\r\n chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];\r\n\r\n // Use bitmasks to extract 6-bit segments from the triplet\r\n a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18\r\n b = (chunk & 258048) >> 12; // 258048 = (2^6 - 1) << 12\r\n c = (chunk & 4032) >> 6; // 4032 = (2^6 - 1) << 6\r\n d = chunk & 63; // 63 = 2^6 - 1\r\n\r\n // Convert the raw binary segments to the appropriate ASCII encoding\r\n base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d];\r\n }\r\n\r\n // Deal with the remaining bytes and padding\r\n if (byteRemainder == 1) {\r\n chunk = bytes[mainLength];\r\n\r\n a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2\r\n\r\n // Set the 4 least significant bits to zero\r\n b = (chunk & 3) << 4; // 3 = 2^2 - 1\r\n\r\n base64 += encodings[a] + encodings[b] + '==';\r\n } else if (byteRemainder == 2) {\r\n chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1];\r\n\r\n a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10\r\n b = (chunk & 1008) >> 4; // 1008 = (2^6 - 1) << 4\r\n\r\n // Set the 2 least significant bits to zero\r\n c = (chunk & 15) << 2; // 15 = 2^4 - 1\r\n\r\n base64 += encodings[a] + encodings[b] + encodings[c] + '=';\r\n }\r\n\r\n return base64;\r\n }\r\n\r\n private base64ToArrayBuffer(base64: string): Output {\r\n const binary_string = atob?.(base64) as string; // this will always be defined in browser so it's safe to cast\r\n const len = binary_string.length;\r\n const bytes = new Uint8Array(len);\r\n for (let i = 0; i < len; i++) {\r\n const ascii = binary_string.charCodeAt(i);\r\n bytes[i] = ascii;\r\n }\r\n return this.toArrayBuffer(bytes);\r\n }\r\n\r\n isBuffer(buffer: unknown): buffer is Bufferlike {\r\n return buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer);\r\n }\r\n\r\n toBuffer(buffer: Bufferlike): ToBufferOutput {\r\n if (!ArrayBuffer) {\r\n throw new Error(\"Can't convert to Buffer: browser does not support the necessary types\");\r\n }\r\n\r\n if (buffer instanceof ArrayBuffer) {\r\n return new Uint8Array(buffer);\r\n }\r\n\r\n if (ArrayBuffer.isView(buffer)) {\r\n return new Uint8Array(this.toArrayBuffer(buffer));\r\n }\r\n\r\n throw new Error('BufferUtils.toBuffer expected an ArrayBuffer or a view onto one');\r\n }\r\n\r\n toArrayBuffer(buffer: Bufferlike): ArrayBuffer {\r\n if (!ArrayBuffer) {\r\n throw new Error(\"Can't convert to ArrayBuffer: browser does not support the necessary types\");\r\n }\r\n\r\n if (buffer instanceof ArrayBuffer) {\r\n return buffer;\r\n }\r\n\r\n if (ArrayBuffer.isView(buffer)) {\r\n return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);\r\n }\r\n\r\n throw new Error('BufferUtils.toArrayBuffer expected an ArrayBuffer or a view onto one');\r\n }\r\n\r\n base64Encode(buffer: Bufferlike): string {\r\n return this.uint8ViewToBase64(this.toBuffer(buffer));\r\n }\r\n\r\n base64UrlEncode(buffer: Bufferlike): string {\r\n // base64url encoding is based on regular base64 with following changes: https://base64.guru/standards/base64url\r\n return this.base64Encode(buffer).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\r\n }\r\n\r\n base64Decode(str: string): Output {\r\n if (ArrayBuffer && Platform.Config.atob) {\r\n return this.base64ToArrayBuffer(str);\r\n } else {\r\n throw new Error('Expected ArrayBuffer to exist and Platform.Config.atob to be configured');\r\n }\r\n }\r\n\r\n hexEncode(buffer: Bufferlike): string {\r\n const uint8Array = this.toBuffer(buffer);\r\n return uint8Array.reduce((accum, byte) => accum + byte.toString(16).padStart(2, '0'), '');\r\n }\r\n\r\n hexDecode(hexEncodedBytes: string): Output {\r\n if (hexEncodedBytes.length % 2 !== 0) {\r\n throw new Error(\"Can't create a byte array from a hex string of odd length\");\r\n }\r\n\r\n const uint8Array = new Uint8Array(hexEncodedBytes.length / 2);\r\n\r\n for (let i = 0; i < uint8Array.length; i++) {\r\n uint8Array[i] = parseInt(hexEncodedBytes.slice(2 * i, 2 * (i + 1)), 16);\r\n }\r\n\r\n return this.toArrayBuffer(uint8Array);\r\n }\r\n\r\n utf8Encode(string: string): Output {\r\n if (Platform.Config.TextEncoder) {\r\n const encodedByteArray = new Platform.Config.TextEncoder().encode(string);\r\n return this.toArrayBuffer(encodedByteArray);\r\n } else {\r\n throw new Error('Expected TextEncoder to be configured');\r\n }\r\n }\r\n\r\n /* For utf8 decoding we apply slightly stricter input validation than to\r\n * hexEncode/base64Encode/etc: in those we accept anything that Buffer.from\r\n * can take (in particular allowing strings, which are just interpreted as\r\n * binary); here we ensure that the input is actually a buffer since trying\r\n * to utf8-decode a string to another string is almost certainly a mistake */\r\n utf8Decode(buffer: Bufferlike): string {\r\n if (!this.isBuffer(buffer)) {\r\n throw new Error('Expected input of utf8decode to be an arraybuffer or typed array');\r\n }\r\n if (TextDecoder) {\r\n return new TextDecoder().decode(buffer);\r\n } else {\r\n throw new Error('Expected TextDecoder to be configured');\r\n }\r\n }\r\n\r\n areBuffersEqual(buffer1: Bufferlike, buffer2: Bufferlike): boolean {\r\n if (!buffer1 || !buffer2) return false;\r\n const arrayBuffer1 = this.toArrayBuffer(buffer1);\r\n const arrayBuffer2 = this.toArrayBuffer(buffer2);\r\n\r\n if (arrayBuffer1.byteLength != arrayBuffer2.byteLength) return false;\r\n\r\n const bytes1 = new Uint8Array(arrayBuffer1);\r\n const bytes2 = new Uint8Array(arrayBuffer2);\r\n\r\n for (var i = 0; i < bytes1.length; i++) {\r\n if (bytes1[i] != bytes2[i]) return false;\r\n }\r\n return true;\r\n }\r\n\r\n byteLength(buffer: Bufferlike): number {\r\n if (buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer)) {\r\n return buffer.byteLength;\r\n }\r\n return -1;\r\n }\r\n\r\n arrayBufferViewToBuffer(arrayBufferView: ArrayBufferView): ArrayBuffer {\r\n return this.toArrayBuffer(arrayBufferView);\r\n }\r\n\r\n concat(buffers: Bufferlike[]): Output {\r\n const sumLength = buffers.reduce((acc, v) => acc + v.byteLength, 0);\r\n const result = new Uint8Array(sumLength);\r\n let offset = 0;\r\n\r\n for (const buffer of buffers) {\r\n const uint8Array = this.toBuffer(buffer);\r\n // see TypedArray.set for TypedArray argument https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/set#typedarray\r\n result.set(uint8Array, offset);\r\n offset += uint8Array.byteLength;\r\n }\r\n\r\n return result.buffer;\r\n }\r\n\r\n sha256(message: Bufferlike): Output {\r\n const hash = sha256(this.toBuffer(message));\r\n return this.toArrayBuffer(hash);\r\n }\r\n\r\n hmacSha256(message: Bufferlike, key: Bufferlike): Output {\r\n const hash = hmacSha256(this.toBuffer(key), this.toBuffer(message));\r\n return this.toArrayBuffer(hash);\r\n }\r\n}\r\n\r\nexport default new BufferUtils();\r\n", "import Logger from '../../../../common/lib/util/logger';\nimport ErrorInfo from 'common/lib/types/errorinfo';\nimport * as API from '../../../../../ably';\nimport ICryptoStatic, { IGetCipherParams } from '../../../../common/types/ICryptoStatic';\nimport ICipher from '../../../../common/types/ICipher';\nimport { CryptoDataTypes } from '../../../../common/types/cryptoDataTypes';\nimport BufferUtils, { Bufferlike, Output as BufferUtilsOutput } from './bufferutils';\nimport { IPlatformConfig } from 'common/types/IPlatformConfig';\n\n// The type to which ./msgpack.ts deserializes elements of the `bin` or `ext` type\ntype MessagePackBinaryType = ArrayBuffer;\n\ntype IV = CryptoDataTypes.IV<BufferUtilsOutput>;\ntype InputPlaintext = CryptoDataTypes.InputPlaintext<Bufferlike, BufferUtilsOutput>;\ntype OutputCiphertext = ArrayBuffer;\ntype InputCiphertext = CryptoDataTypes.InputCiphertext<MessagePackBinaryType, BufferUtilsOutput>;\ntype OutputPlaintext = ArrayBuffer;\n\nvar createCryptoClass = function (config: IPlatformConfig, bufferUtils: typeof BufferUtils) {\n var DEFAULT_ALGORITHM = 'aes';\n var DEFAULT_KEYLENGTH = 256; // bits\n var DEFAULT_MODE = 'cbc';\n var DEFAULT_BLOCKLENGTH = 16; // bytes\n\n /**\n * Internal: checks that the cipherParams are a valid combination. Currently\n * just checks that the calculated keyLength is a valid one for aes-cbc\n */\n function validateCipherParams(params: API.CipherParams) {\n if (params.algorithm === 'aes' && params.mode === 'cbc') {\n if (params.keyLength === 128 || params.keyLength === 256) {\n return;\n }\n throw new Error(\n 'Unsupported key length ' +\n params.keyLength +\n ' for aes-cbc encryption. Encryption key must be 128 or 256 bits (16 or 32 ASCII characters)',\n );\n }\n }\n\n function normaliseBase64(string: string) {\n /* url-safe base64 strings use _ and - instread of / and + */\n return string.replace('_', '/').replace('-', '+');\n }\n\n function isCipherParams(params: API.CipherParams | API.CipherParamOptions): params is API.CipherParams {\n // Although API.CipherParams is an interface, the documentation for its `key` property makes it clear that the only valid way to form one is by using getDefaultParams. The implementation of getDefaultParams returns an instance of CipherParams.\n return params instanceof CipherParams;\n }\n\n /**\n * A class encapsulating the client-specifiable parameters for\n * the cipher.\n *\n * algorithm is the name of the algorithm in the default system provider,\n * or the lower-cased version of it; eg \"aes\" or \"AES\".\n *\n * Clients are recommended to not call this directly, but instead to use the\n * Crypto.getDefaultParams helper, which will fill in any fields not supplied\n * with default values and validation the result.\n */\n class CipherParams implements API.CipherParams {\n algorithm: string;\n keyLength: number;\n mode: string;\n key: ArrayBuffer;\n\n constructor(algorithm: string, keyLength: number, mode: string, key: ArrayBuffer) {\n this.algorithm = algorithm;\n this.keyLength = keyLength;\n this.mode = mode;\n this.key = key;\n }\n }\n\n /**\n * Utility classes and interfaces for message payload encryption.\n *\n * This class supports AES/CBC/PKCS5 with a default keylength of 128 bits\n * but supporting other keylengths. Other algorithms and chaining modes are\n * not supported directly, but supportable by extending/implementing the base\n * classes and interfaces here.\n *\n * Secure random data for creation of Initialization Vectors (IVs) and keys\n * is obtained from window.crypto.getRandomValues.\n *\n * Each message payload is encrypted with an IV in CBC mode, and the IV is\n * concatenated with the resulting raw ciphertext to construct the \"ciphertext\"\n * data passed to the recipient.\n */\n class Crypto {\n static CipherParams = CipherParams;\n\n /**\n * Obtain a complete CipherParams instance from the provided params, filling\n * in any not provided with default values, calculating a keyLength from\n * the supplied key, and validating the result.\n * @param params an object containing at a minimum a `key` key with value the\n * key, as either a binary or a base64-encoded string.\n * May optionally also contain: algorithm (defaults to AES),\n * mode (defaults to 'cbc')\n */\n static getDefaultParams(params: API.CipherParamOptions) {\n var key: ArrayBuffer;\n\n if (!params.key) {\n throw new Error('Crypto.getDefaultParams: a key is required');\n }\n\n if (typeof params.key === 'string') {\n key = bufferUtils.toArrayBuffer(bufferUtils.base64Decode(normaliseBase64(params.key)));\n } else if (params.key instanceof ArrayBuffer) {\n key = params.key;\n } else {\n key = bufferUtils.toArrayBuffer(params.key);\n }\n\n var algorithm = params.algorithm || DEFAULT_ALGORITHM;\n var keyLength = key.byteLength * 8;\n var mode = params.mode || DEFAULT_MODE;\n var cipherParams = new CipherParams(algorithm, keyLength, mode, key);\n\n if (params.keyLength && params.keyLength !== cipherParams.keyLength) {\n throw new Error(\n 'Crypto.getDefaultParams: a keyLength of ' +\n params.keyLength +\n ' was specified, but the key actually has length ' +\n cipherParams.keyLength,\n );\n }\n\n validateCipherParams(cipherParams);\n return cipherParams;\n }\n\n /**\n * Generate a random encryption key from the supplied keylength (or the\n * default keyLength if none supplied) as an ArrayBuffer\n * @param keyLength (optional) the required keyLength in bits\n */\n static async generateRandomKey(keyLength?: number): Promise<API.CipherKey> {\n try {\n return config.getRandomArrayBuffer((keyLength || DEFAULT_KEYLENGTH) / 8);\n } catch (err) {\n throw new ErrorInfo('Failed to generate random key: ' + (err as Error).message, 400, 50000, err as Error);\n }\n }\n\n /**\n * Internal; get a ChannelCipher instance based on the given cipherParams\n * @param params either a CipherParams instance or some subset of its\n * fields that includes a key\n */\n static getCipher(params: IGetCipherParams<IV>, logger: Logger) {\n var cipherParams = isCipherParams(params) ? (params as CipherParams) : this.getDefaultParams(params);\n\n return {\n cipherParams: cipherParams,\n cipher: new CBCCipher(cipherParams, params.iv ?? null, logger),\n };\n }\n }\n\n Crypto satisfies ICryptoStatic<IV, InputPlaintext, OutputCiphertext, InputCiphertext, OutputPlaintext>;\n\n class CBCCipher implements ICipher<InputPlaintext, OutputCiphertext, InputCiphertext, OutputPlaintext> {\n algorithm: string;\n webCryptoAlgorithm: string;\n key: ArrayBuffer;\n iv: ArrayBuffer | null;\n\n constructor(\n params: CipherParams,\n iv: IV | null,\n private readonly logger: Logger,\n ) {\n if (!crypto.subtle) {\n if (isSecureContext) {\n throw new Error(\n 'Crypto operations are not possible since the browser\u2019s SubtleCrypto class is unavailable (reason unknown).',\n );\n } else {\n throw new Error(\n 'Crypto operations are is not possible since the current environment is a non-secure context and hence the browser\u2019s SubtleCrypto class is not available.',\n );\n }\n }\n\n this.algorithm = params.algorithm + '-' + String(params.keyLength) + '-' + params.mode;\n this.webCryptoAlgorithm = params.algorithm + '-' + params.mode;\n this.key = bufferUtils.toArrayBuffer(params.key);\n this.iv = iv ? bufferUtils.toArrayBuffer(iv) : null;\n }\n\n private concat(buffer1: Bufferlike, buffer2: Bufferlike) {\n const output = new ArrayBuffer(buffer1.byteLength + buffer2.byteLength);\n const outputView = new DataView(output);\n\n const buffer1View = new DataView(bufferUtils.toArrayBuffer(buffer1));\n for (let i = 0; i < buffer1View.byteLength; i++) {\n outputView.setInt8(i, buffer1View.getInt8(i));\n }\n\n const buffer2View = new DataView(bufferUtils.toArrayBuffer(buffer2));\n for (let i = 0; i < buffer2View.byteLength; i++) {\n outputView.setInt8(buffer1View.byteLength + i, buffer2View.getInt8(i));\n }\n\n return output;\n }\n\n async encrypt(plaintext: InputPlaintext): Promise<OutputCiphertext> {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'CBCCipher.encrypt()', '');\n\n const iv = await this.getIv();\n const cryptoKey = await crypto.subtle.importKey('raw', this.key, this.webCryptoAlgorithm, false, ['encrypt']);\n const ciphertext = await crypto.subtle.encrypt({ name: this.webCryptoAlgorithm, iv }, cryptoKey, plaintext);\n\n return this.concat(iv, ciphertext);\n }\n\n async decrypt(ciphertext: InputCiphertext): Promise<OutputPlaintext> {\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'CBCCipher.decrypt()', '');\n\n const ciphertextArrayBuffer = bufferUtils.toArrayBuffer(ciphertext);\n const iv = ciphertextArrayBuffer.slice(0, DEFAULT_BLOCKLENGTH);\n const ciphertextBody = ciphertextArrayBuffer.slice(DEFAULT_BLOCKLENGTH);\n\n const cryptoKey = await crypto.subtle.importKey('raw', this.key, this.webCryptoAlgorithm, false, ['decrypt']);\n return crypto.subtle.decrypt({ name: this.webCryptoAlgorithm, iv }, cryptoKey, ciphertextBody);\n }\n\n async getIv(): Promise<ArrayBuffer> {\n if (this.iv) {\n var iv = this.iv;\n this.iv = null;\n return iv;\n }\n\n const randomBlock = await config.getRandomArrayBuffer(DEFAULT_BLOCKLENGTH);\n return bufferUtils.toArrayBuffer(randomBlock);\n }\n }\n\n return Crypto;\n};\n\nexport { createCryptoClass };\n", "enum XHRStates {\n REQ_SEND = 0,\n REQ_RECV = 1,\n REQ_RECV_POLL = 2,\n REQ_RECV_STREAM = 3,\n}\n\nexport default XHRStates;\n", "import Platform from 'common/platform';\nimport Defaults from 'common/lib/util/defaults';\nimport ErrorInfo, { PartialErrorInfo } from 'common/lib/types/errorinfo';\nimport { RequestBody, RequestResultError, RequestParams, RequestResult } from 'common/types/http';\nimport HttpMethods from 'common/constants/HttpMethods';\nimport BaseClient from 'common/lib/client/baseclient';\nimport XHRStates from 'common/constants/XHRStates';\nimport Logger from 'common/lib/util/logger';\nimport { StandardCallback } from 'common/types/utils';\nimport { isSuccessCode } from 'common/constants/HttpStatusCodes';\nimport { ModularPlugins } from 'common/lib/client/modularplugins';\n\nexport type HTTPRequestImplementations = Pick<ModularPlugins, 'XHRRequest' | 'FetchRequest'>;\n\nfunction createMissingImplementationError() {\n return new ErrorInfo(\n 'No HTTP request plugin provided. Provide at least one of the FetchRequest or XHRRequest plugins.',\n 400,\n 40000,\n );\n}\n\nconst Http = class {\n static methods = [HttpMethods.Get, HttpMethods.Delete, HttpMethods.Post, HttpMethods.Put, HttpMethods.Patch];\n static methodsWithoutBody = [HttpMethods.Get, HttpMethods.Delete];\n static methodsWithBody = [HttpMethods.Post, HttpMethods.Put, HttpMethods.Patch];\n // HTTP request implementations that are available even without a BaseClient object (needed by some tests which directly instantiate `Http` without a client)\n static bundledRequestImplementations: HTTPRequestImplementations;\n checksInProgress: Array<StandardCallback<boolean>> | null = null;\n private client: BaseClient | null;\n\n constructor(client?: BaseClient) {\n this.client = client ?? null;\n const connectivityCheckUrl = client?.options.connectivityCheckUrl || Defaults.connectivityCheckUrl;\n const connectivityCheckParams = client?.options.connectivityCheckParams ?? null;\n const connectivityUrlIsDefault = !client?.options.connectivityCheckUrl;\n\n const requestImplementations = {\n ...Http.bundledRequestImplementations,\n ...client?._additionalHTTPRequestImplementations,\n };\n const xhrRequestImplementation = requestImplementations.XHRRequest;\n const fetchRequestImplementation = requestImplementations.FetchRequest;\n const hasImplementation = !!(xhrRequestImplementation || fetchRequestImplementation);\n\n if (!hasImplementation) {\n throw createMissingImplementationError();\n }\n\n if (Platform.Config.xhrSupported && xhrRequestImplementation) {\n this.supportsAuthHeaders = true;\n this.Request = async function (\n method: HttpMethods,\n uri: string,\n headers: Record<string, string> | null,\n params: RequestParams,\n body: RequestBody | null,\n ) {\n return new Promise((resolve) => {\n const req = xhrRequestImplementation.createRequest(\n uri,\n headers,\n params,\n body,\n XHRStates.REQ_SEND,\n (client && client.options.timeouts) ?? null,\n this.logger,\n method,\n );\n req.once(\n 'complete',\n (\n error: RequestResult['error'],\n body: RequestResult['body'],\n headers: RequestResult['headers'],\n unpacked: RequestResult['unpacked'],\n statusCode: RequestResult['statusCode'],\n ) => resolve({ error, body, headers, unpacked, statusCode }),\n );\n req.exec();\n });\n };\n if (client?.options.disableConnectivityCheck) {\n this.checkConnectivity = async function () {\n return true;\n };\n } else {\n this.checkConnectivity = async function () {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n '(XHRRequest)Http.checkConnectivity()',\n 'Sending; ' + connectivityCheckUrl,\n );\n\n const requestResult = await this.doUri(\n HttpMethods.Get,\n connectivityCheckUrl,\n null,\n null,\n connectivityCheckParams,\n );\n\n let result = false;\n if (!connectivityUrlIsDefault) {\n result = !requestResult.error && isSuccessCode(requestResult.statusCode as number);\n } else {\n result = !requestResult.error && (requestResult.body as string)?.replace(/\\n/, '') == 'yes';\n }\n\n Logger.logAction(this.logger, Logger.LOG_MICRO, '(XHRRequest)Http.checkConnectivity()', 'Result: ' + result);\n return result;\n };\n }\n } else if (Platform.Config.fetchSupported && fetchRequestImplementation) {\n this.supportsAuthHeaders = true;\n this.Request = async (method, uri, headers, params, body) => {\n return fetchRequestImplementation(method, client ?? null, uri, headers, params, body);\n };\n\n if (client?.options.disableConnectivityCheck) {\n this.checkConnectivity = async function () {\n return true;\n };\n } else {\n this.checkConnectivity = async function () {\n Logger.logAction(\n this.logger,\n Logger.LOG_MICRO,\n '(Fetch)Http.checkConnectivity()',\n 'Sending; ' + connectivityCheckUrl,\n );\n const requestResult = await this.doUri(HttpMethods.Get, connectivityCheckUrl, null, null, null);\n const result = !requestResult.error && (requestResult.body as string)?.replace(/\\n/, '') == 'yes';\n Logger.logAction(this.logger, Logger.LOG_MICRO, '(Fetch)Http.checkConnectivity()', 'Result: ' + result);\n return result;\n };\n }\n } else {\n this.Request = async () => {\n const error = hasImplementation\n ? new PartialErrorInfo('no supported HTTP transports available', null, 400)\n : createMissingImplementationError();\n return { error };\n };\n }\n }\n\n get logger(): Logger {\n return this.client?.logger ?? Logger.defaultLogger;\n }\n\n async doUri(\n method: HttpMethods,\n uri: string,\n headers: Record<string, string> | null,\n body: RequestBody | null,\n params: RequestParams,\n ): Promise<RequestResult> {\n if (!this.Request) {\n return { error: new PartialErrorInfo('Request invoked before assigned to', null, 500) };\n }\n return this.Request(method, uri, headers, params, body);\n }\n\n private Request?: (\n method: HttpMethods,\n uri: string,\n headers: Record<string, string> | null,\n params: RequestParams,\n body: RequestBody | null,\n ) => Promise<RequestResult>;\n\n checkConnectivity?: () => Promise<boolean> = undefined;\n\n supportsAuthHeaders = false;\n supportsLinkHeaders = false;\n\n shouldFallback(errorInfo: RequestResultError) {\n const statusCode = errorInfo.statusCode as number;\n /* 400 + no code = a generic xhr onerror. Browser doesn't give us enough\n * detail to know whether it's fallback-fixable, but it may be (eg if a\n * network issue), so try just in case */\n return (\n (statusCode === 408 && !errorInfo.code) ||\n (statusCode === 400 && !errorInfo.code) ||\n (statusCode >= 500 && statusCode <= 504)\n );\n }\n};\n\nexport default Http;\n", "import IWebStorage from 'common/types/IWebStorage';\n\nconst test = 'ablyjs-storage-test';\n\nlet globalObject = typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : self;\n\nclass Webstorage implements IWebStorage {\n sessionSupported: boolean;\n localSupported: boolean;\n\n constructor() {\n /* Even just accessing the session/localStorage object can throw a\n * security exception in some circumstances with some browsers. In\n * others, calling setItem will throw. So have to check in this\n * somewhat roundabout way. (If unsupported or no global object,\n * will throw on accessing a property of undefined) */\n try {\n globalObject.sessionStorage.setItem(test, test);\n globalObject.sessionStorage.removeItem(test);\n this.sessionSupported = true;\n } catch (e) {\n this.sessionSupported = false;\n }\n\n try {\n globalObject.localStorage.setItem(test, test);\n globalObject.localStorage.removeItem(test);\n this.localSupported = true;\n } catch (e) {\n this.localSupported = false;\n }\n }\n\n get(name: string): any {\n return this._get(name, false);\n }\n\n getSession(name: string): any {\n return this._get(name, true);\n }\n\n remove(name: string): void {\n return this._remove(name, false);\n }\n\n removeSession(name: string): void {\n return this._remove(name, true);\n }\n\n set(name: string, value: string, ttl?: number): void {\n return this._set(name, value, ttl, false);\n }\n\n setSession(name: string, value: string, ttl?: number): void {\n return this._set(name, value, ttl, true);\n }\n\n private _set(name: string, value: string, ttl: number | undefined, session: any) {\n const wrappedValue: Record<string, any> = { value: value };\n if (ttl) {\n wrappedValue.expires = Date.now() + ttl;\n }\n return this.storageInterface(session).setItem(name, JSON.stringify(wrappedValue));\n }\n\n private _get(name: string, session?: boolean) {\n if (session && !this.sessionSupported) throw new Error('Session Storage not supported');\n if (!session && !this.localSupported) throw new Error('Local Storage not supported');\n const rawItem = this.storageInterface(session).getItem(name);\n if (!rawItem) return null;\n const wrappedValue = JSON.parse(rawItem);\n if (wrappedValue.expires && wrappedValue.expires < Date.now()) {\n this.storageInterface(session).removeItem(name);\n return null;\n }\n return wrappedValue.value;\n }\n\n private _remove(name: string, session?: boolean) {\n return this.storageInterface(session).removeItem(name);\n }\n\n private storageInterface(session?: boolean) {\n return session ? globalObject.sessionStorage : globalObject.localStorage;\n }\n}\n\nexport default new Webstorage();\n", "import { IPlatformConfig } from '../../common/types/IPlatformConfig';\nimport * as Utils from 'common/lib/util/utils';\nimport { DeviceFormFactor, DevicePlatform } from 'common/lib/types/devicedetails';\nimport webstorage from './lib/util/webstorage';\n\n// Workaround for salesforce lightning locker compat\nconst globalObject = Utils.getGlobalObject();\n\n// @ts-ignore\nconst isVercelEdgeRuntime = typeof EdgeRuntime === 'string';\n\n// We get false positive result here in the Vercel Edge runtime because it lacks the usual global browser objects, such as Window.\n// However, it is closer to the browser environment, so it intentionally uses browser bundles when importing packages.\n// Therefore, we do an additional check to avoid logging this incorrect warning for Vercel Edge runtime.\nif (typeof Window === 'undefined' && typeof WorkerGlobalScope === 'undefined' && !isVercelEdgeRuntime) {\n console.log(\n \"Warning: this distribution of Ably is intended for browsers. On nodejs, please use the 'ably' package on npm\",\n );\n}\n\nfunction allowComet() {\n /* xhr requests from local files are unreliable in some browsers, such as Chrome 65 and higher -- see eg\n * https://stackoverflow.com/questions/49256429/chrome-65-unable-to-make-post-requests-from-local-files-to-flask\n * So if websockets are supported, then just forget about comet transports and use that */\n const loc = globalObject.location;\n return !globalObject.WebSocket || !loc || !loc.origin || loc.origin.indexOf('http') > -1;\n}\n\n// from: https://stackoverflow.com/a/18002694\nexport function isWebWorkerContext(): boolean {\n // run this in global scope of window or worker. since window.self = window, we're ok\n if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {\n return true;\n } else {\n return false;\n }\n}\n\nconst userAgent = globalObject.navigator && globalObject.navigator.userAgent.toString();\nconst currentUrl = globalObject.location && globalObject.location.href;\n\nconst Config: IPlatformConfig = {\n agent: 'browser',\n logTimestamps: true,\n userAgent: userAgent,\n currentUrl: currentUrl,\n binaryType: 'arraybuffer',\n WebSocket: globalObject.WebSocket,\n fetchSupported: !!globalObject.fetch,\n xhrSupported: globalObject.XMLHttpRequest && 'withCredentials' in new XMLHttpRequest(),\n allowComet: allowComet(),\n useProtocolHeartbeats: true,\n supportsBinary: !!globalObject.TextDecoder,\n /* Per Paddy (https://ably-real-time.slack.com/archives/CURL4U2FP/p1705674537763479) web intentionally prefers JSON to MessagePack:\n *\n * > browsers' support for binary types in general was historically poor, and JSON transport performance is significantly better in a browser than msgpack. In modern browsers then binary is supported consistently, but I'd still expect that JSON encode/decode performance is dramatically better than msgpack in a browser.\n */\n preferBinary: false,\n ArrayBuffer: globalObject.ArrayBuffer,\n atob: globalObject.atob,\n nextTick:\n typeof globalObject.setImmediate !== 'undefined'\n ? globalObject.setImmediate.bind(globalObject)\n : function (f: () => void) {\n setTimeout(f, 0);\n },\n addEventListener: globalObject.addEventListener,\n inspect: JSON.stringify,\n stringByteSize: function (str: string) {\n /* str.length will be an underestimate for non-ascii strings. But if we're\n * in a browser too old to support TextDecoder, not much we can do. Better\n * to underestimate, so if we do go over-size, the server will reject the\n * message */\n return (globalObject.TextDecoder && new globalObject.TextEncoder().encode(str).length) || str.length;\n },\n TextEncoder: globalObject.TextEncoder,\n TextDecoder: globalObject.TextDecoder,\n getRandomArrayBuffer: async function (byteLength: number): Promise<ArrayBuffer> {\n const byteArray = new Uint8Array(byteLength);\n globalObject.crypto.getRandomValues(byteArray);\n return byteArray.buffer;\n },\n isWebworker: isWebWorkerContext(),\n push: {\n platform: DevicePlatform.Browser,\n formFactor: DeviceFormFactor.Desktop,\n storage: webstorage,\n },\n};\n\nexport default Config;\n", "import * as Utils from '../util/utils';\nimport { actions } from '../types/protocolmessagecommon';\nimport ProtocolMessage, {\n fromValues as protocolMessageFromValues,\n fromDeserialized as protocolMessageFromDeserialized,\n} from '../types/protocolmessage';\nimport Transport from './transport';\nimport Logger from '../util/logger';\nimport Defaults from '../util/defaults';\nimport ConnectionErrors from './connectionerrors';\nimport Auth from '../client/auth';\nimport ErrorInfo from '../types/errorinfo';\nimport IXHRRequest from '../../types/IXHRRequest';\nimport * as API from '../../../../ably';\nimport ConnectionManager, { TransportParams } from './connectionmanager';\nimport XHRStates from '../../constants/XHRStates';\nimport Platform from 'common/platform';\n\n/* TODO: can remove once realtime sends protocol message responses for comet errors */\nfunction shouldBeErrorAction(err: ErrorInfo) {\n const UNRESOLVABLE_ERROR_CODES = [80015, 80017, 80030];\n if (err.code) {\n if (Auth.isTokenErr(err)) return false;\n if (UNRESOLVABLE_ERROR_CODES.includes(err.code)) return true;\n return err.code >= 40000 && err.code < 50000;\n } else {\n /* Likely a network or transport error of some kind. Certainly not fatal to the connection */\n return false;\n }\n}\n\nfunction protocolMessageFromRawError(err: ErrorInfo) {\n /* err will be either a legacy (non-protocolmessage) comet error response\n * (which will have an err.code), or a xhr/network error (which won't). */\n if (shouldBeErrorAction(err)) {\n return [protocolMessageFromValues({ action: actions.ERROR, error: err })];\n } else {\n return [protocolMessageFromValues({ action: actions.DISCONNECTED, error: err })];\n }\n}\n\n/*\n * A base comet transport class\n */\nabstract class CometTransport extends Transport {\n stream: string | boolean;\n sendRequest: IXHRRequest | null;\n recvRequest: null | IXHRRequest;\n pendingCallback: null;\n pendingItems: null | Array<ProtocolMessage>;\n baseUri?: string;\n authParams?: Record<string, any>;\n closeUri?: string;\n disconnectUri?: string;\n sendUri?: string;\n recvUri?: string;\n\n constructor(connectionManager: ConnectionManager, auth: Auth, params: TransportParams) {\n super(connectionManager, auth, params, /* binary not supported for comet so force JSON protocol */ true);\n this.stream = 'stream' in params ? params.stream : true;\n this.sendRequest = null;\n this.recvRequest = null;\n this.pendingCallback = null;\n this.pendingItems = null;\n }\n\n abstract createRequest(\n uri: string,\n headers: Record<string, string> | null,\n params?: Record<string, unknown> | null,\n body?: unknown,\n requestMode?: number,\n ): IXHRRequest;\n\n connect(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.connect()', 'starting');\n Transport.prototype.connect.call(this);\n const params = this.params;\n const options = params.options;\n const host = params.host || options.primaryDomain;\n const port = Defaults.getPort(options);\n const cometScheme = options.tls ? 'https://' : 'http://';\n\n this.baseUri = cometScheme + host + ':' + port + '/comet/';\n const connectUri = this.baseUri + 'connect';\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.connect()', 'uri: ' + connectUri);\n Utils.whenPromiseSettles(this.auth.getAuthParams(), (err: Error | null, authParams?: Record<string, any>) => {\n if (err) {\n this.disconnect(err);\n return;\n }\n if (this.isDisposed) {\n return;\n }\n this.authParams = authParams;\n const connectParams = this.params.getConnectParams(authParams!);\n if ('stream' in connectParams) this.stream = connectParams.stream;\n Logger.logAction(\n this.logger,\n Logger.LOG_MINOR,\n 'CometTransport.connect()',\n 'connectParams:' + Utils.toQueryString(connectParams),\n );\n\n /* this will be the 'recvRequest' so this connection can stream messages */\n let preconnected = false;\n const connectRequest = (this.recvRequest = this.createRequest(\n connectUri,\n null,\n connectParams,\n null,\n this.stream ? XHRStates.REQ_RECV_STREAM : XHRStates.REQ_RECV,\n ));\n\n connectRequest.on('data', (data: any) => {\n if (!this.recvRequest) {\n /* the transport was disposed before we connected */\n return;\n }\n if (!preconnected) {\n preconnected = true;\n this.emit('preconnect');\n }\n this.onData(data);\n });\n connectRequest.on('complete', (err: ErrorInfo) => {\n if (!this.recvRequest) {\n /* the transport was disposed before we connected */\n err = err || new ErrorInfo('Request cancelled', 80003, 400);\n }\n this.recvRequest = null;\n /* Connect request may complete without a emitting 'data' event since that is not\n * emitted for e.g. a non-streamed error response. Still implies preconnect. */\n if (!preconnected && !err) {\n preconnected = true;\n this.emit('preconnect');\n }\n this.onActivity();\n if (err) {\n if (err.code) {\n /* A protocol error received from realtime. TODO: once realtime\n * consistendly sends errors wrapped in protocol messages, should be\n * able to remove this */\n this.onData(protocolMessageFromRawError(err));\n } else {\n /* A network/xhr error. Don't bother wrapping in a protocol message,\n * just disconnect the transport */\n this.disconnect(err);\n }\n return;\n }\n Platform.Config.nextTick(() => {\n this.recv();\n });\n });\n connectRequest.exec();\n });\n }\n\n requestClose(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.requestClose()');\n this._requestCloseOrDisconnect(true);\n }\n\n requestDisconnect(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.requestDisconnect()');\n this._requestCloseOrDisconnect(false);\n }\n\n _requestCloseOrDisconnect(closing: boolean): void {\n const closeOrDisconnectUri = closing ? this.closeUri : this.disconnectUri;\n if (closeOrDisconnectUri) {\n const request = this.createRequest(closeOrDisconnectUri, null, this.authParams, null, XHRStates.REQ_SEND);\n\n request.on('complete', (err: ErrorInfo) => {\n if (err) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'CometTransport.request' + (closing ? 'Close()' : 'Disconnect()'),\n 'request returned err = ' + Utils.inspectError(err),\n );\n this.finish('disconnected', err);\n }\n });\n request.exec();\n }\n }\n\n dispose(): void {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.dispose()', '');\n if (!this.isDisposed) {\n this.isDisposed = true;\n if (this.recvRequest) {\n Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.dispose()', 'aborting recv request');\n this.recvRequest.abort();\n this.recvRequest = null;\n }\n /* In almost all cases the transport will be finished before it's\n * disposed. Finish here just to make sure. */\n this.finish('disconnected', ConnectionErrors.disconnected());\n Platform.Config.nextTick(() => {\n this.emit('disposed');\n });\n }\n }\n\n onConnect(message: ProtocolMessage): void {\n /* if this transport has been disposed whilst awaiting connection, do nothing */\n if (this.isDisposed) {\n return;\n }\n\n /* the connectionKey in a comet connected response is really\n * <instId>-<connectionKey> */\n const connectionStr = message.connectionDetails?.connectionKey;\n Transport.prototype.onConnect.call(this, message);\n\n const baseConnectionUri = (this.baseUri as string) + connectionStr;\n Logger.logAction(this.logger, Logger.LOG_MICRO, 'CometTransport.onConnect()', 'baseUri = ' + baseConnectionUri);\n this.sendUri = baseConnectionUri + '/send';\n this.recvUri = baseConnectionUri + '/recv';\n this.closeUri = baseConnectionUri + '/close';\n this.disconnectUri = baseConnectionUri + '/disconnect';\n }\n\n send(message: ProtocolMessage): void {\n if (this.sendRequest) {\n /* there is a pending send, so queue this message */\n this.pendingItems = this.pendingItems || [];\n this.pendingItems.push(message);\n return;\n }\n /* send this, plus any pending, now */\n const pendingItems = this.pendingItems || [];\n pendingItems.push(message);\n this.pendingItems = null;\n\n this.sendItems(pendingItems);\n }\n\n sendAnyPending(): void {\n const pendingItems = this.pendingItems;\n\n if (!pendingItems) {\n return;\n }\n\n this.pendingItems = null;\n this.sendItems(pendingItems);\n }\n\n sendItems(items: Array<ProtocolMessage>): void {\n const sendRequest = (this.sendRequest = this.createRequest(\n this.sendUri as string,\n null,\n this.authParams,\n this.encodeRequest(items),\n XHRStates.REQ_SEND,\n ));\n\n sendRequest.on('complete', (err: ErrorInfo, data: string) => {\n if (err)\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'CometTransport.sendItems()',\n 'on complete: err = ' + Utils.inspectError(err),\n );\n this.sendRequest = null;\n\n /* the result of the request, even if a nack, is usually a protocol response\n * contained in the data. An err is anomolous, and indicates some issue with the\n * network,transport, or connection */\n if (err) {\n if (err.code) {\n /* A protocol error received from realtime. TODO: once realtime\n * consistendly sends errors wrapped in protocol messages, should be\n * able to remove this */\n this.onData(protocolMessageFromRawError(err));\n } else {\n /* A network/xhr error. Don't bother wrapping in a protocol message,\n * just disconnect the transport */\n this.disconnect(err);\n }\n return;\n }\n\n if (data) {\n this.onData(data);\n }\n\n if (this.pendingItems) {\n Platform.Config.nextTick(() => {\n /* If there's a new send request by now, any pending items will have\n * been picked up by that; any new ones added since then will be\n * picked up after that one completes */\n if (!this.sendRequest) {\n this.sendAnyPending();\n }\n });\n }\n });\n sendRequest.exec();\n }\n\n recv(): void {\n /* do nothing if there is an active request, which might be streaming */\n if (this.recvRequest) return;\n\n /* If we're no longer connected, do nothing */\n if (!this.isConnected) return;\n\n const recvRequest = (this.recvRequest = this.createRequest(\n this.recvUri as string,\n null,\n this.authParams,\n null,\n this.stream ? XHRStates.REQ_RECV_STREAM : XHRStates.REQ_RECV_POLL,\n ));\n\n recvRequest.on('data', (data: string) => {\n this.onData(data);\n });\n recvRequest.on('complete', (err: ErrorInfo) => {\n this.recvRequest = null;\n /* A request completing must be considered activity, as realtime sends\n * heartbeats every 15s since a request began, not every 15s absolutely */\n this.onActivity();\n if (err) {\n if (err.code) {\n /* A protocol error received from realtime. TODO: once realtime\n * consistently sends errors wrapped in protocol messages, should be\n * able to remove this */\n this.onData(protocolMessageFromRawError(err));\n } else {\n /* A network/xhr error. Don't bother wrapping in a protocol message,\n * just disconnect the transport */\n this.disconnect(err);\n }\n return;\n }\n Platform.Config.nextTick(() => {\n this.recv();\n });\n });\n recvRequest.exec();\n }\n\n onData(responseData: string | Record<string, any>): void {\n try {\n const items = this.decodeResponse(responseData);\n if (items && items.length)\n for (let i = 0; i < items.length; i++)\n this.onProtocolMessage(\n protocolMessageFromDeserialized(\n items[i],\n this.connectionManager.realtime._RealtimePresence,\n this.connectionManager.realtime._Annotations,\n this.connectionManager.realtime._objectsPlugin,\n ),\n );\n } catch (e) {\n Logger.logAction(\n this.logger,\n Logger.LOG_ERROR,\n 'CometTransport.onData()',\n 'Unexpected exception handing channel event: ' + (e as Error).stack,\n );\n }\n }\n\n encodeRequest(requestItems: Array<ProtocolMessage>): string {\n return JSON.stringify(requestItems);\n }\n\n decodeResponse(responseData: string | Record<string, any>): Record<string, any> {\n if (typeof responseData == 'string') return JSON.parse(responseData);\n return responseData;\n }\n\n /* Historical comment, back from when we supported JSONP:\n *\n * > For comet, we could do the auth update by aborting the current recv and\n * > starting a new one with the new token, that'd be sufficient for realtime.\n * > Problem is JSONP - you can't cancel truly abort a recv once started. So\n * > we need to send an AUTH for jsonp. In which case it's simpler to keep all\n * > comet transports the same and do it for all of them. So we send the AUTH\n * > instead, and don't need to abort the recv\n *\n * Now that we\u2019ve dropped JSONP support, we may be able to revisit the above;\n * see https://github.com/ably/ably-js/issues/1214.\n */\n onAuthUpdated = (tokenDetails: API.TokenDetails): void => {\n this.authParams = { access_token: tokenDetails.token };\n };\n}\n\nexport default CometTransport;\n", "import * as Utils from 'common/lib/util/utils';\r\nimport EventEmitter from 'common/lib/util/eventemitter';\r\nimport ErrorInfo, { IPartialErrorInfo, PartialErrorInfo } from 'common/lib/types/errorinfo';\r\nimport Logger from 'common/lib/util/logger';\r\nimport Defaults from 'common/lib/util/defaults';\r\nimport HttpMethods from 'common/constants/HttpMethods';\r\nimport IXHRRequest from 'common/types/IXHRRequest';\r\nimport { RequestBody, RequestParams } from 'common/types/http';\r\nimport XHRStates from 'common/constants/XHRStates';\r\nimport Platform from 'common/platform';\r\n\r\nfunction isAblyError(responseBody: unknown, headers: Record<string, string>): responseBody is { error?: ErrorInfo } {\r\n return Utils.allToLowerCase(Utils.keysArray(headers)).includes('x-ably-errorcode');\r\n}\r\n\r\nfunction getAblyError(responseBody: unknown, headers: Record<string, string>) {\r\n if (isAblyError(responseBody, headers)) {\r\n return responseBody.error && ErrorInfo.fromValues(responseBody.error);\r\n }\r\n}\r\n\r\nconst noop = function () {};\r\nlet idCounter = 0;\r\nconst pendingRequests: Record<string, XHRRequest> = {};\r\n\r\nfunction getHeader(xhr: XMLHttpRequest, header: string) {\r\n return xhr.getResponseHeader && xhr.getResponseHeader(header);\r\n}\r\n\r\n/* Safari mysteriously returns 'Identity' for transfer-encoding when in fact\r\n * it is 'chunked'. So instead, decide that it is chunked when\r\n * transfer-encoding is present or content-length is absent. ('or' because\r\n * when using http2 streaming, there's no transfer-encoding header, but can\r\n * still deduce streaming from lack of content-length) */\r\nfunction isEncodingChunked(xhr: XMLHttpRequest) {\r\n return (\r\n xhr.getResponseHeader && (xhr.getResponseHeader('transfer-encoding') || !xhr.getResponseHeader('content-length'))\r\n );\r\n}\r\n\r\nfunction getHeadersAsObject(xhr: XMLHttpRequest) {\r\n const headerPairs = xhr.getAllResponseHeaders().trim().split('\\r\\n');\r\n const headers: Record<string, string> = {};\r\n for (let i = 0; i < headerPairs.length; i++) {\r\n const parts = headerPairs[i].split(':').map((x) => x.trim());\r\n headers[parts[0].toLowerCase()] = parts[1];\r\n }\r\n return headers;\r\n}\r\n\r\nclass XHRRequest extends EventEmitter implements IXHRRequest {\r\n uri: string;\r\n headers: Record<string, string>;\r\n body: RequestBody | null;\r\n method: string;\r\n requestMode: number;\r\n timeouts: Record<string, number>;\r\n timedOut: boolean;\r\n requestComplete: boolean;\r\n id: string;\r\n streamComplete?: boolean;\r\n xhr?: XMLHttpRequest | null;\r\n timer?: NodeJS.Timeout | number | null;\r\n\r\n constructor(\r\n uri: string,\r\n headers: Record<string, string> | null,\r\n params: Record<string, string>,\r\n body: RequestBody | null,\r\n requestMode: number,\r\n timeouts: Record<string, number>,\r\n logger: Logger,\r\n method?: HttpMethods,\r\n ) {\r\n super(logger);\r\n params = params || {};\r\n params.rnd = Utils.cheapRandStr();\r\n this.uri = uri + Utils.toQueryString(params);\r\n this.headers = headers || {};\r\n this.body = body;\r\n this.method = method ? method.toUpperCase() : Utils.isNil(body) ? 'GET' : 'POST';\r\n this.requestMode = requestMode;\r\n this.timeouts = timeouts;\r\n this.timedOut = false;\r\n this.requestComplete = false;\r\n this.id = String(++idCounter);\r\n pendingRequests[this.id] = this;\r\n }\r\n\r\n static createRequest(\r\n uri: string,\r\n headers: Record<string, string> | null,\r\n params: RequestParams,\r\n body: RequestBody | null,\r\n requestMode: number,\r\n timeouts: Record<string, number> | null,\r\n logger: Logger,\r\n method?: HttpMethods,\r\n ): XHRRequest {\r\n /* XHR requests are used either with the context being a realtime\r\n * transport, or with timeouts passed in (for when used by a rest client),\r\n * or completely standalone. Use the appropriate timeouts in each case */\r\n const _timeouts = timeouts || Defaults.TIMEOUTS;\r\n return new XHRRequest(\r\n uri,\r\n headers,\r\n Utils.copy(params) as Record<string, string>,\r\n body,\r\n requestMode,\r\n _timeouts,\r\n logger,\r\n method,\r\n );\r\n }\r\n\r\n complete(\r\n err?: IPartialErrorInfo | null,\r\n body?: unknown,\r\n headers?: Record<string, string> | null,\r\n unpacked?: boolean | null,\r\n statusCode?: number,\r\n ): void {\r\n if (!this.requestComplete) {\r\n this.requestComplete = true;\r\n if (!err && body) {\r\n this.emit('data', body);\r\n }\r\n this.emit('complete', err, body, headers, unpacked, statusCode);\r\n this.dispose();\r\n }\r\n }\r\n\r\n abort(): void {\r\n this.dispose();\r\n }\r\n\r\n exec(): void {\r\n let headers = this.headers;\r\n const timeout =\r\n this.requestMode == XHRStates.REQ_SEND ? this.timeouts.httpRequestTimeout : this.timeouts.recvTimeout,\r\n timer = (this.timer = setTimeout(() => {\r\n this.timedOut = true;\r\n xhr.abort();\r\n }, timeout)),\r\n method = this.method,\r\n xhr = (this.xhr = new XMLHttpRequest()),\r\n accept = headers['accept'];\r\n let body = this.body;\r\n let responseType: XMLHttpRequestResponseType = 'text';\r\n\r\n if (!accept) {\r\n // Default to JSON\r\n headers['accept'] = 'application/json';\r\n } else if (accept.indexOf('application/x-msgpack') === 0) {\r\n // Msgpack responses will be typed as ArrayBuffer\r\n responseType = 'arraybuffer';\r\n }\r\n\r\n if (body) {\r\n const contentType = headers['content-type'] || (headers['content-type'] = 'application/json');\r\n if (contentType.indexOf('application/json') > -1 && typeof body != 'string') body = JSON.stringify(body);\r\n }\r\n\r\n // Can probably remove this directive if https://github.com/nodesecurity/eslint-plugin-security/issues/26 is resolved\r\n // eslint-disable-next-line security/detect-non-literal-fs-filename\r\n xhr.open(method, this.uri, true);\r\n xhr.responseType = responseType;\r\n\r\n if ('authorization' in headers) {\r\n xhr.withCredentials = true;\r\n }\r\n\r\n for (const h in headers) xhr.setRequestHeader(h, headers[h]);\r\n\r\n const errorHandler = (\r\n errorEvent: ProgressEvent<EventTarget>,\r\n message: string,\r\n code: number | null,\r\n statusCode: number,\r\n ) => {\r\n let errorMessage = message + ' (event type: ' + errorEvent.type + ')';\r\n if (this?.xhr?.statusText) errorMessage += ', current statusText is ' + this.xhr.statusText;\r\n Logger.logAction(this.logger, Logger.LOG_ERROR, 'Request.on' + errorEvent.type + '()', errorMessage);\r\n this.complete(new PartialErrorInfo(errorMessage, code, statusCode));\r\n };\r\n xhr.onerror = (errorEvent) => {\r\n errorHandler(errorEvent, 'XHR error occurred', null, 400);\r\n };\r\n xhr.onabort = (errorEvent) => {\r\n if (this.timedOut) {\r\n errorHandler(errorEvent, 'Request aborted due to request timeout expiring', null, 408);\r\n } else {\r\n errorHandler(errorEvent, 'Request cancelled', null, 400);\r\n }\r\n };\r\n xhr.ontimeout = (errorEvent) => {\r\n errorHandler(errorEvent, 'Request timed out', null, 408);\r\n };\r\n\r\n let streaming: boolean | string;\r\n let statusCode: number;\r\n let successResponse: boolean;\r\n let streamPos = 0;\r\n let unpacked = false;\r\n\r\n const onResponse = () => {\r\n clearTimeout(timer);\r\n successResponse = statusCode < 400;\r\n if (statusCode == 204) {\r\n this.complete(null, null, null, null, statusCode);\r\n return;\r\n }\r\n streaming = this.requestMode == XHRStates.REQ_RECV_STREAM && successResponse && isEncodingChunked(xhr);\r\n };\r\n\r\n const onEnd = () => {\r\n let parsedResponse: any;\r\n try {\r\n const contentType = getHeader(xhr, 'content-type');\r\n /* Be liberal in what we accept; buggy auth servers may respond\r\n * without the correct contenttype, but assume they're still\r\n * responding with json */\r\n const json = contentType ? contentType.indexOf('application/json') >= 0 : xhr.responseType == 'text';\r\n\r\n if (json) {\r\n /* If we requested msgpack but server responded with json, then since\r\n * we set the responseType expecting msgpack, the response will be\r\n * an ArrayBuffer containing json */\r\n const jsonResponseBody =\r\n xhr.responseType === 'arraybuffer'\r\n ? Platform.BufferUtils.utf8Decode(xhr.response)\r\n : String(xhr.responseText);\r\n if (jsonResponseBody.length) {\r\n parsedResponse = JSON.parse(jsonResponseBody);\r\n } else {\r\n parsedResponse = jsonResponseBody;\r\n }\r\n unpacked = true;\r\n } else {\r\n parsedResponse = xhr.response;\r\n }\r\n\r\n if (parsedResponse.response !== undefined) {\r\n /* unwrap JSON envelope */\r\n statusCode = parsedResponse.statusCode;\r\n successResponse = statusCode < 400;\r\n headers = parsedResponse.headers;\r\n parsedResponse = parsedResponse.response;\r\n } else {\r\n headers = getHeadersAsObject(xhr);\r\n }\r\n } catch (e) {\r\n this.complete(new PartialErrorInfo('Malformed response body from server: ' + (e as Error).message, null, 400));\r\n return;\r\n }\r\n\r\n /* If response is an array, it's an array of protocol messages -- even if\r\n * is contains an error action (hence the nonsuccess statuscode), we can\r\n * consider the request to have succeeded, just pass it on to\r\n * onProtocolMessage to decide what to do */\r\n if (successResponse || Array.isArray(parsedResponse)) {\r\n this.complete(null, parsedResponse, headers, unpacked, statusCode);\r\n return;\r\n }\r\n\r\n let err: IPartialErrorInfo | undefined = getAblyError(parsedResponse, headers);\r\n if (!err) {\r\n err = new PartialErrorInfo(\r\n 'Error response received from server: ' +\r\n statusCode +\r\n ' body was: ' +\r\n Platform.Config.inspect(parsedResponse),\r\n null,\r\n statusCode,\r\n );\r\n }\r\n this.complete(err, parsedResponse, headers, unpacked, statusCode);\r\n };\r\n\r\n function onProgress() {\r\n const responseText = xhr.responseText;\r\n const bodyEnd = responseText.length - 1;\r\n let idx, chunk;\r\n while (streamPos < bodyEnd && (idx = responseText.indexOf('\\n', streamPos)) > -1) {\r\n chunk = responseText.slice(streamPos, idx);\r\n streamPos = idx + 1;\r\n onChunk(chunk);\r\n }\r\n }\r\n\r\n const onChunk = (chunk: string) => {\r\n try {\r\n chunk = JSON.parse(chunk);\r\n } catch (e) {\r\n this.complete(new PartialErrorInfo('Malformed response body from server: ' + (e as Error).message, null, 400));\r\n return;\r\n }\r\n this.emit('data', chunk);\r\n };\r\n\r\n const onStreamEnd = () => {\r\n onProgress();\r\n this.streamComplete = true;\r\n Platform.Config.nextTick(() => {\r\n this.complete();\r\n });\r\n };\r\n\r\n xhr.onreadystatechange = () => {\r\n const readyState = xhr.readyState;\r\n if (readyState < 3) return;\r\n if (xhr.status !== 0) {\r\n if (statusCode === undefined) {\r\n statusCode = xhr.status;\r\n onResponse();\r\n }\r\n if (readyState == 3 && streaming) {\r\n onProgress();\r\n } else if (readyState == 4) {\r\n if (streaming) onStreamEnd();\r\n else onEnd();\r\n }\r\n }\r\n };\r\n xhr.send(body as any);\r\n }\r\n\r\n dispose(): void {\r\n const xhr = this.xhr;\r\n if (xhr) {\r\n xhr.onreadystatechange = xhr.onerror = xhr.onabort = xhr.ontimeout = noop;\r\n this.xhr = null;\r\n const timer = this.timer;\r\n if (timer) {\r\n clearTimeout(timer as NodeJS.Timeout);\r\n this.timer = null;\r\n }\r\n if (!this.requestComplete) xhr.abort();\r\n }\r\n delete pendingRequests[this.id];\r\n }\r\n}\r\n\r\nexport default XHRRequest;\r\n", "import Platform from '../../../../common/platform';\nimport CometTransport from '../../../../common/lib/transport/comettransport';\nimport XHRRequest from '../http/request/xhrrequest';\nimport ConnectionManager, { TransportParams } from 'common/lib/transport/connectionmanager';\nimport Auth from 'common/lib/client/auth';\nimport { RequestBody, RequestParams } from 'common/types/http';\nimport { TransportNames } from 'common/constants/TransportName';\n\nvar shortName = TransportNames.XhrPolling;\nclass XHRPollingTransport extends CometTransport {\n shortName = shortName;\n constructor(connectionManager: ConnectionManager, auth: Auth, params: TransportParams) {\n super(connectionManager, auth, params);\n params.stream = false;\n this.shortName = shortName;\n }\n\n static isAvailable() {\n return !!(Platform.Config.xhrSupported && Platform.Config.allowComet);\n }\n\n toString() {\n return 'XHRPollingTransport; uri=' + this.baseUri + '; isConnected=' + this.isConnected;\n }\n\n createRequest(\n uri: string,\n headers: Record<string, string>,\n params: RequestParams,\n body: RequestBody | null,\n requestMode: number,\n ) {\n return XHRRequest.createRequest(uri, headers, params, body, requestMode, this.timeouts, this.logger);\n }\n}\n\nexport default XHRPollingTransport;\n", "import TransportName from 'common/constants/TransportName';\nimport Platform from 'common/platform';\nimport XhrPollingTransport from './xhrpollingtransport';\nimport WebSocketTransport from '../../../../common/lib/transport/websockettransport';\n\n// For reasons that I don\u2019t understand, if we use [TransportNames.XhrPolling] for the keys in defaultTransports\u2019s, then defaultTransports does not get tree-shaken. Hence using literals instead. They\u2019re still correctly type-checked.\n\nconst order: TransportName[] = ['xhr_polling'];\n\nconst defaultTransports: (typeof Platform)['Transports'] = {\n order,\n bundledImplementations: {\n web_socket: WebSocketTransport,\n xhr_polling: XhrPollingTransport,\n },\n};\n\nexport default defaultTransports;\n\nexport const ModularTransports: (typeof Platform)['Transports'] = {\n order,\n bundledImplementations: {},\n};\n", "import IDefaults from 'common/types/IDefaults';\nimport { TransportNames } from 'common/constants/TransportName';\n\nconst Defaults: IDefaults = {\n connectivityCheckUrl: 'https://internet-up.ably-realtime.com/is-the-internet-up.txt',\n wsConnectivityCheckUrl: 'wss://ws-up.ably-realtime.com',\n /* Order matters here: the base transport is the leftmost one in the\n * intersection of baseTransportOrder and the transports clientOption that's\n * supported. */\n defaultTransports: [TransportNames.XhrPolling, TransportNames.WebSocket],\n};\n\nexport default Defaults;\n", "function inspect(buffer: undefined | ArrayBuffer | DataView) {\n if (buffer === undefined) return 'undefined';\n let view;\n let type;\n if (buffer instanceof ArrayBuffer) {\n type = 'ArrayBuffer';\n view = new DataView(buffer);\n } else if (buffer instanceof DataView) {\n type = 'DataView';\n view = buffer;\n }\n if (!view) return JSON.stringify(buffer);\n const bytes = [];\n for (let i = 0; i < buffer.byteLength; i++) {\n if (i > 20) {\n bytes.push('...');\n break;\n }\n let byte_ = view.getUint8(i).toString(16);\n if (byte_.length === 1) byte_ = '0' + byte_;\n bytes.push(byte_);\n }\n return '<' + type + ' ' + bytes.join(' ') + '>';\n}\n\n// Encode string as utf8 into dataview at offset\nfunction utf8Write(view: DataView, offset: number, string: string) {\n for (let i = 0, l = string.length; i < l; i++) {\n const codePoint = string.charCodeAt(i);\n\n // One byte of UTF-8\n if (codePoint < 0x80) {\n view.setUint8(offset++, ((codePoint >>> 0) & 0x7f) | 0x00);\n continue;\n }\n\n // Two bytes of UTF-8\n if (codePoint < 0x800) {\n view.setUint8(offset++, ((codePoint >>> 6) & 0x1f) | 0xc0);\n view.setUint8(offset++, ((codePoint >>> 0) & 0x3f) | 0x80);\n continue;\n }\n\n // Three bytes of UTF-8.\n if (codePoint < 0x10000) {\n view.setUint8(offset++, ((codePoint >>> 12) & 0x0f) | 0xe0);\n view.setUint8(offset++, ((codePoint >>> 6) & 0x3f) | 0x80);\n view.setUint8(offset++, ((codePoint >>> 0) & 0x3f) | 0x80);\n continue;\n }\n\n // Four bytes of UTF-8\n if (codePoint < 0x110000) {\n view.setUint8(offset++, ((codePoint >>> 18) & 0x07) | 0xf0);\n view.setUint8(offset++, ((codePoint >>> 12) & 0x3f) | 0x80);\n view.setUint8(offset++, ((codePoint >>> 6) & 0x3f) | 0x80);\n view.setUint8(offset++, ((codePoint >>> 0) & 0x3f) | 0x80);\n continue;\n }\n throw new Error('bad codepoint ' + codePoint);\n }\n}\n\nfunction utf8Read(view: DataView, offset: number, length: number) {\n let string = '';\n for (let i = offset, end = offset + length; i < end; i++) {\n const byte_ = view.getUint8(i);\n // One byte character\n if ((byte_ & 0x80) === 0x00) {\n string += String.fromCharCode(byte_);\n continue;\n }\n // Two byte character\n if ((byte_ & 0xe0) === 0xc0) {\n string += String.fromCharCode(((byte_ & 0x0f) << 6) | (view.getUint8(++i) & 0x3f));\n continue;\n }\n // Three byte character\n if ((byte_ & 0xf0) === 0xe0) {\n string += String.fromCharCode(\n ((byte_ & 0x0f) << 12) | ((view.getUint8(++i) & 0x3f) << 6) | ((view.getUint8(++i) & 0x3f) << 0),\n );\n continue;\n }\n // Four byte character\n if ((byte_ & 0xf8) === 0xf0) {\n string += String.fromCharCode(\n ((byte_ & 0x07) << 18) |\n ((view.getUint8(++i) & 0x3f) << 12) |\n ((view.getUint8(++i) & 0x3f) << 6) |\n ((view.getUint8(++i) & 0x3f) << 0),\n );\n continue;\n }\n throw new Error('Invalid byte ' + byte_.toString(16));\n }\n return string;\n}\n\nfunction utf8ByteCount(string: string) {\n let count = 0;\n for (let i = 0, l = string.length; i < l; i++) {\n const codePoint = string.charCodeAt(i);\n if (codePoint < 0x80) {\n count += 1;\n continue;\n }\n if (codePoint < 0x800) {\n count += 2;\n continue;\n }\n if (codePoint < 0x10000) {\n count += 3;\n continue;\n }\n if (codePoint < 0x110000) {\n count += 4;\n continue;\n }\n throw new Error('bad codepoint ' + codePoint);\n }\n return count;\n}\n\nfunction encode(value: unknown, sparse?: boolean) {\n const size = sizeof(value, sparse);\n if (size === 0) return undefined;\n const buffer = new ArrayBuffer(size);\n const view = new DataView(buffer);\n _encode(value, view, 0, sparse);\n return buffer;\n}\n\nconst SH_L_32 = (1 << 16) * (1 << 16),\n SH_R_32 = 1 / SH_L_32;\nfunction getInt64(view: DataView, offset: number) {\n offset = offset || 0;\n return view.getInt32(offset) * SH_L_32 + view.getUint32(offset + 4);\n}\n\nfunction getUint64(view: DataView, offset: number) {\n offset = offset || 0;\n return view.getUint32(offset) * SH_L_32 + view.getUint32(offset + 4);\n}\n\nfunction setInt64(view: DataView, offset: number, val: number) {\n if (val < 0x8000000000000000) {\n view.setInt32(offset, Math.floor(val * SH_R_32));\n view.setInt32(offset + 4, val & -1);\n } else {\n view.setUint32(offset, 0x7fffffff);\n view.setUint32(offset + 4, 0x7fffffff);\n }\n}\n\nfunction setUint64(view: DataView, offset: number, val: number) {\n if (val < 0x10000000000000000) {\n view.setUint32(offset, Math.floor(val * SH_R_32));\n view.setInt32(offset + 4, val & -1);\n } else {\n view.setUint32(offset, 0xffffffff);\n view.setUint32(offset + 4, 0xffffffff);\n }\n}\n\n// https://gist.github.com/frsyuki/5432559 - v5 spec\n//\n// I've used one extension point from `fixext 1` to store `undefined`. On the wire this\n// should translate to exactly 0xd40000\n//\n// +--------+--------+--------+\n// | 0xd4 | 0x00 | 0x00 |\n// +--------+--------+--------+\n// ^ fixext | ^ value part unused (fixed to be 0)\n// ^ indicates undefined value\n//\n\nclass Decoder {\n offset: number;\n view: DataView;\n\n constructor(view: DataView, offset?: number) {\n this.offset = offset || 0;\n this.view = view;\n }\n\n map = (length: number) => {\n const value: { [key: string]: ArrayBuffer } = {};\n for (let i = 0; i < length; i++) {\n const key = this.parse();\n value[key as string] = this.parse() as ArrayBuffer;\n }\n return value;\n };\n\n bin = (length: number) => {\n const value = new ArrayBuffer(length);\n new Uint8Array(value).set(new Uint8Array(this.view.buffer, this.offset, length), 0);\n this.offset += length;\n return value;\n };\n\n buf = this.bin;\n\n str = (length: number) => {\n const value = utf8Read(this.view, this.offset, length);\n this.offset += length;\n return value;\n };\n\n array = (length: number) => {\n const value = new Array(length);\n for (let i = 0; i < length; i++) {\n value[i] = this.parse();\n }\n return value;\n };\n\n ext = (length: number) => {\n this.offset += length;\n return {\n type: this.view.getInt8(this.offset),\n data: this.buf(length),\n };\n };\n\n parse = (): unknown => {\n const type = this.view.getUint8(this.offset);\n let value, length;\n\n // Positive FixInt - 0xxxxxxx\n if ((type & 0x80) === 0x00) {\n this.offset++;\n return type;\n }\n\n // FixMap - 1000xxxx\n if ((type & 0xf0) === 0x80) {\n length = type & 0x0f;\n this.offset++;\n return this.map(length);\n }\n\n // FixArray - 1001xxxx\n if ((type & 0xf0) === 0x90) {\n length = type & 0x0f;\n this.offset++;\n return this.array(length);\n }\n\n // FixStr - 101xxxxx\n if ((type & 0xe0) === 0xa0) {\n length = type & 0x1f;\n this.offset++;\n return this.str(length);\n }\n\n // Negative FixInt - 111xxxxx\n if ((type & 0xe0) === 0xe0) {\n value = this.view.getInt8(this.offset);\n this.offset++;\n return value;\n }\n\n switch (type) {\n // nil\n case 0xc0:\n this.offset++;\n return null;\n\n // 0xc1 never used - use for undefined (NON-STANDARD)\n case 0xc1:\n this.offset++;\n return undefined;\n\n // false\n case 0xc2:\n this.offset++;\n return false;\n\n // true\n case 0xc3:\n this.offset++;\n return true;\n\n // bin 8\n case 0xc4:\n length = this.view.getUint8(this.offset + 1);\n this.offset += 2;\n return this.bin(length);\n\n // bin 16\n case 0xc5:\n length = this.view.getUint16(this.offset + 1);\n this.offset += 3;\n return this.bin(length);\n\n // bin 32\n case 0xc6:\n length = this.view.getUint32(this.offset + 1);\n this.offset += 5;\n return this.bin(length);\n\n // ext 8\n case 0xc7:\n length = this.view.getUint8(this.offset + 1);\n this.offset += 2;\n return this.ext(length);\n\n // ext 16\n case 0xc8:\n length = this.view.getUint16(this.offset + 1);\n this.offset += 3;\n return this.ext(length);\n\n // ext 32\n case 0xc9:\n length = this.view.getUint32(this.offset + 1);\n this.offset += 5;\n return this.ext(length);\n\n // float 32\n case 0xca:\n value = this.view.getFloat32(this.offset + 1);\n this.offset += 5;\n return value;\n\n // float 64\n case 0xcb:\n value = this.view.getFloat64(this.offset + 1);\n this.offset += 9;\n return value;\n\n // uint8\n case 0xcc:\n value = this.view.getUint8(this.offset + 1);\n this.offset += 2;\n return value;\n\n // uint 16\n case 0xcd:\n value = this.view.getUint16(this.offset + 1);\n this.offset += 3;\n return value;\n\n // uint 32\n case 0xce:\n value = this.view.getUint32(this.offset + 1);\n this.offset += 5;\n return value;\n\n // uint 64\n case 0xcf:\n value = getUint64(this.view, this.offset + 1);\n this.offset += 9;\n return value;\n\n // int 8\n case 0xd0:\n value = this.view.getInt8(this.offset + 1);\n this.offset += 2;\n return value;\n\n // int 16\n case 0xd1:\n value = this.view.getInt16(this.offset + 1);\n this.offset += 3;\n return value;\n\n // int 32\n case 0xd2:\n value = this.view.getInt32(this.offset + 1);\n this.offset += 5;\n return value;\n\n // int 64\n case 0xd3:\n value = getInt64(this.view, this.offset + 1);\n this.offset += 9;\n return value;\n\n // fixext 1\n case 0xd4:\n length = 1;\n this.offset++;\n return this.ext(length);\n\n // fixext 2\n case 0xd5:\n length = 2;\n this.offset++;\n return this.ext(length);\n\n // fixext 4\n case 0xd6:\n length = 4;\n this.offset++;\n return this.ext(length);\n\n // fixext 8\n case 0xd7:\n length = 8;\n this.offset++;\n return this.ext(length);\n\n // fixext 16\n case 0xd8:\n length = 16;\n this.offset++;\n return this.ext(length);\n\n // str8\n case 0xd9:\n length = this.view.getUint8(this.offset + 1);\n this.offset += 2;\n return this.str(length);\n\n // str 16\n case 0xda:\n length = this.view.getUint16(this.offset + 1);\n this.offset += 3;\n return this.str(length);\n\n // str 32\n case 0xdb:\n length = this.view.getUint32(this.offset + 1);\n this.offset += 5;\n return this.str(length);\n\n // array 16\n case 0xdc:\n length = this.view.getUint16(this.offset + 1);\n this.offset += 3;\n return this.array(length);\n\n // array 32\n case 0xdd:\n length = this.view.getUint32(this.offset + 1);\n this.offset += 5;\n return this.array(length);\n\n // map 16\n case 0xde:\n length = this.view.getUint16(this.offset + 1);\n this.offset += 3;\n return this.map(length);\n\n // map 32\n case 0xdf:\n length = this.view.getUint32(this.offset + 1);\n this.offset += 5;\n return this.map(length);\n }\n throw new Error('Unknown type 0x' + type.toString(16));\n };\n}\n\nfunction decode(buffer: ArrayBuffer) {\n const view = new DataView(buffer);\n const decoder = new Decoder(view);\n const value = decoder.parse();\n if (decoder.offset !== buffer.byteLength) throw new Error(buffer.byteLength - decoder.offset + ' trailing bytes');\n return value;\n}\n\nfunction encodeableKeys(value: { [key: string]: unknown }, sparse?: boolean) {\n return Object.keys(value).filter(function (e) {\n const val = value[e],\n type = typeof val;\n return (!sparse || (val !== undefined && val !== null)) && ('function' !== type || !!(val as Date).toJSON);\n });\n}\n\nfunction _encode(value: unknown, view: DataView, offset: number, sparse?: boolean): number {\n const type = typeof value;\n\n // Strings Bytes\n // There are four string types: fixstr/str8/str16/str32\n if (typeof value === 'string') {\n const length = utf8ByteCount(value);\n\n // fixstr\n if (length < 0x20) {\n view.setUint8(offset, length | 0xa0);\n utf8Write(view, offset + 1, value);\n return 1 + length;\n }\n\n // str8\n if (length < 0x100) {\n view.setUint8(offset, 0xd9);\n view.setUint8(offset + 1, length);\n utf8Write(view, offset + 2, value);\n return 2 + length;\n }\n\n // str16\n if (length < 0x10000) {\n view.setUint8(offset, 0xda);\n view.setUint16(offset + 1, length);\n utf8Write(view, offset + 3, value);\n return 3 + length;\n }\n // str32\n if (length < 0x100000000) {\n view.setUint8(offset, 0xdb);\n view.setUint32(offset + 1, length);\n utf8Write(view, offset + 5, value);\n return 5 + length;\n }\n }\n\n if (ArrayBuffer.isView && ArrayBuffer.isView(value)) {\n // extract the arraybuffer and fallthrough\n value = value.buffer;\n }\n\n // There are three bin types: bin8/bin16/bin32\n if (value instanceof ArrayBuffer) {\n const length = value.byteLength;\n\n // bin8\n if (length < 0x100) {\n view.setUint8(offset, 0xc4);\n view.setUint8(offset + 1, length);\n new Uint8Array(view.buffer).set(new Uint8Array(value), offset + 2);\n return 2 + length;\n }\n\n // bin16\n if (length < 0x10000) {\n view.setUint8(offset, 0xc5);\n view.setUint16(offset + 1, length);\n new Uint8Array(view.buffer).set(new Uint8Array(value), offset + 3);\n return 3 + length;\n }\n\n // bin 32\n if (length < 0x100000000) {\n view.setUint8(offset, 0xc6);\n view.setUint32(offset + 1, length);\n new Uint8Array(view.buffer).set(new Uint8Array(value), offset + 5);\n return 5 + length;\n }\n }\n\n if (typeof value === 'number') {\n // Floating Point\n // NOTE: We're always using float64\n if (Math.floor(value) !== value) {\n view.setUint8(offset, 0xcb);\n view.setFloat64(offset + 1, value);\n return 9;\n }\n\n // Integers\n if (value >= 0) {\n // positive fixnum\n if (value < 0x80) {\n view.setUint8(offset, value);\n return 1;\n }\n // uint 8\n if (value < 0x100) {\n view.setUint8(offset, 0xcc);\n view.setUint8(offset + 1, value);\n return 2;\n }\n // uint 16\n if (value < 0x10000) {\n view.setUint8(offset, 0xcd);\n view.setUint16(offset + 1, value);\n return 3;\n }\n // uint 32\n if (value < 0x100000000) {\n view.setUint8(offset, 0xce);\n view.setUint32(offset + 1, value);\n return 5;\n }\n // uint 64\n if (value < 0x10000000000000000) {\n view.setUint8(offset, 0xcf);\n setUint64(view, offset + 1, value);\n return 9;\n }\n throw new Error('Number too big 0x' + value.toString(16));\n }\n\n // negative fixnum\n if (value >= -0x20) {\n view.setInt8(offset, value);\n return 1;\n }\n // int 8\n if (value >= -0x80) {\n view.setUint8(offset, 0xd0);\n view.setInt8(offset + 1, value);\n return 2;\n }\n // int 16\n if (value >= -0x8000) {\n view.setUint8(offset, 0xd1);\n view.setInt16(offset + 1, value);\n return 3;\n }\n // int 32\n if (value >= -0x80000000) {\n view.setUint8(offset, 0xd2);\n view.setInt32(offset + 1, value);\n return 5;\n }\n // int 64\n if (value >= -0x8000000000000000) {\n view.setUint8(offset, 0xd3);\n setInt64(view, offset + 1, value);\n return 9;\n }\n throw new Error('Number too small -0x' + (-value).toString(16).substr(1));\n }\n\n // undefined - use d4 (NON-STANDARD)\n if (type === 'undefined') {\n if (sparse) return 0;\n view.setUint8(offset, 0xd4);\n view.setUint8(offset + 1, 0x00);\n view.setUint8(offset + 2, 0x00);\n return 3;\n }\n\n // null\n if (value === null) {\n if (sparse) return 0;\n view.setUint8(offset, 0xc0);\n return 1;\n }\n\n // Boolean\n if (type === 'boolean') {\n view.setUint8(offset, value ? 0xc3 : 0xc2);\n return 1;\n }\n\n if ('function' === typeof (value as Date).toJSON) return _encode((value as Date).toJSON(), view, offset, sparse);\n\n // Container Types\n if (type === 'object') {\n let length: number,\n size = 0;\n let keys: string[] | undefined;\n const isArray = Array.isArray(value);\n\n if (isArray) {\n length = (value as unknown[]).length;\n } else {\n keys = encodeableKeys(value as { [key: string]: unknown }, sparse);\n length = keys.length;\n }\n\n if (length < 0x10) {\n view.setUint8(offset, length | (isArray ? 0x90 : 0x80));\n size = 1;\n } else if (length < 0x10000) {\n view.setUint8(offset, isArray ? 0xdc : 0xde);\n view.setUint16(offset + 1, length);\n size = 3;\n } else if (length < 0x100000000) {\n view.setUint8(offset, isArray ? 0xdd : 0xdf);\n view.setUint32(offset + 1, length);\n size = 5;\n }\n\n if (isArray) {\n for (let i = 0; i < length; i++) {\n size += _encode((value as unknown[])[i], view, offset + size, sparse);\n }\n } else if (keys) {\n for (let i = 0; i < length; i++) {\n const key = keys[i];\n size += _encode(key, view, offset + size);\n size += _encode((value as { [key: string]: unknown })[key], view, offset + size, sparse);\n }\n }\n\n return size;\n }\n if (type === 'function') return 0;\n\n throw new Error('Unknown type ' + type);\n}\n\nfunction sizeof(value: unknown, sparse?: boolean): number {\n const type = typeof value;\n\n // fixstr or str8 or str16 or str32\n if (type === 'string') {\n const length = utf8ByteCount(value as string);\n if (length < 0x20) {\n return 1 + length;\n }\n if (length < 0x100) {\n return 2 + length;\n }\n if (length < 0x10000) {\n return 3 + length;\n }\n if (length < 0x100000000) {\n return 5 + length;\n }\n }\n\n if (ArrayBuffer.isView && ArrayBuffer.isView(value)) {\n // extract the arraybuffer and fallthrough\n value = value.buffer;\n }\n\n // bin8 or bin16 or bin32\n if (value instanceof ArrayBuffer) {\n const length = value.byteLength;\n if (length < 0x100) {\n return 2 + length;\n }\n if (length < 0x10000) {\n return 3 + length;\n }\n if (length < 0x100000000) {\n return 5 + length;\n }\n }\n\n if (typeof value === 'number') {\n // Floating Point (32 bits)\n // double\n if (Math.floor(value) !== value) return 9;\n\n // Integers\n if (value >= 0) {\n // positive fixint\n if (value < 0x80) return 1;\n // uint 8\n if (value < 0x100) return 2;\n // uint 16\n if (value < 0x10000) return 3;\n // uint 32\n if (value < 0x100000000) return 5;\n // uint 64\n if (value < 0x10000000000000000) return 9;\n // Too big\n throw new Error('Number too big 0x' + value.toString(16));\n }\n // negative fixint\n if (value >= -0x20) return 1;\n // int 8\n if (value >= -0x80) return 2;\n // int 16\n if (value >= -0x8000) return 3;\n // int 32\n if (value >= -0x80000000) return 5;\n // int 64\n if (value >= -0x8000000000000000) return 9;\n // Too small\n throw new Error('Number too small -0x' + value.toString(16).substr(1));\n }\n\n // Boolean\n if (type === 'boolean') return 1;\n\n // undefined, null\n if (value === null) return sparse ? 0 : 1;\n if (value === undefined) return sparse ? 0 : 3;\n\n if ('function' === typeof (value as Date).toJSON) return sizeof((value as Date).toJSON(), sparse);\n\n // Container Types\n if (type === 'object') {\n let length: number,\n size = 0;\n if (Array.isArray(value)) {\n length = value.length;\n for (let i = 0; i < length; i++) {\n size += sizeof(value[i], sparse);\n }\n } else {\n const keys = encodeableKeys(value as { [key: string]: unknown }, sparse);\n length = keys.length;\n for (let i = 0; i < length; i++) {\n const key = keys[i];\n size += sizeof(key) + sizeof((value as { [key: string]: unknown })[key], sparse);\n }\n }\n if (length < 0x10) {\n return 1 + size;\n }\n if (length < 0x10000) {\n return 3 + size;\n }\n if (length < 0x100000000) {\n return 5 + size;\n }\n throw new Error('Array or object too long 0x' + length.toString(16));\n }\n if (type === 'function') return 0;\n\n throw new Error('Unknown type ' + type);\n}\n\nexport default {\n encode,\n decode,\n inspect,\n utf8Write,\n utf8Read,\n utf8ByteCount,\n};\n", "import HttpMethods from 'common/constants/HttpMethods';\nimport BaseClient from 'common/lib/client/baseclient';\nimport ErrorInfo, { PartialErrorInfo } from 'common/lib/types/errorinfo';\nimport { RequestBody, RequestResultError, ResponseHeaders, RequestParams, RequestResult } from 'common/types/http';\nimport Platform from 'common/platform';\nimport Defaults from 'common/lib/util/defaults';\nimport * as Utils from 'common/lib/util/utils';\n\nfunction isAblyError(responseBody: unknown, headers: Headers): responseBody is { error?: ErrorInfo } {\n return !!headers.get('x-ably-errorcode');\n}\n\nfunction getAblyError(responseBody: unknown, headers: Headers) {\n if (isAblyError(responseBody, headers)) {\n return responseBody.error && ErrorInfo.fromValues(responseBody.error);\n }\n}\n\nfunction convertHeaders(headers: Headers) {\n const result: ResponseHeaders = {};\n\n headers.forEach((value, key) => {\n result[key] = value;\n });\n\n return result;\n}\n\nexport default async function fetchRequest(\n method: HttpMethods,\n client: BaseClient | null,\n uri: string,\n headers: Record<string, string> | null,\n params: RequestParams,\n body: RequestBody | null,\n): Promise<RequestResult> {\n const fetchHeaders = new Headers(headers || {});\n const _method = method ? method.toUpperCase() : Utils.isNil(body) ? 'GET' : 'POST';\n\n const controller = new AbortController();\n\n let timeout: ReturnType<typeof setTimeout>; // This way we don\u2019t have to worry about the fact that the TypeScript compiler is \u2014 for reasons I haven\u2019t looked into \u2014 picking up the signature of the Node version of setTimeout, which has a different return type to the web one\n const timeoutPromise: Promise<RequestResult> = new Promise((resolve) => {\n timeout = setTimeout(\n () => {\n controller.abort();\n // When AbortController.abort() is called, the fetch() promise rejects with a DOMException named AbortError (source: https://developer.mozilla.org/en-US/docs/Web/API/AbortController)\n // However, we beat it in the Promise.race() by resolving our custom 'Request timed out' error on the next line, thereby exposing users to the better-formatted error.\n resolve({ error: new PartialErrorInfo('Request timed out', null, 408) });\n },\n client ? client.options.timeouts.httpRequestTimeout : Defaults.TIMEOUTS.httpRequestTimeout,\n );\n });\n\n const requestInit: RequestInit = {\n method: _method,\n headers: fetchHeaders,\n body: body as any,\n signal: controller.signal,\n };\n\n if (!Platform.Config.isWebworker) {\n requestInit.credentials = fetchHeaders.has('authorization') ? 'include' : 'same-origin';\n }\n\n const resultPromise = (async (): Promise<RequestResult> => {\n try {\n const urlParams = new URLSearchParams(params || {});\n urlParams.set('rnd', Utils.cheapRandStr());\n const preparedURI = uri + '?' + urlParams;\n const res = await Utils.getGlobalObject().fetch(preparedURI, requestInit);\n\n clearTimeout(timeout!);\n\n if (res.status == 204) {\n return { error: null, statusCode: res.status };\n }\n\n const contentType = res.headers.get('Content-Type');\n let body;\n if (contentType && contentType.indexOf('application/x-msgpack') > -1) {\n body = await res.arrayBuffer();\n } else if (contentType && contentType.indexOf('application/json') > -1) {\n body = await res.json();\n } else {\n body = await res.text();\n }\n\n const unpacked = !!contentType && contentType.indexOf('application/x-msgpack') === -1;\n const headers = convertHeaders(res.headers);\n\n if (!res.ok) {\n const error =\n getAblyError(body, res.headers) ||\n new PartialErrorInfo(\n 'Error response received from server: ' + res.status + ' body was: ' + Platform.Config.inspect(body),\n null,\n res.status,\n );\n\n return { error, body, headers, unpacked, statusCode: res.status };\n } else {\n return { error: null, body, headers, unpacked, statusCode: res.status };\n }\n } catch (error) {\n clearTimeout(timeout!);\n return { error: error as RequestResultError };\n }\n })();\n\n return Promise.race([timeoutPromise, resultPromise]);\n}\n", "import { HTTPRequestImplementations } from '../http';\nimport XHRRequest from './xhrrequest';\nimport fetchRequest from './fetchrequest';\n\nexport const defaultBundledRequestImplementations: HTTPRequestImplementations = {\n XHRRequest: XHRRequest,\n FetchRequest: fetchRequest,\n};\n\nexport const modularBundledRequestImplementations: HTTPRequestImplementations = {};\n", "import AnamClient from './AnamClient';\nimport { PersonaConfig } from './types';\nimport { AnamPublicClientOptions } from './types/AnamPublicClientOptions';\n\n/**\n * Create a new Anam client.\n * @param sessionToken - A session token can be obtained from the Anam API.\n * @param personaConfig - The persona configuration to use.\n * @param options - Additional options.\n * @returns A new Anam client instance.\n */\nconst createClient = (\n sessionToken: string,\n options?: AnamPublicClientOptions,\n): AnamClient => {\n return new AnamClient(sessionToken, undefined, options);\n};\n\n/**\n * Create a new Anam client with an API key instead of a session token.\n * This method is unsafe for production environments because it requires exposing your API key to the client side.\n * Only use this method for local testing.\n * @param apiKey - Your Anam API key.\n * @param personaConfig - The persona configuration to use.\n * @param options - Additional options.\n * @returns A new Anam client instance.\n */\nconst unsafe_createClientWithApiKey = (\n apiKey: string,\n personaConfig: PersonaConfig,\n options?: AnamPublicClientOptions,\n): AnamClient => {\n return new AnamClient(undefined, personaConfig, { ...options, apiKey });\n};\n\nexport { createClient, unsafe_createClientWithApiKey };\nexport type { AnamClient };\nexport * from './types';\n", "import { Buffer } from 'buffer';\nimport { ClientError, ErrorCode } from './lib/ClientError';\nimport {\n ClientMetricMeasurement,\n DEFAULT_ANAM_API_VERSION,\n DEFAULT_ANAM_METRICS_BASE_URL,\n sendClientMetric,\n setClientMetricsBaseUrl,\n setMetricsContext,\n} from './lib/ClientMetrics';\nimport { generateCorrelationId } from './lib/correlationId';\nimport {\n CoreApiRestClient,\n InternalEventEmitter,\n MessageHistoryClient,\n PublicEventEmitter,\n StreamingClient,\n} from './modules';\nimport {\n AnamClientOptions,\n AnamEvent,\n ConnectionClosedCode,\n EventCallbacks,\n InputAudioState,\n PersonaConfig,\n StartSessionOptions,\n StartSessionResponse,\n} from './types';\nimport { TalkMessageStream } from './types/TalkMessageStream';\nexport default class AnamClient {\n private publicEventEmitter: PublicEventEmitter;\n private internalEventEmitter: InternalEventEmitter;\n\n private readonly messageHistoryClient: MessageHistoryClient;\n\n private personaConfig: PersonaConfig | undefined;\n private clientOptions: AnamClientOptions | undefined;\n private inputAudioState: InputAudioState = { isMuted: false };\n\n private sessionId: string | null = null;\n private organizationId: string | null = null;\n\n private streamingClient: StreamingClient | null = null;\n private apiClient: CoreApiRestClient;\n\n private _isStreaming = false;\n\n constructor(\n sessionToken: string | undefined,\n personaConfig?: PersonaConfig,\n options?: AnamClientOptions,\n ) {\n const configError: string | undefined = this.validateClientConfig(\n sessionToken,\n personaConfig,\n options,\n );\n if (configError) {\n throw new ClientError(\n configError,\n ErrorCode.CLIENT_ERROR_CODE_CONFIGURATION_ERROR,\n 400,\n );\n }\n\n this.personaConfig = personaConfig;\n this.clientOptions = options;\n\n if (options?.api?.baseUrl || options?.api?.apiVersion) {\n setClientMetricsBaseUrl(\n options.api.baseUrl || DEFAULT_ANAM_METRICS_BASE_URL,\n options.api.apiVersion || DEFAULT_ANAM_API_VERSION,\n );\n }\n\n this.publicEventEmitter = new PublicEventEmitter();\n this.internalEventEmitter = new InternalEventEmitter();\n\n this.apiClient = new CoreApiRestClient(\n sessionToken,\n options?.apiKey,\n options?.api,\n );\n this.messageHistoryClient = new MessageHistoryClient(\n this.publicEventEmitter,\n this.internalEventEmitter,\n );\n }\n\n private decodeJwt(token: string): any {\n try {\n const base64Payload = token.split('.')[1];\n const payloadString = Buffer.from(base64Payload, 'base64').toString(\n 'utf8',\n );\n const payload = JSON.parse(payloadString);\n return payload;\n } catch (error) {\n throw new Error('Invalid session token format');\n }\n }\n\n private validateClientConfig(\n sessionToken: string | undefined,\n personaConfig?: PersonaConfig,\n options?: AnamClientOptions,\n ): string | undefined {\n // Validate authentication configuration\n if (!sessionToken && !options?.apiKey) {\n return 'Either sessionToken or apiKey must be provided';\n }\n if (options?.apiKey && sessionToken) {\n return 'Only one of sessionToken or apiKey should be used';\n }\n\n // Validate persona configuration based on session token\n if (sessionToken) {\n const decodedToken = this.decodeJwt(sessionToken);\n this.organizationId = decodedToken.accountId;\n setMetricsContext({\n organizationId: this.organizationId,\n });\n\n const tokenType = decodedToken.type?.toLowerCase();\n\n if (tokenType === 'legacy') {\n return 'Legacy session tokens are no longer supported. Please define your persona when creating your session token. See https://docs.anam.ai/resources/migrating-legacy for more information.';\n } else if (tokenType === 'ephemeral' || tokenType === 'stateful') {\n if (personaConfig) {\n return 'This session token already contains a persona configuration. Please remove the personaConfig parameter.';\n }\n }\n } else {\n // No session token (using apiKey)\n if (!personaConfig) {\n return 'Missing persona config. Persona configuration must be provided when using apiKey';\n }\n }\n\n // Validate voice detection configuration\n if (options?.voiceDetection) {\n if (options.disableInputAudio) {\n return 'Voice detection is disabled because input audio is disabled. Please set disableInputAudio to false to enable voice detection.';\n }\n // End of speech sensitivity must be a number between 0 and 1\n if (options.voiceDetection.endOfSpeechSensitivity !== undefined) {\n if (typeof options.voiceDetection.endOfSpeechSensitivity !== 'number') {\n return 'End of speech sensitivity must be a number';\n }\n if (\n options.voiceDetection.endOfSpeechSensitivity < 0 ||\n options.voiceDetection.endOfSpeechSensitivity > 1\n ) {\n return 'End of speech sensitivity must be between 0 and 1';\n }\n }\n }\n return undefined;\n }\n\n private buildStartSessionOptionsForClient(): StartSessionOptions | undefined {\n const sessionOptions: StartSessionOptions = {};\n if (this.clientOptions?.voiceDetection) {\n sessionOptions.voiceDetection = this.clientOptions.voiceDetection;\n }\n // return undefined if no options are set\n if (Object.keys(sessionOptions).length === 0) {\n return undefined;\n }\n return sessionOptions;\n }\n\n private async startSession(\n userProvidedAudioStream?: MediaStream,\n ): Promise<string> {\n const config = this.personaConfig;\n // build session options from client options\n const sessionOptions: StartSessionOptions | undefined =\n this.buildStartSessionOptionsForClient();\n // start a new session\n const response: StartSessionResponse = await this.apiClient.startSession(\n config,\n sessionOptions,\n );\n const { sessionId, clientConfig, engineHost, engineProtocol } = response;\n const { ablyToken, ablyChannel, iceServers } = clientConfig;\n\n this.sessionId = sessionId;\n setMetricsContext({\n sessionId: this.sessionId,\n });\n\n try {\n this.streamingClient = new StreamingClient(\n sessionId,\n {\n engine: {\n baseUrl: `${engineProtocol}://${engineHost}`,\n },\n signalling: {\n ablyToken,\n channelName: ablyChannel,\n },\n iceServers,\n inputAudio: {\n inputAudioState: this.inputAudioState,\n userProvidedMediaStream: this.clientOptions?.disableInputAudio\n ? undefined\n : userProvidedAudioStream,\n audioDeviceId: this.clientOptions?.audioDeviceId,\n disableInputAudio: this.clientOptions?.disableInputAudio,\n },\n metrics: {\n showPeerConnectionStatsReport:\n this.clientOptions?.metrics?.showPeerConnectionStatsReport ??\n false,\n peerConnectionStatsReportOutputFormat:\n this.clientOptions?.metrics\n ?.peerConnectionStatsReportOutputFormat ?? 'console',\n },\n },\n this.publicEventEmitter,\n this.internalEventEmitter,\n );\n } catch (error) {\n setMetricsContext({\n sessionId: null,\n });\n throw new ClientError(\n 'Failed to initialize streaming client',\n ErrorCode.CLIENT_ERROR_CODE_SERVER_ERROR,\n 500,\n {\n cause: error instanceof Error ? error.message : String(error),\n sessionId,\n },\n );\n }\n\n return sessionId;\n }\n\n private async startSessionIfNeeded(userProvidedAudioStream?: MediaStream) {\n if (!this.sessionId || !this.streamingClient) {\n await this.startSession(userProvidedAudioStream);\n\n if (!this.sessionId || !this.streamingClient) {\n throw new ClientError(\n 'Session ID or streaming client is not available after starting session',\n ErrorCode.CLIENT_ERROR_CODE_SERVER_ERROR,\n 500,\n {\n cause: 'Failed to initialize session properly',\n },\n );\n }\n }\n }\n\n public async stream(\n userProvidedAudioStream?: MediaStream,\n ): Promise<MediaStream[]> {\n if (this._isStreaming) {\n throw new Error('Already streaming');\n }\n // generate a new ID here to track the attempt\n const attemptCorrelationId = generateCorrelationId();\n setMetricsContext({\n attemptCorrelationId,\n sessionId: null, // reset sessionId\n });\n sendClientMetric(\n ClientMetricMeasurement.CLIENT_METRIC_MEASUREMENT_SESSION_ATTEMPT,\n '1',\n );\n if (this.clientOptions?.disableInputAudio && userProvidedAudioStream) {\n console.warn(\n 'AnamClient:Input audio is disabled. User provided audio stream will be ignored.',\n );\n }\n await this.startSessionIfNeeded(userProvidedAudioStream);\n\n this._isStreaming = true;\n return new Promise<MediaStream[]>((resolve) => {\n // set stream callbacks to capture the stream\n const streams: MediaStream[] = [];\n let videoReceived = false;\n let audioReceived = false;\n this.publicEventEmitter.addListener(\n AnamEvent.VIDEO_STREAM_STARTED,\n (videoStream: MediaStream) => {\n streams.push(videoStream);\n videoReceived = true;\n if (audioReceived) {\n resolve(streams);\n }\n },\n );\n this.publicEventEmitter.addListener(\n AnamEvent.AUDIO_STREAM_STARTED,\n (audioStream: MediaStream) => {\n streams.push(audioStream);\n audioReceived = true;\n if (videoReceived) {\n resolve(streams);\n }\n },\n );\n // start streaming\n this.streamingClient?.startConnection();\n });\n }\n\n /**\n * @deprecated This method is deprecated. Please use streamToVideoElement instead.\n */\n public async streamToVideoAndAudioElements(\n videoElementId: string,\n audioElementId: string,\n userProvidedAudioStream?: MediaStream,\n ): Promise<void> {\n console.warn(\n 'AnamClient: streamToVideoAndAudioElements is deprecated. To avoid possible audio issues, please use streamToVideoElement instead.',\n );\n await this.streamToVideoElement(videoElementId, userProvidedAudioStream);\n }\n\n public async streamToVideoElement(\n videoElementId: string,\n userProvidedAudioStream?: MediaStream,\n ): Promise<void> {\n // generate a new ID here to track the attempt\n const attemptCorrelationId = generateCorrelationId();\n setMetricsContext({\n attemptCorrelationId,\n sessionId: null, // reset sessionId\n });\n sendClientMetric(\n ClientMetricMeasurement.CLIENT_METRIC_MEASUREMENT_SESSION_ATTEMPT,\n '1',\n );\n if (this.clientOptions?.disableInputAudio && userProvidedAudioStream) {\n console.warn(\n 'AnamClient:Input audio is disabled. User provided audio stream will be ignored.',\n );\n }\n try {\n await this.startSessionIfNeeded(userProvidedAudioStream);\n } catch (error) {\n if (error instanceof ClientError) {\n throw error;\n }\n\n throw new ClientError(\n 'Failed to start session',\n ErrorCode.CLIENT_ERROR_CODE_SERVER_ERROR,\n 500,\n {\n cause: error instanceof Error ? error.message : String(error),\n sessionId: this.sessionId,\n },\n );\n }\n\n if (this._isStreaming) {\n throw new Error('Already streaming');\n }\n this._isStreaming = true;\n if (!this.streamingClient) {\n throw new Error('Failed to stream: streaming client is not available');\n }\n\n this.streamingClient.setMediaStreamTargetById(videoElementId);\n this.streamingClient.startConnection();\n }\n\n /**\n * Send a talk command to make the persona speak the provided content.\n * @param content - The text content for the persona to speak\n * @throws Error if session is not started or not currently streaming\n */\n public async talk(content: string): Promise<void> {\n if (!this.streamingClient) {\n throw new Error(\n 'Failed to send talk command: session is not started. Have you called startSession?',\n );\n }\n if (!this._isStreaming) {\n throw new Error(\n 'Failed to send talk command: not currently streaming. Have you called stream?',\n );\n }\n await this.streamingClient.sendTalkCommand(content);\n return;\n }\n\n /**\n * Send a raw data message through the WebRTC data channel.\n * @param message - The message string to send through the data channel\n * @throws Error if session is not started\n */\n public sendDataMessage(message: string): void {\n if (this.streamingClient) {\n this.streamingClient.sendDataMessage(message);\n } else {\n throw new Error('Failed to send message: session is not started.');\n }\n }\n\n /**\n * Send a user text message in the active streaming session.\n * @param content - The text message content to send\n * @throws Error if not currently streaming or session is not started\n */\n public sendUserMessage(content: string): void {\n if (!this._isStreaming) {\n console.warn(\n 'AnamClient: Not currently streaming. User message will not be sent.',\n );\n throw new Error('Failed to send user message: not currently streaming');\n }\n\n const sessionId = this.getActiveSessionId();\n if (!sessionId) {\n throw new Error('Failed to send user message: no active session');\n }\n\n const currentTimestamp = new Date().toISOString().replace('Z', '');\n const body = JSON.stringify({\n content,\n timestamp: currentTimestamp,\n session_id: sessionId,\n message_type: 'speech',\n });\n\n this.sendDataMessage(body);\n }\n\n public interruptPersona(): void {\n if (!this._isStreaming) {\n throw new Error(\n 'Failed to send interrupt command: not currently streaming',\n );\n }\n\n const sessionId = this.getActiveSessionId();\n if (!sessionId) {\n throw new Error('Failed to send interrupt command: no active session');\n }\n\n const body = JSON.stringify({\n message_type: 'interrupt',\n session_id: sessionId,\n timestamp: new Date().toISOString(), // removing Z not needed\n });\n\n this.sendDataMessage(body);\n }\n\n public async stopStreaming(): Promise<void> {\n if (this.streamingClient) {\n this.publicEventEmitter.emit(\n AnamEvent.CONNECTION_CLOSED,\n ConnectionClosedCode.NORMAL,\n );\n await this.streamingClient.stopConnection();\n this.streamingClient = null;\n this.sessionId = null;\n setMetricsContext({\n attemptCorrelationId: null,\n sessionId: null,\n organizationId: this.organizationId,\n });\n this._isStreaming = false;\n }\n }\n\n public isStreaming(): boolean {\n return this._isStreaming;\n }\n\n public setPersonaConfig(personaConfig: PersonaConfig): void {\n this.personaConfig = personaConfig;\n }\n\n public getPersonaConfig(): PersonaConfig | undefined {\n return this.personaConfig;\n }\n\n public getInputAudioState(): InputAudioState {\n if (this.clientOptions?.disableInputAudio) {\n console.warn(\n 'AnamClient: Audio state will not be used because input audio is disabled.',\n );\n }\n // if streaming client is available, make sure our state is up to date\n if (this.streamingClient) {\n this.inputAudioState = this.streamingClient.getInputAudioState();\n }\n return this.inputAudioState;\n }\n public muteInputAudio(): InputAudioState {\n if (this.clientOptions?.disableInputAudio) {\n console.warn(\n 'AnamClient: Input audio is disabled. Muting input audio will have no effect.',\n );\n }\n if (this.streamingClient && !this.clientOptions?.disableInputAudio) {\n this.inputAudioState = this.streamingClient.muteInputAudio();\n } else {\n this.inputAudioState = {\n ...this.inputAudioState,\n isMuted: true,\n };\n }\n return this.inputAudioState;\n }\n\n public unmuteInputAudio(): InputAudioState {\n if (this.clientOptions?.disableInputAudio) {\n console.warn(\n 'AnamClient: Input audio is disabled. Unmuting input audio will have no effect.',\n );\n }\n if (this.streamingClient && !this.clientOptions?.disableInputAudio) {\n this.inputAudioState = this.streamingClient.unmuteInputAudio();\n } else {\n this.inputAudioState = {\n ...this.inputAudioState,\n isMuted: false,\n };\n }\n return this.inputAudioState;\n }\n\n public createTalkMessageStream(correlationId?: string): TalkMessageStream {\n if (!this.streamingClient) {\n throw new Error(\n 'Failed to start talk message stream: session is not started.',\n );\n }\n if (correlationId && correlationId.trim() === '') {\n throw new Error(\n 'Failed to start talk message stream: correlationId is empty',\n );\n }\n\n return this.streamingClient.startTalkMessageStream(correlationId);\n }\n\n /**\n * Event handling\n */\n public addListener<K extends AnamEvent>(\n event: K,\n callback: EventCallbacks[K],\n ): void {\n this.publicEventEmitter.addListener(event, callback);\n }\n\n public removeListener<K extends AnamEvent>(\n event: K,\n callback: EventCallbacks[K],\n ): void {\n this.publicEventEmitter.removeListener(event, callback);\n }\n\n public getActiveSessionId(): string | null {\n return this.sessionId;\n }\n}\n", "import { ClientMetricMeasurement, sendClientMetric } from './ClientMetrics';\n\nexport enum ErrorCode {\n CLIENT_ERROR_CODE_USAGE_LIMIT_REACHED = 'CLIENT_ERROR_CODE_USAGE_LIMIT_REACHED',\n CLIENT_ERROR_CODE_VALIDATION_ERROR = 'CLIENT_ERROR_CODE_VALIDATION_ERROR',\n CLIENT_ERROR_CODE_AUTHENTICATION_ERROR = 'CLIENT_ERROR_CODE_AUTHENTICATION_ERROR',\n CLIENT_ERROR_CODE_SERVER_ERROR = 'CLIENT_ERROR_CODE_SERVER_ERROR',\n CLIENT_ERROR_CODE_MAX_CONCURRENT_SESSIONS_REACHED = 'CLIENT_ERROR_CODE_MAX_CONCURRENT_SESSIONS_REACHED',\n CLIENT_ERROR_CODE_SERVICE_BUSY = 'CLIENT_ERROR_CODE_SERVICE_BUSY',\n CLIENT_ERROR_CODE_NO_PLAN_FOUND = 'CLIENT_ERROR_CODE_NO_PLAN_FOUND',\n CLIENT_ERROR_CODE_UNKNOWN_ERROR = 'CLIENT_ERROR_CODE_UNKNOWN_ERROR',\n CLIENT_ERROR_CODE_CONFIGURATION_ERROR = 'CLIENT_ERROR_CODE_CONFIGURATION_ERROR',\n}\n\nexport class ClientError extends Error {\n code: ErrorCode;\n statusCode: number;\n details?: any;\n\n constructor(\n message: string,\n code: ErrorCode,\n statusCode: number = 500,\n details?: any,\n ) {\n super(message);\n this.name = 'ClientError';\n this.code = code;\n this.statusCode = statusCode;\n this.details = details;\n\n Object.setPrototypeOf(this, ClientError.prototype);\n\n // Send error metric when error is created\n sendClientMetric(\n ClientMetricMeasurement.CLIENT_METRIC_MEASUREMENT_ERROR,\n code,\n {\n details,\n statusCode,\n },\n );\n }\n}\n", "import { CLIENT_METADATA } from './constants';\n\nexport const DEFAULT_ANAM_METRICS_BASE_URL = 'https://api.anam.ai';\nexport const DEFAULT_ANAM_API_VERSION = '/v1';\n\nexport enum ClientMetricMeasurement {\n CLIENT_METRIC_MEASUREMENT_ERROR = 'client_error',\n CLIENT_METRIC_MEASUREMENT_CONNECTION_CLOSED = 'client_connection_closed',\n CLIENT_METRIC_MEASUREMENT_CONNECTION_ESTABLISHED = 'client_connection_established',\n CLIENT_METRIC_MEASUREMENT_SESSION_ATTEMPT = 'client_session_attempt',\n CLIENT_METRIC_MEASUREMENT_SESSION_SUCCESS = 'client_session_success',\n}\n\nlet anamCurrentBaseUrl = DEFAULT_ANAM_METRICS_BASE_URL;\nlet anamCurrentApiVersion = DEFAULT_ANAM_API_VERSION;\n\nexport const setClientMetricsBaseUrl = (\n baseUrl: string,\n apiVersion: string = DEFAULT_ANAM_API_VERSION,\n) => {\n anamCurrentBaseUrl = baseUrl;\n anamCurrentApiVersion = apiVersion;\n};\n\nexport interface AnamMetricsContext {\n sessionId: string | null;\n organizationId: string | null;\n attemptCorrelationId: string | null;\n}\n\nlet anamMetricsContext: AnamMetricsContext = {\n sessionId: null,\n organizationId: null,\n attemptCorrelationId: null,\n};\n\nexport const setMetricsContext = (context: Partial<AnamMetricsContext>) => {\n anamMetricsContext = { ...anamMetricsContext, ...context };\n};\n\nexport const sendClientMetric = async (\n name: string,\n value: string,\n tags?: Record<string, string | number>,\n) => {\n try {\n const metricTags: Record<string, string | number | boolean> = {\n ...CLIENT_METADATA,\n ...tags,\n };\n\n // Add session and organization IDs if available\n if (anamMetricsContext.sessionId) {\n metricTags.sessionId = anamMetricsContext.sessionId;\n }\n if (anamMetricsContext.organizationId) {\n metricTags.organizationId = anamMetricsContext.organizationId;\n }\n if (anamMetricsContext.attemptCorrelationId) {\n metricTags.attemptCorrelationId = anamMetricsContext.attemptCorrelationId;\n }\n\n await fetch(\n `${anamCurrentBaseUrl}${anamCurrentApiVersion}/metrics/client`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name,\n value,\n tags: metricTags,\n }),\n },\n );\n } catch (error) {\n console.error('Failed to send error metric:', error);\n }\n};\n\nexport interface RTCStatsJsonReport {\n personaVideoStream?: {\n framesReceived: number | string;\n framesDropped: number | string;\n framesPerSecond: number | string;\n packetsReceived: number | string;\n packetsLost: number | string;\n resolution?: string;\n jitter?: number;\n }[];\n personaAudioStream?: {\n packetsReceived: number | string;\n packetsLost: number | string;\n audioLevel: number | string;\n jitter?: number;\n totalAudioEnergy?: number;\n }[];\n userAudioInput?: {\n packetsSent: number | string;\n retransmittedPackets?: number;\n avgPacketSendDelay?: number;\n }[];\n codecs?: {\n status: string;\n mimeType: string;\n payloadType: string | number;\n clockRate?: number;\n channels?: number;\n }[];\n transportLayer?: {\n dtlsState: string;\n iceState: string;\n bytesSent?: number;\n bytesReceived?: number;\n }[];\n issues: string[];\n}\n\nexport const createRTCStatsReport = (\n stats: RTCStatsReport,\n outputFormat: 'console' | 'json' = 'console',\n): RTCStatsJsonReport | void => {\n /**\n * constructs a report of the RTC stats for logging to the console or returns as JSON\n */\n\n // Collect stats by type for organized reporting\n const statsByType: Record<string, any[]> = {};\n\n stats.forEach((report) => {\n if (!statsByType[report.type]) {\n statsByType[report.type] = [];\n }\n statsByType[report.type].push(report);\n });\n\n // Initialize JSON report structure\n const jsonReport: RTCStatsJsonReport = {\n issues: [],\n };\n\n // Build video statistics (Persona video output)\n const inboundVideo =\n statsByType['inbound-rtp']?.filter((r) => r.kind === 'video') || [];\n if (inboundVideo.length > 0) {\n jsonReport.personaVideoStream = [];\n\n inboundVideo.forEach((report) => {\n const videoData = {\n framesReceived: report.framesReceived ?? 'unknown',\n framesDropped: report.framesDropped ?? 'unknown',\n framesPerSecond: report.framesPerSecond ?? 'unknown',\n packetsReceived: report.packetsReceived ?? 'unknown',\n packetsLost: report.packetsLost ?? 'unknown',\n resolution:\n report.frameWidth && report.frameHeight\n ? `${report.frameWidth}x${report.frameHeight}`\n : undefined,\n jitter: report.jitter !== undefined ? report.jitter : undefined,\n };\n\n jsonReport.personaVideoStream!.push(videoData);\n });\n }\n\n // Build audio statistics (Persona audio output)\n const inboundAudio =\n statsByType['inbound-rtp']?.filter((r) => r.kind === 'audio') || [];\n if (inboundAudio.length > 0) {\n jsonReport.personaAudioStream = [];\n\n inboundAudio.forEach((report) => {\n const audioData = {\n packetsReceived: report.packetsReceived ?? 'unknown',\n packetsLost: report.packetsLost ?? 'unknown',\n audioLevel: report.audioLevel ?? 'unknown',\n jitter: report.jitter !== undefined ? report.jitter : undefined,\n totalAudioEnergy:\n report.totalAudioEnergy !== undefined\n ? report.totalAudioEnergy\n : undefined,\n };\n\n jsonReport.personaAudioStream!.push(audioData);\n });\n }\n\n // Build user audio input statistics\n const outboundAudio =\n statsByType['outbound-rtp']?.filter((r) => r.kind === 'audio') || [];\n if (outboundAudio.length > 0) {\n jsonReport.userAudioInput = [];\n\n outboundAudio.forEach((report) => {\n const userAudioData = {\n packetsSent: report.packetsSent ?? 'unknown',\n retransmittedPackets: report.retransmittedPacketsSent ?? undefined,\n avgPacketSendDelay:\n report.totalPacketSendDelay !== undefined\n ? (report.totalPacketSendDelay / (report.packetsSent || 1)) * 1000\n : undefined,\n };\n\n jsonReport.userAudioInput!.push(userAudioData);\n });\n }\n\n // Build codec information\n if (statsByType['codec']) {\n jsonReport.codecs = [];\n\n statsByType['codec'].forEach((report) => {\n const codecData = {\n status: report.payloadType ? 'Active' : 'Available',\n mimeType: report.mimeType || 'Unknown',\n payloadType: report.payloadType || 'N/A',\n clockRate: report.clockRate || undefined,\n channels: report.channels || undefined,\n };\n\n jsonReport.codecs!.push(codecData);\n });\n }\n\n // Build transport layer information\n if (statsByType['transport']) {\n jsonReport.transportLayer = [];\n\n statsByType['transport'].forEach((report) => {\n const transportData = {\n dtlsState: report.dtlsState || 'unknown',\n iceState: report.iceState || 'unknown',\n bytesSent: report.bytesSent || undefined,\n bytesReceived: report.bytesReceived || undefined,\n };\n\n jsonReport.transportLayer!.push(transportData);\n });\n }\n\n // Build issues summary\n const issues: string[] = [];\n\n // Check for video issues\n inboundVideo.forEach((report) => {\n if (typeof report.framesDropped === 'number' && report.framesDropped > 0) {\n issues.push(`Video: ${report.framesDropped} frames dropped`);\n }\n if (typeof report.packetsLost === 'number' && report.packetsLost > 0) {\n issues.push(`Video: ${report.packetsLost} packets lost`);\n }\n if (\n typeof report.framesPerSecond === 'number' &&\n report.framesPerSecond < 23\n ) {\n issues.push(`Video: Low frame rate (${report.framesPerSecond} fps)`);\n }\n });\n\n // Check for audio issues\n inboundAudio.forEach((report) => {\n if (typeof report.packetsLost === 'number' && report.packetsLost > 0) {\n issues.push(`Audio: ${report.packetsLost} packets lost`);\n }\n if (typeof report.jitter === 'number' && report.jitter > 0.1) {\n issues.push(\n `Audio: High jitter (${(report.jitter * 1000).toFixed(1)}ms)`,\n );\n }\n });\n\n jsonReport.issues = issues;\n\n // Return JSON if requested\n if (outputFormat === 'json') {\n return jsonReport;\n }\n\n // Generate console output from JSON report\n console.group('\uD83D\uDCCA WebRTC Session Statistics Report');\n\n // Console output for video stream\n if (\n jsonReport.personaVideoStream &&\n jsonReport.personaVideoStream.length > 0\n ) {\n console.group('\uD83D\uDCF9 Persona Video Stream (Inbound)');\n jsonReport.personaVideoStream.forEach((videoData) => {\n console.log(`Frames Received: ${videoData.framesReceived}`);\n console.log(`Frames Dropped: ${videoData.framesDropped}`);\n console.log(`Frames Per Second: ${videoData.framesPerSecond}`);\n console.log(\n `Packets Received: ${typeof videoData.packetsReceived === 'number' ? videoData.packetsReceived.toLocaleString() : videoData.packetsReceived}`,\n );\n console.log(`Packets Lost: ${videoData.packetsLost}`);\n if (videoData.resolution) {\n console.log(`Resolution: ${videoData.resolution}`);\n }\n if (videoData.jitter !== undefined) {\n console.log(`Jitter: ${videoData.jitter.toFixed(5)}ms`);\n }\n });\n console.groupEnd();\n }\n\n // Console output for audio stream\n if (\n jsonReport.personaAudioStream &&\n jsonReport.personaAudioStream.length > 0\n ) {\n console.group('\uD83D\uDD0A Persona Audio Stream (Inbound)');\n jsonReport.personaAudioStream.forEach((audioData) => {\n console.log(\n `Packets Received: ${typeof audioData.packetsReceived === 'number' ? audioData.packetsReceived.toLocaleString() : audioData.packetsReceived}`,\n );\n console.log(`Packets Lost: ${audioData.packetsLost}`);\n console.log(`Audio Level: ${audioData.audioLevel}`);\n if (audioData.jitter !== undefined) {\n console.log(`Jitter: ${audioData.jitter.toFixed(5)}ms`);\n }\n if (audioData.totalAudioEnergy !== undefined) {\n console.log(\n `Total Audio Energy: ${audioData.totalAudioEnergy.toFixed(6)}`,\n );\n }\n });\n console.groupEnd();\n }\n\n // Console output for user audio input\n if (jsonReport.userAudioInput && jsonReport.userAudioInput.length > 0) {\n console.group('\uD83C\uDFA4 User Audio Input (Outbound)');\n jsonReport.userAudioInput.forEach((userAudioData) => {\n console.log(\n `Packets Sent: ${typeof userAudioData.packetsSent === 'number' ? userAudioData.packetsSent.toLocaleString() : userAudioData.packetsSent}`,\n );\n if (userAudioData.retransmittedPackets) {\n console.log(\n `Retransmitted Packets: ${userAudioData.retransmittedPackets}`,\n );\n }\n if (userAudioData.avgPacketSendDelay !== undefined) {\n console.log(\n `Avg Packet Send Delay: ${userAudioData.avgPacketSendDelay.toFixed(5)}ms`,\n );\n }\n });\n console.groupEnd();\n }\n\n // Console output for codecs\n if (jsonReport.codecs && jsonReport.codecs.length > 0) {\n console.group('\uD83D\uDD27 Codecs Used');\n jsonReport.codecs.forEach((codecData) => {\n console.log(\n `${codecData.status} ${codecData.mimeType} - Payload Type: ${codecData.payloadType}`,\n );\n if (codecData.clockRate) {\n console.log(` Clock Rate: ${codecData.clockRate}Hz`);\n }\n if (codecData.channels) {\n console.log(` Channels: ${codecData.channels}`);\n }\n });\n console.groupEnd();\n }\n\n // Console output for transport layer\n if (jsonReport.transportLayer && jsonReport.transportLayer.length > 0) {\n console.group('\uD83D\uDE9A Transport Layer');\n jsonReport.transportLayer.forEach((transportData) => {\n console.log(`DTLS State: ${transportData.dtlsState}`);\n console.log(`ICE State: ${transportData.iceState}`);\n if (transportData.bytesReceived || transportData.bytesSent) {\n console.log(\n `Data Transfer (bytes) - Sent: ${(transportData.bytesSent || 0).toLocaleString()}, Received: ${(transportData.bytesReceived || 0).toLocaleString()}`,\n );\n }\n });\n console.groupEnd();\n }\n\n // Console output for issues\n if (jsonReport.issues.length > 0) {\n console.group('\u26A0\uFE0F Potential Issues Detected');\n jsonReport.issues.forEach((issue) => console.warn(issue));\n console.groupEnd();\n } else {\n console.log('\u2705 No significant issues detected');\n }\n\n console.groupEnd();\n};\n", "// Core API\nexport const DEFAULT_HEADERS = {\n 'Content-Type': 'application/json',\n};\n\nexport const DEFAULT_API_BASE_URL = 'https://api.anam.ai';\nexport const DEFAULT_API_VERSION = '/v1'; // include the leading slash\n\nexport const CLIENT_METADATA = {\n client: 'js-sdk',\n version: '0.0.0-automated',\n supportsPubSubSignalling: true,\n};\n", "export function generateCorrelationId() {\n // Try native crypto.randomUUID() first (supported in modern browsers)\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback for older environments and older react native\n return Date.now().toString(36) + Math.random().toString(36).substr(2, 9);\n}\n", "export { SignallingClient } from './SignallingClient';\nexport { CoreApiRestClient } from './CoreApiRestClient';\nexport { EngineApiRestClient } from './EngineApiRestClient';\nexport { InternalEventEmitter } from './InternalEventEmitter';\nexport { MessageHistoryClient } from './MessageHistoryClient';\nexport { PublicEventEmitter } from './PublicEventEmitter';\nexport { StreamingClient } from './StreamingClient';\n", "import { Realtime, RealtimeChannel, Message as AblyMessage } from 'ably';\nimport { InternalEventEmitter, PublicEventEmitter } from '.';\nimport {\n AnamEvent,\n InternalEvent,\n SignalMessage,\n SignalMessageAction,\n SignallingClientOptions,\n ConnectionClosedCode,\n} from '../types';\nimport { TalkMessageStreamPayload } from '../types/signalling/TalkMessageStreamPayload';\nimport { toUnencodedMessage } from '../types/signalling/SignalMessage';\n\nexport class SignallingClient {\n private publicEventEmitter: PublicEventEmitter;\n private internalEventEmitter: InternalEventEmitter;\n private sessionId: string;\n private ablyToken: string;\n private channelName: string;\n private realtime: Realtime | null = null;\n private channel: RealtimeChannel | null = null;\n private stopSignal = false;\n\n constructor(\n sessionId: string,\n options: SignallingClientOptions,\n publicEventEmitter: PublicEventEmitter,\n internalEventEmitter: InternalEventEmitter,\n ) {\n this.publicEventEmitter = publicEventEmitter;\n this.internalEventEmitter = internalEventEmitter;\n\n if (!sessionId) {\n throw new Error('Signalling Client: sessionId is required');\n }\n this.sessionId = sessionId;\n\n const { ablyToken, channelName } = options;\n\n if (!ablyToken) {\n throw new Error('Signalling Client: ablyToken is required');\n }\n if (!channelName) {\n throw new Error('Signalling Client: channelName is required');\n }\n\n // Store configuration for later use in connect()\n this.ablyToken = ablyToken;\n this.channelName = channelName;\n }\n\n public stop() {\n this.stopSignal = true;\n this.closeConnection();\n }\n\n public connect(): void {\n // Check if already connected\n if (this.realtime) {\n console.warn('SignallingClient - connect: Already connected');\n return;\n }\n\n // Initialize Ably Realtime client with echo disabled\n this.realtime = new Realtime({\n token: this.ablyToken,\n echoMessages: false,\n autoConnect: typeof window !== 'undefined', // only connect if we're in the browser\n disconnectedRetryTimeout: 1000, // Retry after 1 second\n suspendedRetryTimeout: 2000, // Retry after 2 seconds if suspended (this comes after repeated disconnection and failed reconnects)\n transportParams: {\n heartbeatInterval: 5000, // this is the minimum heartbeat interval, we want it low so we can quickly detect disconnections.\n },\n });\n\n // Get the channel with hardcoded rewind parameter of 100\n this.channel = this.realtime.channels.get(this.channelName, {\n params: { rewind: '100' },\n });\n\n this.channel.presence.enter();\n\n // Set up connection state listeners\n this.realtime.connection.on('connected', () => {\n this.onConnected();\n });\n\n this.realtime.connection.on('failed', () => {\n this.onConnectionFailed();\n });\n\n // Subscribe to channel messages\n this.channel.subscribe((message) => {\n this.onMessage(message);\n });\n this.realtime.connect();\n }\n\n public async sendOffer(localDescription: RTCSessionDescription) {\n if (!this.channel) {\n throw new Error(\n 'SignallingClient - sendOffer: Not connected. Call connect() first.',\n );\n }\n\n const offerMessagePayload = {\n connectionDescription: localDescription,\n userUid: this.sessionId,\n };\n const offerMessage: SignalMessage = {\n actionType: SignalMessageAction.OFFER,\n sessionId: this.sessionId,\n payload: offerMessagePayload,\n };\n this.sendSignalMessage(offerMessage);\n }\n\n public async sendIceCandidate(candidate: RTCIceCandidate) {\n if (!this.channel) {\n throw new Error(\n 'SignallingClient - sendIceCandidate: Not connected. Call connect() first.',\n );\n }\n\n const iceCandidateMessage: SignalMessage = {\n actionType: SignalMessageAction.ICE_CANDIDATE,\n sessionId: this.sessionId,\n payload: candidate.toJSON(),\n };\n this.sendSignalMessage(iceCandidateMessage);\n }\n\n private sendSignalMessage(message: SignalMessage) {\n if (!this.channel) {\n throw new Error(\n 'SignallingClient - sendSignalMessage: Cannot send message, not connected. Call connect() first.',\n );\n }\n\n try {\n this.channel.publish('signal', message);\n } catch (error) {\n console.error(\n 'SignallingClient - sendSignalMessage: error sending message',\n error,\n );\n throw error;\n }\n }\n\n public async sendTalkMessage(payload: TalkMessageStreamPayload) {\n if (!this.channel) {\n throw new Error(\n 'SignallingClient - sendTalkMessage: Not connected. Call connect() first.',\n );\n }\n\n const chatMessage: SignalMessage = {\n actionType: SignalMessageAction.TALK_STREAM_INPUT,\n sessionId: this.sessionId,\n payload: payload,\n };\n this.sendSignalMessage(chatMessage);\n }\n\n private closeConnection() {\n if (this.realtime) {\n this.realtime.close();\n this.realtime = null;\n this.channel = null;\n }\n }\n\n private onConnected(): void {\n try {\n this.internalEventEmitter.emit(InternalEvent.WEB_SOCKET_OPEN);\n } catch (e) {\n console.error('SignallingClient - onConnected: error', e);\n this.publicEventEmitter.emit(\n AnamEvent.CONNECTION_CLOSED,\n ConnectionClosedCode.SIGNALLING_CLIENT_CONNECTION_FAILURE,\n );\n }\n }\n\n private onConnectionFailed() {\n if (this.stopSignal) {\n return;\n }\n this.publicEventEmitter.emit(\n AnamEvent.CONNECTION_CLOSED,\n ConnectionClosedCode.SIGNALLING_CLIENT_CONNECTION_FAILURE,\n );\n }\n\n private onMessage(message: AblyMessage) {\n // Extract the SignalMessage from Ably message data\n let signalMessage: SignalMessage = message.data;\n // Messages coming back from the server may have an encoded payload, convert it to unencoded for cosumption elsewhere in the SDK\n signalMessage = toUnencodedMessage(signalMessage);\n this.internalEventEmitter.emit(\n InternalEvent.SIGNAL_MESSAGE_RECEIVED,\n signalMessage,\n );\n }\n}\n", "export type { AnamClientOptions } from './AnamClientOptions';\nexport type * from './signalling';\nexport { SignalMessageAction } from './signalling'; // need to export this explicitly to avoid enum import issues\nexport type * from './streaming';\nexport type * from './coreApi';\nexport type { PersonaConfig } from './PersonaConfig';\nexport type { InputAudioState } from './InputAudioState';\nexport type * from './messageHistory';\nexport { MessageRole } from './messageHistory'; // need to export this explicitly to avoid enum import issues\nexport type * from './events';\nexport { AnamEvent } from './events'; // need to export this explicitly to avoid enum import issues\nexport { InternalEvent } from './events'; // need to export this explicitly to avoid enum import issues\nexport { ConnectionClosedCode } from './events'; // need to export this explicitly to avoid enum import issues\n", "export type { SignallingClientOptions } from './SignallingClientOptions';\nexport type { SignalMessage } from './SignalMessage';\nexport { SignalMessageAction } from './SignalMessage';\n", "export enum SignalMessageAction {\n OFFER = 'offer',\n ANSWER = 'answer',\n ICE_CANDIDATE = 'icecandidate',\n END_SESSION = 'endsession',\n HEARTBEAT = 'heartbeat',\n WARNING = 'warning',\n TALK_STREAM_INTERRUPTED = 'talkinputstreaminterrupted',\n TALK_STREAM_INPUT = 'talkstream',\n SESSION_READY = 'sessionready',\n}\n\nexport interface SignalMessage {\n actionType: SignalMessageAction;\n sessionId: string;\n payload: object | string;\n payloadFormat?: 'json-string' | 'unencoded';\n}\n\nexport function toUnencodedMessage(message: SignalMessage): SignalMessage {\n if (message.payloadFormat === 'json-string') {\n return {\n ...message,\n payload: JSON.parse(message.payload as string),\n payloadFormat: 'unencoded',\n };\n }\n // Already raw or undefined format (assume raw)\n return message;\n}\n", "export { MessageRole } from './MessageRole';\nexport type { Message } from './Message';\nexport type { MessageStreamEvent } from './MessageStreamEvent';\n", "export enum MessageRole {\n USER = 'user',\n PERSONA = 'persona',\n}\n", "export { AnamEvent } from './public/AnamEvent';\nexport type { EventCallbacks } from './public/EventCallbacks';\nexport { InternalEvent } from './internal/InternalEvent';\nexport type { InternalEventCallbacks } from './internal/InternalEventCallbacks';\nexport type { EventCallback } from './EventCallback';\nexport { ConnectionClosedCode } from './public/ConnectionClosedCodes';\n", "export enum AnamEvent {\n MESSAGE_HISTORY_UPDATED = 'MESSAGE_HISTORY_UPDATED',\n MESSAGE_STREAM_EVENT_RECEIVED = 'MESSAGE_STREAM_EVENT_RECEIVED',\n CONNECTION_ESTABLISHED = 'CONNECTION_ESTABLISHED',\n CONNECTION_CLOSED = 'CONNECTION_CLOSED',\n INPUT_AUDIO_STREAM_STARTED = 'INPUT_AUDIO_STREAM_STARTED',\n VIDEO_STREAM_STARTED = 'VIDEO_STREAM_STARTED',\n VIDEO_PLAY_STARTED = 'VIDEO_PLAY_STARTED',\n AUDIO_STREAM_STARTED = 'AUDIO_STREAM_STARTED',\n TALK_STREAM_INTERRUPTED = 'TALK_STREAM_INTERRUPTED',\n SESSION_READY = 'SESSION_READY',\n SERVER_WARNING = 'SERVER_WARNING',\n}\n", "export enum InternalEvent {\n WEB_SOCKET_OPEN = 'WEB_SOCKET_OPEN',\n SIGNAL_MESSAGE_RECEIVED = 'SIGNAL_MESSAGE_RECEIVED',\n WEBRTC_CHAT_MESSAGE_RECEIVED = 'WEBRTC_CHAT_MESSAGE_RECEIVED',\n}\n", "export enum ConnectionClosedCode {\n NORMAL = 'CONNECTION_CLOSED_CODE_NORMAL',\n MICROPHONE_PERMISSION_DENIED = 'CONNECTION_CLOSED_CODE_MICROPHONE_PERMISSION_DENIED',\n SIGNALLING_CLIENT_CONNECTION_FAILURE = 'CONNECTION_CLOSED_CODE_SIGNALLING_CLIENT_CONNECTION_FAILURE',\n WEBRTC_FAILURE = 'CONNECTION_CLOSED_CODE_WEBRTC_FAILURE',\n SERVER_CLOSED_CONNECTION = 'CONNECTION_CLOSED_CODE_SERVER_CLOSED_CONNECTION',\n}\n", "import { ClientError, ErrorCode } from '../lib/ClientError';\nimport {\n CLIENT_METADATA,\n DEFAULT_API_BASE_URL,\n DEFAULT_API_VERSION,\n} from '../lib/constants';\nimport {\n CoreApiRestClientOptions,\n PersonaConfig,\n StartSessionResponse,\n} from '../types';\nimport { StartSessionOptions } from '../types/coreApi/StartSessionOptions';\nimport { isCustomPersonaConfig } from '../types/PersonaConfig';\n\nexport class CoreApiRestClient {\n private baseUrl: string;\n private apiVersion: string;\n private apiKey: string | null;\n private sessionToken: string | null;\n\n constructor(\n sessionToken?: string,\n apiKey?: string,\n options?: CoreApiRestClientOptions,\n ) {\n if (!sessionToken && !apiKey) {\n throw new Error('Either sessionToken or apiKey must be provided');\n }\n this.sessionToken = sessionToken || null;\n this.apiKey = apiKey || null;\n this.baseUrl = options?.baseUrl || DEFAULT_API_BASE_URL;\n this.apiVersion = options?.apiVersion || DEFAULT_API_VERSION;\n }\n\n public async startSession(\n personaConfig?: PersonaConfig,\n sessionOptions?: StartSessionOptions,\n ): Promise<StartSessionResponse> {\n if (!this.sessionToken) {\n if (!personaConfig) {\n throw new ClientError(\n 'Persona configuration must be provided when using apiKey',\n ErrorCode.CLIENT_ERROR_CODE_VALIDATION_ERROR,\n 400,\n );\n }\n this.sessionToken = await this.unsafe_getSessionToken(personaConfig);\n }\n\n // Check if brainType is being used and log deprecation warning\n if (personaConfig && 'brainType' in personaConfig) {\n console.warn(\n 'Warning: brainType is deprecated and will be removed in a future version. Please use llmId instead.',\n );\n }\n\n try {\n const response = await fetch(`${this.getApiUrl()}/engine/session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.sessionToken}`,\n },\n body: JSON.stringify({\n personaConfig,\n sessionOptions,\n clientMetadata: CLIENT_METADATA,\n }),\n });\n\n const data = await response.json();\n\n switch (response.status) {\n case 200:\n case 201:\n return data as StartSessionResponse;\n case 400:\n throw new ClientError(\n 'Invalid request to start session',\n ErrorCode.CLIENT_ERROR_CODE_VALIDATION_ERROR,\n 400,\n { cause: data.message },\n );\n case 401:\n throw new ClientError(\n 'Authentication failed when starting session',\n ErrorCode.CLIENT_ERROR_CODE_AUTHENTICATION_ERROR,\n 401,\n { cause: data.message },\n );\n case 402:\n throw new ClientError(\n 'Please sign up for a plan to start a session',\n ErrorCode.CLIENT_ERROR_CODE_NO_PLAN_FOUND,\n 402,\n { cause: data.message },\n );\n case 403:\n throw new ClientError(\n 'Authentication failed when starting session',\n ErrorCode.CLIENT_ERROR_CODE_AUTHENTICATION_ERROR,\n 403,\n { cause: data.message },\n );\n case 429:\n throw new ClientError(\n 'Usage limit reached, please upgrade your plan',\n ErrorCode.CLIENT_ERROR_CODE_USAGE_LIMIT_REACHED,\n 429,\n { cause: data.message },\n );\n case 503:\n throw new ClientError(\n 'There are no available personas, please try again later',\n ErrorCode.CLIENT_ERROR_CODE_SERVICE_BUSY,\n 503,\n { cause: data.message },\n );\n default:\n throw new ClientError(\n 'Unknown error when starting session',\n ErrorCode.CLIENT_ERROR_CODE_SERVER_ERROR,\n 500,\n { cause: data.message },\n );\n }\n } catch (error) {\n if (error instanceof ClientError) {\n throw error;\n }\n throw new ClientError(\n 'Failed to start session',\n ErrorCode.CLIENT_ERROR_CODE_SERVER_ERROR,\n 500,\n { cause: error instanceof Error ? error.message : String(error) },\n );\n }\n }\n\n public async unsafe_getSessionToken(\n personaConfig: PersonaConfig,\n ): Promise<string> {\n console.warn(\n 'Using unsecure method. This method should not be used in production.',\n );\n if (!this.apiKey) {\n throw new Error('No apiKey provided');\n }\n\n // Check if brainType is being used and log deprecation warning\n if (personaConfig && 'brainType' in personaConfig) {\n console.warn(\n 'Warning: brainType is deprecated and will be removed in a future version. Please use llmId instead.',\n );\n }\n\n let body: { clientLabel: string; personaConfig?: PersonaConfig } = {\n clientLabel: 'js-sdk-api-key',\n };\n if (isCustomPersonaConfig(personaConfig)) {\n body = { ...body, personaConfig };\n }\n try {\n const response = await fetch(`${this.getApiUrl()}/auth/session-token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n const data = await response.json();\n return data.sessionToken;\n } catch (e) {\n throw new Error('Failed to get session token');\n }\n }\n\n private getApiUrl(): string {\n return `${this.baseUrl}${this.apiVersion}`;\n }\n}\n", "export type PersonaConfig = CustomPersonaConfig;\n\nexport interface CustomPersonaConfig {\n personaId: string;\n name: string;\n avatarId: string;\n voiceId: string;\n llmId?: string;\n systemPrompt?: string;\n maxSessionLengthSeconds?: number;\n languageCode?: string;\n}\n\nexport function isCustomPersonaConfig(\n personaConfig: PersonaConfig,\n): personaConfig is CustomPersonaConfig {\n return 'brainType' in personaConfig || 'llmId' in personaConfig;\n}\n", "export class EngineApiRestClient {\n private baseUrl: string;\n private sessionId: string;\n\n constructor(baseUrl: string, sessionId: string) {\n this.baseUrl = baseUrl;\n this.sessionId = sessionId;\n }\n\n public async sendTalkCommand(content: string): Promise<void> {\n try {\n const response = await fetch(\n `${this.baseUrl}/talk?session_id=${this.sessionId}`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n content,\n }),\n },\n );\n if (!response.ok) {\n throw new Error(\n `Failed to send talk command: ${response.status} ${response.statusText}`,\n );\n }\n } catch (error) {\n console.error(error);\n throw new Error(\n 'EngineApiRestClient - sendTalkCommand: Failed to send talk command',\n );\n }\n }\n}\n", "import { InternalEvent, InternalEventCallbacks } from '../types';\n\nexport class InternalEventEmitter {\n private listeners: {\n [K in InternalEvent]?: Set<InternalEventCallbacks[K]>;\n } = {};\n\n constructor() {}\n\n public addListener<K extends InternalEvent>(\n event: K,\n callback: InternalEventCallbacks[K],\n ): void {\n if (!this.listeners[event]) {\n (this.listeners[event] as Set<InternalEventCallbacks[K]>) = new Set<\n InternalEventCallbacks[K]\n >();\n }\n (this.listeners[event] as Set<InternalEventCallbacks[K]>).add(callback);\n }\n\n public removeListener<K extends InternalEvent>(\n event: K,\n callback: InternalEventCallbacks[K],\n ): void {\n if (!this.listeners[event]) return;\n (this.listeners[event] as Set<InternalEventCallbacks[K]>).delete(callback);\n }\n\n public emit<K extends InternalEvent>(\n event: K,\n ...args: InternalEventCallbacks[K] extends (...args: infer P) => any\n ? P\n : never\n ): void {\n if (!this.listeners[event]) return;\n (this.listeners[event] as Set<InternalEventCallbacks[K]>).forEach(\n (callback) => {\n (callback as (...args: any[]) => void)(...args);\n },\n );\n }\n}\n", "import {\n Message,\n WebRtcTextMessageEvent,\n MessageRole,\n MessageStreamEvent,\n InternalEvent,\n AnamEvent,\n} from '../types';\nimport { PublicEventEmitter, InternalEventEmitter } from '.';\nexport class MessageHistoryClient {\n private publicEventEmitter: PublicEventEmitter;\n private internalEventEmitter: InternalEventEmitter;\n\n private messages: Message[] = [];\n\n constructor(\n publicEventEmitter: PublicEventEmitter,\n internalEventEmitter: InternalEventEmitter,\n ) {\n this.publicEventEmitter = publicEventEmitter;\n this.internalEventEmitter = internalEventEmitter;\n // register for events\n this.internalEventEmitter.addListener(\n InternalEvent.WEBRTC_CHAT_MESSAGE_RECEIVED,\n this.processWebRtcTextMessageEvent.bind(this),\n );\n }\n\n private webRtcTextMessageEventToMessageStreamEvent(\n event: WebRtcTextMessageEvent,\n ): MessageStreamEvent {\n return {\n id: `${event.role}::${event.message_id}`, // id is the same for persona and user for a single question response, so we need to differentiate them\n content: event.content,\n role: event.role as MessageRole,\n endOfSpeech: event.end_of_speech,\n interrupted: event.interrupted,\n };\n }\n\n private processUserMessage(messageEvent: MessageStreamEvent): void {\n // each user message is added directly to the history\n // user messages can not be interrupted\n const userMessage: Message = {\n id: messageEvent.id,\n content: messageEvent.content,\n role: messageEvent.role,\n };\n this.messages.push(userMessage);\n }\n\n private processPersonaMessage(messageEvent: MessageStreamEvent): void {\n const personaMessage: Message = {\n id: messageEvent.id,\n content: messageEvent.content,\n role: messageEvent.role,\n interrupted: messageEvent.interrupted,\n };\n // check for existing message in the history\n const existingMessageIndex = this.messages.findIndex(\n (m) => m.id === personaMessage.id,\n );\n if (existingMessageIndex !== -1) {\n const existingMessage = this.messages[existingMessageIndex];\n // update the existing message\n this.messages[existingMessageIndex] = {\n ...existingMessage,\n content: existingMessage.content + personaMessage.content,\n interrupted: existingMessage.interrupted || personaMessage.interrupted,\n };\n } else {\n // add the new persona message to the history\n this.messages.push(personaMessage);\n }\n }\n\n public processWebRtcTextMessageEvent(event: WebRtcTextMessageEvent): void {\n const messageStreamEvent: MessageStreamEvent =\n this.webRtcTextMessageEventToMessageStreamEvent(event);\n // pass to callback stream\n this.publicEventEmitter.emit(\n AnamEvent.MESSAGE_STREAM_EVENT_RECEIVED,\n messageStreamEvent,\n );\n // update the message history\n switch (messageStreamEvent.role) {\n case MessageRole.USER:\n this.processUserMessage(messageStreamEvent);\n break;\n case MessageRole.PERSONA:\n this.processPersonaMessage(messageStreamEvent);\n break;\n }\n if (messageStreamEvent.endOfSpeech) {\n this.publicEventEmitter.emit(\n AnamEvent.MESSAGE_HISTORY_UPDATED,\n this.messages,\n );\n }\n }\n}\n", "import {\n ClientMetricMeasurement,\n sendClientMetric,\n} from '../lib/ClientMetrics';\nimport { AnamEvent, EventCallbacks } from '../types';\n\nexport class PublicEventEmitter {\n private listeners: {\n [K in AnamEvent]?: Set<EventCallbacks[K]>;\n } = {};\n\n constructor() {}\n\n public addListener<K extends AnamEvent>(\n event: K,\n callback: EventCallbacks[K],\n ): void {\n if (!this.listeners[event]) {\n (this.listeners[event] as unknown as Set<EventCallbacks[K]>) = new Set<\n EventCallbacks[K]\n >();\n }\n (this.listeners[event] as Set<EventCallbacks[K]>).add(callback);\n }\n\n public removeListener<K extends AnamEvent>(\n event: K,\n callback: EventCallbacks[K],\n ): void {\n if (!this.listeners[event]) return;\n (this.listeners[event] as Set<EventCallbacks[K]>).delete(callback);\n }\n\n public emit<K extends AnamEvent>(\n event: K,\n ...args: EventCallbacks[K] extends (...args: infer P) => any ? P : never\n ): void {\n if (event === AnamEvent.CONNECTION_ESTABLISHED) {\n sendClientMetric(\n ClientMetricMeasurement.CLIENT_METRIC_MEASUREMENT_CONNECTION_ESTABLISHED,\n '1',\n );\n }\n\n if (event === AnamEvent.CONNECTION_CLOSED) {\n const [closeCode, details] = args;\n sendClientMetric(\n ClientMetricMeasurement.CLIENT_METRIC_MEASUREMENT_CONNECTION_CLOSED,\n closeCode as string,\n details ? { details: details as string } : undefined,\n );\n }\n\n if (!this.listeners[event]) return;\n\n (this.listeners[event] as Set<EventCallbacks[K]>).forEach((callback) => {\n (callback as (...args: any[]) => void)(...args);\n });\n }\n}\n", "import {\n EngineApiRestClient,\n InternalEventEmitter,\n PublicEventEmitter,\n SignallingClient,\n} from '../modules';\nimport {\n AnamEvent,\n InputAudioState,\n InternalEvent,\n SignalMessage,\n SignalMessageAction,\n StreamingClientOptions,\n WebRtcTextMessageEvent,\n ConnectionClosedCode,\n} from '../types';\nimport { TalkMessageStream } from '../types/TalkMessageStream';\nimport { TalkStreamInterruptedSignalMessage } from '../types/signalling/TalkStreamInterruptedSignalMessage';\nimport {\n ClientMetricMeasurement,\n createRTCStatsReport,\n sendClientMetric,\n} from '../lib/ClientMetrics';\n\nconst SUCCESS_METRIC_POLLING_TIMEOUT_MS = 15000; // After this time we will stop polling for the first frame and consider the session a failure.\nexport class StreamingClient {\n private publicEventEmitter: PublicEventEmitter;\n private internalEventEmitter: InternalEventEmitter;\n private signallingClient: SignallingClient;\n private engineApiRestClient: EngineApiRestClient;\n private iceServers: RTCIceServer[];\n private peerConnection: RTCPeerConnection | null = null;\n private connectionReceivedAnswer = false;\n private remoteIceCandidateBuffer: RTCIceCandidate[] = [];\n private inputAudioStream: MediaStream | null = null;\n private dataChannel: RTCDataChannel | null = null;\n private videoElement: HTMLVideoElement | null = null;\n private videoStream: MediaStream | null = null;\n private audioStream: MediaStream | null = null;\n private inputAudioState: InputAudioState = { isMuted: false };\n private audioDeviceId: string | undefined;\n private disableInputAudio: boolean;\n private successMetricPoller: ReturnType<typeof setInterval> | null = null;\n private successMetricFired = false;\n private showPeerConnectionStatsReport: boolean = false;\n private peerConnectionStatsReportOutputFormat: 'console' | 'json' = 'console';\n\n constructor(\n sessionId: string,\n options: StreamingClientOptions,\n publicEventEmitter: PublicEventEmitter,\n internalEventEmitter: InternalEventEmitter,\n ) {\n this.publicEventEmitter = publicEventEmitter;\n this.internalEventEmitter = internalEventEmitter;\n // initialize input audio state\n const { inputAudio } = options;\n this.inputAudioState = inputAudio.inputAudioState;\n if (options.inputAudio.userProvidedMediaStream) {\n this.inputAudioStream = options.inputAudio.userProvidedMediaStream;\n }\n this.disableInputAudio = options.inputAudio.disableInputAudio === true;\n // register event handlers\n this.internalEventEmitter.addListener(\n InternalEvent.WEB_SOCKET_OPEN,\n this.onSignallingClientConnected.bind(this),\n );\n this.internalEventEmitter.addListener(\n InternalEvent.SIGNAL_MESSAGE_RECEIVED,\n this.onSignalMessage.bind(this),\n );\n // set ice servers\n this.iceServers = options.iceServers;\n // initialize signalling client\n this.signallingClient = new SignallingClient(\n sessionId,\n options.signalling,\n this.publicEventEmitter,\n this.internalEventEmitter,\n );\n // initialize engine API client\n this.engineApiRestClient = new EngineApiRestClient(\n options.engine.baseUrl,\n sessionId,\n );\n this.audioDeviceId = options.inputAudio.audioDeviceId;\n this.showPeerConnectionStatsReport =\n options.metrics?.showPeerConnectionStatsReport ?? false;\n this.peerConnectionStatsReportOutputFormat =\n options.metrics?.peerConnectionStatsReportOutputFormat ?? 'console';\n }\n\n private onInputAudioStateChange(\n oldState: InputAudioState,\n newState: InputAudioState,\n ) {\n // changed microphone mute state\n if (oldState.isMuted !== newState.isMuted) {\n if (newState.isMuted) {\n this.muteAllAudioTracks();\n } else {\n this.unmuteAllAudioTracks();\n }\n }\n }\n\n private muteAllAudioTracks() {\n this.inputAudioStream?.getAudioTracks().forEach((track) => {\n track.enabled = false;\n });\n }\n\n private unmuteAllAudioTracks() {\n this.inputAudioStream?.getAudioTracks().forEach((track) => {\n track.enabled = true;\n });\n }\n\n private startSuccessMetricPolling() {\n if (this.successMetricPoller || this.successMetricFired) {\n return;\n }\n\n const timeoutId = setTimeout(() => {\n if (this.successMetricPoller) {\n console.warn(\n 'No video frames received, there is a problem with the connection.',\n );\n clearInterval(this.successMetricPoller);\n this.successMetricPoller = null;\n }\n }, SUCCESS_METRIC_POLLING_TIMEOUT_MS);\n\n this.successMetricPoller = setInterval(async () => {\n if (!this.peerConnection || this.successMetricFired) {\n if (this.successMetricPoller) {\n clearInterval(this.successMetricPoller);\n }\n clearTimeout(timeoutId);\n return;\n }\n\n try {\n const stats = await this.peerConnection.getStats();\n\n let videoDetected = false;\n let detectionMethod = null;\n\n stats.forEach((report) => {\n // Find the report for inbound video\n if (report.type === 'inbound-rtp' && report.kind === 'video') {\n // Method 1: Try framesDecoded (most reliable when available)\n if (\n report.framesDecoded !== undefined &&\n report.framesDecoded > 0\n ) {\n videoDetected = true;\n detectionMethod = 'framesDecoded';\n } else if (\n report.framesReceived !== undefined &&\n report.framesReceived > 0\n ) {\n videoDetected = true;\n detectionMethod = 'framesReceived';\n } else if (\n report.bytesReceived > 0 &&\n report.packetsReceived > 0 &&\n // Additional check: ensure we've received enough data for actual video\n report.bytesReceived > 100000 // rough threshold\n ) {\n videoDetected = true;\n detectionMethod = 'bytesReceived';\n }\n }\n });\n if (videoDetected && !this.successMetricFired) {\n this.successMetricFired = true;\n sendClientMetric(\n ClientMetricMeasurement.CLIENT_METRIC_MEASUREMENT_SESSION_SUCCESS,\n '1',\n detectionMethod ? { detectionMethod } : undefined,\n );\n if (this.successMetricPoller) {\n clearInterval(this.successMetricPoller);\n }\n clearTimeout(timeoutId);\n this.successMetricPoller = null;\n }\n } catch (error) {}\n }, 500);\n }\n\n public muteInputAudio(): InputAudioState {\n const oldAudioState: InputAudioState = this.inputAudioState;\n const newAudioState: InputAudioState = {\n ...this.inputAudioState,\n isMuted: true,\n };\n this.inputAudioState = newAudioState;\n this.onInputAudioStateChange(oldAudioState, newAudioState);\n return this.inputAudioState;\n }\n\n public unmuteInputAudio(): InputAudioState {\n const oldAudioState: InputAudioState = this.inputAudioState;\n const newAudioState: InputAudioState = {\n ...this.inputAudioState,\n isMuted: false,\n };\n this.inputAudioState = newAudioState;\n this.onInputAudioStateChange(oldAudioState, newAudioState);\n return this.inputAudioState;\n }\n\n public getInputAudioState(): InputAudioState {\n return this.inputAudioState;\n }\n\n public getPeerConnection(): RTCPeerConnection | null {\n return this.peerConnection;\n }\n\n public getInputAudioStream(): MediaStream | null {\n return this.inputAudioStream;\n }\n\n public getVideoStream(): MediaStream | null {\n return this.videoStream;\n }\n\n public getAudioStream(): MediaStream | null {\n return this.audioStream;\n }\n\n public sendDataMessage(message: string) {\n if (this.dataChannel && this.dataChannel.readyState === 'open') {\n this.dataChannel.send(message);\n }\n }\n\n public setMediaStreamTargetById(videoElementId: string) {\n // set up streaming targets\n if (videoElementId) {\n const videoElement = document.getElementById(videoElementId);\n if (!videoElement) {\n throw new Error(\n `StreamingClient: video element with id ${videoElementId} not found`,\n );\n }\n this.videoElement = videoElement as HTMLVideoElement;\n }\n }\n\n public startConnection() {\n try {\n if (this.peerConnection) {\n console.error(\n 'StreamingClient - startConnection: peer connection already exists',\n );\n return;\n }\n // start the connection\n this.signallingClient.connect();\n } catch (error) {\n console.log('StreamingClient - startConnection: error', error);\n this.handleWebrtcFailure(error);\n }\n }\n\n public async stopConnection() {\n await this.shutdown();\n }\n\n public async sendTalkCommand(content: string): Promise<void> {\n if (!this.peerConnection) {\n throw new Error(\n 'StreamingClient - sendTalkCommand: peer connection is null',\n );\n }\n await this.engineApiRestClient.sendTalkCommand(content);\n return;\n }\n\n public startTalkMessageStream(correlationId?: string): TalkMessageStream {\n if (!correlationId) {\n // generate a random correlation uuid\n correlationId = Math.random().toString(36).substring(2, 15);\n }\n return new TalkMessageStream(\n correlationId,\n this.internalEventEmitter,\n this.signallingClient,\n );\n }\n\n private async initPeerConnection() {\n this.peerConnection = new RTCPeerConnection({\n iceServers: this.iceServers,\n });\n // set event handlers\n this.peerConnection.onicecandidate = this.onIceCandidate.bind(this);\n this.peerConnection.oniceconnectionstatechange =\n this.onIceConnectionStateChange.bind(this);\n this.peerConnection.onconnectionstatechange =\n this.onConnectionStateChange.bind(this);\n this.peerConnection.addEventListener(\n 'track',\n this.onTrackEventHandler.bind(this),\n );\n\n // set up data channels\n await this.setupDataChannels();\n\n // add transceivers\n this.peerConnection.addTransceiver('video', { direction: 'recvonly' });\n if (this.disableInputAudio) {\n this.peerConnection.addTransceiver('audio', { direction: 'recvonly' });\n } else {\n this.peerConnection.addTransceiver('audio', { direction: 'sendrecv' });\n }\n }\n\n private async onSignalMessage(signalMessage: SignalMessage) {\n if (!this.peerConnection) {\n console.error(\n 'StreamingClient - onSignalMessage: peerConnection is not initialized',\n );\n return;\n }\n switch (signalMessage.actionType) {\n case SignalMessageAction.ANSWER:\n const answer = signalMessage.payload as RTCSessionDescriptionInit;\n await this.peerConnection.setRemoteDescription(answer);\n this.connectionReceivedAnswer = true;\n // flush the remote buffer\n this.flushRemoteIceCandidateBuffer();\n break;\n case SignalMessageAction.ICE_CANDIDATE:\n const iceCandidateConfig = signalMessage.payload as RTCIceCandidateInit;\n const candidate = new RTCIceCandidate(iceCandidateConfig);\n if (this.connectionReceivedAnswer) {\n await this.peerConnection.addIceCandidate(candidate);\n } else {\n this.remoteIceCandidateBuffer.push(candidate);\n }\n break;\n case SignalMessageAction.END_SESSION:\n const reason = signalMessage.payload as string;\n console.log('StreamingClient - onSignalMessage: reason', reason);\n this.publicEventEmitter.emit(\n AnamEvent.CONNECTION_CLOSED,\n ConnectionClosedCode.SERVER_CLOSED_CONNECTION,\n reason,\n );\n // close the peer connection\n this.shutdown();\n break;\n case SignalMessageAction.WARNING:\n const message = signalMessage.payload as string;\n console.warn('Warning received from server: ' + message);\n this.publicEventEmitter.emit(AnamEvent.SERVER_WARNING, message);\n break;\n case SignalMessageAction.TALK_STREAM_INTERRUPTED:\n const chatMessage =\n signalMessage.payload as TalkStreamInterruptedSignalMessage;\n this.publicEventEmitter.emit(\n AnamEvent.TALK_STREAM_INTERRUPTED,\n chatMessage.correlationId,\n );\n break;\n case SignalMessageAction.SESSION_READY:\n const sessionId = signalMessage.sessionId as string;\n this.publicEventEmitter.emit(AnamEvent.SESSION_READY, sessionId);\n break;\n default:\n console.error(\n 'StreamingClient - onSignalMessage: unknown signal message action type. Is your anam-sdk version up to date?',\n signalMessage,\n );\n }\n }\n\n private async onSignallingClientConnected() {\n if (!this.peerConnection) {\n try {\n await this.initPeerConnectionAndSendOffer();\n } catch (err) {\n console.error(\n 'StreamingClient - onSignallingClientConnected: Error initializing peer connection',\n err,\n );\n this.handleWebrtcFailure(err);\n }\n }\n }\n\n private flushRemoteIceCandidateBuffer() {\n this.remoteIceCandidateBuffer.forEach((candidate) => {\n this.peerConnection?.addIceCandidate(candidate);\n });\n this.remoteIceCandidateBuffer = [];\n }\n\n /**\n * ICE Candidate Trickle\n * As each ICE candidate is gathered from the STUN server it is sent to the\n * webRTC server immediately in an effort to reduce time to connection.\n */\n private onIceCandidate(event: RTCPeerConnectionIceEvent) {\n if (event.candidate) {\n this.signallingClient.sendIceCandidate(event.candidate);\n }\n }\n\n private onIceConnectionStateChange() {\n if (\n this.peerConnection?.iceConnectionState === 'connected' ||\n this.peerConnection?.iceConnectionState === 'completed'\n ) {\n this.publicEventEmitter.emit(AnamEvent.CONNECTION_ESTABLISHED);\n }\n }\n\n private onConnectionStateChange() {\n if (this.peerConnection?.connectionState === 'closed') {\n console.error(\n 'StreamingClient - onConnectionStateChange: Connection closed',\n );\n this.handleWebrtcFailure(\n 'The connection to our servers was lost. Please try again.',\n );\n }\n }\n\n private handleWebrtcFailure(err: any) {\n console.error({ message: 'StreamingClient - handleWebrtcFailure: ', err });\n if (err.name === 'NotAllowedError' && err.message === 'Permission denied') {\n this.publicEventEmitter.emit(\n AnamEvent.CONNECTION_CLOSED,\n ConnectionClosedCode.MICROPHONE_PERMISSION_DENIED,\n );\n } else {\n this.publicEventEmitter.emit(\n AnamEvent.CONNECTION_CLOSED,\n ConnectionClosedCode.WEBRTC_FAILURE,\n );\n }\n\n try {\n this.stopConnection();\n } catch (error) {\n console.error(\n 'StreamingClient - handleWebrtcFailure: error stopping connection',\n error,\n );\n }\n }\n\n private onTrackEventHandler(event: RTCTrackEvent) {\n if (event.track.kind === 'video') {\n // start polling stats to detect successful video data received\n this.startSuccessMetricPolling();\n\n this.videoStream = event.streams[0];\n this.publicEventEmitter.emit(\n AnamEvent.VIDEO_STREAM_STARTED,\n this.videoStream,\n );\n if (this.videoElement) {\n this.videoElement.srcObject = this.videoStream;\n const handle = this.videoElement.requestVideoFrameCallback(() => {\n // unregister the callback after the first frame\n this.videoElement?.cancelVideoFrameCallback(handle);\n this.publicEventEmitter.emit(AnamEvent.VIDEO_PLAY_STARTED);\n if (!this.successMetricFired) {\n this.successMetricFired = true;\n sendClientMetric(\n ClientMetricMeasurement.CLIENT_METRIC_MEASUREMENT_SESSION_SUCCESS,\n '1',\n { detectionMethod: 'videoElement' },\n );\n }\n });\n }\n } else if (event.track.kind === 'audio') {\n this.audioStream = event.streams[0];\n this.publicEventEmitter.emit(\n AnamEvent.AUDIO_STREAM_STARTED,\n this.audioStream,\n );\n }\n }\n /**\n * Set up the data channels for sending and receiving messages\n */\n private async setupDataChannels() {\n if (!this.peerConnection) {\n console.error(\n 'StreamingClient - setupDataChannels: peer connection is not initialized',\n );\n return;\n }\n /**\n * Audio\n *\n * If the user hasn't provided an audio stream, capture the audio stream from the user's microphone and send it to the peer connection\n * If input audio is disabled we don't send any audio to the peer connection\n */\n if (!this.disableInputAudio) {\n if (this.inputAudioStream) {\n // verify the user provided stream has audio tracks\n if (!this.inputAudioStream.getAudioTracks().length) {\n throw new Error(\n 'StreamingClient - setupDataChannels: user provided stream does not have audio tracks',\n );\n }\n } else {\n const audioConstraints: MediaTrackConstraints = {\n echoCancellation: true,\n };\n\n // If an audio device ID is provided in the options, use it\n if (this.audioDeviceId) {\n audioConstraints.deviceId = {\n exact: this.audioDeviceId,\n };\n }\n\n this.inputAudioStream = await navigator.mediaDevices.getUserMedia({\n audio: audioConstraints,\n });\n }\n\n // mute the audio tracks if the user has muted the microphone\n if (this.inputAudioState.isMuted) {\n this.muteAllAudioTracks();\n }\n const audioTrack = this.inputAudioStream.getAudioTracks()[0];\n this.peerConnection.addTrack(audioTrack, this.inputAudioStream);\n // pass the stream to the callback if it exists\n this.publicEventEmitter.emit(\n AnamEvent.INPUT_AUDIO_STREAM_STARTED,\n this.inputAudioStream,\n );\n }\n\n /**\n * Text\n *\n * Create the data channel for sending and receiving text.\n * There is no input stream for text, instead the sending of data is triggered by a UI interaction.\n */\n const dataChannel = this.peerConnection.createDataChannel('chat', {\n ordered: true,\n });\n dataChannel.onopen = () => {\n this.dataChannel = dataChannel ?? null;\n };\n dataChannel.onclose = () => {};\n // pass text message to the message history client\n dataChannel.onmessage = (event) => {\n const messageEvent = JSON.parse(event.data) as WebRtcTextMessageEvent;\n this.internalEventEmitter.emit(\n InternalEvent.WEBRTC_CHAT_MESSAGE_RECEIVED,\n messageEvent,\n );\n };\n }\n\n private async initPeerConnectionAndSendOffer() {\n await this.initPeerConnection();\n\n if (!this.peerConnection) {\n console.error(\n 'StreamingClient - initPeerConnectionAndSendOffer: peer connection is not initialized',\n );\n return;\n }\n\n // create offer and set local description\n try {\n const offer: RTCSessionDescriptionInit =\n await this.peerConnection.createOffer();\n await this.peerConnection.setLocalDescription(offer);\n } catch (error) {\n console.error(\n 'StreamingClient - initPeerConnectionAndSendOffer: error creating offer',\n error,\n );\n }\n\n if (!this.peerConnection.localDescription) {\n throw new Error(\n 'StreamingClient - initPeerConnectionAndSendOffer: local description is null',\n );\n }\n await this.signallingClient.sendOffer(this.peerConnection.localDescription);\n }\n\n private async shutdown() {\n if (this.showPeerConnectionStatsReport) {\n const stats = await this.peerConnection?.getStats();\n if (stats) {\n const report = createRTCStatsReport(\n stats,\n this.peerConnectionStatsReportOutputFormat,\n );\n if (report) {\n console.log(report, undefined, 2);\n }\n }\n }\n // reset video frame polling\n if (this.successMetricPoller) {\n clearInterval(this.successMetricPoller);\n this.successMetricPoller = null;\n }\n this.successMetricFired = false;\n\n // stop the input audio stream\n try {\n if (this.inputAudioStream) {\n this.inputAudioStream.getTracks().forEach((track) => {\n track.stop();\n });\n }\n this.inputAudioStream = null;\n } catch (error) {\n console.error(\n 'StreamingClient - shutdown: error stopping input audio stream',\n error,\n );\n }\n\n // stop the signalling client\n try {\n this.signallingClient.stop();\n } catch (error) {\n console.error(\n 'StreamingClient - shutdown: error stopping signallilng',\n error,\n );\n }\n\n // close the peer connection\n try {\n if (\n this.peerConnection &&\n this.peerConnection.connectionState !== 'closed'\n ) {\n this.peerConnection.onconnectionstatechange = null;\n this.peerConnection.close();\n this.peerConnection = null;\n }\n } catch (error) {\n console.error(\n 'StreamingClient - shutdown: error closing peer connection',\n error,\n );\n }\n }\n}\n", "import { InternalEvent, SignalMessage, SignalMessageAction } from '.';\nimport { TalkMessageStreamState } from './TalkMessageStreamState';\nimport { TalkMessageStreamPayload } from './signalling/TalkMessageStreamPayload';\nimport { TalkStreamInterruptedSignalMessage } from './signalling/TalkStreamInterruptedSignalMessage';\nimport { InternalEventEmitter } from '../modules/InternalEventEmitter';\nimport { SignallingClient } from '../modules/SignallingClient';\n\nexport class TalkMessageStream {\n private internalEventEmitter: InternalEventEmitter;\n private state = TalkMessageStreamState.UNSTARTED;\n private correlationId: string;\n private signallingClient: SignallingClient;\n\n constructor(\n correlationId: string,\n internalEventEmitter: InternalEventEmitter,\n signallingClient: SignallingClient,\n ) {\n this.correlationId = correlationId;\n this.internalEventEmitter = internalEventEmitter;\n this.signallingClient = signallingClient;\n\n this.internalEventEmitter.addListener(\n InternalEvent.SIGNAL_MESSAGE_RECEIVED,\n this.onSignalMessage.bind(this),\n );\n }\n\n private onDeactivate() {\n this.internalEventEmitter.removeListener(\n InternalEvent.SIGNAL_MESSAGE_RECEIVED,\n this.onSignalMessage.bind(this),\n );\n }\n\n private async onSignalMessage(signalMessage: SignalMessage) {\n if (\n signalMessage.actionType === SignalMessageAction.TALK_STREAM_INTERRUPTED\n ) {\n const message =\n signalMessage.payload as TalkStreamInterruptedSignalMessage;\n if (message.correlationId === this.correlationId) {\n this.state = TalkMessageStreamState.INTERRUPTED;\n this.onDeactivate();\n }\n }\n }\n\n public async endMessage(): Promise<void> {\n if (this.state === TalkMessageStreamState.ENDED) {\n console.warn(\n 'Talk stream is already ended via end of speech. No need to call endMessage.',\n );\n return;\n }\n\n if (this.state !== TalkMessageStreamState.STREAMING) {\n console.warn('Talk stream is not active state: ' + this.state);\n return;\n }\n\n const payload: TalkMessageStreamPayload = {\n content: '',\n startOfSpeech: false,\n endOfSpeech: true,\n correlationId: this.correlationId,\n };\n await this.signallingClient.sendTalkMessage(payload);\n this.state = TalkMessageStreamState.ENDED;\n this.onDeactivate();\n }\n\n public async streamMessageChunk(\n partialMessage: string,\n endOfSpeech: boolean,\n ): Promise<void> {\n if (\n this.state !== TalkMessageStreamState.STREAMING &&\n this.state !== TalkMessageStreamState.UNSTARTED\n ) {\n // throw error\n throw new Error('Talk stream is not in an active state: ' + this.state);\n }\n const payload: TalkMessageStreamPayload = {\n content: partialMessage,\n startOfSpeech: this.state === TalkMessageStreamState.UNSTARTED,\n endOfSpeech: endOfSpeech,\n correlationId: this.correlationId,\n };\n this.state = endOfSpeech\n ? TalkMessageStreamState.ENDED\n : TalkMessageStreamState.STREAMING;\n if (this.state === TalkMessageStreamState.ENDED) {\n this.onDeactivate();\n }\n\n // send message to signalling client\n await this.signallingClient.sendTalkMessage(payload);\n }\n\n public getCorrelationId(): string {\n return this.correlationId;\n }\n\n public isActive(): boolean {\n return (\n this.state === TalkMessageStreamState.STREAMING ||\n this.state === TalkMessageStreamState.UNSTARTED\n );\n }\n\n public getState(): TalkMessageStreamState {\n return this.state;\n }\n}\n", "export enum TalkMessageStreamState {\n UNSTARTED,\n STREAMING,\n INTERRUPTED,\n ENDED,\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["init_browser_polyfills", "__esmMin", "require_base64_js", "__commonJSMin", "exports", "init_browser_polyfills", "byteLength", "toByteArray", "fromByteArray", "lookup", "revLookup", "Arr", "code", "i", "len", "getLens", "b64", "validLen", "placeHoldersLen", "lens", "_byteLength", "tmp", "arr", "curByte", "tripletToBase64", "num", "encodeChunk", "uint8", "start", "end", "output", "extraBytes", "parts", "maxChunkLength", "len2", "require_ieee754", "__commonJSMin", "exports", "init_browser_polyfills", "buffer", "offset", "isLE", "mLen", "nBytes", "e", "eLen", "eMax", "eBias", "nBits", "i", "d", "s", "value", "m", "c", "rt", "require_buffer", "__commonJSMin", "exports", "init_browser_polyfills", "base64", "ieee754", "customInspectSymbol", "Buffer", "SlowBuffer", "K_MAX_LENGTH", "typedArraySupport", "arr", "proto", "createBuffer", "length", "buf", "arg", "encodingOrOffset", "allocUnsafe", "from", "value", "fromString", "fromArrayView", "isInstance", "fromArrayBuffer", "valueOf", "b", "fromObject", "assertSize", "size", "alloc", "fill", "encoding", "checked", "string", "byteLength", "actual", "fromArrayLike", "array", "i", "arrayView", "copy", "byteOffset", "obj", "len", "numberIsNaN", "a", "x", "y", "list", "buffer", "pos", "mustMatch", "loweredCase", "utf8ToBytes", "base64ToBytes", "slowToString", "start", "end", "hexSlice", "utf8Slice", "asciiSlice", "latin1Slice", "base64Slice", "utf16leSlice", "swap", "n", "m", "str", "max", "target", "thisStart", "thisEnd", "thisCopy", "targetCopy", "bidirectionalIndexOf", "val", "dir", "arrayIndexOf", "indexSize", "arrLength", "valLength", "read", "foundIndex", "found", "j", "hexWrite", "offset", "remaining", "strLen", "parsed", "utf8Write", "blitBuffer", "asciiWrite", "asciiToBytes", "base64Write", "ucs2Write", "utf16leToBytes", "res", "firstByte", "codePoint", "bytesPerSequence", "secondByte", "thirdByte", "fourthByte", "tempCodePoint", "decodeCodePointsArray", "MAX_ARGUMENTS_LENGTH", "codePoints", "ret", "out", "hexSliceLookupTable", "bytes", "newBuf", "checkOffset", "ext", "noAssert", "mul", "defineBigIntMethod", "validateNumber", "first", "last", "boundsError", "lo", "hi", "checkInt", "min", "maxBytes", "wrtBigUInt64LE", "checkIntBI", "wrtBigUInt64BE", "limit", "sub", "checkIEEE754", "writeFloat", "littleEndian", "writeDouble", "targetStart", "code", "errors", "E", "sym", "getMessage", "Base", "name", "range", "input", "msg", "received", "addNumericalSeparator", "checkBounds", "type", "INVALID_BASE64_RE", "base64clean", "units", "leadSurrogate", "byteArray", "c", "src", "dst", "alphabet", "table", "i16", "fn", "BufferBigIntNotDefined", "web_exports", "__export", "ErrorInfo", "DefaultRealtime", "DefaultRest", "web_default", "makeFromDeserializedWithDependencies", "msgpack_default", "module", "__toCommonJS", "Platform", "globalObject", "pad", "timeSegment", "three", "getHandler", "logger", "msg", "time", "getDefaultLoggers", "_a", "consoleLogger", "errorLogger", "args", "_Logger", "description", "level", "handler", "logHandler", "logErrorHandler", "action", "message", "oldName", "newName", "className", "Logger", "logger_default", "utils_exports", "Format", "allSame", "allToLowerCase", "allToUpperCase", "arrChooseN", "arrDeleteValue", "arrEquals", "arrIntersect", "arrIntersectOb", "arrPopRandomElement", "arrWithoutValue", "cheapRandStr", "containsValue", "copy", "createMissingPluginError", "dataSizeBytes", "decodeBody", "encodeBody", "ensureArray", "forInOwnNonNullProperties", "getBackoffCoefficient", "getGlobalObject", "getJitterCoefficient", "getRetryTime", "inherits", "inspectBody", "inspectError", "intersect", "isEmpty", "isErrorInfoOrPartialErrorInfo", "isNil", "isObject", "keysArray", "matchDerivedChannel", "mixin", "parseQueryString", "prototypicalClone", "randomString", "shallowClone", "shallowEquals", "throwMissingPluginError", "toBase64", "toQueryString", "valuesArray", "whenPromiseSettles", "withTimeoutAsync", "toString", "err", "result", "_ErrorInfo", "code", "statusCode", "cause", "values", "PartialErrorInfo", "_PartialErrorInfo", "randomPosn", "arrOrStr", "target", "i", "source", "key", "src", "obj", "ob", "prop", "arg", "ownProperties", "F", "ctor", "superCtor", "val", "arr", "arr1", "arr2", "member", "idx", "res", "newArr", "ownOnly", "fn", "first", "item", "params", "parts", "query", "match", "search", "_b", "body", "data", "numBytes", "buffer", "n", "numItems", "mutableArr", "promise", "callback", "MsgPack", "format", "element", "count", "initialTimeout", "retryAttempt", "name", "regex", "str", "bufferUtils", "textBuffer", "a", "b", "pluginName", "timeout", "e", "_resolve", "reject", "version", "agent", "Defaults", "getPort", "getHttpScheme", "getPrimaryDomainFromEndpoint", "getEndpointFallbackHosts", "getFallbackHosts", "getHosts", "checkHost", "objectifyOptions", "normaliseOptions", "defaultGetHeaders", "defaultPostHeaders", "options", "tls", "isFqdnIpOrLocalhost", "endpoint", "routingPolicyId", "endpointFallbacks", "domain", "id", "fallbackHosts", "httpMaxRetryCount", "host", "getTimeouts", "timeouts", "getAgentString", "agentStr", "allowKeyOrToken", "sourceForErrorMessage", "modularPluginsToInclude", "optionsObj", "__spreadProps", "__spreadValues", "checkIfClientOptionsAreValid", "loggerToUse", "primaryDomainFromEnvironment", "primaryDomain", "headers", "connectivityCheckParams", "connectivityCheckUrl", "uri", "qs", "wsConnectivityCheckUrl", "normaliseChannelOptions", "Crypto", "channelOptions", "cipher", "contentTypes", "defaultHeadersOptions", "protocolVersion", "contentType", "defaults_default", "getDefaults", "platformDefaults", "Multicaster", "_Multicaster", "members", "resolve", "instance", "multicaster_default", "HttpMethods", "HttpMethods_default", "HttpStatusCodes", "isSuccessCode", "HttpStatusCodes_default", "MAX_TOKEN_LENGTH", "random", "isRealtime", "client", "normaliseAuthcallbackError", "hmac", "text", "keyBuffer", "digest", "c14n", "capability", "c14nCapability", "keys", "logAndValidateTokenAuthMethod", "authOptions", "basicAuthForced", "useTokenAuth", "noWayToRenew", "trId", "getTokenRequestId", "Auth", "tokenParams", "tokenDetails", "resolvedAuthOptions", "resolvedTokenParams", "tokenRequestCallback", "cb", "authHeaders", "usePost", "providedQsParams", "queryIdx", "authParams", "authUrlRequestCallback", "contentTypeHeaderOrHeaders", "json", "tokenRequest", "signedTokenParams", "tokenCb", "keyName", "path", "tokenUri", "requestHeaders", "tokenRequestCallbackTimeoutExpired", "timeoutLength", "tokenRequestCallbackTimeout", "tokenRequestOrDetails", "objectSize", "tokenResponse", "unpacked", "keyParts", "keySecret", "request", "clientId", "ttl", "nonce", "timestamp", "signText", "forceSupersede", "token", "tokenRequestId", "caughtError", "multicaster", "tokenClientId", "error", "specifiers", "queryTime", "auth_default", "paramString", "paramPairs", "needle", "appendingParams", "logResult", "method", "logRequest", "Http", "connection", "connectionHost", "uriFromHost", "currentFallback", "hosts", "tryAHostStartedAt", "tryAHost", "candidateHosts", "persistOnSuccess", "callListener", "eventThis", "listener", "removeListener", "targetListeners", "eventFilter", "listeners", "index", "eventName", "targetListenersIndex", "EventEmitter", "event", "firstArg", "secondArg", "eventsOnceListeners", "eventsListeners", "argCount", "self", "listenerWrapper", "innerArgs", "targetState", "currentState", "eventemitter_default", "actions", "ActionName", "flags", "flagNames", "channelModes", "normaliseContext", "context", "normalizeCipherOptions", "encrypt", "cipherOptions", "encoding", "encryptData", "dataToEncrypt", "finalEncoding", "ciphertext", "encode", "isNativeDataType", "encodeData", "decode", "inputContext", "decodeData", "lastPayload", "decodedData", "decodingError", "xforms", "lastProcessedEncodingIndex", "encodingsToProcess", "xform", "xformAlgorithm", "deltaBase", "deltaBaseBuffer", "wireToJSON", "encodeDataForWire", "MessageEncoding", "populateFieldsFromParent", "parent", "connectionId", "msgs", "strMsg", "m", "cls", "attr", "BaseMessage", "BaseClient", "_c", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "normalOptions", "keyMatch", "customHeaders", "specOrSpecs", "channels", "logOptions", "baseclient_default", "DeviceDetails", "_DeviceDetails", "device", "devicedetails_default", "withAuthDetails", "opCallback", "unenvelope", "wrappedStatusCode", "response", "wrappedHeaders", "wrappedErr", "Resource", "_Resource", "envelope", "throwError", "doRequest", "decodedBody", "decodeErr", "httpResult", "resource_default", "getRelParams", "linkUrl", "urlMatch", "parseRelLinks", "linkHeader", "relParams", "linkMatch", "returnErrOnly", "useHPR", "PaginatedResource", "bodyHandler", "useHttpPaginatedResponse", "items", "HttpPaginatedResponse", "PaginatedResult", "resource", "paginatedresource_default", "_PushChannelSubscription", "PushChannelSubscription", "pushchannelsubscription_default", "Push", "Admin", "registerCallback", "updateFailedCallback", "deregisterCallback", "DeviceRegistrations", "ChannelSubscriptions", "recipient", "payload", "requestBody", "deviceIdOrDetails", "deviceId", "_ChannelSubscriptions", "subscription", "parsedBody", "push_default", "fromEncoded", "encoded", "inputOptions", "WirePresenceMessage", "fromEncodedArray", "encodedArray", "_fromEncoded", "channel", "_fromEncodedArray", "PresenceMessage", "_PresenceMessage", "v", "_WirePresenceMessage", "presencemessage_default", "RestPresence", "decoded", "restpresence_default", "stringifyAction", "getMessageSize", "size", "WireMessage", "encodeArray", "messages", "serialize", "getMessagesSize", "total", "Message", "_Message", "_WireMessage", "message_default", "MSG_ID_ENTROPY_BYTES", "allEmptyIds", "RestChannel", "second", "idempotentRestPublishing", "msgIdBase", "wireMessages", "maxMessageSize", "restchannel_default", "Stats", "_Stats", "stats_default", "RestChannelMixin", "RestPresenceMixin", "presence", "Rest", "Channels", "statsValues", "timeUri", "encoder", "decoder", "_method", "paginatedResource", "resbody", "requestBodyDTO", "singleSpecMode", "batchResults", "channelsParam", "resolvedOptions", "specifier", "BaseRest", "allCommonModularPlugins", "DefaultMessage", "DefaultPresenceMessage", "WireAnnotation", "Annotation", "_Annotation", "_WireAnnotation", "annotation_default", "DefaultAnnotation", "serialFromMsgOrSerial", "msgOrSerial", "messageSerial", "constructValidateAnnotation", "annotationValues", "annotation", "basePathForSerial", "serial", "RestAnnotations", "wireAnnotation", "_", "restannotations_default", "toStringArray", "array", "deserialize", "serialized", "presenceMessagePlugin", "annotationsPlugin", "objectsPlugin", "deserialized", "fromDeserialized", "annotations", "state", "ProtocolMessage", "dependencies", "realtimeannotations_default", "fromValues", "stringify", "simpleAttributes", "attribute", "attribIndex", "stringifiedParams", "flag", "modes", "mode", "protocolmessage_default", "ChannelStateChange", "previous", "current", "resumed", "hasBacklog", "reason", "channelstatechange_default", "noop", "validateChannelOptions", "currentMode", "RealtimeChannel", "_RealtimeChannel", "restMixin", "previousChannelOptions", "stateChange", "prevOptions", "requestedParams", "omitAgent", "existingParams", "pm", "subscriptions", "forceReattach", "attachReason", "connectionManager", "attachMsg", "l", "syncMessage", "objectMessages", "syncChannelSerial", "isSync", "modesFromFlags", "hasPresence", "hasObjects", "change", "detachErr", "presenceMessages", "wpm", "om", "firstMessage", "lastMessage", "stateTimer", "retryDelay", "s", "channelSerial", "channelParams", "__objRest", "realtimechannel_default", "RealtimeAnnotations", "channelName", "_args", "_DefaultRest", "newValue", "MessageQueue", "startSerial", "endSerial", "completeMessages", "messagequeue_default", "PendingMessage", "Protocol", "transport", "messageQueue", "pendingMessage", "protocol_default", "ConnectionStateChange", "retryIn", "connectionstatechange_default", "ConnectionErrorCodes", "ConnectionErrors", "isRetriable", "connectionerrors_default", "closeMessage", "disconnectMessage", "Transport", "auth", "forceJsonProtocol", "maxPromisedIdle", "sinceLast", "timeRemaining", "transportCtor", "transportParams", "transportAttemptTimer", "errorCb", "realtimeRequestTimeout", "transport_default", "TransportNames", "haveWebStorage", "haveSessionStorage", "transportPreferenceName", "bundleWith", "dest", "maxSize", "kind", "proposed", "decodeRecoveryKey", "recoveryKey", "TransportParams", "connectionKey", "recoveryContext", "ConnectionManager", "_ConnectionManager", "realtime", "connectingTimeout", "addEventListener", "additionalImplementations", "storage", "implementations", "transportName", "modeCb", "recoverFn", "lastSessionData", "sessionRecoveryName", "shouldRecover", "candidate", "connectionDetails", "existingState", "connectedState", "existingActiveProtocol", "connectedErr", "_connectionId", "currentProtocol", "wasActive", "wasPending", "noTransportsScheduledForActivation", "newConnectionState", "hasConnectionError", "prevConnId", "newError", "newState", "transitionState", "interval", "connectivity", "indicated", "retryImmediately", "autoReconnect", "connectCount", "connect", "authCb", "transportPreference", "ws", "shouldContinue", "giveUp", "hostAttemptCb", "fatal", "tryFallbackHosts", "activeTransport", "authMsg", "successListener", "failureListener", "queueEvent", "lastQueued", "pendingMessages", "numQueued", "pendingChannelMessage", "pingStart", "onHeartbeat", "responseId", "connectionStateTtl", "finished", "value", "connectionmanager_default", "Connection", "ably", "connection_default", "_BaseRealtime", "plugins", "transports", "BaseRealtime", "serials", "channelSerials", "connectionState", "connectionStateToChannelState", "fromChannelStates", "toChannelState", "channelId", "deriveOptions", "filter", "releaseErr", "baserealtime_default", "newerThan", "existing", "itemOrderings", "existingOrderings", "PresenceMap", "memberKey", "newer", "map", "existingItem", "syncInProgress", "inProgress", "getClientId", "realtimePresence", "isAnonymousOrWildcard", "waitAttached", "RealtimePresence", "wirePresMsg", "waitForSync", "returnMembers", "presenceSet", "syncCursor", "myMembers", "broadcastMessages", "connId", "pendingPresence", "pendingPresCount", "presenceArray", "entry", "realtimepresence_default", "shortName", "isNodeWebSocket", "WebSocketTransport", "connectParams", "wsUri", "paramStr", "param", "wsConnection", "ev", "wasClean", "websockettransport_default", "FilteredSubscriptions", "filteredListener", "mapping", "realListener", "realListenerMap", "filterMaps", "listenerMaps", "prev", "cur", "_DefaultRealtime", "uint8Array", "uint32Array", "pow", "DEFAULT_STATE", "ROUND_CONSTANTS", "M", "getFractionalBits", "nPrime", "isPrime", "factor", "LittleEndian", "convertEndian", "word", "rightRotate", "bits", "sha256", "STATE", "legth", "bitLength", "newBitLength", "bytes", "words", "round", "block", "workingState", "MRound", "gamma0x", "gamma1x", "t1", "t2", "tmp", "innerKey", "outerKey", "BufferUtils", "base64", "encodings", "byteLength", "byteRemainder", "mainLength", "c", "d", "chunk", "binary_string", "len", "ascii", "accum", "byte", "hexEncodedBytes", "string", "encodedByteArray", "buffer1", "buffer2", "arrayBuffer1", "arrayBuffer2", "bytes1", "bytes2", "arrayBufferView", "buffers", "sumLength", "acc", "offset", "hash", "bufferutils_default", "createCryptoClass", "config", "DEFAULT_ALGORITHM", "DEFAULT_KEYLENGTH", "DEFAULT_MODE", "DEFAULT_BLOCKLENGTH", "validateCipherParams", "normaliseBase64", "isCipherParams", "CipherParams", "algorithm", "keyLength", "cipherParams", "CBCCipher", "iv", "output", "outputView", "buffer1View", "buffer2View", "plaintext", "cryptoKey", "ciphertextArrayBuffer", "ciphertextBody", "randomBlock", "XHRStates", "XHRStates_default", "createMissingImplementationError", "connectivityUrlIsDefault", "requestImplementations", "xhrRequestImplementation", "fetchRequestImplementation", "hasImplementation", "req", "requestResult", "errorInfo", "http_default", "test", "Webstorage", "session", "wrappedValue", "rawItem", "webstorage_default", "isVercelEdgeRuntime", "allowComet", "loc", "isWebWorkerContext", "userAgent", "currentUrl", "Config", "f", "byteArray", "config_default", "shouldBeErrorAction", "UNRESOLVABLE_ERROR_CODES", "protocolMessageFromRawError", "CometTransport", "port", "cometScheme", "connectUri", "preconnected", "connectRequest", "closing", "closeOrDisconnectUri", "connectionStr", "baseConnectionUri", "pendingItems", "sendRequest", "recvRequest", "responseData", "requestItems", "comettransport_default", "isAblyError", "responseBody", "getAblyError", "idCounter", "pendingRequests", "getHeader", "xhr", "header", "isEncodingChunked", "getHeadersAsObject", "headerPairs", "x", "XHRRequest", "_XHRRequest", "requestMode", "_timeouts", "timer", "accept", "responseType", "h", "errorHandler", "errorEvent", "errorMessage", "streaming", "successResponse", "streamPos", "onResponse", "onEnd", "parsedResponse", "jsonResponseBody", "onProgress", "responseText", "bodyEnd", "onChunk", "onStreamEnd", "readyState", "xhrrequest_default", "XHRPollingTransport", "xhrpollingtransport_default", "order", "defaultTransports", "inspect", "view", "type", "byte_", "utf8Write", "codePoint", "utf8Read", "length", "end", "utf8ByteCount", "sparse", "sizeof", "_encode", "SH_L_32", "SH_R_32", "getInt64", "getUint64", "setInt64", "setUint64", "Decoder", "encodeableKeys", "isArray", "convertHeaders", "fetchRequest", "fetchHeaders", "controller", "timeoutPromise", "requestInit", "resultPromise", "urlParams", "preparedURI", "defaultBundledRequestImplementations", "clientClass", "init_browser_polyfills", "init_browser_polyfills", "import_buffer", "init_browser_polyfills", "init_browser_polyfills", "init_browser_polyfills", "DEFAULT_API_BASE_URL", "DEFAULT_API_VERSION", "CLIENT_METADATA", "DEFAULT_ANAM_METRICS_BASE_URL", "DEFAULT_ANAM_API_VERSION", "anamCurrentBaseUrl", "DEFAULT_ANAM_METRICS_BASE_URL", "anamCurrentApiVersion", "DEFAULT_ANAM_API_VERSION", "setClientMetricsBaseUrl", "baseUrl", "apiVersion", "anamMetricsContext", "setMetricsContext", "context", "sendClientMetric", "name", "value", "tags", "metricTags", "CLIENT_METADATA", "error", "createRTCStatsReport", "stats", "outputFormat", "statsByType", "report", "jsonReport", "inboundVideo", "r", "videoData", "inboundAudio", "audioData", "outboundAudio", "userAudioData", "codecData", "transportData", "issues", "issue", "ClientError", "_ClientError", "message", "code", "statusCode", "details", "sendClientMetric", "init_browser_polyfills", "generateCorrelationId", "init_browser_polyfills", "init_browser_polyfills", "import_ably", "init_browser_polyfills", "init_browser_polyfills", "init_browser_polyfills", "SignalMessageAction", "toUnencodedMessage", "message", "init_browser_polyfills", "init_browser_polyfills", "MessageRole", "init_browser_polyfills", "init_browser_polyfills", "AnamEvent", "init_browser_polyfills", "InternalEvent", "init_browser_polyfills", "ConnectionClosedCode", "SignallingClient", "sessionId", "options", "publicEventEmitter", "internalEventEmitter", "ablyToken", "channelName", "message", "localDescription", "offerMessagePayload", "offerMessage", "candidate", "iceCandidateMessage", "error", "payload", "chatMessage", "e", "signalMessage", "toUnencodedMessage", "init_browser_polyfills", "init_browser_polyfills", "isCustomPersonaConfig", "personaConfig", "CoreApiRestClient", "sessionToken", "apiKey", "options", "DEFAULT_API_BASE_URL", "DEFAULT_API_VERSION", "personaConfig", "sessionOptions", "ClientError", "response", "CLIENT_METADATA", "data", "error", "body", "isCustomPersonaConfig", "init_browser_polyfills", "EngineApiRestClient", "baseUrl", "sessionId", "content", "response", "error", "init_browser_polyfills", "InternalEventEmitter", "event", "callback", "args", "init_browser_polyfills", "MessageHistoryClient", "publicEventEmitter", "internalEventEmitter", "event", "messageEvent", "userMessage", "personaMessage", "existingMessageIndex", "m", "existingMessage", "messageStreamEvent", "init_browser_polyfills", "PublicEventEmitter", "event", "callback", "args", "sendClientMetric", "closeCode", "details", "init_browser_polyfills", "init_browser_polyfills", "init_browser_polyfills", "TalkMessageStream", "correlationId", "internalEventEmitter", "signallingClient", "signalMessage", "payload", "partialMessage", "endOfSpeech", "SUCCESS_METRIC_POLLING_TIMEOUT_MS", "StreamingClient", "sessionId", "options", "publicEventEmitter", "internalEventEmitter", "inputAudio", "SignallingClient", "EngineApiRestClient", "oldState", "newState", "track", "timeoutId", "stats", "videoDetected", "detectionMethod", "report", "sendClientMetric", "oldAudioState", "newAudioState", "message", "videoElementId", "videoElement", "error", "content", "correlationId", "TalkMessageStream", "signalMessage", "answer", "iceCandidateConfig", "candidate", "reason", "chatMessage", "err", "event", "handle", "audioConstraints", "audioTrack", "dataChannel", "messageEvent", "offer", "createRTCStatsReport", "AnamClient", "sessionToken", "personaConfig", "options", "configError", "ClientError", "setClientMetricsBaseUrl", "DEFAULT_ANAM_METRICS_BASE_URL", "DEFAULT_ANAM_API_VERSION", "PublicEventEmitter", "InternalEventEmitter", "CoreApiRestClient", "MessageHistoryClient", "token", "base64Payload", "payloadString", "decodedToken", "setMetricsContext", "tokenType", "sessionOptions", "userProvidedAudioStream", "config", "response", "sessionId", "clientConfig", "engineHost", "engineProtocol", "ablyToken", "ablyChannel", "iceServers", "StreamingClient", "error", "attemptCorrelationId", "generateCorrelationId", "sendClientMetric", "resolve", "streams", "videoReceived", "audioReceived", "videoStream", "audioStream", "videoElementId", "audioElementId", "content", "message", "currentTimestamp", "body", "correlationId", "event", "callback", "createClient", "sessionToken", "options", "AnamClient", "unsafe_createClientWithApiKey", "apiKey", "personaConfig"]
|
|
7
|
-
}
|