diff --git a/.github/workflows/test-browser.yml b/.github/workflows/test-browser.yml index c434c2e58..acc724f96 100644 --- a/.github/workflows/test-browser.yml +++ b/.github/workflows/test-browser.yml @@ -25,11 +25,69 @@ jobs: with: node-version: 20.x - run: npm ci + + # Set up Python (for pipx) + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + + # Install pipx (for mitmproxy) + # See https://pipx.pypa.io/stable/installation/ + - name: Install pipx + run: | + python3 -m pip install --user pipx + sudo pipx --global ensurepath + + # https://docs.mitmproxy.org/stable/overview-installation/#installation-from-the-python-package-index-pypi + - name: Install mitmproxy + run: | + pipx install mitmproxy + # We use this library in our addon + pipx inject mitmproxy websockets + + - name: Generate mitmproxy SSL certs + run: mitmdump -s test/mitmproxy_addon_generate_certs_and_exit.py + + - name: Start interception proxy server + run: ./start-interception-proxy + - name: Install Playwright browsers and dependencies run: npx playwright install --with-deps - - env: + + # For certutil + - name: Install NSS tools + run: sudo apt install libnss3-tools + + # This is for Chromium (see https://chromium.googlesource.com/chromium/src/+/master/docs/linux/cert_management.md) + # Note this is the same command that we use for adding it to the Firefox profile (see playwrightHelpers.js) + - name: Install mitmproxy root CA in NSS shared DB + run: | + mkdir -p ~/.pki/nssdb + certutil -A -d sql:$HOME/.pki/nssdb -t "C" -n "Mitmproxy Root Cert" -i ~/.mitmproxy/mitmproxy-ca-cert.pem + certutil -L -d sql:$HOME/.pki/nssdb + + # This is for WebKit (I think because it uses OpenSSL) + - name: Install mitmproxy root CA in /usr/local/share/ca-certificates + run: | + sudo cp ~/.mitmproxy/mitmproxy-ca-cert.cer /usr/local/share/ca-certificates/mitmproxy-ca-cert.crt + sudo update-ca-certificates + + - name: Run the tests + env: PLAYWRIGHT_BROWSER: ${{ matrix.browser }} run: npm run test:playwright + + - name: Save interception proxy server logs + if: always() + run: sudo journalctl -u ably-sdk-test-proxy.service > interception-proxy-logs.txt + + - name: Upload interception proxy server logs + if: always() + uses: actions/upload-artifact@v4 + with: + name: interception-proxy-logs-${{ matrix.browser }} + path: interception-proxy-logs.txt + - name: Upload test results if: always() uses: ably/test-observability-action@v1 diff --git a/.github/workflows/test-node.yml b/.github/workflows/test-node.yml index 39ccf4d0e..ec119bb79 100644 --- a/.github/workflows/test-node.yml +++ b/.github/workflows/test-node.yml @@ -25,9 +25,120 @@ jobs: with: node-version: ${{ matrix.node-version }} - run: npm ci - - run: npm run test:node + + # Set up Python (for pipx) + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + + # Install pipx (for mitmproxy) + # See https://pipx.pypa.io/stable/installation/ + - name: Install pipx + run: | + python3 -m pip install --user pipx + sudo pipx --global ensurepath + + # https://docs.mitmproxy.org/stable/overview-installation/#installation-from-the-python-package-index-pypi + - name: Install mitmproxy + run: | + pipx install mitmproxy + # We use this library in our addon + pipx inject mitmproxy websockets + + - name: Create a user to run the tests + run: sudo useradd --create-home ably-test-user + + - name: Create a group for sharing the working directory + run: | + sudo groupadd ably-test-users + # Add relevant users to the group + sudo usermod --append --groups ably-test-users $USER + sudo usermod --append --groups ably-test-users ably-test-user + # Give the group ownership of the working directory and everything under it... + sudo chown -R :ably-test-users . + # ...and give group members full read/write access to its contents (i.e. rw access to files, rwx access to directories) + # (We use xargs because `find` does not fail if an `exec` command fails; see https://serverfault.com/a/905039) + find . -type f -print0 | xargs -n1 -0 chmod g+rw + find . -type d -print0 | xargs -n1 -0 chmod g+rwx + # TODO understand better + # + # This is to make `npm run` work when run as ably-test-user; else it fails because of a `statx()` call on package.json: + # + # > 2024-04-17T13:08:09.1302251Z [pid 2051] statx(AT_FDCWD, `"/home/runner/work/ably-js/ably-js/package.json"`, AT_STATX_SYNC_AS_STAT, STATX_ALL, 0x7f4875ffcb40) = -1 EACCES (Permission denied) + # + # statx documentation says: + # + # > in the case of **statx**() with a pathname, execute (search) permission is required on all of the directories in _pathname_ that lead to the file. + # + # The fact that I’m having to do this probably means that I’m doing something inappropriate elsewhere. (And I don’t know what the other consequences of doing this might be.) + chmod o+x ~ + + # TODO set umask appropriately, so that new files created are readable/writable by the group + + - name: Generate mitmproxy SSL certs + run: mitmdump -s test/mitmproxy_addon_generate_certs_and_exit.py + + - name: Set up iptables rules + run: | + # The rules suggested by mitmproxy etc are aimed at intercepting _all_ the outgoing traffic on a machine. I don’t want that, given that we want to be able to run this test suite on developers’ machines in a non-invasive manner. Instead we just want to target traffic generated by the process that contains the Ably SDK, which we’ll make identifable by iptables by running that process as a specific user created for that purpose (ably-test-user). + # + # Relevant parts of iptables documentation: + # + # nat: + # > This table is consulted when a packet that creates a new connection is encountered. It consists of three built-ins: PREROUTING (for altering packets as soon as they come in), OUTPUT (for altering locally-generated packets before routing), and POSTROUTING (for altering packets as they are about to go out). + # + # owner: + # > This module attempts to match various characteristics of the packet creator, for locally-generated packets. It is only valid in the OUTPUT chain, and even this some packets (such as ICMP ping responses) may have no owner, and hence never match. + # + # REDIRECT: + # > This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains. It redirects the packet to the machine itself by changing the destination IP to the primary address of the incoming interface (locally-generated packets are mapped to the 127.0.0.1 address). It takes one option: + # > + # > --to-ports port[-port] + # > This specifies a destination port or range of ports to use: without this, the destination port is never altered. This is only valid if the rule also specifies -p tcp or -p udp. + # + # I don’t exactly understand what the nat table means; I assume its rules apply to all _subsequent_ packets in the connection, too? + # + # So, what I expect to happen: + # + # 1. iptables rule causes default-port HTTP(S) datagram from test process to get its destination IP rewritten to 127.0.0.1, and rewrites the TCP header’s destination port to 8080 + # 2. 127.0.0.1 destination causes OS’s routing to send this datagram on the loopback interface + # 3. nature of the loopback interface means that this datagram is then received on the loopback interface + # 4. mitmproxy, listening on port 8080 (not sure how or why it uses a single port for both non-TLS and TLS traffic) receives these datagrams, and uses Host header or SNI to figure out where they were originally destined. + # + # TODO (how) do we achieve the below on macOS? I have a feeling that it’s currently just working by accident; e.g. it's because the TCP connection to the control server exists before we start mitmproxy and hence the connection doesn’t get passed to its NETransparentProxyProvider or something. To be on the safe side, though, I’ve added a check in the mitmproxy addon so that we only mess with stuff for ports 80 or 443 + # + # Note that in the current setup with ably-js, the test suite and the Ably SDK run in the same process. We want to make sure that we don’t intercept the test suite’s WebSocket communications with the interception proxy’s control API (which it serves at 127.0.0.1:8001), hence only targeting the default HTTP(S) ports. (TODO consider that Realtime team also run a Realtime on non-default ports when testing locally) + sudo iptables --table nat --append OUTPUT --match owner --uid-owner ably-test-user --protocol tcp --destination-port 80 --jump REDIRECT --to-ports 8080 + sudo iptables --table nat --append OUTPUT --match owner --uid-owner ably-test-user --protocol tcp --destination-port 443 --jump REDIRECT --to-ports 8080 + sudo ip6tables --table nat --append OUTPUT --match owner --uid-owner ably-test-user --protocol tcp --destination-port 80 --jump REDIRECT --to-ports 8080 + sudo ip6tables --table nat --append OUTPUT --match owner --uid-owner ably-test-user --protocol tcp --destination-port 443 --jump REDIRECT --to-ports 8080 + + # TODO how will this behave with: + # + # 1. the WebSocket connection from test suite to control API (see above note; not a problem in this CI setup, think about it on macOS) + # 2. the WebSocket connection from mitmproxy to control API (not an issue on Linux or macOS with our current setup since we don’t intercept any traffic from mitmproxy) + # 3. the WebSocket connections that mitmproxy proxies to the interception proxy (which it sends to localhost:8002) (ditto 2) + # 4. the WebSocket connections for which interception proxy is a client (not an issue for Linux or macOS with our current setup since we don’t intercept any traffic from interception proxy) + + - name: Start interception proxy server + run: ./start-interception-proxy + + - name: Run the tests + run: sudo -u ably-test-user NODE_EXTRA_CA_CERTS=~/.mitmproxy/mitmproxy-ca-cert.pem npm run test:node env: CI: true + + - name: Save interception proxy server logs + if: always() + run: sudo journalctl -u ably-sdk-test-proxy.service > interception-proxy-logs.txt + + - name: Upload interception proxy server logs + if: always() + uses: actions/upload-artifact@v4 + with: + name: interception-proxy-logs-${{ matrix.node-version }} + path: interception-proxy-logs.txt + - name: Upload test results if: always() uses: ably/test-observability-action@v1 diff --git a/.gitignore b/.gitignore index 072dde41f..707c11e63 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,7 @@ react/ typedoc/generated/ junit/ test/support/mocha_junit_reporter/build/ +tmp/ + +# Python stuff (for interception proxy) +__pycache__ diff --git a/capture-5.pcapng b/capture-5.pcapng new file mode 100644 index 000000000..817d8a620 Binary files /dev/null and b/capture-5.pcapng differ diff --git a/docs/internal/private-api-usage.md b/docs/internal/private-api-usage.md new file mode 100644 index 000000000..ec522c0f1 --- /dev/null +++ b/docs/internal/private-api-usage.md @@ -0,0 +1,398 @@ +# Usage of private APIs in ably-js test suite + +## Background + +I performed the following investigation as part of [ECO-4786](https://ably.atlassian.net/browse/ECO-4786). The aim of that task is to understand how the ably-js test suite uses ably-js’s private APIs, to understand the viability of reusing (some of) ably-js’s test suite as a unified test suite. Hence, although this document provides useful documentation for ably-js, it is written with a focus on the unified test suite. + +This document refers to the state of the ably-js tests as of commit `4397c82`. + +The first outcome from this document is [this RFC](https://ably.atlassian.net/wiki/x/IYDItQ): “An alternative to private API for intercepting realtime protocol messages”, which aims to remove one category of private API usage. I imagine that as part of the unified test suite work, we’ll perform further categorisation of private API usage based on the list in the current document. + +## Going through the test files + +- This list of files comes from running `find test -name '*.js'`. +- I haven’t mentioned the places where the tests use JS-specific public API, e.g. `transports` client option. +- I’ve not been particularly consistent here in explaining _for what purpose_ a test uses a given private API; sometimes I have if it was easy to figure out, sometimes I haven't if it wasn't so obvious. +- Multiple similar usages of the same API in a given file are not necessarily repeated here. + +### `test/web_server.js` + +None + +### `test/realtime/delta.test.js` + +- `channel._lastPayload.messageId = null` + - to make decoding fail + +### `test/realtime/encoding.test.js` + +- `var BufferUtils = Ably.Realtime.Platform.BufferUtils;` +- `var Defaults = Ably.Rest.Platform.Defaults;` + - just used for accessing library’s baked-in protocol version, to pass to `request()` + +### `test/realtime/presence.test.js` + +- `var createPM = Ably.protocolMessageFromDeserialized;` +- `var PresenceMessage = Ably.Realtime.PresenceMessage;` +- replacing `channel.sendPresence` with a version that checks the presence message’s client ID +- replacing `transport.send` with a version that checks the encoded data in the protocol message +- `channel.presence.members.waitSync(cb);` +- `var connId = realtime.connection.connectionManager.connectionId;` +- `channel.presence._myMembers.put(` +- `channel.sync();` +- stubbing out `channel.attachImpl` +- `channel.checkPendingState();` +- `Ably.Realtime.Platform.Config.nextTick(cb);` +- calling `channel.processMessage` to inject a protocol message + +### `test/realtime/event_emitter.test.js` + +- `eventEmitter.emit('custom');` — RTE6 says that `emit` is internal + +### `test/realtime/api.test.js` + +None + +### `test/realtime/crypto.test.js` + +- `var BufferUtils = Ably.Realtime.Platform.BufferUtils;` +- `var msgpack = typeof window == 'object' ? Ably.msgpack : require('@ably/msgpack-js');` +- `Message.encode(testMessage, channelOpts)` +- `Message.decode(encryptedMessage, channelOpts);` +- `Message.fromValues(` +- `expect(channel.channelOptions.cipher.algorithm).to.equal('aes');` — `channel.channelOptions` is not public API + +### `test/realtime/failure.test.js` + +- `webSocketConnectTimeout: 50` client option +- replacing `channel.processMessage` to drop `ATTACHED` +- replacing `realtime.connection.connectionManager.activeProtocol.transport.onProtocolMessage` to drop `ACK` +- `Ably.Realtime.Platform.Config.nextTick(function () {` +- calling `realtime.connection.connectionManager.activeProtocol.transport.onProtocolMessage` to inject an `ERROR` +- calling `realtime.connection.connectionManager.on('transport.pending'` and then replacing this transport’s `onProtocolMessage` to change its `connectionDetails.maxIdleInterval` +- accessing `connection.connectionManager.activeProtocol.getTransport()` to inject a `DISCONNECTED` +- replacing `connectionManager.onChannelMessage` to listen for `MESSAGE`and then calling `requestState('attaching')` on a channel in response + +### `test/realtime/channel.test.js` + +- `var createPM = Ably.protocolMessageFromDeserialized;` +- `expect(channel.channelOptions).to.deep.equal(channelOptions, 'Check requested channel options');` (`channelOptions` isn’t public API) +- listens for `channel._allChannelChanges.on(['update'],` +- replaces `channel.sendMessage` with an empty implementation (to "sabotage the reattach attempt") +- sets `realtime.options.timeouts.realtimeRequestTimeout = 100` i.e. modifies client options after creation +- calls `transport.onProtocolMessage` to inject `DETACHED` +- replaces `channel.sendMessage` to check that an `ATTACH` was received, and inside it then calls `transport.onProtocolMessage` to inject a `DETACHED` +- OK, have seen plenty of `onProtocolMessage` calls to inject a protocol message now; will only write if something particularly interesting seen +- replaces `channel.sendMessage` with an implementation which fails the test if called +- replaces `channel.sendMessage` to check that only a `DETACH` is being sent, and to continue the test once second `DETACH` sent + +### `test/realtime/auth.test.js` + +- `var http = new Ably.Realtime._Http();` — just uses this as an HTTP client to fetch a JWT +- spies on `rest.time` to count how many times called +- checks `rest.serverTimeOffset` +- spies on `transport.send` to look for an outgoing `AUTH` and check its properties + +### `test/realtime/transports.test.js` + +Transports are a JS-specific concept so might not be worth worrying too much about the contents of this file + +- `const Defaults = Ably.Rest.Platform.Defaults;` + - changes `Defaults.wsConnectivityUrl` +- `const defaultTransports = new Ably.Realtime({ key: 'xxx:yyy', autoConnect: false }).connection.connectionManager.transports;` +- `const baseTransport = new Ably.Realtime({ key: 'xxx:yyy', autoConnect: false, transports: availableTransports }).connection.connectionManager.baseTransport;` +- changes `Ably.Rest.Platform.Config.WebSocket` + - replaces it with a `FakeWebSocket` class to simulate not emitting any events +- checks `realtime.connection.connectionManager.activeProtocol.transport.shortName` +- `webSocketSlowTimeout` and `webSocketConnectTimeout` client options +- checks `window.localStorage.getItem(transportPreferenceName)` +- sets `window.localStorage.setItem(transportPreferenceName` +- modifies `realtime.connection.connectionManager.checkWsConnectivity` to delay its completion until some other event has happened + +### `test/realtime/utils.test.js` + +Ah, I just realised that some of the properties on `shared_helper` actually refer to properties of the library, e.g. `helper.Utils` is actually `Ably.Realtime.Utils`. So perhaps I missed some usages of internal APIs in earlier files. But can figure that out later. + +- this entire file is a test of the internal `utils.getRetryTime(…)` method + +### `test/realtime/resume.test.js` + +- `connectionManager.once('transport.active',` and inside the callback it makes an assertion on `transport.params.mode` +- sets a channel’s state: `suspendedChannel.state = 'suspended';` +- sabotages a resume by setting `connection.connectionManager`’s `conectionKey` and `connectionId` to garbage +- sets `connection.connectionManager.msgSerial` to some fixed value (not sure of motivation) +- calls `connection.connectionManager.disconnectAllTransports();` +- checks `connection.connectionManager.msgSerial` and `connection.connectionManager.connectionId` +- sabotages a resume by setting `realtime.auth.tokenDetails.token` +- modifies `realtime.auth.key` to something invalid in order to get a fatal resume error +- sets `connectionManager.lastActivity` to something far in the past +- sets `connectionManager.activeProtocol.getTransport().onProtocolMessage` to no-op so that last activity timer doesn’t get bumped +- spies on `connectionManager.tryATransport` to verify `transportParams.mode` +- modifies `connectionManager.send` to do `msg.setFlag('ATTACH_RESUME')` on the outgoing message + +### `test/realtime/message.test.js` + +- `let config = Ably.Realtime.Platform.Config;` +- `var createPM = Ably.protocolMessageFromDeserialized;` +- modifies `transport.send` to check the `clientId` on the outgoing `MESSAGE` +- checks `channel.filteredSubscriptions.has(listener)` +- accesses `connectionManager.connectionDetails`, modifies its `maxMessageSize`, then re-injects it via a `CONNECTED` passed to `onProtocolMessage()` +- bundling test performs some assertions about the contents of `realtime.connection.connectionManager.queuedMessages` + +### `test/realtime/connection.test.js` + +- creates a `recover` client option which uses knowledge of ably-js’s serialization of recovery key +- spies on `transport.send` to listen for `MESSAGE`, check its properties, and then continue the test +- calls `connectionManager.disconnectAllTransports();` +- listens for `connectionManager.once('connectiondetails')` in order to make some assertions about those details +- checks `realtime.options.maxMessageSize` + +### `test/realtime/init.test.js` + +- accesses `var transport = realtime.connection.connectionManager.activeProtocol.transport.uri` or `.recvRequest.recvUri` to check the `v=3` query parameter +- `expect(realtime.options).to.deep.equal(realtime.connection.connectionManager.options);` +- checks `realtime.connection.connectionManager.httpHosts[0];` to check it’s using correct default host, also checks length of that array +- checks that timeout-related client options are reflected in internal `realtime.connection.connectionManager.states.*.retryDelay` values and various `realtime.connection.connectionManager.options` properties +- spies on `realtime.connection.connectionManager.tryATransport`, looking at the host that’s being used to connect, although not sure exactly to what end +- checks `realtime.connection.connectionManager`’s `baseTransport` and `webSocketTransportAvailable` +- modifies `realtime.connection.connectionManager.pendingTransport.onProtocolMessage` to look for `CONNECTED`, make an assertion about it, and then set its `connectionKey` and `clientId` to fixed values (so we can assert they’re subsequently used to populate some user-facing properties) +- calls the `new Ably.Rest._Http()._getHosts(…)` API to check its result +- calls `helper.AblyRest().options.realtimeHost;` just to get a URL to be used in a realtime’s `fallbackHosts` + +### `test/realtime/history.test.js` + +None + +### `test/realtime/connectivity.test.js` + +- directly calls `new Ably.Realtime._Http().checkConnectivity()` and checks it succeeds (i.e. directly tests this method) + +### `test/realtime/reauth.test.js` + +None + +### `test/realtime/sync.test.js` + +- calling `channel.processMessage` to inject an `ATTACHED` with a presence flag, and then a `SYNC`, later on a `PRESENCE` +- spies on `channel.processMessage` to, after processing a received `SYNC`, inject a `PRESENCE` + +### `test/browser/simple.test.js` + +- checks whether a transport is available using `transport in Ably.Realtime.ConnectionManager.supportedTransports(Ably.Realtime._transports)` + +### `test/browser/http.test.js` + +- changes `Ably.Rest.Platform.Config.xhrSupported` to false to make it use Fetch + +### `test/browser/connection.test.js` + +(I guess that this is a test that we might not include in the unified test suite.) + +- uses knowledge of library’s usage of `window.sessionStorage` for transport preference and recovery key +- fires an `"offline"` event, ditto `"offline"` +- replaces `connection.connectionManager.tryATransport` to "simulate the internet being failed" +- listens for `connection.connectionManager.once('transport.pending'` in order to know when to "sabotage the connection attempt", and then makes assertions about this transport (`isDisposed`, checking `realtime.connection.connectionManager.activeProtocol.transport`) +- dispatches a `"beforeunload"` event +- tests `realtime.connection.connectionManager.baseTransport` and `realtime.connection.connectionManager.webSocketTransportAvailable` + +### `test/browser/modular.test.js` + +Another file that probably wouldn’t be part of a unified test suite. + +- `const BufferUtils = BaseRest.Platform.BufferUtils;` + - just used for Base64 and checking buffer equality, can be replaced easily +- replaces `rest.http.do` to check the `Content-Type` request header +- replaces `realtime.connection.connectionManager.connectImpl` to check `transportParams.format` +- spies on `realtime.connection.connectionManager.tryATransport` to check which transport being tried + +### `test/common/globals/named_dependencies.js` + +N/A + +### `test/common/globals/environment.js` + +N/A + +### `test/common/ably-common/test/agents.test.js` + +N/A + +### `test/common/ably-common/.eslintrc.js` + +N/A + +### `test/common/ably-common/json-schemas/publish.js` + +N/A + +### `test/common/modules/client_module.js` + +- uses `Ably.Realtime.Utils` for its `mixin` function + +### `test/common/modules/testapp_manager.js` + +- uses `ably.Realtime.Platform.BufferUtils` + +### `test/common/modules/testapp_module.js` + +None + +### `test/common/modules/shared_helper.js` + +- `var utils = clientModule.Ably.Realtime.Utils;` +- `var platform = clientModule.Ably.Realtime.Platform;` + - uses `platform.Config.nextTick()` +- uses `var BufferUtils = platform.BufferUtils;` +- extracts `availableTransports` and `bestTransport` by reading `Ably.Realtime.ConnectionManager.supportedTransports(Ably.Realtime._transports)` + - `availableTransports` used by `testOnAllTransports` +- `simulateDroppedConnection()` does the following: + - `realtime.connection.connectionManager.requestState({ state: 'disconnected' })` + - `realtime.connection.connectionManager.disconnectAllTransports();` +- `becomeSuspended()` does the following: + - `realtime.connection.connectionManager.disconnectAllTransports();` + - `realtime.connection.connectionManager.notifyState({ state: 'suspended' });` +- `callbackOnClose()`: + - checks `realtime.connection.connectionManager.activeProtocol` + - does `realtime.connection.connectionManager.activeProtocol.transport.on('disposed',` +- `isComet(transport)` and `isWebsocket(transport)` check for `"comet"` and `"wss:/"` which I guess is something internal? + +### `test/support/junit_directory_path.js` + +N/A + +### `test/support/mocha_junit_reporter/index.js` + +N/A + +### `test/support/mocha_junit_reporter/shims/fs.js` + +N/A + +### `test/support/mocha_junit_reporter/build/node.js` + +Generated + +### `test/support/mocha_junit_reporter/build/browser.js` + +Generated + +### `test/support/root_hooks.js` + +None + +### `test/support/environment.vars.js` + +None + +### `test/support/runPlaywrightTests.js` + +N/A + +### `test/support/test_helper.js` + +N/A + +### `test/support/browser_file_list.js` + +N/A + +### `test/support/modules_helper.js` + +N/A + +### `test/support/browser_setup.js` + +N/A + +### `test/support/mocha_reporter.js` + +N/A + +### `test/support/playwrightSetup.js` + +N/A + +### `test/rest/bufferutils.test.js` + +This file is a unit test of `Ably.Realtime.Platform.BufferUtils`; something we wouldn’t include in a unified test suite. + +### `test/rest/presence.test.js` + +- `var BufferUtils = Ably.Realtime.Platform.BufferUtils;` + - I’m going to stop mentioning the use of BufferUtils as a test util now; the pattern is clear and not hard to fix. + +### `test/rest/fallbacks.test.js` + +- checks `rest._currentFallback.{host, validUntil}` to check that the working fallback has been stored correctly +- modifies `rest._currentFallback.validUntil` to check library correctly forgets stored fallback + +### `test/rest/api.test.js` + +None + +### `test/rest/stats.test.js` + +None + +### `test/rest/batch.test.js` + +None + +### `test/rest/time.test.js` + +None + +### `test/rest/auth.test.js` + +- ditto will stop mentioning usage of `Utils` for stuff that will be pretty easy to replace + +None + +### `test/rest/http.test.js` + +- accesses `Ably.Rest.Platform.Defaults` to check its `version` is being used to populate `Ably-Agent` +- spies on `rest.http.do` to make assertions about request headers +- replaces `rest.http.do` to simulate a 204 response + +### `test/rest/capability.test.js` + +None + +### `test/rest/push.test.js` + +None + +### `test/rest/message.test.js` + +- spies on `channel._publish` to verify that client does / doesn’t add a `clientId` + - ditto to check that idempotent REST publishing generates message IDs + - ditto to check `params` +- overrides `Ably.Rest._Http.doUri` to fake a publish error + +### `test/rest/init.test.js` + +- accesses various properties of `rest.options` to check the effect of passing various things to the constructor + +### `test/rest/history.test.js` + +None + +### `test/rest/defaults.test.js` + +This appears to be a unit test of the `Defaults` class’s `normaliseOptions()`, `getHosts()`, and `getPort()` methods. But I imagine it’s actually providing the test suite’s coverage of a bunch of spec points which aren’t written in terms of this API. + +### `test/rest/status.test.js` + +None + +### `test/rest/request.test.js` + +- overrides `rest.http.do()` to check `X-Ably-Version` request header + +### `test/package/browser/template/server/resources/runTest.js` + +N/A + +### `test/package/browser/template/playwright-lib.config.js` + +N/A diff --git a/grunt/esbuild/build.js b/grunt/esbuild/build.js index 16018560d..30d549c58 100644 --- a/grunt/esbuild/build.js +++ b/grunt/esbuild/build.js @@ -35,7 +35,7 @@ const modularConfig = { entryPoints: ['src/platform/web/modular.ts'], outfile: 'build/modular/index.mjs', format: 'esm', - plugins: [stripLogsPlugin], + plugins: [], }; const nodeConfig = { diff --git a/grunt/esbuild/strip-logs.js b/grunt/esbuild/strip-logs.js index 6fc755513..c0826a167 100644 --- a/grunt/esbuild/strip-logs.js +++ b/grunt/esbuild/strip-logs.js @@ -38,32 +38,32 @@ const stripLogsPlugin = { babel.types.isIdentifier(path.node.callee.object, { name: 'Logger' }) ) { if (babel.types.isIdentifier(path.node.callee.property, { name: 'logAction' })) { - const firstArgument = path.node.arguments[0]; + const secondArgument = path.node.arguments[1]; if ( - babel.types.isMemberExpression(firstArgument) && - babel.types.isIdentifier(firstArgument.object, { name: 'Logger' }) && - firstArgument.property.name.startsWith('LOG_') + babel.types.isMemberExpression(secondArgument) && + babel.types.isIdentifier(secondArgument.object, { name: 'Logger' }) && + secondArgument.property.name.startsWith('LOG_') ) { - if (firstArgument.property.name === 'LOG_ERROR') { - // `path` is a call to `Logger.logAction(Logger.LOG_ERROR, ...)`; preserve it. + if (secondArgument.property.name === 'LOG_ERROR') { + // `path` is a call to `Logger.logAction(arg0, Logger.LOG_ERROR, ...)`; preserve it. foundErrorLog = true; } else { - // `path` is a call to `Logger.logAction(Logger.LOG_*, ...) for some other log level; strip it. + // `path` is a call to `Logger.logAction(arg0, Logger.LOG_*, ...) for some other log level; strip it. foundLogToStrip = true; path.remove(); } } else { - // `path` is a call to `Logger.logAction(...)` with some argument other than a `Logger.LOG_*` expression; raise an error because we can’t determine whether to strip it. + // `path` is a call to `Logger.logAction(arg0, ...)` with some argument other than a `Logger.LOG_*` expression; raise an error because we can’t determine whether to strip it. errors.push({ location: { file: args.path, - column: firstArgument.loc.start.column, - line: firstArgument.loc.start.line, - lineText: lines[firstArgument.loc.start.line - 1], + column: secondArgument.loc.start.column, + line: secondArgument.loc.start.line, + lineText: lines[secondArgument.loc.start.line - 1], }, - text: `First argument passed to Logger.logAction() must be Logger.LOG_*, got \`${ - babel.generator.default(firstArgument).code + text: `Second argument passed to Logger.logAction() must be Logger.LOG_*, got \`${ + babel.generator.default(secondArgument).code }\``, }); } diff --git a/only-passing-logs.txt b/only-passing-logs.txt new file mode 100644 index 000000000..af359fc7b --- /dev/null +++ b/only-passing-logs.txt @@ -0,0 +1,113 @@ +favicon.ico:1 + + + Failed to load resource: the server responded with a status of 404 (Not Found) +interception_proxy_client.js:20 connected to interception proxy +interception_proxy_client.js:56 interception proxy sending startInterception request Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"18262122424150573","result":{}} +interception_proxy_client.js:34 startInterception completed +testapp_module.js:38 Test App _tmp_Jb47Yw in environment sandbox has been set up +root_hooks.js:31 START TEST: browser/modular RealtimePresence BaseRealtime with RealtimePresence offers realtime presence functionality +modular.test.js:607 LAWRENCE: begin waiting for presence subscribe +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"d2e3f2ba-de34-4b24-82ea-c20e34d3bc8a","method":"transformInterceptedMessage","params":{"id":"36d684a2-6bb3-46e2-bc59-2ba9a8cdfe45","connectionID":"8ca58a54-08d2-4ad6-af1c-4f6c41294895","type":"text","data":"{\"action\":4,\"connectionId\":\"y4QUaX-lX2\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dUVsT6wBbzfT!y4QUaX-lX2ATeEsy_osN9J-4166\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.fd57.1.us-east-1-A.i-01fe288a84a67f672.e7dUVsT6wBbzfT\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 36d684a2-6bb3-46e2-bc59-2ba9a8cdfe45 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 36d684a2-6bb3-46e2-bc59-2ba9a8cdfe45 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=CONNECTED; connectionId=y4QUaX-lX2]; connectionId = undefined +modular.test.js:580 rxChannel: Ably: Protocol.send(): sending msg; [ProtocolMessage; action=ATTACH; channel=channel] +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"3bdc930a-b198-4a7a-a95b-c17dcdc241fb","method":"transformInterceptedMessage","params":{"id":"c8852ccb-e0dc-4852-a0b2-839c2df6709b","connectionID":"8ca58a54-08d2-4ad6-af1c-4f6c41294895","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message c8852ccb-e0dc-4852-a0b2-839c2df6709b unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message c8852ccb-e0dc-4852-a0b2-839c2df6709b Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"601f4f2c-82b9-4474-b1f3-4fbf286abc9b","method":"transformInterceptedMessage","params":{"id":"86f1b10b-86b8-4a93-9207-0ede99770f0c","connectionID":"4e269d0f-837d-4701-be8f-bf608594a4db","type":"text","data":"{\"action\":4,\"connectionId\":\"kyPOsHUTFq\",\"connectionDetails\":{\"clientId\":\"6162797107938209\",\"connectionKey\":\"e7dUVsT6wBbzfT!kyPOsHUTFqAT74zhxpP6QN-4169\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.fd57.1.us-east-1-A.i-01fe288a84a67f672.e7dUVsT6wBbzfT\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 86f1b10b-86b8-4a93-9207-0ede99770f0c unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 86f1b10b-86b8-4a93-9207-0ede99770f0c Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +modular.test.js:592 txChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=CONNECTED; connectionId=kyPOsHUTFq]; connectionId = undefined +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"fdb11a81-3e11-4152-a98b-0ddeebe83533","method":"transformInterceptedMessage","params":{"id":"f90bf814-c10e-4fbe-9b2b-61b166fea9f1","connectionID":"8ca58a54-08d2-4ad6-af1c-4f6c41294895","type":"text","data":"{\"action\":11,\"flags\":983105,\"channel\":\"channel\",\"channelSerial\":\"e7d4ExGGQBbzfj18717820@1715954182939-0\"}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message f90bf814-c10e-4fbe-9b2b-61b166fea9f1 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message f90bf814-c10e-4fbe-9b2b-61b166fea9f1 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ATTACHED; channel=channel; channelSerial=e7d4ExGGQBbzfj18717820@1715954182939-0; flags=HAS_PRESENCE,PRESENCE,PUBLISH,SUBSCRIBE,PRESENCE_SUBSCRIBE]; connectionId = y4QUaX-lX2 +modular.test.js:609 LAWRENCE: end waiting for presence subscribe +modular.test.js:610 LAWRENCE: begin waiting for presence enter +modular.test.js:592 txChannel: Ably: Protocol.send(): sending msg; [ProtocolMessage; action=ATTACH; channel=channel] +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"eadc8a07-a716-4d3d-be49-3da1fe9a1b7b","method":"transformInterceptedMessage","params":{"id":"c9ff71a5-a32e-4150-acf1-a8ab608a2d5a","connectionID":"4e269d0f-837d-4701-be8f-bf608594a4db","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message c9ff71a5-a32e-4150-acf1-a8ab608a2d5a unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message c9ff71a5-a32e-4150-acf1-a8ab608a2d5a Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"89d4078a-bbef-4ac2-9659-3c633113a646","method":"transformInterceptedMessage","params":{"id":"bc7fdf4f-c3d8-4af1-8a6e-00d2ca16faaf","connectionID":"8ca58a54-08d2-4ad6-af1c-4f6c41294895","type":"text","data":"{\"action\":16,\"channel\":\"channel\",\"channelSerial\":\"e7dUVsT6wBbzfT69031194:\",\"presence\":[],\"count\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message bc7fdf4f-c3d8-4af1-8a6e-00d2ca16faaf unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message bc7fdf4f-c3d8-4af1-8a6e-00d2ca16faaf Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=SYNC; channel=channel; channelSerial=e7dUVsT6wBbzfT69031194:; count=0; presence=[ ]]; connectionId = y4QUaX-lX2 +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"3667cd33-e3a1-41e4-bc87-8f1b054cefb5","method":"transformInterceptedMessage","params":{"id":"9dae6fe9-ab4a-4622-baa9-b82746475a75","connectionID":"4e269d0f-837d-4701-be8f-bf608594a4db","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7d4ExGGQBbzfj18717820@1715954182939-0\"}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 9dae6fe9-ab4a-4622-baa9-b82746475a75 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 9dae6fe9-ab4a-4622-baa9-b82746475a75 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +modular.test.js:592 txChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ATTACHED; channel=channel; channelSerial=e7d4ExGGQBbzfj18717820@1715954182939-0; flags=PRESENCE,PUBLISH,SUBSCRIBE,PRESENCE_SUBSCRIBE]; connectionId = kyPOsHUTFq +modular.test.js:592 txChannel: Ably: Protocol.send(): sending msg; [ProtocolMessage; action=PRESENCE; channel=channel; msgSerial=0; presence=[ [PresenceMessage; action=enter] ]] +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"421b72a5-440d-427b-99ff-313894a9b6a6","method":"transformInterceptedMessage","params":{"id":"d717b092-68f2-44b7-84c9-683d816cb8d6","connectionID":"4e269d0f-837d-4701-be8f-bf608594a4db","type":"text","data":"{\"action\":14,\"channel\":\"channel\",\"presence\":[{\"action\":2}],\"msgSerial\":0}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d717b092-68f2-44b7-84c9-683d816cb8d6 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d717b092-68f2-44b7-84c9-683d816cb8d6 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"55a65e27-e0af-4606-926c-70af966e8be2","method":"transformInterceptedMessage","params":{"id":"3e5e942b-94e8-45ae-a931-f3ac00fa3cdf","connectionID":"8ca58a54-08d2-4ad6-af1c-4f6c41294895","type":"text","data":"{\"action\":14,\"id\":\"kyPOsHUTFq:0\",\"connectionId\":\"kyPOsHUTFq\",\"channel\":\"channel\",\"channelSerial\":\"e7d4ExGGQBbzfj18717820@1715954183200-0\",\"timestamp\":1715954183200,\"presence\":[{\"id\":\"kyPOsHUTFq:0:0\",\"clientId\":\"6162797107938209\",\"connectionId\":\"kyPOsHUTFq\",\"timestamp\":1715954183200,\"action\":2}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 3e5e942b-94e8-45ae-a931-f3ac00fa3cdf unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 3e5e942b-94e8-45ae-a931-f3ac00fa3cdf Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"71132588-4a6f-4a69-80c9-f005d67a1e89","method":"transformInterceptedMessage","params":{"id":"96b31566-71a4-4c9b-8de1-4309f7732fe8","connectionID":"4e269d0f-837d-4701-be8f-bf608594a4db","type":"text","data":"{\"action\":14,\"id\":\"kyPOsHUTFq:0\",\"connectionId\":\"kyPOsHUTFq\",\"channel\":\"channel\",\"channelSerial\":\"e7d4ExGGQBbzfj18717820@1715954183200-0\",\"timestamp\":1715954183200,\"presence\":[{\"id\":\"kyPOsHUTFq:0:0\",\"clientId\":\"6162797107938209\",\"connectionId\":\"kyPOsHUTFq\",\"timestamp\":1715954183200,\"action\":2}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 96b31566-71a4-4c9b-8de1-4309f7732fe8 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 96b31566-71a4-4c9b-8de1-4309f7732fe8 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"6906192b-9da8-477e-8f0c-00b9f7656e3c","method":"transformInterceptedMessage","params":{"id":"c878a150-847b-4f53-88d0-a8cce6a7502d","connectionID":"4e269d0f-837d-4701-be8f-bf608594a4db","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message c878a150-847b-4f53-88d0-a8cce6a7502d unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message c878a150-847b-4f53-88d0-a8cce6a7502d Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=PRESENCE; id=kyPOsHUTFq:0; channel=channel; channelSerial=e7d4ExGGQBbzfj18717820@1715954183200-0; connectionId=kyPOsHUTFq; timestamp=1715954183200; presence=[ [PresenceMessage; action=enter; id=kyPOsHUTFq:0:0; timestamp=1715954183200; clientId=6162797107938209; connectionId=kyPOsHUTFq] ]]; connectionId = y4QUaX-lX2 +modular.test.js:592 txChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=PRESENCE; id=kyPOsHUTFq:0; channel=channel; channelSerial=e7d4ExGGQBbzfj18717820@1715954183200-0; connectionId=kyPOsHUTFq; timestamp=1715954183200; presence=[ [PresenceMessage; action=enter; id=kyPOsHUTFq:0:0; timestamp=1715954183200; clientId=6162797107938209; connectionId=kyPOsHUTFq] ]]; connectionId = kyPOsHUTFq +modular.test.js:592 txChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ACK; count=1; msgSerial=0]; connectionId = kyPOsHUTFq +modular.test.js:612 LAWRENCE: end waiting for presence enter +modular.test.js:614 LAWRENCE: begin waiting for rxPresenceMessagePromise +modular.test.js:616 LAWRENCE: end waiting for rxPresenceMessagePromise +root_hooks.js:27 END TEST: browser/modular RealtimePresence BaseRealtime with RealtimePresence offers realtime presence functionality +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"b4169a1b-bfca-4a07-aa21-9c8fcceea4ef","method":"transformInterceptedMessage","params":{"id":"4d549b43-e115-4825-9f80-499b05edb9c0","connectionID":"8ca58a54-08d2-4ad6-af1c-4f6c41294895","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_QBQgqg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 4d549b43-e115-4825-9f80-499b05edb9c0 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 4d549b43-e115-4825-9f80-499b05edb9c0 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"39ab93b4-ed1b-4a4c-b29b-bd85f012dc43","method":"transformInterceptedMessage","params":{"id":"409bfe83-ae10-4407-a6b8-024bdffe19e7","connectionID":"4e269d0f-837d-4701-be8f-bf608594a4db","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_QBQgqg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 409bfe83-ae10-4407-a6b8-024bdffe19e7 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 409bfe83-ae10-4407-a6b8-024bdffe19e7 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=DISCONNECTED; error=[_ErrorInfo: Account _tmp_QBQgqg disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ]]; connectionId = y4QUaX-lX2 +modular.test.js:592 txChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=DISCONNECTED; error=[_ErrorInfo: Account _tmp_QBQgqg disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ]]; connectionId = kyPOsHUTFq +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"29c27579-5667-4de4-88e5-e8f095b490e2","method":"transformInterceptedMessage","params":{"id":"0bcb9b64-08fb-48c6-ac77-b3972a99e405","connectionID":"2b1d5517-a0d7-49eb-b199-b557b1db2a96","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_QBQgqg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954184661}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 0bcb9b64-08fb-48c6-ac77-b3972a99e405 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 0bcb9b64-08fb-48c6-ac77-b3972a99e405 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ERROR; timestamp=1715954184661; error=[_ErrorInfo: Account _tmp_QBQgqg disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300]]; connectionId = y4QUaX-lX2 +modular.test.js:580 rxChannel: Ably: Connection state: failed; reason: [_ErrorInfo: Account _tmp_QBQgqg disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] +modular.test.js:580 rxChannel: Ably: Channel state for channel "channel": failed; reason: [_ErrorInfo: Account _tmp_QBQgqg disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"31883944-1405-4076-bb35-f6b3b6643b8d","method":"transformInterceptedMessage","params":{"id":"58749a37-e260-4b86-9dd3-ef98b08940b7","connectionID":"9464a56e-f613-4a7a-b053-8fbf0f6595bb","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_QBQgqg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954184670}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 58749a37-e260-4b86-9dd3-ef98b08940b7 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 58749a37-e260-4b86-9dd3-ef98b08940b7 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +modular.test.js:592 txChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ERROR; timestamp=1715954184670; error=[_ErrorInfo: Account _tmp_QBQgqg disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300]]; connectionId = kyPOsHUTFq +modular.test.js:592 txChannel: Ably: Connection state: failed; reason: [_ErrorInfo: Account _tmp_QBQgqg disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] +modular.test.js:592 txChannel: Ably: Channel state for channel "channel": failed; reason: [_ErrorInfo: Account _tmp_QBQgqg disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] +testapp_module.js:76 Test App _tmp_Jb47Yw has been torn down +interception_proxy_client.js:73 interception proxy client disconnected \ No newline at end of file diff --git a/package.json b/package.json index 8641bf3dc..6661efecd 100644 --- a/package.json +++ b/package.json @@ -132,8 +132,10 @@ "test:node:skip-build": "mocha", "test:webserver": "grunt test:webserver", "test:playwright": "node test/support/runPlaywrightTests.js", + "test:playwright:open-browser": "node test/support/openPlaywrightBrowser.js", "test:react": "vitest run", "test:package": "grunt test:package", + "test:proxy": "npm run build && esr test/interception-proxy/server.ts", "concat": "grunt concat", "build": "grunt build:all && npm run build:react", "build:node": "grunt build:node", diff --git a/scripts/moduleReport.ts b/scripts/moduleReport.ts index c933800af..6b0349192 100644 --- a/scripts/moduleReport.ts +++ b/scripts/moduleReport.ts @@ -6,7 +6,7 @@ import { gzip } from 'zlib'; import Table from 'cli-table'; // The maximum size we allow for a minimal useful Realtime bundle (i.e. one that can subscribe to a channel) -const minimalUsefulRealtimeBundleSizeThresholdsKiB = { raw: 95, gzip: 29 }; +const minimalUsefulRealtimeBundleSizeThresholdsKiB = { raw: 96, gzip: 29 }; const baseClientNames = ['BaseRest', 'BaseRealtime']; diff --git a/src/common/lib/client/auth.ts b/src/common/lib/client/auth.ts index 80b4ed253..67e7704f2 100644 --- a/src/common/lib/client/auth.ts +++ b/src/common/lib/client/auth.ts @@ -72,18 +72,18 @@ function c14n(capability?: string | Record>) { return JSON.stringify(c14nCapability); } -function logAndValidateTokenAuthMethod(authOptions: AuthOptions) { +function logAndValidateTokenAuthMethod(authOptions: AuthOptions, logger: Logger) { if (authOptions.authCallback) { - Logger.logAction(Logger.LOG_MINOR, 'Auth()', 'using token auth with authCallback'); + Logger.logAction(logger, Logger.LOG_MINOR, 'Auth()', 'using token auth with authCallback'); } else if (authOptions.authUrl) { - Logger.logAction(Logger.LOG_MINOR, 'Auth()', 'using token auth with authUrl'); + Logger.logAction(logger, Logger.LOG_MINOR, 'Auth()', 'using token auth with authUrl'); } else if (authOptions.key) { - Logger.logAction(Logger.LOG_MINOR, 'Auth()', 'using token auth with client-side signing'); + Logger.logAction(logger, Logger.LOG_MINOR, 'Auth()', 'using token auth with client-side signing'); } else if (authOptions.tokenDetails) { - Logger.logAction(Logger.LOG_MINOR, 'Auth()', 'using token auth with supplied token only'); + Logger.logAction(logger, Logger.LOG_MINOR, 'Auth()', 'using token auth with supplied token only'); } else { const msg = 'authOptions must include valid authentication parameters'; - Logger.logAction(Logger.LOG_ERROR, 'Auth()', msg); + Logger.logAction(logger, Logger.LOG_ERROR, 'Auth()', msg); throw new Error(msg); } } @@ -144,26 +144,31 @@ class Auth { /* Token auth */ if (noWayToRenew(options)) { Logger.logAction( + this.logger, Logger.LOG_ERROR, 'Auth()', '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', ); } this._saveTokenOptions(options.defaultTokenParams as API.TokenDetails, options); - logAndValidateTokenAuthMethod(this.authOptions); + logAndValidateTokenAuthMethod(this.authOptions, this.logger); } else { /* Basic auth */ if (!options.key) { const msg = 'No authentication options provided; need one of: key, authUrl, or authCallback (or for testing only, token or tokenDetails)'; - Logger.logAction(Logger.LOG_ERROR, 'Auth()', msg); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth()', msg); throw new ErrorInfo(msg, 40160, 401); } - Logger.logAction(Logger.LOG_MINOR, 'Auth()', 'anonymous, using basic auth'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth()', 'anonymous, using basic auth'); this._saveBasicOptions(options); } } + get logger(): Logger { + return this.client.logger; + } + /** * Instructs the library to get a token immediately and ensures Token Auth * is used for all future requests, storing the tokenParams and authOptions @@ -303,7 +308,7 @@ class Auth { * not the passed in ones. */ this._saveTokenOptions(tokenParams, authOptions); - logAndValidateTokenAuthMethod(this.authOptions); + logAndValidateTokenAuthMethod(this.authOptions, this.logger); try { return this._ensureValidAuthCredentials(true); @@ -403,10 +408,10 @@ class Auth { client = this.client; if (resolvedAuthOptions.authCallback) { - Logger.logAction(Logger.LOG_MINOR, 'Auth.requestToken()', 'using token auth with authCallback'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.requestToken()', 'using token auth with authCallback'); tokenRequestCallback = resolvedAuthOptions.authCallback; } else if (resolvedAuthOptions.authUrl) { - Logger.logAction(Logger.LOG_MINOR, 'Auth.requestToken()', 'using token auth with authUrl'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.requestToken()', 'using token auth with authUrl'); tokenRequestCallback = (params, cb) => { const authHeaders = Utils.mixin( { accept: 'application/json, text/plain' }, @@ -429,12 +434,13 @@ class Auth { } /* RSA8c2 */ const authParams = Utils.mixin({}, resolvedAuthOptions.authParams || {}, params) as RequestParams; - const authUrlRequestCallback = function (result: RequestResult) { + const authUrlRequestCallback = (result: RequestResult) => { let body = (result.body ?? null) as string | Bufferlike | API.TokenDetails | API.TokenRequest | null; let contentType: string | null = null; if (result.error) { Logger.logAction( + this.logger, Logger.LOG_MICRO, 'Auth.requestToken().tokenRequestCallback', 'Received Error: ' + Utils.inspectError(result.error), @@ -448,6 +454,7 @@ class Auth { contentType = contentTypeHeaderOrHeaders; } Logger.logAction( + this.logger, Logger.LOG_MICRO, 'Auth.requestToken().tokenRequestCallback', 'Received; content-type: ' + contentType + '; body: ' + Utils.inspectBody(body), @@ -503,6 +510,7 @@ class Auth { cb(null, body as Exclude, contentType); }; Logger.logAction( + this.logger, Logger.LOG_MICRO, 'Auth.requestToken().tokenRequestCallback', 'Requesting token from ' + @@ -541,7 +549,12 @@ class Auth { } }; } else if (resolvedAuthOptions.key) { - Logger.logAction(Logger.LOG_MINOR, 'Auth.requestToken()', 'using token auth with client-side signing'); + Logger.logAction( + this.logger, + Logger.LOG_MINOR, + 'Auth.requestToken()', + 'using token auth with client-side signing', + ); tokenRequestCallback = (params, cb) => { Utils.whenPromiseSettles(this.createTokenRequest(params, resolvedAuthOptions), (err, result) => cb(err as string | ErrorInfo | null, result ?? null), @@ -551,6 +564,7 @@ class Auth { const msg = 'Need a new token, but authOptions does not include any way to request one (no authUrl, authCallback, or key)'; Logger.logAction( + this.logger, Logger.LOG_ERROR, 'Auth()', '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', @@ -577,6 +591,7 @@ class Auth { const requestHeaders = Defaults.defaultPostHeaders(this.client.options); if (resolvedAuthOptions.requestHeaders) Utils.mixin(requestHeaders, resolvedAuthOptions.requestHeaders); Logger.logAction( + this.logger, Logger.LOG_MICRO, 'Auth.requestToken().requestToken', 'Sending POST to ' + path + '; Token params: ' + JSON.stringify(signedTokenParams), @@ -593,19 +608,20 @@ class Auth { return new Promise((resolve, reject) => { let tokenRequestCallbackTimeoutExpired = false, timeoutLength = this.client.options.timeouts.realtimeRequestTimeout, - tokenRequestCallbackTimeout = setTimeout(function () { + tokenRequestCallbackTimeout = setTimeout(() => { tokenRequestCallbackTimeoutExpired = true; const msg = 'Token request callback timed out after ' + timeoutLength / 1000 + ' seconds'; - Logger.logAction(Logger.LOG_ERROR, 'Auth.requestToken()', msg); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth.requestToken()', msg); reject(new ErrorInfo(msg, 40170, 401)); }, timeoutLength); - tokenRequestCallback!(resolvedTokenParams, function (err, tokenRequestOrDetails, contentType) { + tokenRequestCallback!(resolvedTokenParams, (err, tokenRequestOrDetails, contentType) => { if (tokenRequestCallbackTimeoutExpired) return; clearTimeout(tokenRequestCallbackTimeout); if (err) { Logger.logAction( + this.logger, Logger.LOG_ERROR, 'Auth.requestToken()', 'token request signing call returned error; err = ' + Utils.inspectError(err), @@ -648,7 +664,7 @@ class Auth { const msg = 'Expected token request callback to call back with a token string or token request/details object, but got a ' + typeof tokenRequestOrDetails; - Logger.logAction(Logger.LOG_ERROR, 'Auth.requestToken()', msg); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth.requestToken()', msg); reject(new ErrorInfo(msg, 40170, 401)); return; } @@ -671,14 +687,15 @@ class Auth { if (!('keyName' in tokenRequestOrDetails)) { const msg = 'Expected token request callback to call back with a token string, token request object, or token details object'; - Logger.logAction(Logger.LOG_ERROR, 'Auth.requestToken()', msg); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth.requestToken()', msg); reject(new ErrorInfo(msg, 40170, 401)); return; } /* it's a token request, so make the request */ - tokenRequest(tokenRequestOrDetails, function (err, tokenResponse, unpacked) { + tokenRequest(tokenRequestOrDetails, (err, tokenResponse, unpacked) => { if (err) { Logger.logAction( + this.logger, Logger.LOG_ERROR, 'Auth.requestToken()', 'token request API call returned error; err = ' + Utils.inspectError(err), @@ -687,7 +704,7 @@ class Auth { return; } if (!unpacked) tokenResponse = JSON.parse(tokenResponse as string); - Logger.logAction(Logger.LOG_MINOR, 'Auth.getToken()', 'token received'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.getToken()', 'token received'); resolve(tokenResponse as API.TokenDetails); }); }); @@ -779,7 +796,7 @@ class Auth { * simply for testing purposes. */ request.mac = request.mac || hmac(signText, keySecret); - Logger.logAction(Logger.LOG_MINOR, 'Auth.getTokenRequest()', 'generated signed request'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.getTokenRequest()', 'generated signed request'); return request as API.TokenRequest; } @@ -897,16 +914,21 @@ class Auth { * automatically remove expired tokens. Else just use the cached token. If it is * expired Ably will tell us and we'll discard it then. */ if (!this.isTimeOffsetSet() || !token.expires || token.expires >= this.getTimestampUsingOffset()) { - Logger.logAction(Logger.LOG_MINOR, 'Auth.getToken()', 'using cached token; expires = ' + token.expires); + Logger.logAction( + this.logger, + Logger.LOG_MINOR, + 'Auth.getToken()', + 'using cached token; expires = ' + token.expires, + ); return token; } /* expired, so remove and fallthrough to getting a new one */ - Logger.logAction(Logger.LOG_MINOR, 'Auth.getToken()', 'deleting expired token'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Auth.getToken()', 'deleting expired token'); this.tokenDetails = null; } const promise = ( - this.waitingForTokenRequest || (this.waitingForTokenRequest = Multicaster.create()) + this.waitingForTokenRequest || (this.waitingForTokenRequest = Multicaster.create(this.logger)) ).createPromise(); if (this.currentTokenRequestId !== null && !forceSupersede) { return promise; @@ -925,6 +947,7 @@ class Auth { if ((this.currentTokenRequestId as number) > tokenRequestId) { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'Auth._ensureValidAuthCredentials()', 'Discarding token request response; overtaken by newer one', @@ -967,7 +990,7 @@ class Auth { * recognise mismatch and return an error */ const msg = 'Unexpected clientId mismatch: client has ' + this.clientId + ', requested ' + clientId; const err = new ErrorInfo(msg, 40102, 401); - Logger.logAction(Logger.LOG_ERROR, 'Auth._uncheckedSetClientId()', msg); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'Auth._uncheckedSetClientId()', msg); return err; } else { /* RSA7a4: if options.clientId is provided and is not diff --git a/src/common/lib/client/baseclient.ts b/src/common/lib/client/baseclient.ts index f4351902a..98a4720f0 100644 --- a/src/common/lib/client/baseclient.ts +++ b/src/common/lib/client/baseclient.ts @@ -44,26 +44,29 @@ class BaseClient { // Extra HTTP request implementations available to this client, in addition to those in web’s Http.bundledRequestImplementations readonly _additionalHTTPRequestImplementations: HTTPRequestImplementations | null; private readonly __FilteredSubscriptions: typeof FilteredSubscriptions | null; + readonly logger: Logger; constructor(options: ClientOptions) { this._additionalHTTPRequestImplementations = options.plugins ?? null; - Logger.setLog(options.logLevel, options.logHandler); + this.logger = new Logger(); + this.logger.setLog(options.logLevel, options.logHandler); Logger.logAction( + this.logger, Logger.LOG_MICRO, 'BaseClient()', 'initialized with clientOptions ' + Platform.Config.inspect(options), ); this._MsgPack = options.plugins?.MsgPack ?? null; - const normalOptions = (this.options = Defaults.normaliseOptions(options, this._MsgPack)); + const normalOptions = (this.options = Defaults.normaliseOptions(options, this._MsgPack, this.logger)); /* process options */ if (normalOptions.key) { const keyMatch = normalOptions.key.match(/^([^:\s]+):([^:.\s]+)$/); if (!keyMatch) { const msg = 'invalid key parameter'; - Logger.logAction(Logger.LOG_ERROR, 'BaseClient()', msg); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'BaseClient()', msg); throw new ErrorInfo(msg, 40400, 404); } normalOptions.keyName = keyMatch[1]; @@ -81,7 +84,7 @@ class BaseClient { ); } - Logger.logAction(Logger.LOG_MINOR, 'BaseClient()', 'started; version = ' + Defaults.version); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'BaseClient()', 'started; version = ' + Defaults.version); this._currentFallback = null; @@ -150,7 +153,7 @@ class BaseClient { } setLog(logOptions: LoggerOptions): void { - Logger.setLog(logOptions.level, logOptions.handler); + this.logger.setLog(logOptions.level, logOptions.handler); } static Platform = Platform; diff --git a/src/common/lib/client/baserealtime.ts b/src/common/lib/client/baserealtime.ts index 6fe106165..f9a57ac17 100644 --- a/src/common/lib/client/baserealtime.ts +++ b/src/common/lib/client/baserealtime.ts @@ -34,7 +34,7 @@ class BaseRealtime extends BaseClient { */ constructor(options?: ClientOptions | string) { super(Defaults.objectifyOptions(options, false, 'BaseRealtime')); - Logger.logAction(Logger.LOG_MINOR, 'Realtime()', ''); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Realtime()', ''); // currently we cannot support using Ably.Realtime instances in Vercel Edge runtime. // this error can be removed after fixing https://github.com/ably/ably-js/issues/1731, @@ -78,12 +78,12 @@ class BaseRealtime extends BaseClient { } connect(): void { - Logger.logAction(Logger.LOG_MINOR, 'Realtime.connect()', ''); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Realtime.connect()', ''); this.connection.connect(); } close(): void { - Logger.logAction(Logger.LOG_MINOR, 'Realtime.close()', ''); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Realtime.close()', ''); this.connection.close(); } } @@ -93,7 +93,7 @@ class Channels extends EventEmitter { all: Record; constructor(realtime: BaseRealtime) { - super(); + super(realtime.logger); this.realtime = realtime; this.all = Object.create(null); realtime.connection.connectionManager.on('transport.active', () => { @@ -125,6 +125,7 @@ class Channels extends EventEmitter { const channelName = msg.channel; if (channelName === undefined) { Logger.logAction( + this.logger, Logger.LOG_ERROR, 'Channels.processChannelMessage()', 'received event unspecified channel, action = ' + msg.action, @@ -134,6 +135,7 @@ class Channels extends EventEmitter { const channel = this.all[channelName]; if (!channel) { Logger.logAction( + this.logger, Logger.LOG_ERROR, 'Channels.processChannelMessage()', 'received event for non-existent channel: ' + channelName, diff --git a/src/common/lib/client/connection.ts b/src/common/lib/client/connection.ts index f8f62ad08..5b7013f28 100644 --- a/src/common/lib/client/connection.ts +++ b/src/common/lib/client/connection.ts @@ -16,7 +16,7 @@ class Connection extends EventEmitter { errorReason: ErrorInfo | null; constructor(ably: BaseRealtime, options: NormalisedClientOptions) { - super(); + super(ably.logger); this.ably = ably; this.connectionManager = new ConnectionManager(ably, options); this.state = this.connectionManager.state.state; @@ -42,24 +42,24 @@ class Connection extends EventEmitter { }) as any; connect(): void { - Logger.logAction(Logger.LOG_MINOR, 'Connection.connect()', ''); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Connection.connect()', ''); this.connectionManager.requestState({ state: 'connecting' }); } async ping(): Promise { - Logger.logAction(Logger.LOG_MINOR, 'Connection.ping()', ''); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Connection.ping()', ''); return new Promise((resolve, reject) => { this.connectionManager.ping(null, (err: unknown, result: number) => (err ? reject(err) : resolve(result))); }); } close(): void { - Logger.logAction(Logger.LOG_MINOR, 'Connection.close()', 'connectionKey = ' + this.key); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Connection.close()', 'connectionKey = ' + this.key); this.connectionManager.requestState({ state: 'closing' }); } get recoveryKey(): string | null { - Logger.deprecationWarning( + this.logger.deprecationWarning( '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.', ); return this.createRecoveryKey(); diff --git a/src/common/lib/client/paginatedresource.ts b/src/common/lib/client/paginatedresource.ts index 8c2353009..5602c0dc1 100644 --- a/src/common/lib/client/paginatedresource.ts +++ b/src/common/lib/client/paginatedresource.ts @@ -59,6 +59,10 @@ class PaginatedResource { this.useHttpPaginatedResponse = useHttpPaginatedResponse || false; } + get logger(): Logger { + return this.client.logger; + } + async get(params: Record): Promise> { const result = await Resource.get(this.client, this.path, this.headers, params, this.envelope, false); return this.handlePage(result); @@ -87,6 +91,7 @@ class PaginatedResource { async handlePage(result: ResourceResult): Promise> { if (result.err && returnErrOnly(result.err, result.body, this.useHttpPaginatedResponse)) { Logger.logAction( + this.logger, Logger.LOG_ERROR, 'PaginatedResource.handlePage()', 'Unexpected error getting resource: err = ' + Utils.inspectError(result.err), diff --git a/src/common/lib/client/realtimechannel.ts b/src/common/lib/client/realtimechannel.ts index 637c1c508..e0a561492 100644 --- a/src/common/lib/client/realtimechannel.ts +++ b/src/common/lib/client/realtimechannel.ts @@ -99,15 +99,15 @@ class RealtimeChannel extends EventEmitter { retryCount: number = 0; constructor(client: BaseRealtime, name: string, options?: API.ChannelOptions) { - super(); - Logger.logAction(Logger.LOG_MINOR, 'RealtimeChannel()', 'started; name = ' + name); + super(client.logger); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'RealtimeChannel()', 'started; name = ' + name); this.name = name; - this.channelOptions = normaliseChannelOptions(client._Crypto ?? null, options); + this.channelOptions = normaliseChannelOptions(client._Crypto ?? null, this.logger, options); this.client = client; this._presence = client._RealtimePresence ? new client._RealtimePresence.RealtimePresence(this) : null; this.connectionManager = client.connection.connectionManager; this.state = 'initialized'; - this.subscriptions = new EventEmitter(); + this.subscriptions = new EventEmitter(this.logger); this.syncChannelSerial = undefined; this.properties = { attachSerial: undefined, @@ -130,7 +130,7 @@ class RealtimeChannel extends EventEmitter { }; /* Only differences between this and the public event emitter is that this emits an * update event for all ATTACHEDs, whether resumed or not */ - this._allChannelChanges = new EventEmitter(); + this._allChannelChanges = new EventEmitter(this.logger); } invalidStateError(): ErrorInfo { @@ -157,7 +157,7 @@ class RealtimeChannel extends EventEmitter { if (err) { throw err; } - this.channelOptions = normaliseChannelOptions(this.client._Crypto ?? null, options); + this.channelOptions = normaliseChannelOptions(this.client._Crypto ?? null, this.logger, options); if (this._decodingContext) this._decodingContext.channelOptions = this.channelOptions; if (this._shouldReattachToSetOptions(options, previousChannelOptions)) { /* This does not just do _attach(true, null, callback) because that would put us @@ -253,7 +253,7 @@ class RealtimeChannel extends EventEmitter { } _publish(messages: Array, callback: ErrCallback) { - Logger.logAction(Logger.LOG_MICRO, 'RealtimeChannel.publish()', 'message count = ' + messages.length); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.publish()', 'message count = ' + messages.length); const state = this.state; switch (state) { case 'failed': @@ -261,7 +261,12 @@ class RealtimeChannel extends EventEmitter { callback(ErrorInfo.fromValues(this.invalidStateError())); break; default: { - Logger.logAction(Logger.LOG_MICRO, 'RealtimeChannel.publish()', 'sending message; channel state is ' + state); + Logger.logAction( + this.logger, + Logger.LOG_MICRO, + 'RealtimeChannel.publish()', + 'sending message; channel state is ' + state, + ); const msg = new ProtocolMessage(); msg.action = actions.MESSAGE; msg.channel = this.name; @@ -273,7 +278,7 @@ class RealtimeChannel extends EventEmitter { } onEvent(messages: Array): void { - Logger.logAction(Logger.LOG_MICRO, 'RealtimeChannel.onEvent()', 'received message'); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.onEvent()', 'received message'); const subscriptions = this.subscriptions; for (let i = 0; i < messages.length; i++) { const message = messages[i]; @@ -297,9 +302,14 @@ class RealtimeChannel extends EventEmitter { callback?: StandardCallback, ): void { if (!callback) { - callback = function (err?: ErrorInfo | null) { + callback = (err?: ErrorInfo | null) => { if (err) { - Logger.logAction(Logger.LOG_ERROR, 'RealtimeChannel._attach()', 'Channel attach failed: ' + err.toString()); + Logger.logAction( + this.logger, + Logger.LOG_ERROR, + 'RealtimeChannel._attach()', + 'Channel attach failed: ' + err.toString(), + ); } }; } @@ -336,7 +346,7 @@ class RealtimeChannel extends EventEmitter { } attachImpl(): void { - Logger.logAction(Logger.LOG_MICRO, 'RealtimeChannel.attachImpl()', 'sending ATTACH message'); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.attachImpl()', 'sending ATTACH message'); const attachMsg = protocolMessageFromValues({ action: actions.ATTACH, channel: this.name, @@ -401,7 +411,7 @@ class RealtimeChannel extends EventEmitter { } detachImpl(callback?: ErrCallback): void { - Logger.logAction(Logger.LOG_MICRO, 'RealtimeChannel.detach()', 'sending DETACH message'); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.detach()', 'sending DETACH message'); const msg = protocolMessageFromValues({ action: actions.DETACH, channel: this.name }); this.sendMessage(msg, callback || noop); } @@ -562,7 +572,12 @@ class RealtimeChannel extends EventEmitter { if (!presenceMsg.timestamp) presenceMsg.timestamp = timestamp; if (!presenceMsg.id) presenceMsg.id = id + ':' + i; } catch (e) { - Logger.logAction(Logger.LOG_ERROR, 'RealtimeChannel.processMessage()', (e as Error).toString()); + Logger.logAction( + this.logger, + Logger.LOG_ERROR, + 'RealtimeChannel.processMessage()', + (e as Error).toString(), + ); } } if (this._presence) { @@ -574,6 +589,7 @@ class RealtimeChannel extends EventEmitter { //RTL17 if (this.state !== 'attached') { Logger.logAction( + this.logger, Logger.LOG_MAJOR, 'RealtimeChannel.processMessage()', 'Message "' + @@ -605,7 +621,7 @@ class RealtimeChannel extends EventEmitter { '" on this channel "' + this.name + '".'; - Logger.logAction(Logger.LOG_ERROR, 'RealtimeChannel.processMessage()', msg); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'RealtimeChannel.processMessage()', msg); this._startDecodeFailureRecovery(new ErrorInfo(msg, 40018, 400)); break; } @@ -616,7 +632,12 @@ class RealtimeChannel extends EventEmitter { await decodeMessage(msg, this._decodingContext); } catch (e) { /* decrypt failed .. the most likely cause is that we have the wrong key */ - Logger.logAction(Logger.LOG_ERROR, 'RealtimeChannel.processMessage()', (e as Error).toString()); + Logger.logAction( + this.logger, + Logger.LOG_ERROR, + 'RealtimeChannel.processMessage()', + (e as Error).toString(), + ); switch ((e as ErrorInfo).code) { case 40018: /* decode failure */ @@ -655,6 +676,7 @@ class RealtimeChannel extends EventEmitter { default: Logger.logAction( + this.logger, Logger.LOG_ERROR, 'RealtimeChannel.processMessage()', 'Fatal protocol error: unrecognised action (' + message.action + ')', @@ -666,6 +688,7 @@ class RealtimeChannel extends EventEmitter { _startDecodeFailureRecovery(reason: ErrorInfo): void { if (!this._lastPayload.decodeFailureRecoveryInProgress) { Logger.logAction( + this.logger, Logger.LOG_MAJOR, 'RealtimeChannel.processMessage()', 'Starting decode failure recovery process.', @@ -678,7 +701,12 @@ class RealtimeChannel extends EventEmitter { } onAttached(): void { - Logger.logAction(Logger.LOG_MINOR, 'RealtimeChannel.onAttached', 'activating channel; name = ' + this.name); + Logger.logAction( + this.logger, + Logger.LOG_MINOR, + 'RealtimeChannel.onAttached', + 'activating channel; name = ' + this.name, + ); } notifyState( @@ -689,6 +717,7 @@ class RealtimeChannel extends EventEmitter { hasBacklog?: boolean, ): void { Logger.logAction( + this.logger, Logger.LOG_MICRO, 'RealtimeChannel.notifyState', 'name = ' + this.name + ', current state = ' + this.state + ', notifying state ' + state, @@ -718,9 +747,9 @@ class RealtimeChannel extends EventEmitter { const action = 'Channel state for channel "' + this.name + '"'; const message = state + (reason ? '; reason: ' + reason : ''); if (state === 'failed') { - Logger.logAction(Logger.LOG_ERROR, action, message); + Logger.logAction(this.logger, Logger.LOG_ERROR, action, message); } else { - Logger.logAction(Logger.LOG_MAJOR, action, message); + Logger.logAction(this.logger, Logger.LOG_MAJOR, action, message); } if (state !== 'attaching' && state !== 'suspended') { @@ -744,7 +773,12 @@ class RealtimeChannel extends EventEmitter { } requestState(state: API.ChannelState, reason?: ErrorInfo | null): void { - Logger.logAction(Logger.LOG_MINOR, 'RealtimeChannel.requestState', 'name = ' + this.name + ', state = ' + state); + Logger.logAction( + this.logger, + Logger.LOG_MINOR, + 'RealtimeChannel.requestState', + 'name = ' + this.name + ', state = ' + state, + ); this.notifyState(state, reason); /* send the event and await response */ this.checkPendingState(); @@ -755,6 +789,7 @@ class RealtimeChannel extends EventEmitter { const cmState = this.connectionManager.state; if (!cmState.sendEvents) { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'RealtimeChannel.checkPendingState', 'sendEvents is false; state is ' + this.connectionManager.state.state, @@ -763,6 +798,7 @@ class RealtimeChannel extends EventEmitter { } Logger.logAction( + this.logger, Logger.LOG_MINOR, 'RealtimeChannel.checkPendingState', 'name = ' + this.name + ', state = ' + this.state, @@ -807,7 +843,7 @@ class RealtimeChannel extends EventEmitter { startStateTimerIfNotRunning(): void { if (!this.stateTimer) { this.stateTimer = setTimeout(() => { - Logger.logAction(Logger.LOG_MINOR, 'RealtimeChannel.startStateTimerIfNotRunning', 'timer expired'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'RealtimeChannel.startStateTimerIfNotRunning', 'timer expired'); this.stateTimer = null; this.timeoutPendingState(); }, this.client.options.timeouts.realtimeRequestTimeout); @@ -833,7 +869,12 @@ class RealtimeChannel extends EventEmitter { * will be triggered once it connects again */ if (this.state === 'suspended' && this.connectionManager.state.sendEvents) { this.retryTimer = null; - Logger.logAction(Logger.LOG_MINOR, 'RealtimeChannel retry timer expired', 'attempting a new attach'); + Logger.logAction( + this.logger, + Logger.LOG_MINOR, + 'RealtimeChannel retry timer expired', + 'attempting a new attach', + ); this.requestState('attaching'); } }, retryDelay); @@ -850,7 +891,7 @@ class RealtimeChannel extends EventEmitter { this: RealtimeChannel, params: RealtimeHistoryParams | null, ): Promise> { - Logger.logAction(Logger.LOG_MICRO, 'RealtimeChannel.history()', 'channel = ' + this.name); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimeChannel.history()', 'channel = ' + this.name); // We fetch this first so that any plugin-not-provided error takes priority over other errors const restMixin = this.client.rest.channelMixin; @@ -893,6 +934,7 @@ class RealtimeChannel extends EventEmitter { setChannelSerial(channelSerial?: string | null): void { Logger.logAction( + this.logger, Logger.LOG_MICRO, 'RealtimeChannel.setChannelSerial()', 'Updating channel serial; serial = ' + channelSerial + '; previous = ' + this.properties.channelSerial, diff --git a/src/common/lib/client/realtimepresence.ts b/src/common/lib/client/realtimepresence.ts index 612438aab..6d7206fe7 100644 --- a/src/common/lib/client/realtimepresence.ts +++ b/src/common/lib/client/realtimepresence.ts @@ -91,17 +91,18 @@ class RealtimePresence extends EventEmitter { name?: string; constructor(channel: RealtimeChannel) { - super(); + super(channel.logger); this.channel = channel; this.syncComplete = false; this.members = new PresenceMap(this, (item) => item.clientId + ':' + item.connectionId); // RTP17h: Store own members by clientId only. this._myMembers = new PresenceMap(this, (item) => item.clientId!); - this.subscriptions = new EventEmitter(); + this.subscriptions = new EventEmitter(this.logger); this.pendingPresence = []; } async enter(data: unknown): Promise { + Logger.logAction(this.logger, Logger.LOG_DEBUG, 'RealtimePresence.enter'); if (isAnonymousOrWildcard(this)) { throw new ErrorInfo('clientId must be specified to enter a presence channel', 40012, 400); } @@ -129,12 +130,14 @@ class RealtimePresence extends EventEmitter { data: unknown, action: string, ): Promise { + Logger.logAction(this.logger, Logger.LOG_DEBUG, 'RealtimePresence._enterOrUpdateClient'); const channel = this.channel; if (!channel.connectionManager.activeState()) { throw channel.connectionManager.getError(); } Logger.logAction( + this.logger, Logger.LOG_MICRO, 'RealtimePresence.' + action + 'Client()', 'channel = ' + channel.name + ', id = ' + id + ', client = ' + (clientId || '(implicit) ' + getClientId(this)), @@ -191,6 +194,7 @@ class RealtimePresence extends EventEmitter { } Logger.logAction( + this.logger, Logger.LOG_MICRO, 'RealtimePresence.leaveClient()', 'leaving; channel = ' + this.channel.name + ', client = ' + clientId, @@ -268,7 +272,7 @@ class RealtimePresence extends EventEmitter { } async history(params: RealtimeHistoryParams | null): Promise> { - Logger.logAction(Logger.LOG_MICRO, 'RealtimePresence.history()', 'channel = ' + this.name); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'RealtimePresence.history()', 'channel = ' + this.name); // We fetch this first so that any plugin-not-provided error takes priority over other errors const restMixin = this.channel.client.rest.presenceMixin; @@ -290,6 +294,7 @@ class RealtimePresence extends EventEmitter { setPresence(presenceSet: PresenceMessage[], isSync: boolean, syncChannelSerial?: string): void { Logger.logAction( + this.logger, Logger.LOG_MICRO, 'RealtimePresence.setPresence()', 'received presence for ' + presenceSet.length + ' participants; syncChannelSerial = ' + syncChannelSerial, @@ -345,6 +350,7 @@ class RealtimePresence extends EventEmitter { onAttached(hasPresence?: boolean): void { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'RealtimePresence.onAttached()', 'channel = ' + this.channel.name + ', hasPresence = ' + hasPresence, @@ -367,8 +373,9 @@ class RealtimePresence extends EventEmitter { if (pendingPresCount) { this.pendingPresence = []; const presenceArray = []; - const multicaster = Multicaster.create(); + const multicaster = Multicaster.create(this.logger); Logger.logAction( + this.logger, Logger.LOG_MICRO, 'RealtimePresence.onAttached', 'sending ' + pendingPresCount + ' queued presence messages', @@ -401,6 +408,7 @@ class RealtimePresence extends EventEmitter { failPendingPresence(err?: ErrorInfo | null): void { if (this.pendingPresence.length) { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'RealtimeChannel.failPendingPresence', 'channel; name = ' + this.channel.name + ', err = ' + Utils.inspectError(err), @@ -424,7 +432,7 @@ class RealtimePresence extends EventEmitter { if (err) { const msg = 'Presence auto-re-enter failed: ' + err.toString(); const wrappedErr = new ErrorInfo(msg, 91004, 400); - Logger.logAction(Logger.LOG_ERROR, 'RealtimePresence._ensureMyMembersPresent()', msg); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'RealtimePresence._ensureMyMembersPresent()', msg); const change = new ChannelStateChange(this.channel.state, this.channel.state, true, false, wrappedErr); this.channel.emit('update', change); } @@ -433,6 +441,7 @@ class RealtimePresence extends EventEmitter { for (const memberKey in myMembers.map) { const entry = myMembers.map[memberKey]; Logger.logAction( + this.logger, Logger.LOG_MICRO, 'RealtimePresence._ensureMyMembersPresent()', 'Auto-reentering clientId "' + entry.clientId + '" into the presence set', @@ -488,7 +497,7 @@ class PresenceMap extends EventEmitter { memberKey: (item: PresenceMessage) => string; constructor(presence: RealtimePresence, memberKey: (item: PresenceMessage) => string) { - super(); + super(presence.logger); this.presence = presence; this.map = Object.create(null); this.syncInProgress = false; @@ -580,6 +589,7 @@ class PresenceMap extends EventEmitter { const map = this.map, syncInProgress = this.syncInProgress; Logger.logAction( + this.logger, Logger.LOG_MINOR, 'PresenceMap.startSync()', 'channel = ' + this.presence.channel.name + '; syncInProgress = ' + syncInProgress, @@ -595,6 +605,7 @@ class PresenceMap extends EventEmitter { const map = this.map, syncInProgress = this.syncInProgress; Logger.logAction( + this.logger, Logger.LOG_MINOR, 'PresenceMap.endSync()', 'channel = ' + this.presence.channel.name + '; syncInProgress = ' + syncInProgress, @@ -625,6 +636,7 @@ class PresenceMap extends EventEmitter { waitSync(callback: () => void) { const syncInProgress = this.syncInProgress; Logger.logAction( + this.logger, Logger.LOG_MINOR, 'PresenceMap.waitSync()', 'channel = ' + this.presence.channel.name + '; syncInProgress = ' + syncInProgress, @@ -643,7 +655,7 @@ class PresenceMap extends EventEmitter { } setInProgress(inProgress: boolean) { - Logger.logAction(Logger.LOG_MICRO, 'PresenceMap.setInProgress()', 'inProgress = ' + inProgress); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'PresenceMap.setInProgress()', 'inProgress = ' + inProgress); this.syncInProgress = inProgress; this.presence.syncComplete = !inProgress; } diff --git a/src/common/lib/client/resource.ts b/src/common/lib/client/resource.ts index c5aba126c..186abf1b6 100644 --- a/src/common/lib/client/resource.ts +++ b/src/common/lib/client/resource.ts @@ -75,15 +75,23 @@ function unenvelope( return { err: result.err, body: response, headers: wrappedHeaders, unpacked: true, statusCode: wrappedStatusCode }; } -function logResult(result: ResourceResult, method: HttpMethods, path: string, params: Record) { +function logResult( + result: ResourceResult, + method: HttpMethods, + path: string, + params: Record, + logger: Logger, +) { if (result.err) { Logger.logAction( + logger, Logger.LOG_MICRO, 'Resource.' + method + '()', 'Received Error; ' + urlFromPathAndParams(path, params) + '; Error: ' + Utils.inspectError(result.err), ); } else { Logger.logAction( + logger, Logger.LOG_MICRO, 'Resource.' + method + '()', 'Received; ' + @@ -298,12 +306,14 @@ class Resource { (params = params || {})['envelope'] = envelope; } + const logger = client.logger; + async function doRequest( this: any, headers: Record, params: Record, ): Promise> { - if (Logger.shouldLog(Logger.LOG_MICRO)) { + if (logger.shouldLog(Logger.LOG_MICRO)) { let decodedBody = body; if (headers['content-type']?.indexOf('msgpack') > 0) { try { @@ -313,6 +323,7 @@ class Resource { decodedBody = client._MsgPack.decode(body as Buffer); } catch (decodeErr) { Logger.logAction( + logger, Logger.LOG_MICRO, 'Resource.' + method + '()', 'Sending MsgPack Decoding Error: ' + Utils.inspectError(decodeErr), @@ -320,6 +331,7 @@ class Resource { } } Logger.logAction( + logger, Logger.LOG_MICRO, 'Resource.' + method + '()', 'Sending; ' + urlFromPathAndParams(path, params) + '; Body: ' + decodedBody, @@ -350,8 +362,8 @@ class Resource { result = unenvelope(result, client._MsgPack, envelope); } - if (Logger.shouldLog(Logger.LOG_MICRO)) { - logResult(result, method, path, params); + if (logger.shouldLog(Logger.LOG_MICRO)) { + logResult(result, method, path, params, logger); } if (throwError) { diff --git a/src/common/lib/client/rest.ts b/src/common/lib/client/rest.ts index 74ce069b0..89bdfd8ba 100644 --- a/src/common/lib/client/rest.ts +++ b/src/common/lib/client/rest.ts @@ -1,5 +1,4 @@ import * as Utils from '../util/utils'; -import Logger, { LoggerOptions } from '../util/logger'; import Defaults from '../util/defaults'; import Push from './push'; import PaginatedResource, { HttpPaginatedResponse, PaginatedResult } from './paginatedresource'; @@ -236,10 +235,6 @@ export class Rest { response.unpacked ? response.body : Utils.decodeBody(response.body, this.client._MsgPack, format) ) as TokenRevocationResult; } - - setLog(logOptions: LoggerOptions): void { - Logger.setLog(logOptions.level, logOptions.handler); - } } class Channels { diff --git a/src/common/lib/client/restchannel.ts b/src/common/lib/client/restchannel.ts index 71ac07ea0..ff086a9db 100644 --- a/src/common/lib/client/restchannel.ts +++ b/src/common/lib/client/restchannel.ts @@ -34,19 +34,23 @@ class RestChannel { channelOptions: ChannelOptions; constructor(client: BaseRest, name: string, channelOptions?: ChannelOptions) { - Logger.logAction(Logger.LOG_MINOR, 'RestChannel()', 'started; name = ' + name); + Logger.logAction(client.logger, Logger.LOG_MINOR, 'RestChannel()', 'started; name = ' + name); this.name = name; this.client = client; this.presence = new RestPresence(this); - this.channelOptions = normaliseChannelOptions(client._Crypto ?? null, channelOptions); + this.channelOptions = normaliseChannelOptions(client._Crypto ?? null, this.logger, channelOptions); + } + + get logger(): Logger { + return this.client.logger; } setOptions(options?: ChannelOptions): void { - this.channelOptions = normaliseChannelOptions(this.client._Crypto ?? null, options); + this.channelOptions = normaliseChannelOptions(this.client._Crypto ?? null, this.logger, options); } async history(params: RestHistoryParams | null): Promise> { - Logger.logAction(Logger.LOG_MICRO, 'RestChannel.history()', 'channel = ' + this.name); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'RestChannel.history()', 'channel = ' + this.name); return this.client.rest.channelMixin.history(this, params); } diff --git a/src/common/lib/client/restchannelmixin.ts b/src/common/lib/client/restchannelmixin.ts index 26695c8c1..c104d66be 100644 --- a/src/common/lib/client/restchannelmixin.ts +++ b/src/common/lib/client/restchannelmixin.ts @@ -36,7 +36,13 @@ export class RestChannelMixin { headers, unpacked, ) { - return await messageFromResponseBody(body as Message[], options, client._MsgPack, unpacked ? undefined : format); + return await messageFromResponseBody( + body as Message[], + options, + channel.logger, + client._MsgPack, + unpacked ? undefined : format, + ); }).get(params as Record); } diff --git a/src/common/lib/client/restpresence.ts b/src/common/lib/client/restpresence.ts index 470752443..3ce4e142a 100644 --- a/src/common/lib/client/restpresence.ts +++ b/src/common/lib/client/restpresence.ts @@ -13,8 +13,12 @@ class RestPresence { this.channel = channel; } + get logger(): Logger { + return this.channel.logger; + } + async get(params: any): Promise> { - Logger.logAction(Logger.LOG_MICRO, 'RestPresence.get()', 'channel = ' + this.channel.name); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'RestPresence.get()', 'channel = ' + this.channel.name); const client = this.channel.client, format = client.options.useBinaryProtocol ? Utils.Format.msgpack : Utils.Format.json, envelope = this.channel.client.http.supportsLinkHeaders ? undefined : format, @@ -28,10 +32,11 @@ class RestPresence { this.channel.client.rest.presenceMixin.basePath(this), headers, envelope, - async function (body, headers, unpacked) { + async (body, headers, unpacked) => { return await presenceMessageFromResponseBody( body as Record[], options as CipherOptions, + this.logger, client._MsgPack, unpacked ? undefined : format, ); @@ -40,7 +45,7 @@ class RestPresence { } async history(params: any): Promise> { - Logger.logAction(Logger.LOG_MICRO, 'RestPresence.history()', 'channel = ' + this.channel.name); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'RestPresence.history()', 'channel = ' + this.channel.name); return this.channel.client.rest.presenceMixin.history(this, params); } } diff --git a/src/common/lib/client/restpresencemixin.ts b/src/common/lib/client/restpresencemixin.ts index c42f725a5..f0b2cca37 100644 --- a/src/common/lib/client/restpresencemixin.ts +++ b/src/common/lib/client/restpresencemixin.ts @@ -32,6 +32,7 @@ export class RestPresenceMixin { return await presenceMessageFromResponseBody( body as Record[], options as CipherOptions, + presence.logger, client._MsgPack, unpacked ? undefined : format, ); diff --git a/src/common/lib/transport/comettransport.ts b/src/common/lib/transport/comettransport.ts index 4ecf0d147..ab468b6cc 100644 --- a/src/common/lib/transport/comettransport.ts +++ b/src/common/lib/transport/comettransport.ts @@ -73,7 +73,7 @@ abstract class CometTransport extends Transport { ): IXHRRequest; connect(): void { - Logger.logAction(Logger.LOG_MINOR, 'CometTransport.connect()', 'starting'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.connect()', 'starting'); Transport.prototype.connect.call(this); const params = this.params; const options = params.options; @@ -83,7 +83,7 @@ abstract class CometTransport extends Transport { this.baseUri = cometScheme + host + ':' + port + '/comet/'; const connectUri = this.baseUri + 'connect'; - Logger.logAction(Logger.LOG_MINOR, 'CometTransport.connect()', 'uri: ' + connectUri); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.connect()', 'uri: ' + connectUri); Utils.whenPromiseSettles(this.auth.getAuthParams(), (err: Error | null, authParams?: Record) => { if (err) { this.disconnect(err); @@ -96,6 +96,7 @@ abstract class CometTransport extends Transport { const connectParams = this.params.getConnectParams(authParams!); if ('stream' in connectParams) this.stream = connectParams.stream; Logger.logAction( + this.logger, Logger.LOG_MINOR, 'CometTransport.connect()', 'connectParams:' + Utils.toQueryString(connectParams), @@ -157,12 +158,12 @@ abstract class CometTransport extends Transport { } requestClose(): void { - Logger.logAction(Logger.LOG_MINOR, 'CometTransport.requestClose()'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.requestClose()'); this._requestCloseOrDisconnect(true); } requestDisconnect(): void { - Logger.logAction(Logger.LOG_MINOR, 'CometTransport.requestDisconnect()'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.requestDisconnect()'); this._requestCloseOrDisconnect(false); } @@ -174,6 +175,7 @@ abstract class CometTransport extends Transport { request.on('complete', (err: ErrorInfo) => { if (err) { Logger.logAction( + this.logger, Logger.LOG_ERROR, 'CometTransport.request' + (closing ? 'Close()' : 'Disconnect()'), 'request returned err = ' + Utils.inspectError(err), @@ -186,11 +188,11 @@ abstract class CometTransport extends Transport { } dispose(): void { - Logger.logAction(Logger.LOG_MINOR, 'CometTransport.dispose()', ''); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.dispose()', ''); if (!this.isDisposed) { this.isDisposed = true; if (this.recvRequest) { - Logger.logAction(Logger.LOG_MINOR, 'CometTransport.dispose()', 'aborting recv request'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'CometTransport.dispose()', 'aborting recv request'); this.recvRequest.abort(); this.recvRequest = null; } @@ -215,7 +217,7 @@ abstract class CometTransport extends Transport { Transport.prototype.onConnect.call(this, message); const baseConnectionUri = (this.baseUri as string) + connectionStr; - Logger.logAction(Logger.LOG_MICRO, 'CometTransport.onConnect()', 'baseUri = ' + baseConnectionUri); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'CometTransport.onConnect()', 'baseUri = ' + baseConnectionUri); this.sendUri = baseConnectionUri + '/send'; this.recvUri = baseConnectionUri + '/recv'; this.closeUri = baseConnectionUri + '/close'; @@ -260,6 +262,7 @@ abstract class CometTransport extends Transport { sendRequest.on('complete', (err: ErrorInfo, data: string) => { if (err) Logger.logAction( + this.logger, Logger.LOG_ERROR, 'CometTransport.sendItems()', 'on complete: err = ' + Utils.inspectError(err), @@ -354,6 +357,7 @@ abstract class CometTransport extends Transport { ); } catch (e) { Logger.logAction( + this.logger, Logger.LOG_ERROR, 'CometTransport.onData()', 'Unexpected exception handing channel event: ' + (e as Error).stack, diff --git a/src/common/lib/transport/connectionmanager.ts b/src/common/lib/transport/connectionmanager.ts index 94d460557..93e30d64f 100644 --- a/src/common/lib/transport/connectionmanager.ts +++ b/src/common/lib/transport/connectionmanager.ts @@ -222,7 +222,7 @@ class ConnectionManager extends EventEmitter { connectCounter: number; constructor(realtime: BaseRealtime, options: NormalisedClientOptions) { - super(); + super(realtime.logger); this.realtime = realtime; this.initTransports(); this.options = options; @@ -284,7 +284,7 @@ class ConnectionManager extends EventEmitter { this.state = this.states.initialized; this.errorReason = null; - this.queuedMessages = new MessageQueue(); + this.queuedMessages = new MessageQueue(this.logger); this.msgSerial = 0; this.connectionDetails = undefined; this.connectionId = undefined; @@ -317,22 +317,29 @@ class ConnectionManager extends EventEmitter { this.webSocketGiveUpTimer = null; this.abandonedWebSocket = false; - Logger.logAction(Logger.LOG_MINOR, 'Realtime.ConnectionManager()', 'started'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Realtime.ConnectionManager()', 'started'); Logger.logAction( + this.logger, Logger.LOG_MICRO, 'Realtime.ConnectionManager()', 'requested transports = [' + (options.transports || Defaults.defaultTransports) + ']', ); Logger.logAction( + this.logger, Logger.LOG_MICRO, 'Realtime.ConnectionManager()', 'available transports = [' + this.transports + ']', ); - Logger.logAction(Logger.LOG_MICRO, 'Realtime.ConnectionManager()', 'http hosts = [' + this.httpHosts + ']'); + Logger.logAction( + this.logger, + Logger.LOG_MICRO, + 'Realtime.ConnectionManager()', + 'http hosts = [' + this.httpHosts + ']', + ); if (!this.transports.length) { const msg = 'no requested transports available'; - Logger.logAction(Logger.LOG_ERROR, 'realtime.ConnectionManager()', msg); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'realtime.ConnectionManager()', msg); throw new Error(msg); } @@ -346,6 +353,7 @@ class ConnectionManager extends EventEmitter { if (options.closeOnUnload === true) { addEventListener('beforeunload', () => { Logger.logAction( + this.logger, Logger.LOG_MAJOR, 'Realtime.ConnectionManager()', 'beforeunload event has triggered the connection to close as closeOnUnload is true', @@ -358,6 +366,7 @@ class ConnectionManager extends EventEmitter { addEventListener('online', () => { if (this.state == this.states.disconnected || this.state == this.states.suspended) { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager caught browser ‘online’ event', 'reattempting connection', @@ -375,6 +384,7 @@ class ConnectionManager extends EventEmitter { addEventListener('offline', () => { if (this.state == this.states.connected) { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager caught browser ‘offline’ event', 'disconnecting active transport', @@ -434,6 +444,7 @@ class ConnectionManager extends EventEmitter { lastSessionData = getSessionRecoverData(); if (lastSessionData && typeof recoverFn === 'function') { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.getTransportParams()', 'Calling clientOptions-provided recover function with last session data', @@ -455,6 +466,7 @@ class ConnectionManager extends EventEmitter { const transportParams = this.createTransportParams(null, mode); if (mode === 'recover') { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.getTransportParams()', 'Transport recovery mode = recover; recoveryKey = ' + this.options.recover, @@ -465,6 +477,7 @@ class ConnectionManager extends EventEmitter { } } else { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.getTransportParams()', 'Transport params = ' + transportParams.toString(), @@ -481,7 +494,7 @@ class ConnectionManager extends EventEmitter { * @param callback */ tryATransport(transportParams: TransportParams, candidate: TransportName, callback: Function): void { - Logger.logAction(Logger.LOG_MICRO, 'ConnectionManager.tryATransport()', 'trying ' + candidate); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.tryATransport()', 'trying ' + candidate); this.proposedTransport = Transport.tryConnect( this.supportedTransports[candidate]!, @@ -493,6 +506,7 @@ class ConnectionManager extends EventEmitter { if (state == this.states.closing || state == this.states.closed || state == this.states.failed) { if (transport) { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.tryATransport()', 'connection ' + state.state + ' while we were attempting the transport; closing ' + transport, @@ -505,6 +519,7 @@ class ConnectionManager extends EventEmitter { if (wrappedErr) { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.tryATransport()', 'transport ' + candidate + ' ' + wrappedErr.event + ', err: ' + wrappedErr.error.toString(), @@ -544,6 +559,7 @@ class ConnectionManager extends EventEmitter { } Logger.logAction( + this.logger, Logger.LOG_MICRO, 'ConnectionManager.tryATransport()', 'viable transport ' + candidate + '; setting pending', @@ -563,6 +579,7 @@ class ConnectionManager extends EventEmitter { setTransportPending(transport: Transport, transportParams: TransportParams): void { const mode = transportParams.mode; Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.setTransportPending()', 'transport = ' + transport + '; mode = ' + mode, @@ -606,15 +623,26 @@ class ConnectionManager extends EventEmitter { connectionId: string, connectionDetails: Record, ): boolean { - Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.activateTransport()', 'transport = ' + transport); + Logger.logAction( + this.logger, + Logger.LOG_MINOR, + 'ConnectionManager.activateTransport()', + 'transport = ' + transport, + ); if (error) { - Logger.logAction(Logger.LOG_ERROR, 'ConnectionManager.activateTransport()', 'error = ' + error); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'ConnectionManager.activateTransport()', 'error = ' + error); } if (connectionId) { - Logger.logAction(Logger.LOG_MICRO, 'ConnectionManager.activateTransport()', 'connectionId = ' + connectionId); + Logger.logAction( + this.logger, + Logger.LOG_MICRO, + 'ConnectionManager.activateTransport()', + 'connectionId = ' + connectionId, + ); } if (connectionDetails) { Logger.logAction( + this.logger, Logger.LOG_MICRO, 'ConnectionManager.activateTransport()', 'connectionDetails = ' + JSON.stringify(connectionDetails), @@ -628,6 +656,7 @@ class ConnectionManager extends EventEmitter { const existingState = this.state, connectedState = this.states.connected.state; Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.activateTransport()', 'current state = ' + existingState.state, @@ -638,6 +667,7 @@ class ConnectionManager extends EventEmitter { existingState.state == this.states.failed.state ) { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.activateTransport()', 'Disconnecting transport and abandoning', @@ -651,6 +681,7 @@ class ConnectionManager extends EventEmitter { /* if the transport is not connected then don't activate it */ if (!transport.isConnected) { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.activateTransport()', 'Declining to activate transport ' + transport + ' since it appears to no longer be connected', @@ -709,6 +740,7 @@ class ConnectionManager extends EventEmitter { * from other active transports when upgrading, and upgrading waits for * the old transport to be idle. So log an error. */ Logger.logAction( + this.logger, Logger.LOG_ERROR, 'ConnectionManager.activateTransport()', 'Previous active protocol (for transport ' + @@ -726,7 +758,7 @@ class ConnectionManager extends EventEmitter { transport.shortName + '; stack = ' + new Error().stack; - Logger.logAction(Logger.LOG_ERROR, 'ConnectionManager.activateTransport()', msg); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'ConnectionManager.activateTransport()', msg); } else { existingActiveProtocol.finish(); } @@ -746,8 +778,14 @@ class ConnectionManager extends EventEmitter { wasPending = transport === this.pendingTransport, noTransportsScheduledForActivation = this.noTransportsScheduledForActivation(); - Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.deactivateTransport()', 'transport = ' + transport); Logger.logAction( + this.logger, + Logger.LOG_MINOR, + 'ConnectionManager.deactivateTransport()', + 'transport = ' + transport, + ); + Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.deactivateTransport()', 'state = ' + @@ -756,10 +794,16 @@ class ConnectionManager extends EventEmitter { (noTransportsScheduledForActivation ? '' : '; another transport is scheduled for activation'), ); if (error && error.message) - Logger.logAction(Logger.LOG_MICRO, 'ConnectionManager.deactivateTransport()', 'reason = ' + error.message); + Logger.logAction( + this.logger, + Logger.LOG_MICRO, + 'ConnectionManager.deactivateTransport()', + 'reason = ' + error.message, + ); if (wasActive) { Logger.logAction( + this.logger, Logger.LOG_MICRO, 'ConnectionManager.deactivateTransport()', 'Getting, clearing, and requeuing ' + @@ -831,7 +875,7 @@ class ConnectionManager extends EventEmitter { connIdChanged = prevConnId && prevConnId !== connectionId, recoverFailure = !prevConnId && hasConnectionError; if (connIdChanged || recoverFailure) { - Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.setConnection()', 'Resetting msgSerial'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.setConnection()', 'Resetting msgSerial'); this.msgSerial = 0; // RTN19a2: In the event of a new connectionId, previous msgSerials are // meaningless. @@ -839,6 +883,7 @@ class ConnectionManager extends EventEmitter { } if (this.connectionId !== connectionId) { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.setConnection()', 'New connectionId; reattaching any attached channels', @@ -876,6 +921,7 @@ class ConnectionManager extends EventEmitter { const sinceLast = Date.now() - this.lastActivity; if (sinceLast > this.connectionStateTtl + (this.maxIdleInterval as number)) { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.checkConnectionStateFreshness()', 'Last known activity from realtime was ' + sinceLast + 'ms ago; discarding connection state', @@ -939,11 +985,12 @@ class ConnectionManager extends EventEmitter { const action = 'Connection state'; const message = stateChange.current + (stateChange.reason ? '; reason: ' + stateChange.reason : ''); if (stateChange.current === 'failed') { - Logger.logAction(Logger.LOG_ERROR, action, message); + Logger.logAction(this.logger, Logger.LOG_ERROR, action, message); } else { - Logger.logAction(Logger.LOG_MAJOR, action, message); + Logger.logAction(this.logger, Logger.LOG_MAJOR, action, message); } Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.enactStateChange', 'setting new state: ' + @@ -972,13 +1019,19 @@ class ConnectionManager extends EventEmitter { startTransitionTimer(transitionState: ConnectionState): void { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.startTransitionTimer()', 'transitionState: ' + transitionState.state, ); if (this.transitionTimer) { - Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.startTransitionTimer()', 'clearing already-running timer'); + Logger.logAction( + this.logger, + Logger.LOG_MINOR, + 'ConnectionManager.startTransitionTimer()', + 'clearing already-running timer', + ); clearTimeout(this.transitionTimer as number); } @@ -986,6 +1039,7 @@ class ConnectionManager extends EventEmitter { if (this.transitionTimer) { this.transitionTimer = null; Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager ' + transitionState.state + ' timer expired', 'requesting new state: ' + transitionState.failState, @@ -996,7 +1050,7 @@ class ConnectionManager extends EventEmitter { } cancelTransitionTimer(): void { - Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.cancelTransitionTimer()', ''); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.cancelTransitionTimer()', ''); if (this.transitionTimer) { clearTimeout(this.transitionTimer as number); this.transitionTimer = null; @@ -1009,6 +1063,7 @@ class ConnectionManager extends EventEmitter { if (this.suspendTimer) { this.suspendTimer = null; Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager suspend timer expired', 'requesting new state: suspended', @@ -1033,7 +1088,7 @@ class ConnectionManager extends EventEmitter { startRetryTimer(interval: number): void { this.retryTimer = setTimeout(() => { - Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager retry timer expired', 'retrying'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager retry timer expired', 'retrying'); this.retryTimer = null; this.requestState({ state: 'connecting' }); }, interval); @@ -1048,11 +1103,17 @@ class ConnectionManager extends EventEmitter { startWebSocketSlowTimer() { this.webSocketSlowTimer = setTimeout(() => { - Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager WebSocket slow timer', 'checking connectivity'); + Logger.logAction( + this.logger, + Logger.LOG_MINOR, + 'ConnectionManager WebSocket slow timer', + 'checking connectivity', + ); if (this.wsCheckResult === null) { this.checkWsConnectivity() .then(() => { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager WebSocket slow timer', 'ws connectivity check succeeded', @@ -1061,6 +1122,7 @@ class ConnectionManager extends EventEmitter { }) .catch(() => { Logger.logAction( + this.logger, Logger.LOG_MAJOR, 'ConnectionManager WebSocket slow timer', 'ws connectivity check failed', @@ -1072,6 +1134,7 @@ class ConnectionManager extends EventEmitter { Utils.whenPromiseSettles(this.realtime.http.checkConnectivity(), (err, connectivity) => { if (err || !connectivity) { Logger.logAction( + this.logger, Logger.LOG_MAJOR, 'ConnectionManager WebSocket slow timer', 'http connectivity check failed', @@ -1083,6 +1146,7 @@ class ConnectionManager extends EventEmitter { }); } else { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager WebSocket slow timer', 'http connectivity check succeeded', @@ -1104,6 +1168,7 @@ class ConnectionManager extends EventEmitter { this.webSocketGiveUpTimer = setTimeout(() => { if (!this.wsCheckResult) { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager WebSocket give up timer', 'websocket connection took more than 10s; ' + (this.baseTransport ? 'trying base transport' : ''), @@ -1116,6 +1181,7 @@ class ConnectionManager extends EventEmitter { } else { // if we don't have a base transport to fallback to, just let the websocket connection attempt time out Logger.logAction( + this.logger, Logger.LOG_MAJOR, 'ConnectionManager WebSocket give up timer', 'websocket connectivity appears to be unavailable but no other transports to try', @@ -1153,6 +1219,7 @@ class ConnectionManager extends EventEmitter { !(this.errorReason && Auth.isTokenErr(this.errorReason as ErrorInfo)))); Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.notifyState()', 'new state: ' + state + (retryImmediately ? '; will retry connection immediately' : ''), @@ -1201,6 +1268,7 @@ class ConnectionManager extends EventEmitter { const sinceLast = this.lastAutoReconnectAttempt && Date.now() - this.lastAutoReconnectAttempt + 1; if (sinceLast && sinceLast < 1000) { Logger.logAction( + this.logger, Logger.LOG_MICRO, 'ConnectionManager.notifyState()', 'Last reconnect attempt was only ' + @@ -1229,6 +1297,7 @@ class ConnectionManager extends EventEmitter { if (state == 'connected' && !this.activeProtocol) { Logger.logAction( + this.logger, Logger.LOG_ERROR, 'ConnectionManager.notifyState()', 'Broken invariant: attempted to go into connected state, but there is no active protocol', @@ -1248,6 +1317,7 @@ class ConnectionManager extends EventEmitter { requestState(request: any): void { const state = request.state; Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.requestState()', 'requested state: ' + state + '; current state: ' + this.state.state, @@ -1289,6 +1359,7 @@ class ConnectionManager extends EventEmitter { startConnect(): void { if (this.state !== this.states.connecting) { Logger.logAction( + this.logger, Logger.LOG_MINOR, 'ConnectionManager.startConnect()', 'Must be in connecting state to connect, but was ' + this.state.state, @@ -1323,7 +1394,7 @@ class ConnectionManager extends EventEmitter { }); }; - Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.startConnect()', 'starting connection'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.startConnect()', 'starting connection'); this.startSuspendTimer(); this.startTransitionTimer(this.states.connecting); @@ -1372,6 +1443,8 @@ class ConnectionManager extends EventEmitter { * for upgrading). Any operation can put us into 'disconnected' to cancel * connection attempts and wait before retrying, or 'failed' to fail. */ Logger.logAction( + this.logger, + Logger.LOG_MINOR, 'ConnectionManager.connectImpl()', 'Must be in connecting state to connect, but was ' + state, @@ -1390,6 +1463,8 @@ class ConnectionManager extends EventEmitter { this.unpersistTransportPreference(); if (this.state === this.states.connecting) { Logger.logAction( + this.logger, + Logger.LOG_MINOR, 'ConnectionManager.connectImpl():', 'web socket connectivity available, cancelling connection attempt with ' + this.baseTransport, @@ -1425,7 +1500,7 @@ class ConnectionManager extends EventEmitter { * with the transport and fallback to base transport. */ connectWs(transportParams: TransportParams, connectCount: number) { - Logger.logAction(Logger.LOG_DEBUG, 'ConnectionManager.connectWs()'); + Logger.logAction(this.logger, Logger.LOG_DEBUG, 'ConnectionManager.connectWs()'); this.startWebSocketSlowTimer(); this.startWebSocketGiveUpTimer(transportParams); @@ -1435,7 +1510,7 @@ class ConnectionManager extends EventEmitter { } connectBase(transportParams: TransportParams, connectCount: number) { - Logger.logAction(Logger.LOG_DEBUG, 'ConnectionManager.connectBase()'); + Logger.logAction(this.logger, Logger.LOG_DEBUG, 'ConnectionManager.connectBase()'); if (this.baseTransport) { this.tryTransportWithFallbacks(this.baseTransport, transportParams, false, connectCount, () => true); } else { @@ -1453,7 +1528,13 @@ class ConnectionManager extends EventEmitter { connectCount: number, shouldContinue: () => boolean, ): void { - Logger.logAction(Logger.LOG_DEBUG, 'ConnectionManager.tryTransportWithFallbacks()', transportName); + Logger.logAction( + this.logger, + + Logger.LOG_DEBUG, + 'ConnectionManager.tryTransportWithFallbacks()', + transportName, + ); const giveUp = (err: IPartialErrorInfo) => { this.notifyState({ state: this.states.connecting.failState as string, error: err }); }; @@ -1535,12 +1616,14 @@ class ConnectionManager extends EventEmitter { } closeImpl(): void { - Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.closeImpl()', 'closing connection'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.closeImpl()', 'closing connection'); this.cancelSuspendTimer(); this.startTransitionTimer(this.states.closing); if (this.pendingTransport) { Logger.logAction( + this.logger, + Logger.LOG_MICRO, 'ConnectionManager.closeImpl()', 'Closing pending transport: ' + this.pendingTransport, @@ -1550,6 +1633,8 @@ class ConnectionManager extends EventEmitter { if (this.activeProtocol) { Logger.logAction( + this.logger, + Logger.LOG_MICRO, 'ConnectionManager.closeImpl()', 'Closing active transport: ' + this.activeProtocol.getTransport(), @@ -1566,6 +1651,8 @@ class ConnectionManager extends EventEmitter { switch (this.state.state) { case 'connected': { Logger.logAction( + this.logger, + Logger.LOG_MICRO, 'ConnectionManager.onAuthUpdated()', 'Sending AUTH message on active transport', @@ -1606,6 +1693,8 @@ class ConnectionManager extends EventEmitter { case 'connecting': Logger.logAction( + this.logger, + Logger.LOG_MICRO, 'ConnectionManager.onAuthUpdated()', 'Aborting current connection attempts in order to start again with the new auth details', @@ -1615,6 +1704,8 @@ class ConnectionManager extends EventEmitter { default: { Logger.logAction( + this.logger, + Logger.LOG_MICRO, 'ConnectionManager.onAuthUpdated()', 'Connection state is ' + this.state.state + '; waiting until either connected or failed', @@ -1649,13 +1740,21 @@ class ConnectionManager extends EventEmitter { } disconnectAllTransports(): void { - Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.disconnectAllTransports()', 'Disconnecting all transports'); + Logger.logAction( + this.logger, + + Logger.LOG_MINOR, + 'ConnectionManager.disconnectAllTransports()', + 'Disconnecting all transports', + ); /* This will prevent any connection procedure in an async part of one of its early stages from continuing */ this.connectCounter++; if (this.pendingTransport) { Logger.logAction( + this.logger, + Logger.LOG_MICRO, 'ConnectionManager.disconnectAllTransports()', 'Disconnecting pending transport: ' + this.pendingTransport, @@ -1666,6 +1765,8 @@ class ConnectionManager extends EventEmitter { if (this.proposedTransport) { Logger.logAction( + this.logger, + Logger.LOG_MICRO, 'ConnectionManager.disconnectAllTransports()', 'Disconnecting proposed transport: ' + this.pendingTransport, @@ -1676,6 +1777,8 @@ class ConnectionManager extends EventEmitter { if (this.activeProtocol) { Logger.logAction( + this.logger, + Logger.LOG_MICRO, 'ConnectionManager.disconnectAllTransports()', 'Disconnecting active transport: ' + this.activeProtocol.getTransport(), @@ -1695,19 +1798,21 @@ class ConnectionManager extends EventEmitter { const state = this.state; if (state.sendEvents) { - Logger.logAction(Logger.LOG_MICRO, 'ConnectionManager.send()', 'sending event'); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.send()', 'sending event'); this.sendImpl(new PendingMessage(msg, callback)); return; } const shouldQueue = queueEvent && state.queueEvents; if (!shouldQueue) { const err = 'rejecting event, queueEvent was ' + queueEvent + ', state was ' + state.state; - Logger.logAction(Logger.LOG_MICRO, 'ConnectionManager.send()', err); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.send()', err); callback(this.errorReason || new ErrorInfo(err, 90000, 400)); return; } - if (Logger.shouldLog(Logger.LOG_MICRO)) { + if (this.logger.shouldLog(Logger.LOG_MICRO)) { Logger.logAction( + this.logger, + Logger.LOG_MICRO, 'ConnectionManager.send()', 'queueing msg; ' + stringifyProtocolMessage(msg, this.realtime._RealtimePresence), @@ -1727,6 +1832,8 @@ class ConnectionManager extends EventEmitter { (this.activeProtocol as Protocol).send(pendingMessage); } catch (e) { Logger.logAction( + this.logger, + Logger.LOG_ERROR, 'ConnectionManager.sendImpl()', 'Unexpected exception in transport.send(): ' + (e as Error).stack, @@ -1735,7 +1842,7 @@ class ConnectionManager extends EventEmitter { } queue(msg: ProtocolMessage, callback: ErrCallback): void { - Logger.logAction(Logger.LOG_MICRO, 'ConnectionManager.queue()', 'queueing event'); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'ConnectionManager.queue()', 'queueing event'); const lastQueued = this.queuedMessages.last(); const maxSize = this.options.maxMessageSize; /* If have already attempted to send a message, don't merge more messages @@ -1743,7 +1850,7 @@ class ConnectionManager extends EventEmitter { * the dup, they'll be lost */ if (lastQueued && !lastQueued.sendAttempted && bundleWith(lastQueued.message, msg, maxSize)) { if (!lastQueued.merged) { - lastQueued.callback = Multicaster.create([lastQueued.callback]); + lastQueued.callback = Multicaster.create(this.logger, [lastQueued.callback]); lastQueued.merged = true; } (lastQueued.callback as MulticasterInstance).push(callback); @@ -1754,6 +1861,8 @@ class ConnectionManager extends EventEmitter { sendQueuedMessages(): void { Logger.logAction( + this.logger, + Logger.LOG_MICRO, 'ConnectionManager.sendQueuedMessages()', 'sending ' + this.queuedMessages.count() + ' queued messages', @@ -1765,6 +1874,8 @@ class ConnectionManager extends EventEmitter { queuePendingMessages(pendingMessages: Array): void { if (pendingMessages && pendingMessages.length) { Logger.logAction( + this.logger, + Logger.LOG_MICRO, 'ConnectionManager.queuePendingMessages()', 'queueing ' + pendingMessages.length + ' pending messages', @@ -1777,6 +1888,8 @@ class ConnectionManager extends EventEmitter { const numQueued = this.queuedMessages.count(); if (numQueued > 0) { Logger.logAction( + this.logger, + Logger.LOG_ERROR, 'ConnectionManager.failQueuedMessages()', 'failing ' + numQueued + ' queued messages, err = ' + Utils.inspectError(err), @@ -1801,6 +1914,8 @@ class ConnectionManager extends EventEmitter { this.processChannelMessage(pendingChannelMessage.message) .catch((err) => { Logger.logAction( + this.logger, + Logger.LOG_ERROR, 'ConnectionManager.processNextPendingChannelMessage() received error ', err, @@ -1820,7 +1935,7 @@ class ConnectionManager extends EventEmitter { ping(transport: Transport | null, callback: Function): void { /* if transport is specified, try that */ if (transport) { - Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.ping()', 'transport = ' + transport); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.ping()', 'transport = ' + transport); const onTimeout = function () { transport.off('heartbeat', onHeartbeat); @@ -1913,11 +2028,11 @@ class ConnectionManager extends EventEmitter { this.notifyState({ state: 'failed', error: err }); } else if (err.statusCode === HttpStatusCodes.Forbidden) { const msg = 'Client configured authentication provider returned 403; failing the connection'; - Logger.logAction(Logger.LOG_ERROR, 'ConnectionManager.actOnErrorFromAuthorize()', msg); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'ConnectionManager.actOnErrorFromAuthorize()', msg); this.notifyState({ state: 'failed', error: new ErrorInfo(msg, 80019, 403, err) }); } else { const msg = 'Client configured authentication provider request failed'; - Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.actOnErrorFromAuthorize', msg); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'ConnectionManager.actOnErrorFromAuthorize', msg); this.notifyState({ state: this.state.failState as string, error: new ErrorInfo(msg, 80019, 401, err) }); } } @@ -1934,7 +2049,7 @@ class ConnectionManager extends EventEmitter { if (clientId) { const err = this.realtime.auth._uncheckedSetClientId(clientId); if (err) { - Logger.logAction(Logger.LOG_ERROR, 'ConnectionManager.onConnectionDetailsUpdate()', err.message); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'ConnectionManager.onConnectionDetailsUpdate()', err.message); /* Errors setting the clientId are fatal to the connection */ transport.fail(err); return; diff --git a/src/common/lib/transport/messagequeue.ts b/src/common/lib/transport/messagequeue.ts index 3544e9042..a335a585b 100644 --- a/src/common/lib/transport/messagequeue.ts +++ b/src/common/lib/transport/messagequeue.ts @@ -6,8 +6,8 @@ import { PendingMessage } from './protocol'; class MessageQueue extends EventEmitter { messages: Array; - constructor() { - super(); + constructor(logger: Logger) { + super(logger); this.messages = []; } @@ -40,7 +40,12 @@ class MessageQueue extends EventEmitter { } completeMessages(serial: number, count: number, err?: ErrorInfo | null): void { - Logger.logAction(Logger.LOG_MICRO, 'MessageQueue.completeMessages()', 'serial = ' + serial + '; count = ' + count); + Logger.logAction( + this.logger, + Logger.LOG_MICRO, + 'MessageQueue.completeMessages()', + 'serial = ' + serial + '; count = ' + count, + ); err = err || null; const messages = this.messages; if (messages.length === 0) { @@ -71,7 +76,12 @@ class MessageQueue extends EventEmitter { } clear(): void { - Logger.logAction(Logger.LOG_MICRO, 'MessageQueue.clear()', 'clearing ' + this.messages.length + ' messages'); + Logger.logAction( + this.logger, + Logger.LOG_MICRO, + 'MessageQueue.clear()', + 'clearing ' + this.messages.length + ' messages', + ); this.messages = []; this.emit('idle'); } diff --git a/src/common/lib/transport/protocol.ts b/src/common/lib/transport/protocol.ts index ee396767a..0dccbdb34 100644 --- a/src/common/lib/transport/protocol.ts +++ b/src/common/lib/transport/protocol.ts @@ -29,9 +29,9 @@ class Protocol extends EventEmitter { messageQueue: MessageQueue; constructor(transport: Transport) { - super(); + super(transport.connectionManager.realtime.logger); this.transport = transport; - this.messageQueue = new MessageQueue(); + this.messageQueue = new MessageQueue(this.logger); transport.on('ack', (serial: number, count: number) => { this.onAck(serial, count); }); @@ -41,12 +41,13 @@ class Protocol extends EventEmitter { } onAck(serial: number, count: number): void { - Logger.logAction(Logger.LOG_MICRO, 'Protocol.onAck()', 'serial = ' + serial + '; count = ' + count); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'Protocol.onAck()', 'serial = ' + serial + '; count = ' + count); this.messageQueue.completeMessages(serial, count); } onNack(serial: number, count: number, err: ErrorInfo): void { Logger.logAction( + this.logger, Logger.LOG_ERROR, 'Protocol.onNack()', 'serial = ' + serial + '; count = ' + count + '; err = ' + Utils.inspectError(err), @@ -70,8 +71,9 @@ class Protocol extends EventEmitter { if (pendingMessage.ackRequired) { this.messageQueue.push(pendingMessage); } - if (Logger.shouldLog(Logger.LOG_MICRO)) { + if (this.logger.shouldLog(Logger.LOG_MICRO)) { Logger.logActionNoStrip( + this.logger, Logger.LOG_MICRO, 'Protocol.send()', 'sending msg; ' + diff --git a/src/common/lib/transport/transport.ts b/src/common/lib/transport/transport.ts index 78a173688..cc8c7217a 100644 --- a/src/common/lib/transport/transport.ts +++ b/src/common/lib/transport/transport.ts @@ -58,7 +58,7 @@ abstract class Transport extends EventEmitter { lastActivity: number | null; constructor(connectionManager: ConnectionManager, auth: Auth, params: TransportParams, forceJsonProtocol?: boolean) { - super(); + super(connectionManager.realtime.logger); if (forceJsonProtocol) { params.format = undefined; params.heartbeats = true; @@ -120,8 +120,9 @@ abstract class Transport extends EventEmitter { } onProtocolMessage(message: ProtocolMessage): void { - if (Logger.shouldLog(Logger.LOG_MICRO)) { + if (this.logger.shouldLog(Logger.LOG_MICRO)) { Logger.logActionNoStrip( + this.logger, Logger.LOG_MICRO, 'Transport.onProtocolMessage()', 'received on ' + @@ -137,6 +138,7 @@ abstract class Transport extends EventEmitter { switch (message.action) { case actions.HEARTBEAT: Logger.logActionNoStrip( + this.logger, Logger.LOG_MICRO, 'Transport.onProtocolMessage()', this.shortName + ' heartbeat; connectionId = ' + this.connectionManager.connectionId, @@ -166,9 +168,10 @@ abstract class Transport extends EventEmitter { // Ignored. break; case actions.AUTH: - Utils.whenPromiseSettles(this.auth.authorize(), function (err: ErrorInfo | null) { + Utils.whenPromiseSettles(this.auth.authorize(), (err: ErrorInfo | null) => { if (err) { Logger.logAction( + this.logger, Logger.LOG_ERROR, 'Transport.onProtocolMessage()', 'Ably requested re-authentication, but unable to obtain a new token: ' + Utils.inspectError(err), @@ -178,6 +181,7 @@ abstract class Transport extends EventEmitter { break; case actions.ERROR: Logger.logAction( + this.logger, Logger.LOG_MINOR, 'Transport.onProtocolMessage()', 'received error action; connectionId = ' + @@ -216,7 +220,7 @@ abstract class Transport extends EventEmitter { /* Used for when the server has disconnected the client (usually with a * DISCONNECTED action) */ const err = message && message.error; - Logger.logAction(Logger.LOG_MINOR, 'Transport.onDisconnect()', 'err = ' + Utils.inspectError(err)); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.onDisconnect()', 'err = ' + Utils.inspectError(err)); this.finish('disconnected', err); } @@ -225,23 +229,23 @@ abstract class Transport extends EventEmitter { * will close the connection and the transport, and do not need to request * a disconnection - RTN15i */ const err = message && message.error; - Logger.logAction(Logger.LOG_MINOR, 'Transport.onFatalError()', 'err = ' + Utils.inspectError(err)); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.onFatalError()', 'err = ' + Utils.inspectError(err)); this.finish('failed', err); } onClose(message: ProtocolMessage): void { const err = message && message.error; - Logger.logAction(Logger.LOG_MINOR, 'Transport.onClose()', 'err = ' + Utils.inspectError(err)); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.onClose()', 'err = ' + Utils.inspectError(err)); this.finish('closed', err); } requestClose(): void { - Logger.logAction(Logger.LOG_MINOR, 'Transport.requestClose()', ''); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.requestClose()', ''); this.send(closeMessage); } requestDisconnect(): void { - Logger.logAction(Logger.LOG_MINOR, 'Transport.requestDisconnect()', ''); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.requestDisconnect()', ''); this.send(disconnectMessage); } @@ -252,7 +256,7 @@ abstract class Transport extends EventEmitter { } dispose(): void { - Logger.logAction(Logger.LOG_MINOR, 'Transport.dispose()', ''); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'Transport.dispose()', ''); this.isDisposed = true; this.off(); } @@ -282,7 +286,7 @@ abstract class Transport extends EventEmitter { const timeRemaining = this.maxIdleInterval - sinceLast; if (timeRemaining <= 0) { const msg = 'No activity seen from realtime in ' + sinceLast + 'ms; assuming connection has dropped'; - Logger.logAction(Logger.LOG_ERROR, 'Transport.onIdleTimerExpire()', msg); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'Transport.onIdleTimerExpire()', msg); this.disconnect(new ErrorInfo(msg, 80003, 408)); } else { this.setIdleTimer(timeRemaining + 100); @@ -317,7 +321,12 @@ abstract class Transport extends EventEmitter { transport.on(['failed', 'disconnected'], errorCb); transport.on('preconnect', function () { - Logger.logAction(Logger.LOG_MINOR, 'Transport.tryConnect()', 'viable transport ' + transport); + Logger.logAction( + connectionManager.realtime.logger, + Logger.LOG_MINOR, + 'Transport.tryConnect()', + 'viable transport ' + transport, + ); clearTimeout(transportAttemptTimer); transport.off(['failed', 'disconnected'], errorCb); callback(null, transport); diff --git a/src/common/lib/transport/websockettransport.ts b/src/common/lib/transport/websockettransport.ts index 0efe0eba0..8fad206d7 100644 --- a/src/common/lib/transport/websockettransport.ts +++ b/src/common/lib/transport/websockettransport.ts @@ -38,6 +38,7 @@ class WebSocketTransport extends Transport { createWebSocket(uri: string, connectParams: Record) { this.uri = uri + Utils.toQueryString(connectParams); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.createWebSocket()', 'uri:' + this.uri); return new Platform.Config.WebSocket(this.uri); } @@ -46,14 +47,14 @@ class WebSocketTransport extends Transport { } connect() { - Logger.logAction(Logger.LOG_MINOR, 'WebSocketTransport.connect()', 'starting'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.connect()', 'starting'); Transport.prototype.connect.call(this); const self = this, params = this.params, options = params.options; const wsScheme = options.tls ? 'wss://' : 'ws://'; const wsUri = wsScheme + this.wsHost + ':' + Defaults.getPort(options) + '/'; - Logger.logAction(Logger.LOG_MINOR, 'WebSocketTransport.connect()', 'uri: ' + wsUri); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.connect()', 'uri: ' + wsUri); Utils.whenPromiseSettles( this.auth.getAuthParams(), function (err: ErrorInfo | null, authParams?: Record) { @@ -62,7 +63,12 @@ class WebSocketTransport extends Transport { } let paramStr = ''; for (const param in authParams) paramStr += ' ' + param + ': ' + authParams[param] + ';'; - Logger.logAction(Logger.LOG_MINOR, 'WebSocketTransport.connect()', 'authParams:' + paramStr + ' err: ' + err); + Logger.logAction( + self.logger, + Logger.LOG_MINOR, + 'WebSocketTransport.connect()', + 'authParams:' + paramStr + ' err: ' + err, + ); if (err) { self.disconnect(err); return; @@ -92,6 +98,7 @@ class WebSocketTransport extends Transport { } } catch (e) { Logger.logAction( + self.logger, Logger.LOG_ERROR, 'WebSocketTransport.connect()', 'Unexpected exception creating websocket: err = ' + ((e as Error).stack || (e as Error).message), @@ -105,7 +112,7 @@ class WebSocketTransport extends Transport { send(message: ProtocolMessage) { const wsConnection = this.wsConnection; if (!wsConnection) { - Logger.logAction(Logger.LOG_ERROR, 'WebSocketTransport.send()', 'No socket connection'); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'WebSocketTransport.send()', 'No socket connection'); return; } try { @@ -114,7 +121,7 @@ class WebSocketTransport extends Transport { ); } catch (e) { const msg = 'Exception from ws connection when trying to send: ' + Utils.inspectError(e); - Logger.logAction(Logger.LOG_ERROR, 'WebSocketTransport.send()', msg); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'WebSocketTransport.send()', msg); /* Don't try to request a disconnect, that'll just involve sending data * down the websocket again. Just finish the transport. */ this.finish('disconnected', new ErrorInfo(msg, 50000, 500)); @@ -123,6 +130,7 @@ class WebSocketTransport extends Transport { onWsData(data: string) { Logger.logAction( + this.logger, Logger.LOG_MICRO, 'WebSocketTransport.onWsData()', 'data received; length = ' + data.length + '; type = ' + typeof data, @@ -138,6 +146,7 @@ class WebSocketTransport extends Transport { ); } catch (e) { Logger.logAction( + this.logger, Logger.LOG_ERROR, 'WebSocketTransport.onWsData()', 'Unexpected exception handing channel message: ' + (e as Error).stack, @@ -146,7 +155,7 @@ class WebSocketTransport extends Transport { } onWsOpen() { - Logger.logAction(Logger.LOG_MINOR, 'WebSocketTransport.onWsOpen()', 'opened WebSocket'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.onWsOpen()', 'opened WebSocket'); this.emit('preconnect'); } @@ -164,20 +173,25 @@ class WebSocketTransport extends Transport { } delete this.wsConnection; if (wasClean) { - Logger.logAction(Logger.LOG_MINOR, 'WebSocketTransport.onWsClose()', 'Cleanly closed WebSocket'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.onWsClose()', 'Cleanly closed WebSocket'); const err = new ErrorInfo('Websocket closed', 80003, 400); this.finish('disconnected', err); } else { const msg = 'Unclean disconnection of WebSocket ; code = ' + code, err = new ErrorInfo(msg, 80003, 400); - Logger.logAction(Logger.LOG_MINOR, 'WebSocketTransport.onWsClose()', msg); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.onWsClose()', msg); this.finish('disconnected', err); } this.emit('disposed'); } onWsError(err: ErrorEvent) { - Logger.logAction(Logger.LOG_MINOR, 'WebSocketTransport.onError()', 'Error from WebSocket: ' + err.message); + Logger.logAction( + this.logger, + Logger.LOG_MINOR, + 'WebSocketTransport.onError()', + 'Error from WebSocket: ' + err.message, + ); /* Wait a tick before aborting: if the websocket was connected, this event * will be immediately followed by an onclose event with a close code. Allow * that to close it (so we see the close code) rather than anticipating it */ @@ -187,7 +201,7 @@ class WebSocketTransport extends Transport { } dispose() { - Logger.logAction(Logger.LOG_MINOR, 'WebSocketTransport.dispose()', ''); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'WebSocketTransport.dispose()', ''); this.isDisposed = true; const wsConnection = this.wsConnection; if (wsConnection) { @@ -198,8 +212,8 @@ class WebSocketTransport extends Transport { delete this.wsConnection; /* defer until the next event loop cycle before closing the socket, * giving some implementations the opportunity to send any outstanding close message */ - Platform.Config.nextTick(function () { - Logger.logAction(Logger.LOG_MICRO, 'WebSocketTransport.dispose()', 'closing websocket'); + Platform.Config.nextTick(() => { + Logger.logAction(this.logger, Logger.LOG_MICRO, 'WebSocketTransport.dispose()', 'closing websocket'); if (!wsConnection) { throw new Error('WebSocketTransport.dispose(): wsConnection is not defined'); } diff --git a/src/common/lib/types/defaultmessage.ts b/src/common/lib/types/defaultmessage.ts index 286ceeef5..dfc4a02b1 100644 --- a/src/common/lib/types/defaultmessage.ts +++ b/src/common/lib/types/defaultmessage.ts @@ -10,17 +10,18 @@ import * as API from '../../../../ably'; import Platform from 'common/platform'; import PresenceMessage from './presencemessage'; import { ChannelOptions } from 'common/types/channel'; +import Logger from '../util/logger'; /** `DefaultMessage` is the class returned by `DefaultRest` and `DefaultRealtime`’s `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. */ export class DefaultMessage extends Message { static async fromEncoded(encoded: unknown, inputOptions?: API.ChannelOptions): Promise { - return fromEncoded(Platform.Crypto, encoded, inputOptions); + return fromEncoded(Logger.defaultLogger, Platform.Crypto, encoded, inputOptions); } static async fromEncodedArray(encodedArray: Array, options?: API.ChannelOptions): Promise { - return fromEncodedArray(Platform.Crypto, encodedArray, options); + return fromEncodedArray(Logger.defaultLogger, Platform.Crypto, encodedArray, options); } // Used by tests diff --git a/src/common/lib/types/defaultpresencemessage.ts b/src/common/lib/types/defaultpresencemessage.ts index d6639af31..1b8592c3e 100644 --- a/src/common/lib/types/defaultpresencemessage.ts +++ b/src/common/lib/types/defaultpresencemessage.ts @@ -1,4 +1,5 @@ import * as API from '../../../../ably'; +import Logger from '../util/logger'; import PresenceMessage, { fromEncoded, fromEncodedArray, fromValues } from './presencemessage'; /** @@ -6,14 +7,14 @@ import PresenceMessage, { fromEncoded, fromEncodedArray, fromValues } from './pr */ export class DefaultPresenceMessage extends PresenceMessage { static async fromEncoded(encoded: unknown, inputOptions?: API.ChannelOptions): Promise { - return fromEncoded(encoded, inputOptions); + return fromEncoded(Logger.defaultLogger, encoded, inputOptions); } static async fromEncodedArray( encodedArray: Array, options?: API.ChannelOptions, ): Promise { - return fromEncodedArray(encodedArray, options); + return fromEncodedArray(Logger.defaultLogger, encodedArray, options); } static fromValues(values: PresenceMessage | Record, stringifyAction?: boolean): PresenceMessage { diff --git a/src/common/lib/types/message.ts b/src/common/lib/types/message.ts index f1c44cb26..7cc8b80ac 100644 --- a/src/common/lib/types/message.ts +++ b/src/common/lib/types/message.ts @@ -45,11 +45,12 @@ function normaliseContext(context: CipherOptions | EncodingDecodingContext | Cha function normalizeCipherOptions( Crypto: IUntypedCryptoStatic | null, + logger: Logger, options: API.ChannelOptions | null, ): ChannelOptions { if (options && options.cipher) { if (!Crypto) Utils.throwMissingPluginError('Crypto'); - const cipher = Crypto.getCipher(options.cipher); + const cipher = Crypto.getCipher(options.cipher, logger); return { cipher: cipher.cipherParams, channelCipher: cipher.cipher, @@ -76,30 +77,32 @@ function getMessageSize(msg: Message) { } export async function fromEncoded( + logger: Logger, Crypto: IUntypedCryptoStatic | null, encoded: unknown, inputOptions?: API.ChannelOptions, ): Promise { const msg = fromValues(encoded); - const options = normalizeCipherOptions(Crypto, inputOptions ?? null); + const options = normalizeCipherOptions(Crypto, logger, inputOptions ?? null); /* if decoding fails at any point, catch and return the message decoded to * the fullest extent possible */ try { await decode(msg, options); } catch (e) { - Logger.logAction(Logger.LOG_ERROR, 'Message.fromEncoded()', (e as Error).toString()); + Logger.logAction(logger, Logger.LOG_ERROR, 'Message.fromEncoded()', (e as Error).toString()); } return msg; } export async function fromEncodedArray( + logger: Logger, Crypto: IUntypedCryptoStatic | null, encodedArray: Array, options?: API.ChannelOptions, ): Promise { return Promise.all( encodedArray.map(function (encoded) { - return fromEncoded(Crypto, encoded, options); + return fromEncoded(logger, Crypto, encoded, options); }), ); } @@ -248,6 +251,7 @@ export async function decode( export async function fromResponseBody( body: Array, options: ChannelOptions | EncodingDecodingContext, + logger: Logger, MsgPack: MsgPack | null, format?: Utils.Format, ): Promise { @@ -260,7 +264,7 @@ export async function fromResponseBody( try { await decode(msg, options); } catch (e) { - Logger.logAction(Logger.LOG_ERROR, 'Message.fromResponseBody()', (e as Error).toString()); + Logger.logAction(logger, Logger.LOG_ERROR, 'Message.fromResponseBody()', (e as Error).toString()); } } return body; diff --git a/src/common/lib/types/presencemessage.ts b/src/common/lib/types/presencemessage.ts index 5cb1b690c..34e0d2d06 100644 --- a/src/common/lib/types/presencemessage.ts +++ b/src/common/lib/types/presencemessage.ts @@ -11,25 +11,30 @@ function toActionValue(actionString: string) { return actions.indexOf(actionString); } -export async function fromEncoded(encoded: unknown, options?: API.ChannelOptions): Promise { +export async function fromEncoded( + logger: Logger, + encoded: unknown, + options?: API.ChannelOptions, +): Promise { const msg = fromValues(encoded as PresenceMessage | Record, true); /* if decoding fails at any point, catch and return the message decoded to * the fullest extent possible */ try { await decode(msg, options ?? {}); } catch (e) { - Logger.logAction(Logger.LOG_ERROR, 'PresenceMessage.fromEncoded()', (e as Error).toString()); + Logger.logAction(logger, Logger.LOG_ERROR, 'PresenceMessage.fromEncoded()', (e as Error).toString()); } return msg; } export async function fromEncodedArray( + logger: Logger, encodedArray: unknown[], options?: API.ChannelOptions, ): Promise { return Promise.all( encodedArray.map(function (encoded) { - return fromEncoded(encoded, options); + return fromEncoded(logger, encoded, options); }), ); } @@ -50,6 +55,7 @@ export const decode = decodeMessage; export async function fromResponseBody( body: Record[], options: CipherOptions, + logger: Logger, MsgPack: MsgPack | null, format?: Utils.Format, ): Promise { @@ -63,7 +69,7 @@ export async function fromResponseBody( try { await decode(msg, options); } catch (e) { - Logger.logAction(Logger.LOG_ERROR, 'PresenceMessage.fromResponseBody()', (e as Error).toString()); + Logger.logAction(logger, Logger.LOG_ERROR, 'PresenceMessage.fromResponseBody()', (e as Error).toString()); } } return messages; diff --git a/src/common/lib/util/defaults.ts b/src/common/lib/util/defaults.ts index 3d7fdf32d..43f3218c6 100644 --- a/src/common/lib/util/defaults.ts +++ b/src/common/lib/util/defaults.ts @@ -44,14 +44,13 @@ type CompleteDefaults = IDefaults & { getFallbackHosts(options: NormalisedClientOptions): string[]; getHosts(options: NormalisedClientOptions, ws?: boolean): string[]; checkHost(host: string): void; - getRealtimeHost(options: ClientOptions, production: boolean, environment: string): string; objectifyOptions( options: undefined | ClientOptions | string, allowKeyOrToken: boolean, sourceForErrorMessage: string, modularPluginsToInclude?: ModularPlugins, ): ClientOptions; - normaliseOptions(options: ClientOptions, MsgPack: MsgPack | null): NormalisedClientOptions; + normaliseOptions(options: ClientOptions, MsgPack: MsgPack | null, logger?: Logger): NormalisedClientOptions; defaultGetHeaders(options: NormalisedClientOptions, headersOptions?: HeadersOptions): Record; defaultPostHeaders(options: NormalisedClientOptions, headersOptions?: HeadersOptions): Record; }; @@ -152,12 +151,13 @@ function checkHost(host: string): void { } } -function getRealtimeHost(options: ClientOptions, production: boolean, environment: string): string { +function getRealtimeHost(options: ClientOptions, production: boolean, environment: string, logger: Logger): string { if (options.realtimeHost) return options.realtimeHost; /* prefer setting realtimeHost to restHost as a custom restHost typically indicates * a development environment is being used that can't be inferred by the library */ if (options.restHost) { Logger.logAction( + logger, Logger.LOG_MINOR, 'Defaults.normaliseOptions', 'restHost is set to "' + @@ -200,7 +200,7 @@ export function objectifyOptions( const msg = allowKeyOrToken ? `${sourceForErrorMessage} must be initialized with either a client options object, an Ably API key, or an Ably Token` : `${sourceForErrorMessage} must be initialized with a client options object`; - Logger.logAction(Logger.LOG_ERROR, `${sourceForErrorMessage}()`, msg); + Logger.logAction(Logger.defaultLogger, Logger.LOG_ERROR, `${sourceForErrorMessage}()`, msg); throw new Error(msg); } @@ -210,7 +210,7 @@ export function objectifyOptions( if (options.indexOf(':') == -1) { if (!allowKeyOrToken) { 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’s \`token\` property.)`; - Logger.logAction(Logger.LOG_ERROR, `${sourceForErrorMessage}()`, msg); + Logger.logAction(Logger.defaultLogger, Logger.LOG_ERROR, `${sourceForErrorMessage}()`, msg); throw new Error(msg); } @@ -218,7 +218,7 @@ export function objectifyOptions( } else { if (!allowKeyOrToken) { 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’s \`key\` property.)`; - Logger.logAction(Logger.LOG_ERROR, `${sourceForErrorMessage}()`, msg); + Logger.logAction(Logger.defaultLogger, Logger.LOG_ERROR, `${sourceForErrorMessage}()`, msg); throw new Error(msg); } @@ -235,9 +235,14 @@ export function objectifyOptions( return optionsObj; } -export function normaliseOptions(options: ClientOptions, MsgPack: MsgPack | null): NormalisedClientOptions { +export function normaliseOptions( + options: ClientOptions, + MsgPack: MsgPack | null, + logger: Logger = Logger.defaultLogger, // should only be omitted by tests +): NormalisedClientOptions { if (typeof options.recover === 'function' && options.closeOnUnload === true) { Logger.logAction( + logger, Logger.LOG_ERROR, 'Defaults.normaliseOptions', 'closeOnUnload was true and a session recovery function was set - these are mutually exclusive, so unsetting the latter', @@ -262,7 +267,7 @@ export function normaliseOptions(options: ClientOptions, MsgPack: MsgPack | null } const restHost = options.restHost || (production ? Defaults.REST_HOST : environment + '-' + Defaults.REST_HOST); - const realtimeHost = getRealtimeHost(options, production, environment); + const realtimeHost = getRealtimeHost(options, production, environment, logger); (options.fallbackHosts || []).concat(restHost, realtimeHost).forEach(checkHost); @@ -314,11 +319,11 @@ export function normaliseOptions(options: ClientOptions, MsgPack: MsgPack | null }; } -export function normaliseChannelOptions(Crypto: IUntypedCryptoStatic | null, options?: ChannelOptions) { +export function normaliseChannelOptions(Crypto: IUntypedCryptoStatic | null, logger: Logger, options?: ChannelOptions) { const channelOptions = options || {}; if (channelOptions.cipher) { if (!Crypto) Utils.throwMissingPluginError('Crypto'); - const cipher = Crypto.getCipher(channelOptions.cipher); + const cipher = Crypto.getCipher(channelOptions.cipher, logger); channelOptions.cipher = cipher.cipherParams; channelOptions.channelCipher = cipher.cipher; } else if ('cipher' in channelOptions) { diff --git a/src/common/lib/util/eventemitter.ts b/src/common/lib/util/eventemitter.ts index 830962ddd..4c7fef0c9 100644 --- a/src/common/lib/util/eventemitter.ts +++ b/src/common/lib/util/eventemitter.ts @@ -3,11 +3,12 @@ import Logger from './logger'; import Platform from 'common/platform'; /* Call the listener, catch any exceptions and log, but continue operation*/ -function callListener(eventThis: { event: string }, listener: Function, args: unknown[]) { +function callListener(logger: Logger, eventThis: { event: string }, listener: Function, args: unknown[]) { try { listener.apply(eventThis, args); } catch (e) { Logger.logAction( + logger, Logger.LOG_ERROR, 'EventEmitter.emit()', 'Unexpected listener exception: ' + e + '; stack = ' + (e && (e as Error).stack), @@ -58,7 +59,7 @@ class EventEmitter { anyOnce: Array; eventsOnce: Record>; - constructor() { + constructor(readonly logger: Logger) { this.any = []; this.events = Object.create(null); this.anyOnce = []; @@ -215,8 +216,8 @@ class EventEmitter { Array.prototype.push.apply(listeners, eventsListeners); } - listeners.forEach(function (listener) { - callListener(eventThis, listener, args); + listeners.forEach((listener) => { + callListener(this.logger, eventThis, listener, args); }); } diff --git a/src/common/lib/util/logger.ts b/src/common/lib/util/logger.ts index 84b743a67..22d8a1617 100644 --- a/src/common/lib/util/logger.ts +++ b/src/common/lib/util/logger.ts @@ -65,9 +65,13 @@ const getDefaultLoggers = (): [Function, Function] => { }; class Logger { - private static logLevel: LogLevels = LogLevels.Error; // default logLevel - private static logHandler: Function; - private static logErrorHandler: Function; + private static defaultLogLevel: LogLevels = LogLevels.Error; // default logLevel + private static defaultLogHandler: Function; + private static defaultLogErrorHandler: Function; + + private logLevel: LogLevels; + private logHandler: Function; + private logErrorHandler: Function; // public constants static readonly LOG_NONE: LogLevels = LogLevels.None; @@ -76,17 +80,24 @@ class Logger { static readonly LOG_MINOR: LogLevels = LogLevels.Minor; static readonly LOG_MICRO: LogLevels = LogLevels.Micro; // aliases - static readonly LOG_DEFAULT: LogLevels = LogLevels.Error; static readonly LOG_DEBUG: LogLevels = LogLevels.Micro; - constructor() { - Logger.logLevel = Logger.LOG_DEFAULT; - } + /** + * 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’t accept any logging configuration. + */ + static defaultLogger: Logger; static initLogHandlers() { const [logHandler, logErrorHandler] = getDefaultLoggers(); - this.logHandler = logHandler; - this.logErrorHandler = logErrorHandler; + this.defaultLogHandler = logHandler; + this.defaultLogErrorHandler = logErrorHandler; + this.defaultLogger = new Logger(); + } + + constructor() { + this.logLevel = Logger.defaultLogLevel; + this.logHandler = Logger.defaultLogHandler; + this.logErrorHandler = Logger.defaultLogErrorHandler; } /* public static functions */ @@ -95,50 +106,54 @@ class Logger { * * The aforementioned plugin expects `level` to be an expression of the form `Logger.LOG_*`; that is, you can’t dynamically specify the log level. */ - static logAction = (level: LogLevels, action: string, message?: string) => { - this.logActionNoStrip(level, action, message); + static logAction = (logger: Logger, level: LogLevels, action: string, message?: string) => { + this.logActionNoStrip(logger, level, action, message); }; /** * 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. */ - static logActionNoStrip(level: LogLevels, action: string, message?: string) { - if (Logger.shouldLog(level)) { - (level === LogLevels.Error ? Logger.logErrorHandler : Logger.logHandler)('Ably: ' + action + ': ' + message); + static logActionNoStrip(logger: Logger, level: LogLevels, action: string, message?: string) { + logger.logAction(level, action, message); + } + + private logAction(level: LogLevels, action: string, message?: string) { + if (this.shouldLog(level)) { + (level === LogLevels.Error ? this.logErrorHandler : this.logHandler)('Ably: ' + action + ': ' + message); } } - static deprecated = (description: string, msg: string) => { - Logger.deprecationWarning(`${description} is deprecated and will be removed in a future version. ${msg}`); + deprecated = (description: string, msg: string) => { + this.deprecationWarning(`${description} is deprecated and will be removed in a future version. ${msg}`); }; - static renamedClientOption(oldName: string, newName: string) { - Logger.deprecationWarning( + renamedClientOption(oldName: string, newName: string) { + this.deprecationWarning( `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.`, ); } - static renamedMethod(className: string, oldName: string, newName: string) { - Logger.deprecationWarning( + renamedMethod(className: string, oldName: string, newName: string) { + this.deprecationWarning( `\`${className}\`’s \`${oldName}\` method has been renamed to \`${newName}\`. Please update your code to use \`${newName}\` instead. \`${oldName}\` will be removed in a future version.`, ); } - static deprecationWarning(message: string) { - if (Logger.shouldLog(LogLevels.Error)) { - Logger.logErrorHandler(`Ably: Deprecation warning - ${message}`); + deprecationWarning(message: string) { + if (this.shouldLog(LogLevels.Error)) { + this.logErrorHandler(`Ably: Deprecation warning - ${message}`); } } /* Where a logging operation is expensive, such as serialisation of data, use shouldLog will prevent the object being serialised if the log level will not output the message */ - static shouldLog = (level: LogLevels) => { - return level <= Logger.logLevel; + shouldLog = (level: LogLevels) => { + return level <= this.logLevel; }; - static setLog = (level: LogLevels | undefined, handler: Function | undefined) => { - if (level !== undefined) Logger.logLevel = level; - if (handler !== undefined) Logger.logHandler = Logger.logErrorHandler = handler; + setLog = (level: LogLevels | undefined, handler: Function | undefined) => { + if (level !== undefined) this.logLevel = level; + if (handler !== undefined) this.logHandler = this.logErrorHandler = handler; }; } diff --git a/src/common/lib/util/multicaster.ts b/src/common/lib/util/multicaster.ts index bf5c32c64..494b04d92 100644 --- a/src/common/lib/util/multicaster.ts +++ b/src/common/lib/util/multicaster.ts @@ -23,7 +23,7 @@ class Multicaster { members: Array>; // Private constructor; use static Multicaster.create instead - private constructor(members?: Array | undefined>) { + private constructor(private readonly logger: Logger, members?: Array | undefined>) { this.members = (members as Array>) || []; } @@ -34,6 +34,7 @@ class Multicaster { member(err, result); } catch (e) { Logger.logAction( + this.logger, Logger.LOG_ERROR, 'Multicaster multiple callback handler', 'Unexpected exception: ' + e + '; stack = ' + (e as Error).stack, @@ -63,8 +64,8 @@ class Multicaster { this.call(err); } - static create(members?: Array | undefined>): MulticasterInstance { - const instance = new Multicaster(members); + static create(logger: Logger, members?: Array | undefined>): MulticasterInstance { + const instance = new Multicaster(logger, members); return Object.assign((err?: ErrorInfo | null, result?: T) => instance.call(err, result), { push: (fn: StandardCallback) => instance.push(fn), createPromise: () => instance.createPromise(), diff --git a/src/common/types/ICryptoStatic.ts b/src/common/types/ICryptoStatic.ts index 38648449c..31ff8a369 100644 --- a/src/common/types/ICryptoStatic.ts +++ b/src/common/types/ICryptoStatic.ts @@ -1,5 +1,6 @@ import * as API from '../../../ably'; import ICipher from './ICipher'; +import Logger from '../../common/lib/util/logger'; export type IGetCipherParams = (API.CipherParams | API.CipherParamOptions) & { iv?: IV }; export interface IGetCipherReturnValue { @@ -11,6 +12,7 @@ export default interface ICryptoStatic, + logger: Logger, ): IGetCipherReturnValue>; } @@ -19,5 +21,5 @@ export default interface ICryptoStatic | null) return uri + (params ? '?' : '') + paramString(params); } -function logResult(result: RequestResult, method: HttpMethods, uri: string, params: Record | null) { +function logResult( + result: RequestResult, + method: HttpMethods, + uri: string, + params: Record | null, + logger: Logger, +) { if (result.error) { Logger.logActionNoStrip( + logger, Logger.LOG_MICRO, 'Http.' + method + '()', 'Received Error; ' + appendingParams(uri, params) + '; Error: ' + Utils.inspectError(result.error), ); } else { Logger.logActionNoStrip( + logger, Logger.LOG_MICRO, 'Http.' + method + '()', 'Received; ' + @@ -97,9 +105,10 @@ function logResult(result: RequestResult, method: HttpMethods, uri: string, para } } -function logRequest(method: HttpMethods, uri: string, body: RequestBody | null, params: RequestParams) { - if (Logger.shouldLog(Logger.LOG_MICRO)) { +function logRequest(method: HttpMethods, uri: string, body: RequestBody | null, params: RequestParams, logger: Logger) { + if (logger.shouldLog(Logger.LOG_MICRO)) { Logger.logActionNoStrip( + logger, Logger.LOG_MICRO, 'Http.' + method + '()', 'Sending; ' + @@ -122,6 +131,10 @@ export class Http { : undefined; } + get logger(): Logger { + return this.client?.logger ?? Logger.defaultLogger; + } + get supportsAuthHeaders() { return this.platformHttp.supportsAuthHeaders; } @@ -239,12 +252,12 @@ export class Http { params: RequestParams, ): Promise { try { - logRequest(method, uri, body, params); + logRequest(method, uri, body, params, this.logger); const result = await this.platformHttp.doUri(method, uri, headers, body, params); - if (Logger.shouldLog(Logger.LOG_MICRO)) { - logResult(result, method, uri, params); + if (this.logger.shouldLog(Logger.LOG_MICRO)) { + logResult(result, method, uri, params, this.logger); } return result; diff --git a/src/platform/nodejs/lib/transport/nodecomettransport.js b/src/platform/nodejs/lib/transport/nodecomettransport.js index 9a4eb0a9e..045a2d9f3 100644 --- a/src/platform/nodejs/lib/transport/nodecomettransport.js +++ b/src/platform/nodejs/lib/transport/nodecomettransport.js @@ -96,7 +96,7 @@ class NodeCometTransport extends CometTransport { class Request extends EventEmitter { constructor(uri, headers, params, body, requestMode, format, timeouts, transport) { - super(); + super(transport.logger); if (typeof uri == 'string') uri = url.parse(uri); var tls = uri.protocol == 'https:'; @@ -199,7 +199,7 @@ class Request extends EventEmitter { chunk = JSON.parse(chunk); } catch (e) { var msg = 'Malformed response body from server: ' + e.message; - Logger.logAction(Logger.LOG_ERROR, 'NodeCometTransport.Request.readStream()', msg); + Logger.logAction(self.logger, Logger.LOG_ERROR, 'NodeCometTransport.Request.readStream()', msg); self.complete(new PartialErrorInfo(msg, null, 400)); return; } @@ -256,7 +256,7 @@ class Request extends EventEmitter { body = JSON.parse(String(body)); } catch (e) { var msg = 'Malformed response body from server: ' + e.message; - Logger.logAction(Logger.LOG_ERROR, 'NodeCometTransport.Request.readFully()', msg); + Logger.logAction(self.logger, Logger.LOG_ERROR, 'NodeCometTransport.Request.readFully()', msg); self.complete(new PartialErrorInfo(msg, null, 400)); return; } @@ -301,7 +301,7 @@ class Request extends EventEmitter { } abort() { - Logger.logAction(Logger.LOG_MINOR, 'NodeCometTransport.Request.abort()', ''); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'NodeCometTransport.Request.abort()', ''); var timer = this.timer; if (timer) { clearTimeout(timer); @@ -309,7 +309,7 @@ class Request extends EventEmitter { } var req = this.req; if (req) { - Logger.logAction(Logger.LOG_MINOR, 'NodeCometTransport.Request.abort()', 'aborting request'); + Logger.logAction(this.logger, Logger.LOG_MINOR, 'NodeCometTransport.Request.abort()', 'aborting request'); req.removeListener('error', this.onReqError); req.on('error', noop); req.abort(); diff --git a/src/platform/nodejs/lib/util/crypto.ts b/src/platform/nodejs/lib/util/crypto.ts index 7efe4e43c..1a0854484 100644 --- a/src/platform/nodejs/lib/util/crypto.ts +++ b/src/platform/nodejs/lib/util/crypto.ts @@ -189,12 +189,12 @@ var createCryptoClass = function (bufferUtils: typeof BufferUtils) { * @param params either a CipherParams instance or some subset of its * fields that includes a key */ - static getCipher(params: IGetCipherParams) { + static getCipher(params: IGetCipherParams, logger: Logger) { var cipherParams = isInstCipherParams(params) ? (params as CipherParams) : this.getDefaultParams(params); return { cipherParams: cipherParams, - cipher: new CBCCipher(cipherParams, params.iv ?? null), + cipher: new CBCCipher(cipherParams, params.iv ?? null, logger), }; } } @@ -207,14 +207,14 @@ var createCryptoClass = function (bufferUtils: typeof BufferUtils) { iv: Buffer | null; encryptCipher: NodeCipher | null = null; - constructor(params: CipherParams, iv: Buffer | null) { + constructor(params: CipherParams, iv: Buffer | null, private readonly logger: Logger) { this.algorithm = params.algorithm + '-' + String(params.keyLength) + '-' + params.mode; this.key = params.key; this.iv = iv; } async encrypt(plaintext: InputPlaintext): Promise { - Logger.logAction(Logger.LOG_MICRO, 'CBCCipher.encrypt()', ''); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'CBCCipher.encrypt()', ''); const iv = await this.getIv(); if (!this.encryptCipher) { diff --git a/src/platform/web/lib/http/http.ts b/src/platform/web/lib/http/http.ts index ffe276163..99516cc3b 100644 --- a/src/platform/web/lib/http/http.ts +++ b/src/platform/web/lib/http/http.ts @@ -64,6 +64,7 @@ const Http = class { body, XHRStates.REQ_SEND, (client && client.options.timeouts) ?? null, + this.logger, method, ); req.once( @@ -86,6 +87,7 @@ const Http = class { } else { this.checkConnectivity = async function () { Logger.logAction( + this.logger, Logger.LOG_MICRO, '(XHRRequest)Http.checkConnectivity()', 'Sending; ' + connectivityCheckUrl, @@ -106,7 +108,7 @@ const Http = class { result = !requestResult.error && (requestResult.body as string)?.replace(/\n/, '') == 'yes'; } - Logger.logAction(Logger.LOG_MICRO, '(XHRRequest)Http.checkConnectivity()', 'Result: ' + result); + Logger.logAction(this.logger, Logger.LOG_MICRO, '(XHRRequest)Http.checkConnectivity()', 'Result: ' + result); return result; }; } @@ -116,10 +118,15 @@ const Http = class { return fetchRequestImplementation(method, client ?? null, uri, headers, params, body); }; this.checkConnectivity = async function () { - Logger.logAction(Logger.LOG_MICRO, '(Fetch)Http.checkConnectivity()', 'Sending; ' + connectivityCheckUrl); + Logger.logAction( + this.logger, + Logger.LOG_MICRO, + '(Fetch)Http.checkConnectivity()', + 'Sending; ' + connectivityCheckUrl, + ); const requestResult = await this.doUri(HttpMethods.Get, connectivityCheckUrl, null, null, null); const result = !requestResult.error && (requestResult.body as string)?.replace(/\n/, '') == 'yes'; - Logger.logAction(Logger.LOG_MICRO, '(Fetch)Http.checkConnectivity()', 'Result: ' + result); + Logger.logAction(this.logger, Logger.LOG_MICRO, '(Fetch)Http.checkConnectivity()', 'Result: ' + result); return result; }; } else { @@ -132,6 +139,10 @@ const Http = class { } } + get logger(): Logger { + return this.client?.logger ?? Logger.defaultLogger; + } + async doUri( method: HttpMethods, uri: string, diff --git a/src/platform/web/lib/http/request/fetchrequest.ts b/src/platform/web/lib/http/request/fetchrequest.ts index d262ef1af..27dd29bd6 100644 --- a/src/platform/web/lib/http/request/fetchrequest.ts +++ b/src/platform/web/lib/http/request/fetchrequest.ts @@ -69,6 +69,10 @@ export default async function fetchRequest( clearTimeout(timeout!); + if (res.status == 204) { + return { error: null, statusCode: res.status }; + } + const contentType = res.headers.get('Content-Type'); let body; if (contentType && contentType.indexOf('application/x-msgpack') > -1) { diff --git a/src/platform/web/lib/http/request/xhrrequest.ts b/src/platform/web/lib/http/request/xhrrequest.ts index 942097d26..f390388d7 100644 --- a/src/platform/web/lib/http/request/xhrrequest.ts +++ b/src/platform/web/lib/http/request/xhrrequest.ts @@ -69,9 +69,10 @@ class XHRRequest extends EventEmitter implements IXHRRequest { body: RequestBody | null, requestMode: number, timeouts: Record, + logger: Logger, method?: HttpMethods, ) { - super(); + super(logger); params = params || {}; params.rnd = Utils.cheapRandStr(); this.uri = uri + Utils.toQueryString(params); @@ -93,6 +94,7 @@ class XHRRequest extends EventEmitter implements IXHRRequest { body: RequestBody | null, requestMode: number, timeouts: Record | null, + logger: Logger, method?: HttpMethods, ): XHRRequest { /* XHR requests are used either with the context being a realtime @@ -106,6 +108,7 @@ class XHRRequest extends EventEmitter implements IXHRRequest { body, requestMode, _timeouts, + logger, method, ); } @@ -177,7 +180,7 @@ class XHRRequest extends EventEmitter implements IXHRRequest { ) => { let errorMessage = message + ' (event type: ' + errorEvent.type + ')'; if (this?.xhr?.statusText) errorMessage += ', current statusText is ' + this.xhr.statusText; - Logger.logAction(Logger.LOG_ERROR, 'Request.on' + errorEvent.type + '()', errorMessage); + Logger.logAction(this.logger, Logger.LOG_ERROR, 'Request.on' + errorEvent.type + '()', errorMessage); this.complete(new PartialErrorInfo(errorMessage, code, statusCode)); }; xhr.onerror = function (errorEvent) { diff --git a/src/platform/web/lib/transport/xhrpollingtransport.ts b/src/platform/web/lib/transport/xhrpollingtransport.ts index 12268fed8..0a08b5c3b 100644 --- a/src/platform/web/lib/transport/xhrpollingtransport.ts +++ b/src/platform/web/lib/transport/xhrpollingtransport.ts @@ -30,7 +30,7 @@ class XHRPollingTransport extends CometTransport { body: RequestBody | null, requestMode: number, ) { - return XHRRequest.createRequest(uri, headers, params, body, requestMode, this.timeouts); + return XHRRequest.createRequest(uri, headers, params, body, requestMode, this.timeouts, this.logger); } } diff --git a/src/platform/web/lib/util/crypto.ts b/src/platform/web/lib/util/crypto.ts index b7dab53bf..097e4eef5 100644 --- a/src/platform/web/lib/util/crypto.ts +++ b/src/platform/web/lib/util/crypto.ts @@ -152,12 +152,12 @@ var createCryptoClass = function (config: IPlatformConfig, bufferUtils: typeof B * @param params either a CipherParams instance or some subset of its * fields that includes a key */ - static getCipher(params: IGetCipherParams) { + static getCipher(params: IGetCipherParams, logger: Logger) { var cipherParams = isCipherParams(params) ? (params as CipherParams) : this.getDefaultParams(params); return { cipherParams: cipherParams, - cipher: new CBCCipher(cipherParams, params.iv ?? null), + cipher: new CBCCipher(cipherParams, params.iv ?? null, logger), }; } } @@ -170,7 +170,7 @@ var createCryptoClass = function (config: IPlatformConfig, bufferUtils: typeof B key: ArrayBuffer; iv: ArrayBuffer | null; - constructor(params: CipherParams, iv: IV | null) { + constructor(params: CipherParams, iv: IV | null, private readonly logger: Logger) { if (!crypto.subtle) { if (isSecureContext) { throw new Error( @@ -207,7 +207,7 @@ var createCryptoClass = function (config: IPlatformConfig, bufferUtils: typeof B } async encrypt(plaintext: InputPlaintext): Promise { - Logger.logAction(Logger.LOG_MICRO, 'CBCCipher.encrypt()', ''); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'CBCCipher.encrypt()', ''); const iv = await this.getIv(); const cryptoKey = await crypto.subtle.importKey('raw', this.key, this.webCryptoAlgorithm, false, ['encrypt']); @@ -217,7 +217,7 @@ var createCryptoClass = function (config: IPlatformConfig, bufferUtils: typeof B } async decrypt(ciphertext: InputCiphertext): Promise { - Logger.logAction(Logger.LOG_MICRO, 'CBCCipher.decrypt()', ''); + Logger.logAction(this.logger, Logger.LOG_MICRO, 'CBCCipher.decrypt()', ''); const ciphertextArrayBuffer = bufferUtils.toArrayBuffer(ciphertext); const iv = ciphertextArrayBuffer.slice(0, DEFAULT_BLOCKLENGTH); diff --git a/src/platform/web/modular/message.ts b/src/platform/web/modular/message.ts index 18c5d1396..539a2f782 100644 --- a/src/platform/web/modular/message.ts +++ b/src/platform/web/modular/message.ts @@ -1,21 +1,22 @@ import * as API from '../../../../ably'; import { Crypto } from './crypto'; import { fromEncoded, fromEncodedArray } from '../../../common/lib/types/message'; +import Logger from '../../../common/lib/util/logger'; // The type assertions for the decode* functions below are due to https://github.com/ably/ably-js/issues/1421 export const decodeMessage = ((obj, options) => { - return fromEncoded(null, obj, options); + return fromEncoded(Logger.defaultLogger, null, obj, options); }) as API.MessageStatic['fromEncoded']; export const decodeEncryptedMessage = ((obj, options) => { - return fromEncoded(Crypto, obj, options); + return fromEncoded(Logger.defaultLogger, Crypto, obj, options); }) as API.MessageStatic['fromEncoded']; export const decodeMessages = ((obj, options) => { - return fromEncodedArray(null, obj, options); + return fromEncodedArray(Logger.defaultLogger, null, obj, options); }) as API.MessageStatic['fromEncodedArray']; export const decodeEncryptedMessages = ((obj, options) => { - return fromEncodedArray(Crypto, obj, options); + return fromEncodedArray(Logger.defaultLogger, Crypto, obj, options); }) as API.MessageStatic['fromEncodedArray']; diff --git a/src/platform/web/modular/presencemessage.ts b/src/platform/web/modular/presencemessage.ts index 60e5351e9..6c9b891a0 100644 --- a/src/platform/web/modular/presencemessage.ts +++ b/src/platform/web/modular/presencemessage.ts @@ -1,8 +1,15 @@ import * as API from '../../../../ably'; import { fromEncoded, fromEncodedArray, fromValues } from '../../../common/lib/types/presencemessage'; +import Logger from '../../../common/lib/util/logger'; // The type assertions for the functions below are due to https://github.com/ably/ably-js/issues/1421 -export const decodePresenceMessage = fromEncoded as API.PresenceMessageStatic['fromEncoded']; -export const decodePresenceMessages = fromEncodedArray as API.PresenceMessageStatic['fromEncodedArray']; +export const decodePresenceMessage = ((obj, options) => { + return fromEncoded(Logger.defaultLogger, obj, options); +}) as API.PresenceMessageStatic['fromEncoded']; + +export const decodePresenceMessages = ((obj, options) => { + return fromEncodedArray(Logger.defaultLogger, obj, options); +}) as API.PresenceMessageStatic['fromEncodedArray']; + export const constructPresenceMessage = fromValues as API.PresenceMessageStatic['fromValues']; diff --git a/start-interception-proxy b/start-interception-proxy new file mode 100755 index 000000000..e0b9cc379 --- /dev/null +++ b/start-interception-proxy @@ -0,0 +1,94 @@ +#!/usr/bin/env bash + +# Runs the server as a background service, exiting once the server is ready to receive requests. +# +# Intended for use in SDKs’ CI jobs. Must be run from the root of this repository. + +set -e + +# We run as the current user so that we can access the generated server certificate (in ~/.mitmproxy) without having to worry about permissions. TODO consider instead generating our own cert and telling mitmproxy to use it, then we also won’t have to have that step where we run mitmproxy once just to generate the certs +start_systemd_service () { + systemd_service=$(cat </dev/null + + echo "Starting ably-sdk-test-proxy systemd service..." 1>&2 + sudo systemctl start ably-sdk-test-proxy.service + echo "Started ably-sdk-test-proxy systemd service." 1>&2 +} + +start_launchd_daemon () { + launchd_daemon=$(cat < + + + + Label + com.ably.test.proxy + WorkingDirectory + $(pwd) + ProgramArguments + + npm + run + test:proxy + + RunAtLoad + + + +LAUNCHD_DAEMON +) + + # https://stackoverflow.com/questions/84882/sudo-echo-something-etc-privilegedfile-doesnt-work + echo "${launchd_daemon}" | sudo tee /Library/LaunchDaemons/com.ably.test.proxy.plist + + echo "Loading ably-sdk-test-proxy launchd daemon..." 1>&2 + sudo launchctl load /Library/LaunchDaemons/com.ably.test.proxy.plist + echo "Loaded ably-sdk-test-proxy launchd daemon." 1>&2 +} + +check_daemon_still_running () { + if uname | grep Linux 1>/dev/null + then + systemctl is-active --quiet ably-sdk-test-proxy.service + elif uname | grep Darwin 1>/dev/null + then + launchctl print system/com.ably.test.proxy 1>/dev/null + fi +} + +if uname | grep Linux 1>/dev/null +then + start_systemd_service +elif uname | grep Darwin 1>/dev/null +then + start_launchd_daemon +else + echo "Unsupported system $(uname); exiting" 1>&2 + exit 1 +fi + +echo "Waiting for sdk-test-proxy server to start on port 8001..." 1>&2 + +# https://stackoverflow.com/questions/27599839/how-to-wait-for-an-open-port-with-netcat +while ! nc -z localhost 8001; do + # Check that the service hasn’t failed (else we’ll be waiting forever) + check_daemon_still_running + sleep 0.5 +done + +echo "sdk-test-proxy server is now listening on port 8001." 1>&2 diff --git a/test/browser/modular.test.js b/test/browser/modular.test.js index 82e5b0698..95ddd2f65 100644 --- a/test/browser/modular.test.js +++ b/test/browser/modular.test.js @@ -37,6 +37,14 @@ function registerAblyModularTests(helper) { }); }; + async function monitorConnectionThenCloseAndFinish(action, realtime, states) { + try { + await helper.monitorConnectionAsync(action, realtime, states); + } finally { + await helper.closeAndFinishAsync(realtime); + } + } + before((done) => { helper.setupApp(done); }); @@ -159,6 +167,7 @@ function registerAblyModularTests(helper) { it(`allows you to ${scenario.description}`, async () => { const client = new BaseRealtime( ablyClientOptions({ + autoConnect: false, ...scenario.getAdditionalClientOptions?.(), plugins: { WebSocketTransport, @@ -185,23 +194,27 @@ function registerAblyModularTests(helper) { it('still allows publishing and subscribing', async () => { const client = new BaseRealtime(ablyClientOptions({ plugins: { WebSocketTransport, FetchRequest } })); - const channel = client.channels.get('channel'); - await channel.attach(); + await monitorConnectionThenCloseAndFinish(async () => { + const channel = client.channels.get('channel'); + await channel.attach(); - const recievedMessagePromise = new Promise((resolve) => { - channel.subscribe((message) => { - resolve(message); + const recievedMessagePromise = new Promise((resolve) => { + channel.subscribe((message) => { + resolve(message); + }); }); - }); - await channel.publish({ data: { foo: 'bar' } }); + await channel.publish({ data: { foo: 'bar' } }); - const receivedMessage = await recievedMessagePromise; - expect(receivedMessage.data).to.eql({ foo: 'bar' }); + const receivedMessage = await recievedMessagePromise; + expect(receivedMessage.data).to.eql({ foo: 'bar' }); + }, client); }); it('allows `auth.createTokenRequest()` without `queryTime` option enabled', async () => { - const client = new BaseRealtime(ablyClientOptions({ plugins: { WebSocketTransport, FetchRequest } })); + const client = new BaseRealtime( + ablyClientOptions({ autoConnect: false, plugins: { WebSocketTransport, FetchRequest } }), + ); const tokenRequest = await client.auth.createTokenRequest(); expect(tokenRequest).to.be.an('object'); @@ -211,6 +224,7 @@ function registerAblyModularTests(helper) { it(`throws an error when attempting to ${scenario.description}`, async () => { const client = new BaseRealtime( ablyClientOptions({ + autoConnect: false, ...scenario.getAdditionalClientOptions?.(), plugins: { WebSocketTransport, @@ -367,6 +381,7 @@ function registerAblyModularTests(helper) { async function testThrowsAnErrorWhenGivenChannelOptionsWithACipher(clientClassConfig) { const client = new clientClassConfig.clientClass( ablyClientOptions({ + ...clientClassConfig.additionalClientOptions, plugins: { ...clientClassConfig.additionalPlugins, FetchRequest, @@ -379,7 +394,11 @@ function registerAblyModularTests(helper) { for (const clientClassConfig of [ { clientClass: BaseRest }, - { clientClass: BaseRealtime, additionalPlugins: { WebSocketTransport } }, + { + clientClass: BaseRealtime, + additionalClientOptions: { autoConnect: false }, + additionalPlugins: { WebSocketTransport }, + }, ]) { describe(clientClassConfig.clientClass.name, () => { it('throws an error when given channel options with a cipher', async () => { @@ -398,38 +417,51 @@ function registerAblyModularTests(helper) { // Publish the message on a channel configured to use encryption, and receive it on one not configured to use encryption const rxClient = new BaseRealtime({ ...clientOptions, plugins: { WebSocketTransport, FetchRequest } }); - const rxChannel = rxClient.channels.get('channel'); - await rxChannel.attach(); - const rxMessagePromise = new Promise((resolve, _) => rxChannel.subscribe((message) => resolve(message))); + await monitorConnectionThenCloseAndFinish(async () => { + const rxChannel = rxClient.channels.get('channel'); + await rxChannel.attach(); - const encryptionChannelOptions = { cipher: { key } }; + const rxMessagePromise = new Promise((resolve, _) => rxChannel.subscribe((message) => resolve(message))); - const txMessage = { name: 'message', data: 'data' }; - const txClient = new clientClassConfig.clientClass({ - ...clientOptions, - plugins: { - ...clientClassConfig.additionalPlugins, - FetchRequest, - Crypto, - }, - }); - const txChannel = txClient.channels.get('channel', encryptionChannelOptions); - await txChannel.publish(txMessage); + const encryptionChannelOptions = { cipher: { key } }; - const rxMessage = await rxMessagePromise; + const txMessage = { name: 'message', data: 'data' }; + const txClient = new clientClassConfig.clientClass({ + ...clientOptions, + plugins: { + ...clientClassConfig.additionalPlugins, + FetchRequest, + Crypto, + }, + }); + + await (clientClassConfig.isRealtime ? monitorConnectionThenCloseAndFinish : async (op) => await op())( + async () => { + const txChannel = txClient.channels.get('channel', encryptionChannelOptions); + await txChannel.publish(txMessage); - // Verify that the message was published with encryption - expect(rxMessage.encoding).to.equal('utf-8/cipher+aes-256-cbc'); + const rxMessage = await rxMessagePromise; - // Verify that the message was correctly encrypted - const rxMessageDecrypted = await decodeEncryptedMessage(rxMessage, encryptionChannelOptions); - testMessageEquality(rxMessageDecrypted, txMessage); + // Verify that the message was published with encryption + expect(rxMessage.encoding).to.equal('utf-8/cipher+aes-256-cbc'); + + // Verify that the message was correctly encrypted + const rxMessageDecrypted = await decodeEncryptedMessage(rxMessage, encryptionChannelOptions); + testMessageEquality(rxMessageDecrypted, txMessage); + }, + txClient, + ); + }, rxClient); } for (const clientClassConfig of [ - { clientClass: BaseRest }, - { clientClass: BaseRealtime, additionalPlugins: { WebSocketTransport } }, + { clientClass: BaseRest, isRealtime: false }, + { + clientClass: BaseRealtime, + additionalPlugins: { WebSocketTransport }, + isRealtime: true, + }, ]) { describe(clientClassConfig.clientClass.name, () => { it('is able to publish encrypted messages', async () => { @@ -494,7 +526,10 @@ function registerAblyModularTests(helper) { }, }), ); - await testRealtimeUsesFormat(client, 'json'); + + await monitorConnectionThenCloseAndFinish(async () => { + await testRealtimeUsesFormat(client, 'json'); + }, client); }); }); }); @@ -528,7 +563,10 @@ function registerAblyModularTests(helper) { }, }), ); - await testRealtimeUsesFormat(client, 'msgpack'); + + await monitorConnectionThenCloseAndFinish(async () => { + await testRealtimeUsesFormat(client, 'msgpack'); + }, client); }); }); }); @@ -537,45 +575,54 @@ function registerAblyModularTests(helper) { describe('RealtimePresence', () => { describe('BaseRealtime without RealtimePresence', () => { - it('throws an error when attempting to access the `presence` property', () => { + it('throws an error when attempting to access the `presence` property', async () => { const client = new BaseRealtime(ablyClientOptions({ plugins: { WebSocketTransport, FetchRequest } })); - const channel = client.channels.get('channel'); - expect(() => channel.presence).to.throw('RealtimePresence plugin not provided'); + await monitorConnectionThenCloseAndFinish(async () => { + const channel = client.channels.get('channel'); + + expect(() => channel.presence).to.throw('RealtimePresence plugin not provided'); + }, client); }); it('doesn’t break when it receives a PRESENCE ProtocolMessage', async () => { const rxClient = new BaseRealtime(ablyClientOptions({ plugins: { WebSocketTransport, FetchRequest } })); - const rxChannel = rxClient.channels.get('channel'); - await rxChannel.attach(); + await monitorConnectionThenCloseAndFinish(async () => { + const rxChannel = rxClient.channels.get('channel'); - const receivedMessagePromise = new Promise((resolve) => rxChannel.subscribe(resolve)); + await rxChannel.attach(); - const txClient = new BaseRealtime( - ablyClientOptions({ - clientId: randomString(), - plugins: { - WebSocketTransport, - FetchRequest, - RealtimePresence, - }, - }), - ); - const txChannel = txClient.channels.get('channel'); + const receivedMessagePromise = new Promise((resolve) => rxChannel.subscribe(resolve)); + + const txClient = new BaseRealtime( + ablyClientOptions({ + clientId: randomString(), + plugins: { + WebSocketTransport, + FetchRequest, + RealtimePresence, + }, + }), + ); + + await monitorConnectionThenCloseAndFinish(async () => { + const txChannel = txClient.channels.get('channel'); - await txChannel.publish('message', 'body'); - await txChannel.presence.enter(); + await txChannel.publish('message', 'body'); + await txChannel.presence.enter(); - // The idea being here that in order for receivedMessagePromise to resolve, rxClient must have first processed the PRESENCE ProtocolMessage that resulted from txChannel.presence.enter() + // The idea being here that in order for receivedMessagePromise to resolve, rxClient must have first processed the PRESENCE ProtocolMessage that resulted from txChannel.presence.enter() - await receivedMessagePromise; + await receivedMessagePromise; + }, txClient); + }, rxClient); }); }); describe('BaseRealtime with RealtimePresence', () => { it('offers realtime presence functionality', async () => { - const rxChannel = new BaseRealtime( + const rxClient = new BaseRealtime( ablyClientOptions({ plugins: { WebSocketTransport, @@ -583,28 +630,36 @@ function registerAblyModularTests(helper) { RealtimePresence, }, }), - ).channels.get('channel'); - const txClientId = randomString(); - const txChannel = new BaseRealtime( - ablyClientOptions({ - clientId: txClientId, - plugins: { - WebSocketTransport, - FetchRequest, - RealtimePresence, - }, - }), - ).channels.get('channel'); + ); + const rxChannel = rxClient.channels.get('channel'); - let resolveRxPresenceMessagePromise; - const rxPresenceMessagePromise = new Promise((resolve, reject) => { - resolveRxPresenceMessagePromise = resolve; - }); - await rxChannel.presence.subscribe('enter', resolveRxPresenceMessagePromise); - await txChannel.presence.enter(); + await monitorConnectionThenCloseAndFinish(async () => { + const txClientId = randomString(); + const txClient = new BaseRealtime( + ablyClientOptions({ + clientId: txClientId, + plugins: { + WebSocketTransport, + FetchRequest, + RealtimePresence, + }, + }), + ); + + await monitorConnectionThenCloseAndFinish(async () => { + const txChannel = txClient.channels.get('channel'); - const rxPresenceMessage = await rxPresenceMessagePromise; - expect(rxPresenceMessage.clientId).to.equal(txClientId); + let resolveRxPresenceMessagePromise; + const rxPresenceMessagePromise = new Promise((resolve, reject) => { + resolveRxPresenceMessagePromise = resolve; + }); + await rxChannel.presence.subscribe('enter', resolveRxPresenceMessagePromise); + await txChannel.presence.enter(); + + const rxPresenceMessage = await rxPresenceMessagePromise; + expect(rxPresenceMessage.clientId).to.equal(txClientId); + }, txClient); + }, rxClient); }); }); }); @@ -679,20 +734,22 @@ function registerAblyModularTests(helper) { }), ); - let firstTransportCandidate; - const connectionManager = realtime.connection.connectionManager; - const originalTryATransport = connectionManager.tryATransport; - realtime.connection.connectionManager.tryATransport = (transportParams, candidate, callback) => { - if (!firstTransportCandidate) { - firstTransportCandidate = candidate; - } - originalTryATransport.bind(connectionManager)(transportParams, candidate, callback); - }; - - realtime.connect(); - - await realtime.connection.once('connected'); - expect(firstTransportCandidate).to.equal(scenario.transportName); + await monitorConnectionThenCloseAndFinish(async () => { + let firstTransportCandidate; + const connectionManager = realtime.connection.connectionManager; + const originalTryATransport = connectionManager.tryATransport; + realtime.connection.connectionManager.tryATransport = (transportParams, candidate, callback) => { + if (!firstTransportCandidate) { + firstTransportCandidate = candidate; + } + originalTryATransport.bind(connectionManager)(transportParams, candidate, callback); + }; + + realtime.connect(); + + await realtime.connection.once('connected'); + expect(firstTransportCandidate).to.equal(scenario.transportName); + }, realtime); }); }); } @@ -724,30 +781,36 @@ function registerAblyModularTests(helper) { describe('without MessageInteractions', () => { it('is able to subscribe to and unsubscribe from channel events, as long as a MessageFilter isn’t passed', async () => { const realtime = new BaseRealtime(ablyClientOptions({ plugins: { WebSocketTransport, FetchRequest } })); - const channel = realtime.channels.get('channel'); - await channel.attach(); - const subscribeReceivedMessagePromise = new Promise((resolve) => channel.subscribe(resolve)); + await monitorConnectionThenCloseAndFinish(async () => { + const channel = realtime.channels.get('channel'); + await channel.attach(); + + const subscribeReceivedMessagePromise = new Promise((resolve) => channel.subscribe(resolve)); - await channel.publish('message', 'body'); + await channel.publish('message', 'body'); - const subscribeReceivedMessage = await subscribeReceivedMessagePromise; - expect(subscribeReceivedMessage.data).to.equal('body'); + const subscribeReceivedMessage = await subscribeReceivedMessagePromise; + expect(subscribeReceivedMessage.data).to.equal('body'); + }, realtime); }); it('throws an error when attempting to subscribe to channel events using a MessageFilter', async () => { const realtime = new BaseRealtime(ablyClientOptions({ plugins: { WebSocketTransport, FetchRequest } })); - const channel = realtime.channels.get('channel'); - let thrownError = null; - try { - await channel.subscribe({ clientId: 'someClientId' }, () => {}); - } catch (error) { - thrownError = error; - } + await monitorConnectionThenCloseAndFinish(async () => { + const channel = realtime.channels.get('channel'); - expect(thrownError).not.to.be.null; - expect(thrownError.message).to.equal('MessageInteractions plugin not provided'); + let thrownError = null; + try { + await channel.subscribe({ clientId: 'someClientId' }, () => {}); + } catch (error) { + thrownError = error; + } + + expect(thrownError).not.to.be.null; + expect(thrownError.message).to.equal('MessageInteractions plugin not provided'); + }, realtime); }); }); @@ -762,50 +825,53 @@ function registerAblyModularTests(helper) { }, }), ); - const channel = realtime.channels.get('channel'); - await channel.attach(); + await monitorConnectionThenCloseAndFinish(async () => { + const channel = realtime.channels.get('channel'); - // Test `subscribe` with a filter: send two messages with different clientIds, and check that unfiltered subscription receives both messages but clientId-filtered subscription only receives the matching one. - const messageFilter = { clientId: 'someClientId' }; // note that `unsubscribe` compares filter by reference, I found that a bit surprising + await channel.attach(); - const filteredSubscriptionReceivedMessages = []; - channel.subscribe(messageFilter, (message) => { - filteredSubscriptionReceivedMessages.push(message); - }); + // Test `subscribe` with a filter: send two messages with different clientIds, and check that unfiltered subscription receives both messages but clientId-filtered subscription only receives the matching one. + const messageFilter = { clientId: 'someClientId' }; // note that `unsubscribe` compares filter by reference, I found that a bit surprising - const unfilteredSubscriptionReceivedFirstTwoMessagesPromise = new Promise((resolve) => { - const receivedMessages = []; - channel.subscribe(function listener(message) { - receivedMessages.push(message); - if (receivedMessages.length === 2) { - channel.unsubscribe(listener); - resolve(); - } + const filteredSubscriptionReceivedMessages = []; + channel.subscribe(messageFilter, (message) => { + filteredSubscriptionReceivedMessages.push(message); }); - }); - await channel.publish(await decodeMessage({ clientId: 'someClientId' })); - await channel.publish(await decodeMessage({ clientId: 'someOtherClientId' })); - await unfilteredSubscriptionReceivedFirstTwoMessagesPromise; + const unfilteredSubscriptionReceivedFirstTwoMessagesPromise = new Promise((resolve) => { + const receivedMessages = []; + channel.subscribe(function listener(message) { + receivedMessages.push(message); + if (receivedMessages.length === 2) { + channel.unsubscribe(listener); + resolve(); + } + }); + }); + + await channel.publish(await decodeMessage({ clientId: 'someClientId' })); + await channel.publish(await decodeMessage({ clientId: 'someOtherClientId' })); + await unfilteredSubscriptionReceivedFirstTwoMessagesPromise; - expect(filteredSubscriptionReceivedMessages.length).to.equal(1); - expect(filteredSubscriptionReceivedMessages[0].clientId).to.equal('someClientId'); + expect(filteredSubscriptionReceivedMessages.length).to.equal(1); + expect(filteredSubscriptionReceivedMessages[0].clientId).to.equal('someClientId'); - // Test `unsubscribe` with a filter: call `unsubscribe` with the clientId filter, publish a message matching the filter, check that only the unfiltered listener recieves it - channel.unsubscribe(messageFilter); + // Test `unsubscribe` with a filter: call `unsubscribe` with the clientId filter, publish a message matching the filter, check that only the unfiltered listener recieves it + channel.unsubscribe(messageFilter); - const unfilteredSubscriptionReceivedNextMessagePromise = new Promise((resolve) => { - channel.subscribe(function listener() { - channel.unsubscribe(listener); - resolve(); + const unfilteredSubscriptionReceivedNextMessagePromise = new Promise((resolve) => { + channel.subscribe(function listener() { + channel.unsubscribe(listener); + resolve(); + }); }); - }); - await channel.publish(await decodeMessage({ clientId: 'someClientId' })); - await unfilteredSubscriptionReceivedNextMessagePromise; + await channel.publish(await decodeMessage({ clientId: 'someClientId' })); + await unfilteredSubscriptionReceivedNextMessagePromise; - expect(filteredSubscriptionReceivedMessages.length).to./* (still) */ equal(1); + expect(filteredSubscriptionReceivedMessages.length).to./* (still) */ equal(1); + }, realtime); }); }); }); diff --git a/test/common/globals/named_dependencies.js b/test/common/globals/named_dependencies.js index 0558b575e..1299d8d6a 100644 --- a/test/common/globals/named_dependencies.js +++ b/test/common/globals/named_dependencies.js @@ -13,5 +13,9 @@ define(function () { shared_helper: { browser: 'test/common/modules/shared_helper', node: 'test/common/modules/shared_helper' }, async: { browser: 'node_modules/async/lib/async' }, chai: { browser: 'node_modules/chai/chai', node: 'node_modules/chai/chai' }, + interception_proxy_client: { + browser: 'test/common/modules/interception_proxy_client', + node: 'test/common/modules/interception_proxy_client', + }, }); }); diff --git a/test/common/modules/interception_proxy_client.js b/test/common/modules/interception_proxy_client.js new file mode 100644 index 000000000..e7224dcce --- /dev/null +++ b/test/common/modules/interception_proxy_client.js @@ -0,0 +1,200 @@ +'use strict'; + +define(['ably', 'shared_helper'], function (Ably, helper) { + // copied from crypto test + var msgpack = typeof window == 'object' ? Ably.msgpack : require('@ably/msgpack-js'); + // similar approach + var WebSocket = typeof window == 'object' ? window.WebSocket : require('ws'); + var BufferUtils = Ably.Realtime.Platform.BufferUtils; + + class InterceptionProxyClient { + currentContext = null; + + // this expects the interception proxy to already be running (i.e. the test suite doesn't launch it) + // this method is called by test suite’s root hooks. test cases shouldn't call this method; rather, they should use + async connect() { + this.webSocket = new WebSocket('ws://localhost:8001'); + + await new Promise((resolve, reject) => { + this.webSocket.addEventListener('open', () => { + console.log('connected to interception proxy'); + resolve(); + }); + this.webSocket.addEventListener('error', (error) => { + console.log('failed to connect to interception proxy:', error); + reject(error); + }); + this.webSocket.addEventListener('message', (message) => { + console.log('interception proxy got message', message.data); + this.handleJSONRPCMessage(JSON.parse(message.data)); + }); + }); + + await this.startInterception(); + console.log('startInterception completed'); + + // TODO something if connection lost + } + + async startInterception() { + const promise = new Promise((resolve, reject) => { + this.onStartedInterception = resolve; + this.onFailedToStartInterception = reject; + }); + + // i.e. for browser we use proxy, for Node we use local + const params = typeof window == 'object' ? { mode: 'proxy' } : { mode: 'local', pid: process.pid }; + + const request = { + jsonrpc: '2.0', + method: 'startInterception', + params, + id: helper.randomString(), + }; + const requestData = JSON.stringify(request); + + console.log('interception proxy sending startInterception request', request); + this.webSocket.send(requestData); + + return promise; + } + + async disconnect() { + if (this.webSocket.readyState === 3) { + // already closed + console.log('interception proxy client already disconnected'); + return; + } + + this.webSocket.close(); + + return new Promise((resolve) => { + this.webSocket.addEventListener('close', () => { + console.log('interception proxy client disconnected'); + resolve(); + }); + }); + } + + // TODO explain motivation for this API (so that a lingering test can’t accidentally override the interception in your test; of course, the interception in your test might accidentally _intercept_ messages sent by a lingering test but that’s a separate issue) + // + // This is written as (done, action) for compatibility with the way our tests are currently written; a promise-based version would be good to have too + // + // action receives a context object. it can modify the following properties of this object to modify the interception: + // + // - `transformClientMessage` or `transformServerMessage` (for message from client or server respectively) + // + // Receives an object with the following properties: + // + // - id: a unique identifier for this WebSocket message (generated by the interception proxy) + // - connectionID: a unique identifier for this WebSocket connection (generated by the interception proxy) + // - deserialized: a JSON-like object (i.e. the result of JSON.parse or msgpack.decode) + // + // And returns one of: + // + // - a JSON-like object (to modify the message) + // - `null` (to drop the message) + // + // Can also return a promise. + // + // If not set, then messages will be passed through unaltered. + // + // TODO some thoughts on API: + // + // - user currently has to make sure they remember to return something from the transform* function, even if they’re failing their test in some exceptional manner — this is to make sure that the connection can be allowed to disconnect at the proxy + // + // - users might think that they can directly mutate the object passed to transform* functions + intercept(done, action) { + if (this.currentContext !== null) { + throw new Error( + 'A call to `intercept` is already active; check you’re not running multiple tests at the same time', + ); + } + + this.currentContext = { + transformClientMessage: null, + transformServerMessage: null, + }; + + const newDone = (error) => { + this.currentContext = null; + done(error); + }; + + action(newDone, this.currentContext); + } + + handleJSONRPCMessage(message) { + if (message.method === 'transformInterceptedMessage') { + let deserialized; + if (message.params.type === 'binary') { + const data = BufferUtils.base64Decode(message.params.data); + deserialized = msgpack.decode(data); + } else if (message.params.type === 'text') { + const data = message.params.data; + deserialized = JSON.parse(data); + } + + console.log( + 'interception proxy awaiting response of transformInterceptedMessage for message', + message, + 'deserialized to', + deserialized, + ); + + const messageForTransform = { id: message.params.id, connectionID: message.params.connectionID, deserialized }; + + const noOpTransformInterceptedMessage = (message) => { + console.log(`default transformInterceptedMessage implementation passing message ${message.id} unaltered`); + return message.deserialized; + }; + + const transformInterceptedMessage = + (message.params.fromClient + ? this.currentContext?.transformClientMessage + : this.currentContext?.transformServerMessage) ?? noOpTransformInterceptedMessage; + + Promise.resolve(transformInterceptedMessage(messageForTransform)).then((result) => { + try { + console.log(`interception proxy got result of transforming message ${messageForTransform.id}`, result); + + let responseResult; + + if (result === null) { + responseResult = { action: 'drop' }; + } else { + let data; + + if (message.params.type === 'binary') { + const serialized = msgpack.encode(result); + data = BufferUtils.base64Encode(serialized); + } else if (message.params.type === 'text') { + data = JSON.stringify(result); + } + + responseResult = { action: 'replace', type: message.params.type, data }; + } + + const response = { jsonrpc: '2.0', id: message.id, result: responseResult }; + console.log('interception proxy sending transformInterceptedMessage response', response); + + const responseJSON = JSON.stringify(response); + this.webSocket.send(responseJSON); + } catch (err) { + // TODO better error handling + console.log('interception proxy caught', err); + } + }); + } else { + // assume it's the response to our startInterception call; TODO sort this out + if ('error' in message) { + this.onFailedToStartInterception(new Error(message.error.message)); + } else { + this.onStartedInterception(); + } + } + } + } + + return (module.exports = new InterceptionProxyClient()); +}); diff --git a/test/common/modules/shared_helper.js b/test/common/modules/shared_helper.js index 986ed85f7..71fcb919a 100644 --- a/test/common/modules/shared_helper.js +++ b/test/common/modules/shared_helper.js @@ -253,18 +253,20 @@ define([ } function logTestResults() { + /* if (this.currentTest.isFailed()) { const logs = globals.getLogs(); if (logs.length > 0) { // empty console.logs are for vertical spacing console.log(); - console.log('Logs for failing test: \n'); + console.log('Logs for test: \n'); logs.forEach(([timestamp, log]) => { console.log(timestamp, log); }); console.log(); } } + */ } return (module.exports = { diff --git a/test/interception-proxy/ControlRPC.ts b/test/interception-proxy/ControlRPC.ts new file mode 100644 index 000000000..8348a0884 --- /dev/null +++ b/test/interception-proxy/ControlRPC.ts @@ -0,0 +1,126 @@ +import { MessageAction } from './InterceptedMessagesQueue'; +import { WebSocketMessageData } from './WebSocketMessageData'; + +// TODO proper types for the DTOs, and align them better with the internal language + +export class JSONRPCRequest { + constructor(readonly id: string) {} + + createDTO() { + return { jsonrpc: '2.0', id: this.id }; + } +} + +export class TransformInterceptedMessageJSONRPCRequest extends JSONRPCRequest { + constructor( + id: string, + readonly messageID: string, + readonly connectionID: string, + readonly data: WebSocketMessageData, + readonly fromClient: boolean, + ) { + super(id); + } + + createDTO() { + let dataParam: string; + switch (this.data.type) { + case 'binary': + dataParam = this.data.data.toString('base64'); + break; + case 'text': + dataParam = this.data.data; + break; + } + + const params = { + id: this.messageID, + connectionID: this.connectionID, + type: this.data.type, + data: dataParam, + fromClient: this.fromClient, + }; + + return { ...super.createDTO(), method: 'transformInterceptedMessage', params }; + } +} + +export interface JSONRPCRequestDTO { + id: string; + params: T; +} + +export type InterceptionModeDTO = { mode: 'local'; pid: number } | { mode: 'proxy' }; + +export type StartInterceptionJSONRPCRequestDTO = JSONRPCRequestDTO; + +export class StartInterceptionJSONRPCRequest extends JSONRPCRequest { + constructor(id: string, readonly mode: InterceptionModeDTO) { + super(id); + } + + static fromDTO(dto: StartInterceptionJSONRPCRequestDTO) { + return new StartInterceptionJSONRPCRequest(dto.id, dto.params); + } +} + +type JSONObject = Partial>; + +export interface JSONRPCResponseDTO { + id: string; + result: T; +} + +type TransformInterceptedMessageJSONRPCResponseDTO = JSONRPCResponseDTO< + { action: 'drop' } | { action: 'replace'; type: 'binary' | 'text'; data: string } +>; + +export class JSONRPCResponse { + constructor(readonly id: string, readonly errorMessage: string | null = null) {} + + createDTO() { + const dto: Record = { jsonrpc: '2.0', id: this.id }; + + if (this.errorMessage !== null) { + dto.error = { code: 1, message: this.errorMessage }; + } else { + dto.result = {}; + } + + return dto; + } + + static fromDTO(dto: JSONRPCResponseDTO): JSONRPCResponse { + // TODO when we add more methods we’ll need a way to know which method the request corresponds to, via the ID + return TransformInterceptedMessageJSONRPCResponse.fromDTO(dto as TransformInterceptedMessageJSONRPCResponseDTO); + } +} + +export class TransformInterceptedMessageJSONRPCResponse extends JSONRPCResponse { + constructor(id: string, readonly action: MessageAction) { + super(id); + } + + static fromDTO(dto: TransformInterceptedMessageJSONRPCResponseDTO) { + let action: MessageAction; + + switch (dto.result.action) { + case 'drop': + action = { type: 'drop' }; + break; + case 'replace': + switch (dto.result.type) { + case 'binary': + const data = Buffer.from(dto.result.data, 'base64'); + action = { type: 'replace', data: { type: 'binary', data } }; + break; + case 'text': + action = { type: 'replace', data: { type: 'text', data: dto.result.data } }; + break; + } + break; + } + + return new TransformInterceptedMessageJSONRPCResponse(dto.id, action); + } +} diff --git a/test/interception-proxy/ControlServer.ts b/test/interception-proxy/ControlServer.ts new file mode 100644 index 000000000..b171b2a03 --- /dev/null +++ b/test/interception-proxy/ControlServer.ts @@ -0,0 +1,59 @@ +import { WebSocket, WebSocketServer } from 'ws'; +import { InterceptionContext } from './InterceptionContext'; + +const port = 8001; + +// think of it as an opaque type for now +export type ControlServerConnection = WebSocket; + +export class ControlServer { + private wss = new WebSocketServer({ port }); + private webSocketConnections: WebSocket[] = []; + private activeConnection: WebSocket | null = null; + + constructor(private readonly interceptionContext: InterceptionContext) { + interceptionContext.controlServer = this; + } + + start() { + this.wss.on('connection', (ws) => { + console.log('New connection to control server'); + this.webSocketConnections.push(ws); + ws.on('error', console.error); + + ws.on('message', (data, isBinary) => { + try { + if (isBinary) { + throw new Error('Control server got a binary message; it only works with text messages'); + } + + const text = data.toString('utf-8'); + console.info('Control server received message', text); + this.interceptionContext.onControlWebSocketMessage(text, ws); + } catch (err) { + console.error('Control server got error handling message', err); + } + }); + }); + console.log(`Started control server on port ${port}`); + } + + send(data: string, connection: ControlServerConnection) { + console.log('Control server sending message', data); + connection.send(data); + } + + sendToActiveConnection(data: string) { + console.log('Control server sending message to active connection', data); + this.activeConnection?.send(data); + } + + setActiveConnection(connection: ControlServerConnection) { + if (this.activeConnection !== null) { + throw new Error('There is already an active connection to the control server'); + } + + console.log('Control server set active connection'); + this.activeConnection = connection; + } +} diff --git a/test/interception-proxy/InterceptedConnection.ts b/test/interception-proxy/InterceptedConnection.ts new file mode 100644 index 000000000..de114d9c4 --- /dev/null +++ b/test/interception-proxy/InterceptedConnection.ts @@ -0,0 +1,311 @@ +import { randomUUID } from 'crypto'; +import { stateMachineDefinition, InterceptedConnectionState, InterceptedConnectionEvent } from './StateMachine'; +import { WebSocket, WebSocketServer } from 'ws'; +import { ProxyMessage } from './Proxy'; +import { WebSocketMessageData } from './WebSocketMessageData'; +import { InterceptionContext } from './InterceptionContext'; + +export enum WhichConnection { + ToServer, + ToClient, +} + +/** + * Represents a WebSocket connection that we’re forwarding from a client to a server. + */ +export class InterceptedConnection { + readonly id = randomUUID(); + private _state = InterceptedConnectionState.ConnectedToClientButNotYetServer; + serverConnection: WebSocket | null = null; + + private messageQueues: { + /** + * Messages that are waiting to be sent to the server + */ + toServer: WebSocketMessageData[]; + /** + * Messages that are waiting to be sent to the client + */ + toClient: WebSocketMessageData[]; + } = { + toServer: [], + toClient: [], + }; + + private keepClientConnectionAlive = false; + private keepServerConnectionAlive = false; + + /** + * @param clientConnection An open WebSocket connection to the client. + */ + constructor( + private readonly interceptionContext: InterceptionContext, + host: string, + proto: string, + url: string, + readonly clientConnection: WebSocket, + ) { + this.log(`New connection to proxy server (forwarded host ${host}, forwarded proto ${proto})`); + + clientConnection.on('close', () => { + this.log('clientConnection close event'); + this.on(InterceptedConnectionEvent.ClientClose); + // TODO I’ve written a state machine but instead of state machine actions I have these calls below (ditto for the server connection); seems maybe suboptimal but not important now + this.tryFlushSendQueue(false); // drop all queued client-bound messages + this.tryPropagateClosure(WhichConnection.ToServer); + }); + // TODO do something with this event? + clientConnection.on('error', (err) => { + this.log(`clientConnection error event: ${err}`); + }); + + this.connectToServer(host, proto, url); + + clientConnection.on('message', (data, isBinary) => { + console.info('Got message from client'); + // TODO sort out type assertion + this.onMessage(data as Buffer, isBinary, true); + }); + } + + get state(): InterceptedConnectionState { + return this._state; + } + + log(message: string) { + console.log(`Connection ${this.id} (state ${InterceptedConnectionState[this.state]}): ${message}`); + } + + on(event: InterceptedConnectionEvent) { + const transition = stateMachineDefinition.fetchTransition(this.state, event); + + if (transition === null) { + throw new Error( + `No transition defined for current state ${InterceptedConnectionState[this.state]} and event ${ + InterceptedConnectionEvent[event] + }`, + ); + } + + this.log(`Transitioning to state ${InterceptedConnectionState[transition.newState]}`); + this._state = transition.newState; + + if (this._state === InterceptedConnectionState.Disconnected) { + this.log(`Finished`); + } + } + + private connectToServer(host: string, proto: string, resourceName: string) { + const uri = `${proto}://${host}${resourceName}`; + this.log(`Starting forwarding to ${uri}`); + + const serverConnection = new WebSocket(uri); + this.serverConnection = serverConnection; + + serverConnection.on('open', () => { + this.log('serverConnection open event'); + this.on(InterceptedConnectionEvent.ServerOpen); + this.tryFlushSendQueue(true); // forward all queued server-bound messages + }); + serverConnection.on('close', () => { + this.log('serverConnection close event'); + this.on(InterceptedConnectionEvent.ServerClose); + this.tryFlushSendQueue(true); // drop all queued server-bound messages + this.tryPropagateClosure(WhichConnection.ToClient); + }); + // TODO better logging, do something with this event? + serverConnection.on('error', (err) => { + this.log(`serverConnection error event: ${err}`); + }); + + serverConnection.on('message', (data, isBinary) => { + // TODO sort out type assertion + this.onMessage(data as Buffer, isBinary, false); + }); + } + + private onMessage(data: Buffer, isBinary: boolean, fromClient: boolean) { + const proxyMessage = new ProxyMessage( + isBinary ? { type: 'binary', data } : { type: 'text', data: data.toString('utf-8') }, + fromClient, + ); + + this.log(`Got message ${proxyMessage.loggingDescription}`); + + // We don’t forward this message directly to the other peer; rather we pass it to the interception context, which will use the control API to ask its client what to do with this message. It might, for example, result in a replacement message being injected via `inject`. + + this.interceptionContext.enqueueMessage(proxyMessage, this); + } + + inject(fromClient: boolean, data: WebSocketMessageData) { + this.enqueueForSend(fromClient, data); + this.tryFlushSendQueue(fromClient); + } + + /** + * When called with `keepAlive` set to `true`, tells the proxy not to close the connection described by `connection` until called again with `keepAlive` set to `false`. + */ + setKeepConnectionAlive(keepAlive: boolean, connection: WhichConnection) { + this.log(`set ${keepAlive ? '' : 'no '}keepAlive connection ${WhichConnection[connection]}`); + + switch (connection) { + case WhichConnection.ToServer: + this.keepServerConnectionAlive = keepAlive; + break; + case WhichConnection.ToClient: + this.keepClientConnectionAlive = keepAlive; + break; + } + + this.tryPropagateClosure(connection); + } + + private tryPropagateClosure(targetConnectionDescription: WhichConnection) { + let keepAlive: boolean; + let queuedMessages: WebSocketMessageData[]; + let targetConnection: WebSocket | null; + + switch (targetConnectionDescription) { + case WhichConnection.ToServer: + keepAlive = this.keepServerConnectionAlive; + queuedMessages = this.messageQueues.toServer; + targetConnection = this.serverConnection; + break; + case WhichConnection.ToClient: + keepAlive = this.keepClientConnectionAlive; + queuedMessages = this.messageQueues.toClient; + targetConnection = this.clientConnection; + break; + } + + // if there are queued messages then we’ll call tryPropagateClosure again after sending them + if (keepAlive || queuedMessages.length !== 0) { + return; + } + + let propagate; + + switch (this.state) { + case InterceptedConnectionState.ConnectingToServerButNoLongerConnectedToClient: + case InterceptedConnectionState.ConnectedToServerButNoLongerToClient: + propagate = targetConnectionDescription === WhichConnection.ToServer; + break; + case InterceptedConnectionState.ConnectedToClientAndFailedToConnectToServer: + case InterceptedConnectionState.ConnectedToClientButNoLongerToServer: + propagate = targetConnectionDescription === WhichConnection.ToClient; + break; + case InterceptedConnectionState.ConnectedToClientButNotYetServer: + case InterceptedConnectionState.ConnectedToClientAndServer: + propagate = false; // nothing to propagate + break; + case InterceptedConnectionState.Disconnected: + propagate = false; // already propagated + break; + } + + // TODO make use of the information about how the connection closed (i.e. code and data), instead of just a generic close. Not immediately important I think because I don’t think Ably / our tests care about whether clean or what the closing handshake said + if (propagate) { + this.log(`Propagating close of connection ${WhichConnection[targetConnectionDescription]}`); + targetConnection?.close(); + } + } + + private enqueueForSend(fromClient: boolean, data: WebSocketMessageData) { + const queue = fromClient ? this.messageQueues.toServer : this.messageQueues.toClient; + queue.push(data); + } + + private tryFlushSendQueue(fromClient: boolean) { + const queue = fromClient ? this.messageQueues.toServer : this.messageQueues.toClient; + + if (queue.length === 0) { + return; + } + + let whenCanSend: 'now' | 'later' | 'never'; + + switch (this.state) { + case InterceptedConnectionState.ConnectedToClientButNotYetServer: + whenCanSend = fromClient ? 'later' : 'now'; + break; + case InterceptedConnectionState.ConnectingToServerButNoLongerConnectedToClient: + whenCanSend = fromClient ? 'later' : 'never'; + break; + case InterceptedConnectionState.ConnectedToClientAndFailedToConnectToServer: + whenCanSend = fromClient ? 'never' : 'now'; + break; + case InterceptedConnectionState.ConnectedToClientAndServer: + whenCanSend = 'now'; + break; + case InterceptedConnectionState.ConnectedToClientButNoLongerToServer: + whenCanSend = fromClient ? 'never' : 'now'; + break; + case InterceptedConnectionState.ConnectedToServerButNoLongerToClient: + whenCanSend = fromClient ? 'now' : 'never'; + break; + case InterceptedConnectionState.Disconnected: + whenCanSend = 'never'; + break; + } + + let clearQueue = false; + + switch (whenCanSend) { + case 'now': + this.log(`Sending ${queue.length} injected messages to ${fromClient ? 'server' : 'client'}`); + const outgoingConnection = fromClient ? this.serverConnection : this.clientConnection; + for (const data of queue) { + this.send(data, outgoingConnection!); + } + clearQueue = true; + break; + case 'later': + this.log( + `There are ${queue.length} injected messages to send to ${ + fromClient ? 'server' : 'client' + }; will try sending later since connection is in state ${InterceptedConnectionState[this.state]}`, + ); + break; + case 'never': + this.log( + `There are ${queue.length} injected messages to send to ${ + fromClient ? 'server' : 'client' + }; cannot do this ever since connection is in state ${ + InterceptedConnectionState[this.state] + }. Dropping messages.`, + ); + clearQueue = true; + break; + } + + if (clearQueue) { + queue.length = 0; // clear the queue + this.tryPropagateClosure(fromClient ? WhichConnection.ToServer : WhichConnection.ToClient); + } + } + + private send(data: WebSocketMessageData, connection: WebSocket) { + let buffer: Buffer; + switch (data.type) { + case 'binary': + buffer = data.data; + break; + case 'text': + buffer = Buffer.from(data.data, 'utf-8'); + break; + } + + let binary: boolean; + switch (data.type) { + case 'binary': + binary = true; + break; + case 'text': + binary = false; + break; + } + + // TODO what does the callback that you can pass here do? + connection.send(buffer, { binary }); + } +} diff --git a/test/interception-proxy/InterceptedMessagesQueue.ts b/test/interception-proxy/InterceptedMessagesQueue.ts new file mode 100644 index 000000000..95a446f51 --- /dev/null +++ b/test/interception-proxy/InterceptedMessagesQueue.ts @@ -0,0 +1,86 @@ +import { InterceptedConnection } from './InterceptedConnection'; +import { ProxyMessage } from './Proxy'; +import { WebSocketMessageData } from './WebSocketMessageData'; + +export class InterceptedMessagePredicate { + constructor(readonly interceptedConnection: InterceptedConnection, readonly fromClient: boolean) {} + + get loggingDescription() { + return `(messages from ${this.fromClient ? 'client' : 'server'} for connection ID ${ + this.interceptedConnection.id + })`; + } + + get keyForMap() { + return `${this.interceptedConnection.id}-${this.fromClient}`; + } +} + +// A handle for locating a message within InterceptedMessageQueue. +export class InterceptedMessageHandle { + constructor(readonly predicate: InterceptedMessagePredicate, readonly messageId: string) {} +} + +export type MessageAction = { type: 'drop' } | { type: 'replace'; data: WebSocketMessageData }; + +export class InterceptedMessage { + action: MessageAction | null = null; + + constructor(readonly message: ProxyMessage) {} + + get id(): string { + return this.message.id; + } +} + +// Per-connection, per-direction message queue. We use it to queue intercepted messages whilst waiting for a control server message telling us what to do with the message at the head of the queue. +export class InterceptedMessagesQueue { + // Maps an InterceptedMessagePredicate’s `keyForMap` to a queue + private readonly queues = new Map(); + + private messagesFor(predicate: InterceptedMessagePredicate, createIfNeeded = false) { + const queue = this.queues.get(predicate.keyForMap); + if (queue !== undefined) { + return queue; + } else { + const result: InterceptedMessage[] = []; + + if (createIfNeeded) { + this.queues.set(predicate.keyForMap, result); + } + + return result; + } + } + + pop(predicate: InterceptedMessagePredicate) { + const messages = this.messagesFor(predicate); + + if (messages.length === 0) { + throw new Error('pop called for empty queue'); + } + + return messages.shift()!; + } + + hasMessages(predicate: InterceptedMessagePredicate) { + return this.messagesFor(predicate).length > 0; + } + + append(message: InterceptedMessage, predicate: InterceptedMessagePredicate) { + this.messagesFor(predicate, true).push(message); + } + + count(predicate: InterceptedMessagePredicate) { + return this.messagesFor(predicate).length; + } + + isHead(handle: InterceptedMessageHandle) { + const head = this.messagesFor(handle.predicate)[0]; + return head.id === handle.messageId; + } + + getHead(predicate: InterceptedMessagePredicate) { + return this.messagesFor(predicate)[0]; + } +} diff --git a/test/interception-proxy/InterceptionContext.ts b/test/interception-proxy/InterceptionContext.ts new file mode 100644 index 000000000..63854d0da --- /dev/null +++ b/test/interception-proxy/InterceptionContext.ts @@ -0,0 +1,256 @@ +import { ChildProcessWithoutNullStreams, spawn } from 'child_process'; +import { randomUUID } from 'crypto'; +import { + JSONRPCRequest, + JSONRPCResponse, + StartInterceptionJSONRPCRequest, + TransformInterceptedMessageJSONRPCRequest, + TransformInterceptedMessageJSONRPCResponse, +} from './ControlRPC'; +import { ControlServer, ControlServerConnection } from './ControlServer'; +import { InterceptedConnection, WhichConnection } from './InterceptedConnection'; +import { + InterceptedMessagesQueue, + InterceptedMessageHandle, + InterceptedMessagePredicate, + InterceptedMessage, +} from './InterceptedMessagesQueue'; +import { ProxyMessage } from './Proxy'; +import { ProxyServer } from './ProxyServer'; +import { webSocketMessageDataLoggingDescription } from './WebSocketMessageData'; + +export class InterceptionContext { + controlServer: ControlServer | null = null; + proxyServer: ProxyServer | null = null; + private interceptedMessagesQueue = new InterceptedMessagesQueue(); + // TODO use a Map + private jsonRPCRequestIDsToHandles: Partial> = {}; + private onMitmproxyReady: (() => void) | null = null; + + onControlWebSocketMessage(data: string, controlServerConnection: ControlServerConnection) { + const dto = JSON.parse(data); + + if ('error' in dto) { + throw new Error('Not expecting an error in JSON-RPC response'); + } else if ('result' in dto) { + const response = JSONRPCResponse.fromDTO(dto); + this.handleJSONRPCResponse(response); + } else if ('method' in dto) { + if ('id' in dto) { + const request = StartInterceptionJSONRPCRequest.fromDTO(dto); + this.handleJSONRPCRequest(request, controlServerConnection); + } else if (dto.method === 'mitmproxyReady') { + // notification telling us that mitmproxy is running + this.onMitmproxyReady?.(); + } + } else { + throw new Error(`Got unrecognised control API message: ${dto}`); + } + } + + private handleJSONRPCRequest(request: JSONRPCRequest, controlServerConnection: ControlServerConnection) { + try { + if (request instanceof StartInterceptionJSONRPCRequest) { + this.controlServer!.setActiveConnection(controlServerConnection); + + console.log('starting mitmdump, mode', request.mode); + + let mitmdumpBinary: string; + let mitmdumpMode: string | null; + + // TODO this is currently written on the assumption that darwin means running locally and linux means running in GitHub action; sort out so that you can run (locally or on CI) on (macOS or Linux) + switch (process.platform) { + // currently this actually means " + case 'darwin': + mitmdumpBinary = 'mitmdump'; + switch (request.mode.mode) { + case 'local': + mitmdumpMode = `local:${request.mode.pid}`; + break; + case 'proxy': + mitmdumpMode = null; + break; + } + break; + case 'linux': + // Currently we expect that you set up the iptables rules externally + mitmdumpBinary = '/opt/pipx_bin/mitmdump'; + switch (request.mode.mode) { + case 'local': + mitmdumpMode = 'transparent'; + break; + case 'proxy': + mitmdumpMode = null; + break; + } + break; + default: + throw new Error(`Don’t know how to set up mitmdump interception for platform ${process.platform}`); + } + + // sounds like we don’t need to explicitly stop this when we stop the current process: https://nodejs.org/api/child_process.html#optionsdetached + const mitmdump = spawn(mitmdumpBinary, [ + '--set', + 'stream_large_bodies=1', + ...(mitmdumpMode === null ? [] : ['--mode', mitmdumpMode]), + '-s', + 'test/mitmproxy_addon_2.py', + '--set', + // "full request URL with response status code and HTTP headers" (the default truncates the URL) + 'flow_detail=2', + ]); + + const formatMitmdumpOutput = (source: string, data: Buffer) => { + const text = data.toString('utf-8'); + const lines = text.split('\n'); + return lines.map((line) => `mitmdump ${source}: ${line}`).join('\n'); + }; + + mitmdump.stdout.on('data', (data) => { + console.log(formatMitmdumpOutput('stdout', data)); + }); + + mitmdump.stderr.on('data', (data) => { + console.log(formatMitmdumpOutput('stderr', data)); + }); + + console.log(`Waiting for mitmdump to start`); + + this.onMitmproxyReady = () => { + this.onMitmproxyReady = null; + console.log(`mitmdump has started`); + const response = new JSONRPCResponse(request.id); + const responseDTO = response.createDTO(); + this.controlServer!.sendToActiveConnection(JSON.stringify(responseDTO)); + }; + } else { + throw new Error(`Got unknown control API request: ${request}`); + } + } catch (error) { + console.log(`Error handling JSON-RPC request ${request.id}:`, error); + const response = new JSONRPCResponse(request.id, `Error handling request: ${error}`); + const responseDTO = response.createDTO(); + this.controlServer!.send(JSON.stringify(responseDTO), controlServerConnection); + } + } + + private handleJSONRPCResponse(response: JSONRPCResponse) { + if (response instanceof TransformInterceptedMessageJSONRPCResponse) { + this.handleTransformInterceptedMessageResponse(response); + } else { + throw new Error(`Got unknown control API response: ${response}`); + } + } + + private handleTransformInterceptedMessageResponse(response: TransformInterceptedMessageJSONRPCResponse) { + const handle = this.jsonRPCRequestIDsToHandles[response.id]; + + if (handle === undefined) { + throw new Error(`Unrecognised control response ID: ${response.id}`); + } + + delete this.jsonRPCRequestIDsToHandles[response.id]; + + if (!this.interceptedMessagesQueue.isHead(handle)) { + throw new Error('Got response for an intercepted message that’s not at head of queue; shouldn’t be possible'); + } + + const interceptedMessage = this.interceptedMessagesQueue.getHead(handle.predicate); + + if (interceptedMessage.action !== null) { + throw new Error('Response asked us to set the action for a message that already has action set'); + } + + interceptedMessage.action = response.action; + + this.dequeueInterceptedMessage(handle.predicate); + } + + private dequeueInterceptedMessage(predicate: InterceptedMessagePredicate) { + console.log('Dequeueing intercepted message for predicate', predicate.loggingDescription); + + const message = this.interceptedMessagesQueue.pop(predicate); + + if (message.action === null) { + throw new Error(`Attempted to dequeue message that doesn’t have an action: ${message}`); + } + + switch (message.action.type) { + case 'replace': + console.log( + `Injecting replacement message for message ${message.id}, with type ${ + message.action.data.type + } and data (${webSocketMessageDataLoggingDescription(message.action.data)})`, + ); + + predicate.interceptedConnection.inject(predicate.fromClient, message.action.data); + break; + case 'drop': + console.log(`Dropping message ${message}`); + break; + } + + if (this.interceptedMessagesQueue.hasMessages(predicate)) { + this.broadcastNextMessage(predicate); + } else { + // We’re not waiting to forward any more messages, so tell the proxy that it can propagate any pending connection close and propagate any future connection close + predicate.interceptedConnection.setKeepConnectionAlive( + false, + predicate.fromClient ? WhichConnection.ToServer : WhichConnection.ToClient, + ); + } + } + + private broadcastJSONRPCRequest(request: JSONRPCRequest) { + const data = JSON.stringify(request.createDTO()); + + console.log(`Broadcasting request JSON ${data}`); + this.controlServer?.sendToActiveConnection(data); + } + + private broadcastNextMessage(predicate: InterceptedMessagePredicate) { + const interceptedMessage = this.interceptedMessagesQueue.getHead(predicate); + + const jsonRPCRequestID = randomUUID(); + const handle = new InterceptedMessageHandle(predicate, interceptedMessage.id); + this.jsonRPCRequestIDsToHandles[jsonRPCRequestID] = handle; + + // Broadcast to everyone connected to the control server. + // TODO I think would be better for there to be one client who sends an explicit message to become the active client, or to only allow a single connection at a time; not important now though + + const jsonRPCRequest = new TransformInterceptedMessageJSONRPCRequest( + jsonRPCRequestID, + interceptedMessage.id, + predicate.interceptedConnection.id, + interceptedMessage.message.data, + interceptedMessage.message.fromClient, + ); + + this.broadcastJSONRPCRequest(jsonRPCRequest); + } + + enqueueMessage(message: ProxyMessage, interceptedConnection: InterceptedConnection) { + console.log(`enqueueMessage ${message.id}`); + + // Tell the proxy to not propagate a connection close until we’ve had a chance to inject this message + interceptedConnection.setKeepConnectionAlive( + true, + message.fromClient ? WhichConnection.ToServer : WhichConnection.ToClient, + ); + + const predicate = new InterceptedMessagePredicate(interceptedConnection, message.fromClient); + + const interceptedMessage = new InterceptedMessage(message); + this.interceptedMessagesQueue.append(interceptedMessage, predicate); + + if (this.interceptedMessagesQueue.count(predicate) === 1) { + this.broadcastNextMessage(predicate); + } else { + console.log( + `Enqueued message ${interceptedMessage.id} since there are ${ + this.interceptedMessagesQueue.count(predicate) - 1 + } pending messages`, + ); + } + } +} diff --git a/test/interception-proxy/Proxy.ts b/test/interception-proxy/Proxy.ts new file mode 100644 index 000000000..431ada1cd --- /dev/null +++ b/test/interception-proxy/Proxy.ts @@ -0,0 +1,17 @@ +// TODO implement the proxy! These types are placeholders + +import { randomUUID } from 'crypto'; +import { WebSocketMessageData, webSocketMessageDataLoggingDescription } from './WebSocketMessageData'; + +export class ProxyMessage { + // unique identifier that we generate for this message + id = randomUUID(); + + constructor(readonly data: WebSocketMessageData, readonly fromClient: boolean) {} + + get loggingDescription(): string { + const sourceDescription = `from ${this.fromClient ? 'client' : 'server'}`; + + return `${sourceDescription} (id: ${this.id}, ${webSocketMessageDataLoggingDescription(this.data)})`; + } +} diff --git a/test/interception-proxy/ProxyServer.ts b/test/interception-proxy/ProxyServer.ts new file mode 100644 index 000000000..777e8e65a --- /dev/null +++ b/test/interception-proxy/ProxyServer.ts @@ -0,0 +1,55 @@ +import { randomUUID } from 'crypto'; +import { WebSocket, WebSocketServer } from 'ws'; +import { InterceptionContext } from './InterceptionContext'; +import { ProxyMessage } from './Proxy'; +import { WebSocketMessageData } from './WebSocketMessageData'; +import { stateMachineDefinition, InterceptedConnectionState, InterceptedConnectionEvent } from './StateMachine'; +import { InterceptedConnection } from './InterceptedConnection'; + +const port = 8002; + +// TODO make sure this is as accurate as possible (in terms of frames) — forward PING and PONG without emitting our own, etc +// TODO more generally there are definitely going to be nuances that I’ve missed that mean this proxy introduces a not 100% faithful reproduction of the comms, but we can iterate +// TODO Understand the server API better +// TODO note that here we always accept the connection from the client, which, again, isn’t necessarily faithful + +export class ProxyServer { + private wss = new WebSocketServer({ port }); + // Keyed by connections’ `id` + private interceptedConnections = new Map(); + + constructor(private readonly interceptionContext: InterceptionContext) { + interceptionContext.proxyServer = this; + } + + start() { + this.wss.on('connection', (clientConnection, req) => { + const host = req.headers['ably-test-host'] as string | undefined; + const proto = req.headers['ably-test-proto'] as string | undefined; + + if (host === undefined) { + console.error('Connection to proxy server without Ably-Test-Host header; closing'); + clientConnection.close(); + return; + } + + if (proto === undefined) { + console.error('Connection to proxy server without Ably-Test-Proto header; closing'); + clientConnection.close(); + return; + } + + const interceptedConnection = new InterceptedConnection( + this.interceptionContext, + host, + proto, + req.url!, + clientConnection, + ); + // TODO do we actually need to keep hold of it or will it keep itself around since it’s a listener of a WebSocket? + this.interceptedConnections.set(interceptedConnection.id, interceptedConnection); + }); + + console.log(`Started proxy server on port ${port}`); + } +} diff --git a/test/interception-proxy/StateMachine.ts b/test/interception-proxy/StateMachine.ts new file mode 100644 index 000000000..7361a2791 --- /dev/null +++ b/test/interception-proxy/StateMachine.ts @@ -0,0 +1,185 @@ +export enum InterceptedConnectionEvent { + /** + * The proxy’s WebSocket connection to the client emitted a `close` event. + */ + ClientClose, + + /** + * The proxy’s WebSocket connection to the server emitted an `open` event. + */ + ServerOpen, + + /** + * The proxy’s WebSocket connection to the server emitted a `close` event. + */ + ServerClose, +} + +export enum InterceptedConnectionState { + /** + * Initial state. + * + * Transitions: + * + * Event: ClientClose + * New state: ConnectingToServerButNoLongerConnectedToClient + * + * Event: ServerOpen + * New state: ConnectedToClientAndServer + * + * Event: ServerClose + * New state: ConnectedToClientAndFailedToConnectToServer + */ + ConnectedToClientButNotYetServer, + + /** + * The client closed the connection whilst we were connecting to the server. + * + * Transitions: + * + * Event: ServerOpen + * New state: ConnectedToServerButNoLongerToClient + * + * Event: ServerClose + * New state: Disconnected + */ + ConnectingToServerButNoLongerConnectedToClient, + + /** + * We failed to establish a connection to the server. + * + * Transitions: + * + * Event: ClientClose + * New state: Disconnected + */ + ConnectedToClientAndFailedToConnectToServer, + + /** + * In this state, we can send messages in both directions. + * + * Transitions: + * + * Event: ClientClose + * New state: ConnectedToServerButNoLongerToClient + * + * Event: ServerClose + * New state: ConnectedToClientButNoLongerToServer + */ + ConnectedToClientAndServer, + + /** + * The server closed the connection. + * + * Transitions: + * + * Event: ClientClose + * New state: Disconnected + */ + ConnectedToClientButNoLongerToServer, + + /** + * The client closed the connection. + * + * Transitions: + * + * Event: ServerClose + * New state: Disconnected + */ + ConnectedToServerButNoLongerToClient, + + /** + * Final state. + */ + Disconnected, +} + +export interface InterceptedConnectionStateMachineTransition { + newState: InterceptedConnectionState; +} + +interface InterceptedConnectionStateMachineRule { + fromState: InterceptedConnectionState; + event: InterceptedConnectionEvent; + transition: InterceptedConnectionStateMachineTransition; +} + +class InterceptedConnectionStateMachineDefinition { + private rules: InterceptedConnectionStateMachineRule[] = []; + + constructor() { + this.addRule( + InterceptedConnectionState.ConnectedToClientButNotYetServer, + InterceptedConnectionEvent.ClientClose, + InterceptedConnectionState.ConnectingToServerButNoLongerConnectedToClient, + ); + this.addRule( + InterceptedConnectionState.ConnectedToClientButNotYetServer, + InterceptedConnectionEvent.ServerOpen, + InterceptedConnectionState.ConnectedToClientAndServer, + ); + this.addRule( + InterceptedConnectionState.ConnectedToClientButNotYetServer, + InterceptedConnectionEvent.ServerClose, + InterceptedConnectionState.ConnectedToClientAndFailedToConnectToServer, + ); + this.addRule( + InterceptedConnectionState.ConnectingToServerButNoLongerConnectedToClient, + InterceptedConnectionEvent.ServerOpen, + InterceptedConnectionState.ConnectedToServerButNoLongerToClient, + ); + this.addRule( + InterceptedConnectionState.ConnectingToServerButNoLongerConnectedToClient, + InterceptedConnectionEvent.ServerClose, + InterceptedConnectionState.Disconnected, + ); + this.addRule( + InterceptedConnectionState.ConnectedToClientAndFailedToConnectToServer, + InterceptedConnectionEvent.ClientClose, + InterceptedConnectionState.Disconnected, + ); + this.addRule( + InterceptedConnectionState.ConnectedToClientAndServer, + InterceptedConnectionEvent.ClientClose, + InterceptedConnectionState.ConnectedToServerButNoLongerToClient, + ); + this.addRule( + InterceptedConnectionState.ConnectedToClientAndServer, + InterceptedConnectionEvent.ServerClose, + InterceptedConnectionState.ConnectedToClientButNoLongerToServer, + ); + this.addRule( + InterceptedConnectionState.ConnectedToClientButNoLongerToServer, + InterceptedConnectionEvent.ClientClose, + InterceptedConnectionState.Disconnected, + ); + this.addRule( + InterceptedConnectionState.ConnectedToServerButNoLongerToClient, + InterceptedConnectionEvent.ServerClose, + InterceptedConnectionState.Disconnected, + ); + } + + private addRule( + fromState: InterceptedConnectionState, + event: InterceptedConnectionEvent, + newState: InterceptedConnectionState, + ) { + this.rules.push({ fromState, event, transition: { newState } }); + } + + fetchTransition( + fromState: InterceptedConnectionState, + event: InterceptedConnectionEvent, + ): InterceptedConnectionStateMachineTransition | null { + for (const rule of this.rules) { + if (rule.fromState == fromState && rule.event == event) { + return rule.transition; + } + } + + return null; + } +} + +export const stateMachineDefinition = new InterceptedConnectionStateMachineDefinition(); diff --git a/test/interception-proxy/WebSocketMessageData.ts b/test/interception-proxy/WebSocketMessageData.ts new file mode 100644 index 000000000..2a5a63f81 --- /dev/null +++ b/test/interception-proxy/WebSocketMessageData.ts @@ -0,0 +1,10 @@ +export type WebSocketMessageData = { type: 'binary'; data: Buffer } | { type: 'text'; data: string }; + +export function webSocketMessageDataLoggingDescription(data: WebSocketMessageData) { + switch (data.type) { + case 'binary': + return `binary data: ${data.data.toString('base64')}`; + case 'text': + return `text data: ${data.data}`; + } +} diff --git a/test/interception-proxy/server.ts b/test/interception-proxy/server.ts new file mode 100644 index 000000000..0050ede2f --- /dev/null +++ b/test/interception-proxy/server.ts @@ -0,0 +1,14 @@ +import { ControlServer } from './ControlServer'; +import { InterceptionContext } from './InterceptionContext'; +import { ProxyServer } from './ProxyServer'; + +// TODO cleanup as control server connections go away +// TODO cleanup as intercepted connections go away + +const interceptionContext = new InterceptionContext(); + +const controlServer = new ControlServer(interceptionContext); +controlServer.start(); + +const proxyServer = new ProxyServer(interceptionContext); +proxyServer.start(); diff --git a/test/mitm-server-thoughts.md b/test/mitm-server-thoughts.md new file mode 100644 index 000000000..01a28954f --- /dev/null +++ b/test/mitm-server-thoughts.md @@ -0,0 +1,303 @@ +# Thoughts on a man-in-the-middle-server for replacing some private API usage + +**Note:** Most of the contents of this note are now better explained in [this RFC](https://ably.atlassian.net/wiki/x/IYDItQ); keeping this note around for now because there are some details I didn’t include there for brevity. + +The context being that we eventually intend to use the ably-js test suite for the unified test suite. + +See [`private-api-usage.md`](./private-api-usage.md) for the private APIs we’re referring to here. + +## Requirements + +TODO + +Key realtime protocol-related methods used by tests (will look at REST later): + +### Outgoing + +- replacing `channel.sendPresence` + - check presence message’s client ID +- replacing `transport.send` + - check the encoded data in a protocol message + - to look for an outgoing `AUTH` and check its properties + - to check the `clientId` on the outgoing message + - to listen for `MESSAGE`, check its properties, **and then continue the test** +- replacing `channel.sendMessage` + - with an empty implementation, to "sabotage the reattach attempt" + - with an implementation that fails the test if called + - to check that only a `DETACH` is being sent, **and to continue the test once second `DETACH` sent** +- replacing `connectionManager.send` + - to do `msg.setFlag('ATTACH_RESUME')` on the outgoing message +- accesses `var transport = realtime.connection.connectionManager.activeProtocol.transport.uri` or `.recvRequest.recvUri` to check the `v=3` query parameter +- checks `realtime.connection.connectionManager.httpHosts[0];` to check it’s using correct default host, also checks length of that array +- replacing `realtime.conneciton.connectionManager.tryATransport` + - looking at the host that’s being used to connect, although not sure exactly to what end + - to "simulate the internet being failed" +- replaces `realtime.connection.connectionManager.connectImpl` + - to check `transportParams.format` + +### Incoming + +- calling `channel.processMessage` + - inject a protocol message +- calling `onProtocolMessage` (on a specific transport) + + - inject an `ERROR` + - inject a `DISCONNECTED` + - etc. inject protocol message (won't keep repeating) + - accesses `connectionManager.connectionDetails`, modifies its `maxMessageSize`, then re-injects it via a `CONNECTED` passed to `onProtocolMessage()` (the point here being that maybe we can get this `connectionManager.connectionDetails` some other way, or just modify the original `CONNECTED`?) + +- replacing `channel.processMessage` + - drop an `ATTACHED` + - spies on this to, after processing a received `SYNC`, inject a `PRESENCE` +- replacing `onProtocolMessage` (on a specific transport) + - drop `ACK` + - change protocol message’s `connectionDetails.maxIdleInterval` + - with no-op so that last activity timer doesn’t get bumped + - to look for `CONNECTED`, make an assertion about it, and then set its `connectionKey` and `clientId` to fixed values (so we can assert they’re subsequently used to populate some user-facing properties) +- replacing `connectionManager.onChannelMessage` + - listen for `MESSAGE` and then run some code in response + +## API thoughts + +Ideal would be a 2-way communication between test suite and proxy server, that for each incoming message asks what you want to do with it (drop, or maintain with edits), instead of having to have a convoluted declarative API for pre-configuring what to do with messages. That will be the easiest drop-in for the existing private API usage. + +## Implementation thoughts + +Options: + +1. a WebSocket server (application layer) + + - Ably clients created by the tests would be configured with this server’s URL as their `realtimeHost` + - this would complicate the use of TLS; either the server would only operate over HTTPS, with the test client being configured to do the same, or we’d need to use self-signed certificates, which may be easy or hard to use depending on the client library under test + - this would complicate the testing of things like `environment` client option or fallback hosts + +2. a WebSocket proxy server (application layer) + + - e.g. a SOCKS5 proxy + - the environment in which client library is running (e.g. browser, or JVM, or platform’s OS) would be (per language in 4.1 of RFC 6455) configured to use a proxy when using WebSocket to connect to `sandbox.ably.com` + - client libraries’ WebSocket implementations would pick up this proxy configuration and ask the proxy to open a TCP connection to the library’s configured host (see _Proxy Usage_ in 4.1) + - this would mean that we could let the client use its default URLs, and things like `environment`, default behaviour of fallback hosts etc would be easy to test + - TLS: if we wanted to be able to MITM then we’d still need to work with self-signed certificates (TODO understand better) + - main issue I foresee here is that we don’t specify that our libraries need to work correctly behind a WebSocket proxy, and have reason to believe that some don’t (e.g. https://github.com/ably/ably-java/issues/120, although it says that the ably-js WebSocket library supports SOCKS, and https://github.com/ably/ably-dotnet/issues/159). I know off the top of my head that the library we use for WebSocket in ably-cocoa does (claim to) work with proxies, and presumably it’d work fine in a browser in ably-js + +- not sure whether Node has support for proxies (other than specifically configuring your HTTP / WS client) +- the other thing is that it would be nice to not need to have to make any global settings changes (e.g. OS proxy settings) + +3. some lower-level option + + Some other option that’s less visible to the Ably client library. For example, see the [modes of operation offered by mitmproxy](https://docs.mitmproxy.org/stable/concepts-modes/). + + One question in that case is whether it would be easy to use an option like this for all of the runtime environments in which we want to run the unified test suite (e.g. iOS Simulator, Android emulator, …?) + +## What about using mitmproxy? + +It's an interesting idea — it gives us access to a bunch of alternatives for how we'd implement the proxy, e.g. 1. above I think can be done with mitmproxy’s reverse proxy mode, and 2. with its regular mode. + +And then (TODO check) we'd have a unified API (i.e. abstraction) for doing the MITM-ing, regardless of the implementation details. Maybe, once I’ve got a better idea of the requirements, take a look at its API. (One problem is that I don’t know Python.) + +mitmproxy has good platform compatibility (Mac, Windows, Linux, and has instructions for using with Android Emulator, iOS Simulator). And has good instructions for how to set up self-signed certificates. + +It also means that I can use the proxy approach for now, which requires the least changes to the test suite, and then switch later on if / when necessary. + +It’s a mature piece of software, too, currently on something like version 12, seems to be actively developed. + +Also, someone has already made [a WebSocket-based tool](https://github.com/hacker1024/mitmproxy_remote_interceptions) that puts an external API on mitmproxy. Not sure if works with WebSocket. + +## Playwright + +Just noticed that this offers an API for e.g. intercepting WebSocket: https://playwright.dev/docs/network. Not very useful cross-platform though. + +## What about other transports? + +In the above, I’ve only considered the WebSocket transport. Haven’t taken into account what we’d do for ably-js’s Comet transports. But having a unified API between the test suite and the mock server would help to build a solution that works for all transports. + +## What we’ve used in the past + +TODO + +## Using mitmproxy + +Going to read the documentation + +I’ve been using the Wireguard mode, which seems very easy to use (installed the macOS client from App Store). Oh, no, that doesn't seem to work, you need to run on a separate machine: + +> With the current implementation, it is not possible to proxy all traffic of the host that mitmproxy itself is running on, since this would result in outgoing WireGuard packets being sent over the WireGuard tunnel themselves. + +There's something coming called local redirect mode ([here](https://github.com/mitmproxy/mitmproxy/discussions/5795) referred to as `osproxy` mode), not sure how far along. Ah, it's apparently out on Mac now! [Here](https://mitmproxy.org/posts/local-redirect/macos/) is the blog post. You can target a process by PID or by name. + +For Node to work with mitmproxy certs: `NODE_EXTRA_CA_CERTS=~/.mitmproxy/mitmproxy-ca-cert.pem npm run test:node` + +I think I need to learn a bit of Python now? + +## Writing mitmproxy addon + +- install mitmproxy using pipx so that we can install websockets package +- `pipx inject mitmproxy websockets` +- run mitmproxy with `mitmdump --set stream_large_bodies=1 --mode local:node -s test/interception-proxy/src/mitmproxy_addon.py` +- run Node tests with `NODE_EXTRA_CA_CERTS=~/.mitmproxy/mitmproxy-ca-cert.pem npm run test:node` +- to connect to the control API for now, use `websocat ws://localhost:8001` + +TODO (something to do with injecting a message) + +TODO need to figure out how it’ll work when running across multiple test cases — how to distinguish between different connections (e.g. ignoring ones from accidental lingering clients) + +## mitmproxy limitations + +- sounds like [you can’t intercept PING / PONG frames](https://github.com/mitmproxy/mitmproxy/blob/8cf0cba1cb6e87f1cf48789e90526b75caa5436d/docs/src/content/concepts-protocols.md?plain=1#L56) — this might be an issue. TODO double check whether our tests _currently_ make use of ping / pong (I don't think they do) + +### mitmproxy and Comet + +Evgenii said that we perhaps don't need to worry about Comet for now (i.e. if this doesn't work out then I’ll try running the test suite with just websockets) + +see https://docs.mitmproxy.org/stable/overview-features/#streaming + +note that you can't manipulate streamed responses; is that an issue? in web i don't think we stream any more; what about in Node? + +## Replacing a few usages of private API in tests + +- `test/realtime/connection.test.js` - spies on `transport.send` to listen for `MESSAGE`, check its properties, and then continue the test + +## JSON-RPC notifications sent by our little mitmproxy addon when running + +It connects to the control API described below and sends a notification, method `mitmproxyReady`, no params. + +## JSON-RPC methods implemented in TypeScript proxy server + +Implemented via text WebSocket messages exchanged between proxy and test suite. The WebSocket server is run by the proxy at `http://localhost:8001`. + +### `startInterception` + +The test suite calls this method on the proxy at the start of the test suite. It: + +- results in an error if there is already an active test suite +- marks the WebSocket connection as belonging the active test suite (there is currently no way to undo this; to set a new active test suite you must restart the proxy) +- sets up a proxy for intercepting traffic (this may require cooperation from the tests; see `mode` below) + +Request params is one of the following objects: + +- `{ 'mode': 'local', 'pid': number }`: transparently intercept traffic from the process with the given PID (note that this is currently only used on macOS; in Linux we do interception by UID, see test-node.yml workflow for now) +- `{ 'mode': 'proxy' }`: run an HTTP proxy which listens on port 8080 + +Response result is an empty object. + +### `transformInterceptedMessage` + +The proxy calls this method on the active test suite each time a WebSocket message is intercepted. The test suite must return a result telling the proxy what to do with the message. Subsequent messages intercepted on that WebSocket connection, in the direction described by `fromClient`, will be queued pending the test suite’s reply. + +Request params is an object with the following properties: + +- `id`: a unique identifier for this message +- `connectionID`: a unique identifer for the intercepted WebSocket connection that this message belongs to +- `type`: + - `binary` if the intercepted message is of Binary type + - `text` if it is of Text type +- `data`: the data of the intercepted WebSocket message + - if `type` is `binary`, then this value is Base64-encoded +- `fromClient`: describes the direction in which the intercepted message was sent + +Response result is one of the following objects: + +- `{ "action": "drop" }`: this will cause the proxy to drop the intercepted message +- `{ "action": "replace", "type": "binary", "data": "(…)" }`: this will cause the proxy to replace the intercepted message with a message of Binary type whose data is the result of Base64-decoding the `data` property +- `{ "action": "replace", "type": "text", "data": "(…)" }`: this will cause the proxy to replace the intercepted message with a message of Text type whose data is the value of the `data` property + +### Writing a proxy that sits behind mitmproxy in order to control WebSocket connection lifetime + +The idea is that we’ll build a proxy (i.e. something that mitmproxy knows how to tunnel WebSocket requests through), which will be the thing that actually manages the lifetime of the WebSocket connection to the client. And then, if it turns out that for some other reason we can’t use mitmproxy, we can just give up on interception and instead add a mode for this server to work as a reverse proxy. + +And, as a bonus, I can write this server in TypeScript, which means not having to battle with Python. + +OK, I’ve pulled across the code, now I need to write a proxy and figure out how to make mitmproxy target it. + +So, how do we get mitmproxy to intercept everything using `local` mode, but then send it upstream to another proxy? Let’s play around. + +1. start an mitmproxy that acts as a normal HTTP proxy (this mimics the proxy we’ll eventually implement ourselves): `mitmproxy --listen-port 8081` + +1. start an mitmproxy in `local` mode that intercepts `curl` traffic: `mitmproxy --mode local:curl`. Now the question is how do we make this one forward to our upstream proxy (i.e. http://localhost:8081)? The only functionality I can see in mitmproxy for forwarding to an upstream proxy is the [upstream proxy mode](https://docs.mitmproxy.org/stable/concepts-modes/#upstream-proxy), but that’s a mode; is it mutually exclusive from `local` mode? Let’s try `mitmproxy --mode local:curl --mode upstream:http://localhost:8081`. + +OK, [maintainer replied to my question](https://github.com/mitmproxy/mitmproxy/discussions/6786#discussioncomment-9044517) saying that’s not possible: + +> This commands starts two proxy modes: First, proxy all local cURL traffic. Second, spawn an HTTP proxy on port 8080 that will forward all traffic to another HTTP proxy upstream at `localhost:8081`. Proxy modes are not "interconnected". There currently is no (easy) way to use an upstream proxy with local redirect mode. + +So, we can’t use this TS server as a proxy server. What about if we write it as an application server? Either configuring the test suite to use it directly, or configuring mitmproxy to intercept and rewrite the destination server. + +How would we do the latter? Can we do [this example](https://docs.mitmproxy.org/stable/addons-examples/#http-redirect-requests) ("redirect HTTP requests to another server"), but somehow for WebSocket? + +Let's run an application server inside the server I created, then take it from there. + +OK, have got mitmproxy set up to intercept in local mode and then change the upstream server to my local app server. It seems to be doing that successfully (tested in websocat). Run with: + +`mitmdump --set stream_large_bodies=1 --mode local:websocat -s test/mitmproxy_addon_2.py` (or `local:node` for test suite) + +Now we need to set it to grab the original host so that it can open a connection to it. Let’s set a header? So I think that in normal proxy usage things are different — I think the proxy uses the `Host` header (which the agent that forwarded it the request doesn’t modify) to know where to forward to. But presumably mitmproxy is modifying that header. + +But how does a proxy know what scheme to use? i.e. whether to open with HTTPS or not. Here’s ChatGPT: + +> Yes, a proxy can determine whether to use HTTPS (HTTP over TLS) to communicate with the upstream server based on several factors: +> +> 1. **Protocol Detection**: The proxy can examine the initial request from the client to determine if it's an HTTPS request. If the request uses the HTTPS protocol (`https://`), the proxy can infer that it needs to establish an HTTPS connection with the upstream server. +> +> 2. **Explicit Configuration**: The proxy can be configured explicitly to use HTTPS for certain URLs or domains. This configuration tells the proxy to always use HTTPS when forwarding requests to these destinations. +> +> 3. **Forwarded Protocol Header**: Some proxies use a "Forwarded" or similar header to indicate the original protocol (HTTP or HTTPS) used by the client. This header can be used by the proxy to determine whether to use HTTPS when communicating with the upstream server. +> +> 4. **Environment Variables**: In some setups, environment variables or other configuration mechanisms can be used to indicate whether HTTPS should be used. The proxy can check these variables to make the decision. +> +> The exact method used depends on the proxy software and its configuration. However, proxies typically have mechanisms in place to determine whether to use HTTPS when communicating with upstream servers. + +The `Forwarded` header isn’t defined in HTTP spec, but rather in another RFC. See [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Forwarded). + +So let’s have: + +- `Ably-Test-Host`: like `Host` +- `Ably-Test-Proto`: either `ws` or `wss` + +## Notes from Thu 4 Apr that I didn’t previously incorporate here + +### About managing WebSocket connection lifetime + +hmm, all the test things are saying + +``` + 1) realtime/auth + auth_token_expires_with_web_socket_binary_transport: + + Verify correct disconnect statusCode + + expected - actual + + -400 + +401 +``` + +(why is the test suite sometimes just hanging?) + +OK, I think there's an actual issue here. What's happening is that the client is receiving the CONNECTED protocol message, then we intercept the DISCONNECTED but the server closes the connection before we have a chance to process the DISCONNECTED, so what ends up happening is that the client sees the close before the disconnected and we end up with the wrong status code. + +so for this to work we'd want to delay: + +- the delivery of the `CLOSE` frame from the server to the client +- "passing on" the server’s closing of the TCP connection (my TCP knowledge is shaky here so I don't know what that means exactly) + +until after we've delivered the DISCONNECTED + +is this possible in mitmproxy? would it have been possible in that kotlin thing? + +the problem is that mitmproxy doesn't work at a frame level AFAIK + +what we want to do is when mitmproxy finds out a websocket connection has been closed by server, to keep _its_ websocket connection with the client open until it's delivered all the stuff from the server, then pass along the `CLOSE` frame and close the connection + +is there a proper way to do with with mitmproxy? is there a hack way to do it? (will ask) + +this is how mitmproxy handles a connection closure: https://github.com/mitmproxy/mitmproxy/blob/8cf0cba1cb6e87f1cf48789e90526b75caa5436d/mitmproxy/proxy/layers/websocket.py#L202-L215 — not sure exactly what's happening here but it seems to be immediately doing _something_ with the close event...? + +`yield ws.send2(ws_event)` and `yield commands.CloseConnection(ws.conn)` (don’t know what the difference is) + +OK, I've [asked about this in mitmproxy discussions](https://github.com/mitmproxy/mitmproxy/discussions/6784) + +### About Comet + +see https://docs.mitmproxy.org/stable/overview-features/#streaming + +note that you can't manipulate streamed responses; is that an issue? in web i don't think we stream any more; what about in Node? + +start 09:48 with `--set stream_large_bodies=1` diff --git a/test/mitmproxy_addon_2.py b/test/mitmproxy_addon_2.py new file mode 100644 index 000000000..4ae36a9c1 --- /dev/null +++ b/test/mitmproxy_addon_2.py @@ -0,0 +1,54 @@ +import mitmproxy +import logging +import asyncio +import websockets +import json + +async def send_ready_notification(): + uri = "ws://localhost:8001" + logging.info(f'sending mitmproxyReady JSON-RPC notification to {uri}') + async with websockets.connect(uri) as websocket: + notification_dto = { "jsonrpc": "2.0", "method": "mitmproxyReady" } + data = json.dumps(notification_dto) + await websocket.send(data) + +class MitmproxyAddon2: + def running(self): + # tell the control API that we’re ready to receive traffic + asyncio.get_running_loop().create_task(send_ready_notification()) + + # Copied from https://docs.mitmproxy.org/stable/addons-examples/#http-redirect-requests + def request(self, flow: mitmproxy.http.HTTPFlow) -> None: + # To make sure that when running in local redirect mode (and hence intercepting all traffic from the test process) we don’t mess with traffic from the test process to the control API + # TODO see extended comments re this in test-node.yml and why it hasn’t yet been an issue in practice on macOS + if not flow.request.port in [80, 443]: + return + + # (b'Connection', b'Upgrade'), (b'Upgrade', b'websocket') + intercept = MitmproxyAddon2.is_websocket_upgrade_request(flow.request) + logging.info(f'MitmproxyAddon2 {"intercepting" if intercept else "not intercepting"} `request` {flow.request.url}, headers {flow.request.headers}') + # pretty_host takes the "Host" header of the request into account, + # which is useful in transparent mode where we usually only have the IP + # otherwise. + # if flow.request.pretty_host == "example.org": + # I tried doing it in websocket_start instead but that didn’t work + if MitmproxyAddon2.is_websocket_upgrade_request(flow.request): + original_host = flow.request.pretty_host + original_scheme = flow.request.scheme + + flow.request.host = "localhost" + flow.request.port = 8002 + flow.request.scheme = 'http' + # TODO understand how port fits into this + flow.request.headers['Ably-Test-Host'] = original_host + match original_scheme: + case 'http': + flow.request.headers['Ably-Test-Proto'] = 'ws' + case 'https': + flow.request.headers['Ably-Test-Proto'] = 'wss' + + def is_websocket_upgrade_request(request: mitmproxy.http.Request): + # TODO this request handling is a bit fragile, the special case for `split` is just to handle the fact that Firefox sends 'Connection: keep-alive, Upgrade' + return True if 'Connection' in request.headers and ('Upgrade' in request.headers['Connection'].split(", ")) and 'Upgrade' in request.headers and request.headers['Upgrade'] == 'websocket' else False + +addons = [MitmproxyAddon2()] diff --git a/test/mitmproxy_addon_generate_certs_and_exit.py b/test/mitmproxy_addon_generate_certs_and_exit.py new file mode 100644 index 000000000..29aa91df7 --- /dev/null +++ b/test/mitmproxy_addon_generate_certs_and_exit.py @@ -0,0 +1,13 @@ +import sys +import asyncio + +async def wait_a_bit_then_exit(): + await asyncio.sleep(1) + sys.exit() + +class MitmproxyAddon: + # Wait until we’ve started up, and presumably generated the SSL certs, then exit. (The wait is because if I put a `sys.exit()` directly inside `running()`, the certs aren’t yet generated; I guess there’s some enqueued work I need to wait to complete) + def running(self): + asyncio.get_running_loop().create_task(wait_a_bit_then_exit()) + +addons = [MitmproxyAddon()] diff --git a/test/private-api-usage.md b/test/private-api-usage.md new file mode 100644 index 000000000..c25c6dd9b --- /dev/null +++ b/test/private-api-usage.md @@ -0,0 +1,405 @@ +# Usage of private APIs in ably-js test suite + +Written at commit `50076ed`. + +Investigating this as part of ECO-14. + +Files come from running `find test -name '*.js'`. + +Multiple similar usages of the same API in a given file are not necessarily repeated. + +Not been particularly consistent here in explaining _why_ it uses a given API; sometimes I have, sometimes I haven't if it wasn't obvious or something. + +Questions: + +- when it does things like noop-ing `onProtocolMessage`, is it important whether it applies to a specific instance or not? +- what subtleties are there about whether when we override e.g. a send method, it's blocking other sends until resolved? +- things like `await channel.processMessage` in a test (actually, the `await` is a bit of a red herring, could just as easily be `onProtocolMessage`), how do we know when the client has actually processed the message so that we can proceed with the test? (understand better how much of an issue this is) +- how would patterns like restore the `original*` implementation work? + +## Other notes + +I haven’t mentioned the places where the tests use JS-specific public API, e.g. `transports` client option. + +## `test/web_server.js` + +None + +## `test/realtime/delta.test.js` + +- `channel._lastPayload.messageId = null` + - to make decoding fail + +## `test/realtime/encoding.test.js` + +- `var BufferUtils = Ably.Realtime.Platform.BufferUtils;` +- `var Defaults = Ably.Rest.Platform.Defaults;` + - just used for accessing library’s baked-in protocol version, to pass to `request()` + +## `test/realtime/presence.test.js` + +- `var createPM = Ably.protocolMessageFromDeserialized;` +- `var PresenceMessage = Ably.Realtime.PresenceMessage;` +- replacing `channel.sendPresence` with a version that checks the presence message’s client ID +- replacing `transport.send` with a version that checks the encoded data in the protocol message +- `channel.presence.members.waitSync(cb);` +- `var connId = realtime.connection.connectionManager.connectionId;` +- `channel.presence._myMembers.put(` +- `channel.sync();` +- stubbing out `channel.attachImpl` +- `channel.checkPendingState();` +- `Ably.Realtime.Platform.Config.nextTick(cb);` +- calling `channel.processMessage` to inject a protocol message + +TODO what’s +var openConnections = res[1] && res[1].close ? [listenerRealtime, res[1]] : listenerRealtime; + +## `test/realtime/event_emitter.test.js` + +- `eventEmitter.emit('custom');` — RTE6 says that `emit` is internal + +## `test/realtime/api.test.js` + +None + +## `test/realtime/crypto.test.js` + +- `var BufferUtils = Ably.Realtime.Platform.BufferUtils;` +- `var msgpack = typeof window == 'object' ? Ably.msgpack : require('@ably/msgpack-js');` +- `Message.encode(testMessage, channelOpts)` +- `Message.decode(encryptedMessage, channelOpts);` +- `Message.fromValues(` +- `expect(channel.channelOptions.cipher.algorithm).to.equal('aes');` — `channel.channelOptions` is not public API + +## `test/realtime/failure.test.js` + +- `webSocketConnectTimeout: 50` client option +- replacing `channel.processMessage` to drop `ATTACHED` +- replacing `realtime.connection.connectionManager.activeProtocol.transport.onProtocolMessage` to drop `ACK` +- `Ably.Realtime.Platform.Config.nextTick(function () {` +- calling `realtime.connection.connectionManager.activeProtocol.transport.onProtocolMessage` to inject an `ERROR` +- calling `realtime.connection.connectionManager.on('transport.pending'` and then replacing this transport’s `onProtocolMessage` to change its `connectionDetails.maxIdleInterval` +- accessing `connection.connectionManager.activeProtocol.getTransport()` to inject a `DISCONNECTED` +- replacing `connectionManager.onChannelMessage` to listen for `MESSAGE`and then calling `requestState('attaching')` on a channel in response + +## `test/realtime/channel.test.js` + +- `var createPM = Ably.protocolMessageFromDeserialized;` +- `expect(channel.channelOptions).to.deep.equal(channelOptions, 'Check requested channel options');` (`channelOptions` isn’t public API) +- listens for `channel._allChannelChanges.on(['update'],` +- replaces `channel.sendMessage` with an empty implementation (to "sabotage the reattach attempt") +- sets `realtime.options.timeouts.realtimeRequestTimeout = 100` i.e. modifies client options after creation +- calls `transport.onProtocolMessage` to inject `DETACHED` +- replaces `channel.sendMessage` to check that an `ATTACH` was received, and inside it then calls `transport.onProtocolMessage` to inject a `DETACHED` +- OK, have seen plenty of `onProtocolMessage` calls to inject a protocol message now; will only write if something particularly interesting seen +- replaces `channel.sendMessage` with an implementation which fails the test if called +- replaces `channel.sendMessage` to check that only a `DETACH` is being sent, and to continue the test once second `DETACH` sent + +## `test/realtime/auth.test.js` + +- `var http = new Ably.Realtime._Http();` — just uses this as an HTTP client to fetch a JWT +- spies on `rest.time` to count how many times called +- checks `rest.serverTimeOffset` +- spies on `transport.send` to look for an outgoing `AUTH` and check its properties + +## `test/realtime/transports.test.js` + +Transports are a JS-specific concept so might not be worth worrying too much about the contents of this file + +- `const Defaults = Ably.Rest.Platform.Defaults;` + - changes `Defaults.wsConnectivityUrl` +- `const defaultTransports = new Ably.Realtime({ key: 'xxx:yyy', autoConnect: false }).connection.connectionManager.transports;` +- `const baseTransport = new Ably.Realtime({ key: 'xxx:yyy', autoConnect: false, transports: availableTransports }).connection.connectionManager.baseTransport;` +- changes `Ably.Rest.Platform.Config.WebSocket` + - replaces it with a `FakeWebSocket` class to simulate not emitting any events +- checks `realtime.connection.connectionManager.activeProtocol.transport.shortName` +- `webSocketSlowTimeout` and `webSocketConnectTimeout` client options +- checks `window.localStorage.getItem(transportPreferenceName)` +- sets `window.localStorage.setItem(transportPreferenceName` +- modifies `realtime.connection.connectionManager.checkWsConnectivity` to delay its completion until some other event has happened + +## `test/realtime/utils.test.js` + +Ah, I just realised that some of the properties on `shared_helper` actually refer to properties of the library, e.g. `helper.Utils` is actually `Ably.Realtime.Utils`. So perhaps I missed some usages of internal APIs in earlier files. But can figure that out later. + +- this entire file is a test of the internal `utils.getRetryTime(…)` method + +## `test/realtime/resume.test.js` + +- `connectionManager.once('transport.active',` and inside the callback it makes an assertion on `transport.params.mode` +- sets a channel’s state: `suspendedChannel.state = 'suspended';` +- sabotages a resume by setting `connection.connectionManager`’s `conectionKey` and `connectionId` to garbage +- sets `connection.connectionManager.msgSerial` to some fixed value (not sure of motivation) +- calls `connection.connectionManager.disconnectAllTransports();` +- checks `connection.connectionManager.msgSerial` and `connection.connectionManager.connectionId` +- sabotages a resume by setting `realtime.auth.tokenDetails.token` +- modifies `realtime.auth.key` to something invalid in order to get a fatal resume error +- sets `connectionManager.lastActivity` to something far in the past +- sets `connectionManager.activeProtocol.getTransport().onProtocolMessage` to no-op so that last activity timer doesn’t get bumped +- spies on `connectionManager.tryATransport` to verify `transportParams.mode` +- modifies `connectionManager.send` to do `msg.setFlag('ATTACH_RESUME')` on the outgoing message + +## `test/realtime/message.test.js` + +- `let config = Ably.Realtime.Platform.Config;` +- `var createPM = Ably.protocolMessageFromDeserialized;` +- modifies `transport.send` to check the `clientId` on the outgoing `MESSAGE` +- checks `channel.filteredSubscriptions.has(listener)` +- accesses `connectionManager.connectionDetails`, modifies its `maxMessageSize`, then re-injects it via a `CONNECTED` passed to `onProtocolMessage()` +- bundling test performs some assertions about the contents of `realtime.connection.connectionManager.queuedMessages` + +## `test/realtime/connection.test.js` + +- creates a `recover` client option which uses knowledge of ably-js’s serialization of recovery key +- spies on `transport.send` to listen for `MESSAGE`, check its properties, and then continue the test +- calls `connectionManager.disconnectAllTransports();` +- listens for `connectionManager.once('connectiondetails')` in order to make some assertions about those details +- checks `realtime.options.maxMessageSize` + +## `test/realtime/init.test.js` + +- accesses `var transport = realtime.connection.connectionManager.activeProtocol.transport.uri` or `.recvRequest.recvUri` to check the `v=3` query parameter +- `expect(realtime.options).to.deep.equal(realtime.connection.connectionManager.options);` +- checks `realtime.connection.connectionManager.httpHosts[0];` to check it’s using correct default host, also checks length of that array +- checks that timeout-related client options are reflected in internal `realtime.connection.connectionManage.states.*.retryDelay` values +- spies on `realtime.connection.connectionManager.tryATransport`, looking at the host that’s being used to connect, although not sure exactly to what end +- checks `realtime.connection.connectionManager`’s `baseTransport` and `webSocketTransportAvailable` +- modifies `realtime.connection.connectionManager.pendingTransport.onProtocolMessage` to look for `CONNECTED`, make an assertion about it, and then set its `connectionKey` and `clientId` to fixed values (so we can assert they’re subsequently used to populate some user-facing properties) +- calls the `new Ably.Rest._Http()._getHosts(…)` API to check its result +- calls `helper.AblyRest().options.realtimeHost;` just to get a URL to be used in a realtime’s `fallbackHosts` + +## `test/realtime/history.test.js` + +None + +## `test/realtime/connectivity.test.js` + +- directly calls `new Ably.Realtime._Http().checkConnectivity()` and checks it succeeds (i.e. directly tests this method) + +## `test/realtime/reauth.test.js` + +None + +## `test/realtime/sync.test.js` + +- calling `channel.processMessage` to inject an `ATTACHED` with a presence flag, and then a `SYNC`, later on a `PRESENCE` +- spies on `channel.processMessage` to, after processing a received `SYNC`, inject a `PRESENCE` + +## `test/browser/simple.test.js` + +- checks whether a transport is available using `transport in Ably.Realtime.ConnectionManager.supportedTransports(Ably.Realtime._transports)` + +## `test/browser/http.test.js` + +- changes `Ably.Rest.Platform.Config.xhrSupported` to false to make it use Fetch + +## `test/browser/connection.test.js` + +(I guess that this is a test that we might not include in the unified test suite.) + +- uses knowledge of library’s usage of `window.sessionStorage` for transport preference and recovery key +- fires an `"offline"` event, ditto `"offline"` +- replaces `connection.connectionManager.tryATransport` to "simulate the internet being failed" +- listens for `connection.connectionManager.once('transport.pending'` in order to know when to "sabotage the connection attempt", and then makes assertions about this transport (`isDisposed`, checking `realtime.connection.connectionManager.activeProtocol.transport`) +- dispatches a `"beforeunload"` event +- tests `realtime.connection.connectionManager.baseTransport` and `realtime.connection.connectionManager.webSocketTransportAvailable` + +## `test/browser/modular.test.js` + +- `const BufferUtils = BaseRest.Platform.BufferUtils;` + - just used for Base64 and checking buffer equality, can be replaced easily +- replaces `rest.http.do` to check the `Content-Type` request header +- replaces `realtime.connection.connectionManager.connectImpl` to check `transportParams.format` +- spies on `realtime.connection.connectionManager.tryATransport` to check which transport being tried + +## `test/common/globals/named_dependencies.js` + +N/A + +## `test/common/globals/environment.js` + +N/A + +## `test/common/ably-common/test/agents.test.js` + +N/A + +## `test/common/ably-common/.eslintrc.js` + +N/A + +## `test/common/ably-common/json-schemas/publish.js` + +N/A + +## `test/common/modules/client_module.js` + +- uses `Ably.Realtime.Utils` for its `mixin` function + +## `test/common/modules/testapp_manager.js` + +- uses `ably.Realtime.Platform.BufferUtils` + +## `test/common/modules/testapp_module.js` + +None + +## `test/common/modules/shared_helper.js` + +- `var utils = clientModule.Ably.Realtime.Utils;` +- `var platform = clientModule.Ably.Realtime.Platform;` + - uses `platform.Config.nextTick()` +- uses `var BufferUtils = platform.BufferUtils;` +- extracts `availableTransports` and `bestTransport` by reading `Ably.Realtime.ConnectionManager.supportedTransports(Ably.Realtime._transports)` + - `availableTransports` used by `testOnAllTransports` +- `simulateDroppedConnection()` does the following: + - `realtime.connection.connectionManager.requestState({ state: 'disconnected' })` + - `realtime.connection.connectionManager.disconnectAllTransports();` +- `becomeSuspended()` does the following: + - `realtime.connection.connectionManager.disconnectAllTransports();` + - `realtime.connection.connectionManager.notifyState({ state: 'suspended' });` +- `callbackOnClose()`: + - checks `realtime.connection.connectionManager.activeProtocol` + - does `realtime.connection.connectionManager.activeProtocol.transport.on('disposed',` +- `isComet(transport)` and `isWebsocket(transport)` check for `"comet"` and `"wss:/"` which I guess is something internal? + +## `test/support/junit_directory_path.js` + +N/A + +## `test/support/mocha_junit_reporter/index.js` + +N/A + +## `test/support/mocha_junit_reporter/shims/fs.js` + +N/A + +## `test/support/mocha_junit_reporter/build/node.js` + +Generated + +## `test/support/mocha_junit_reporter/build/browser.js` + +Generated + +## `test/support/root_hooks.js` + +None + +## `test/support/environment.vars.js` + +None + +## `test/support/runPlaywrightTests.js` + +N/A + +## `test/support/test_helper.js` + +N/A + +## `test/support/browser_file_list.js` + +N/A + +## `test/support/modules_helper.js` + +N/A + +## `test/support/browser_setup.js` + +N/A + +## `test/support/mocha_reporter.js` + +N/A + +## `test/support/playwrightSetup.js` + +N/A + +## `test/rest/bufferutils.test.js` + +This file is a unit test of `Ably.Realtime.Platform.BufferUtils`; something we wouldn’t include in a unified test suite. + +## `test/rest/presence.test.js` + +- `var BufferUtils = Ably.Realtime.Platform.BufferUtils;` + - I’m going to stop mentioning the use of BufferUtils as a test util now; the pattern is clear and not hard to fix. + +## `test/rest/fallbacks.test.js` + +- checks `rest._currentFallback.{host, validUntil}` to check that the working fallback has been stored correctly +- modifies `rest._currentFallback.validUntil` to check library correctly forgets stored fallback + +## `test/rest/api.test.js` + +None + +## `test/rest/stats.test.js` + +None + +## `test/rest/batch.test.js` + +None + +## `test/rest/time.test.js` + +None + +## `test/rest/auth.test.js` + +- ditto will stop mentioning usage of `Utils` for stuff that will be pretty easy to replace + +None + +## `test/rest/http.test.js` + +- accesses `Ably.Rest.Platform.Defaults` to check its `version` is being used to populate `Ably-Agent` +- spies on `rest.http.do` to make assertions about request headers +- replaces `rest.http.do` to simulate a 204 response + +## `test/rest/capability.test.js` + +None + +## `test/rest/push.test.js` + +None + +## `test/rest/message.test.js` + +- spies on `channel._publish` to verify that client does / doesn’t add a `clientId` + - ditto to check that idempotent REST publishing generates message IDs + - ditto to check `params` +- overrides `Ably.Rest._Http.doUri` to fake a publish error + +## `test/rest/init.test.js` + +- accesses various properties of `rest.options` to check the effect of passing various things to the constructor + +## `test/rest/history.test.js` + +None + +## `test/rest/defaults.test.js` + +This appears to be a unit test of the `Defaults` class’s `normaliseOptions()`, `getHosts()`, and `getPort()` methods. ButI imagine it’s actually providing the test suite’s coverage of a buch of spec points which aren’t written in terms of this API. + +## `test/rest/status.test.js` + +None + +## `test/rest/request.test.js` + +- overrides `rest.http.do()` to check `X-Ably-Version` request header + +## `test/package/browser/template/server/resources/runTest.js` + +N/A + +## `test/package/browser/template/playwright-lib.config.js` + +N/A diff --git a/test/realtime/connection.test.js b/test/realtime/connection.test.js index 058b6a646..660333027 100644 --- a/test/realtime/connection.test.js +++ b/test/realtime/connection.test.js @@ -1,6 +1,12 @@ 'use strict'; -define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async, chai) { +define(['ably', 'shared_helper', 'async', 'chai', 'interception_proxy_client'], function ( + Ably, + helper, + async, + chai, + interceptionProxyClient, +) { var expect = chai.expect; var closeAndFinish = helper.closeAndFinish; var closeAndFinishAsync = helper.closeAndFinishAsync; @@ -169,112 +175,124 @@ define(['ably', 'shared_helper', 'async', 'chai'], function (Ably, helper, async * without being merged with new messages) */ it('connectionQueuing', function (done) { - var realtime = helper.AblyRealtime({ transports: [helper.bestTransport] }), - channel = realtime.channels.get('connectionQueuing'), - connectionManager = realtime.connection.connectionManager; + interceptionProxyClient.intercept(done, (done, interceptionContext) => { + var realtime = helper.AblyRealtime({ transports: [helper.bestTransport] }), + channel = realtime.channels.get('connectionQueuing'), + connectionManager = realtime.connection.connectionManager; - realtime.connection.once('connected', function () { - var transport = connectionManager.activeProtocol.transport; - whenPromiseSettles(channel.attach(), function (err) { - if (err) { - closeAndFinish(done, realtime, err); - return; - } + realtime.connection.once('connected', function () { + var transport = connectionManager.activeProtocol.transport; + whenPromiseSettles(channel.attach(), function (err) { + if (err) { + closeAndFinish(done, realtime, err); + return; + } - let transportSendCallback; + let transportSendCallback; - /* Sabotage sending the message */ - transport.send = function (msg) { - if (msg.action == 15) { - expect(msg.msgSerial).to.equal(0, 'Expect msgSerial to be 0'); + /* Sabotage sending the message */ + interceptionContext.transformClientMessage = (msg) => { + if (msg.deserialized.action == 15) { + expect(msg.deserialized.msgSerial).to.equal(0, 'Expect msgSerial to be 0'); - if (!transportSendCallback) { - done(new Error('transport.send override called before transportSendCallback populated')); - } + if (!transportSendCallback) { + done(new Error('transport.send override called before transportSendCallback populated')); + } - transportSendCallback(null); - } - }; + transportSendCallback(null); + } - let publishCallback; + // drop the message + return null; + }; - async.series( - [ - function (cb) { - transportSendCallback = cb; + let publishCallback; - /* Sabotaged publish */ - whenPromiseSettles(channel.publish('first', null), function (err) { - if (!publishCallback) { - done(new Error('publish completed before publishCallback populated')); - } - publishCallback(err); - }); - }, + async.series( + [ + function (cb) { + transportSendCallback = cb; - // We wait for transport.send to recieve the message that we just - // published before we proceed to disconnecting the transport, to - // make sure that the message got marked as `sendAttempted`. + /* Sabotaged publish */ + whenPromiseSettles(channel.publish('first', null), function (err) { + if (!publishCallback) { + done(new Error('publish completed before publishCallback populated')); + } + publishCallback(err); + }); + }, - function (cb) { - async.parallel( - [ - function (cb) { - publishCallback = function (err) { - try { - expect(!err, 'Check publish happened (eventually) without err').to.be.ok; - } catch (err) { - cb(err); - return; - } - cb(); - }; - }, - function (cb) { - /* After the disconnect, on reconnect, spy on transport.send again */ - connectionManager.once('transport.pending', function (transport) { - var oldSend = transport.send; + // We wait for transport.send to recieve the message that we just + // published before we proceed to disconnecting the transport, to + // make sure that the message got marked as `sendAttempted`. - transport.send = function (msg, msgCb) { - if (msg.action === 15) { - if (msg.messages[0].name === 'first') { - try { - expect(msg.msgSerial).to.equal(0, 'Expect msgSerial of original message to still be 0'); - expect(msg.messages.length).to.equal( - 1, - 'Expect second message to not have been merged with the attempted message', - ); - } catch (err) { - cb(err); - return; - } - } else if (msg.messages[0].name === 'second') { - try { - expect(msg.msgSerial).to.equal(1, 'Expect msgSerial of new message to be 1'); - } catch (err) { - cb(err); - return; - } - cb(); - } + function (cb) { + async.parallel( + [ + function (cb) { + publishCallback = function (err) { + try { + expect(!err, 'Check publish happened (eventually) without err').to.be.ok; + } catch (err) { + cb(err); + return; } - oldSend.call(transport, msg, msgCb); + cb(); }; - channel.publish('second', null); - }); + }, + function (cb) { + /* After the disconnect, on reconnect, spy on transport.send again */ + connectionManager.once('transport.pending', function (transport) { + // TODO does the identity of this transport matter, and can we replace the `transport.pending` check with something external too (e.g. detecting a new connection)? perhaps let's have an EventEmitter interface on the interception context that says when there's a new connection or something + interceptionContext.transformClientMessage = function (msg) { + if (msg.deserialized.action === 15) { + if (msg.deserialized.messages[0].name === 'first') { + try { + expect(msg.deserialized.msgSerial).to.equal( + 0, + 'Expect msgSerial of original message to still be 0', + ); + expect(msg.deserialized.messages.length).to.equal( + 1, + 'Expect second message to not have been merged with the attempted message', + ); + } catch (err) { + cb(err); + return msg.deserialized; + } + } else if (msg.deserialized.messages[0].name === 'second') { + try { + expect(msg.deserialized.msgSerial).to.equal( + 1, + 'Expect msgSerial of new message to be 1', + ); + } catch (err) { + cb(err); + return msg.deserialized; + } + cb(); + } + } - /* Disconnect the transport (will automatically reconnect and resume) () */ - connectionManager.disconnectAllTransports(); - }, - ], - cb, - ); + // preserve the message + return msg.deserialized; + }; + channel.publish('second', null); + }); + + /* Disconnect the transport (will automatically reconnect and resume) () */ + connectionManager.disconnectAllTransports(); + }, + ], + cb, + ); + }, + ], + function (err) { + closeAndFinish(done, realtime, err); }, - ], - function (err) { - closeAndFinish(done, realtime, err); - }, - ); + ); + }); }); }); }); diff --git a/test/support/openPlaywrightBrowser.js b/test/support/openPlaywrightBrowser.js new file mode 100644 index 000000000..2f828bd29 --- /dev/null +++ b/test/support/openPlaywrightBrowser.js @@ -0,0 +1,5 @@ +const { openPlaywrightBrowser } = require('./playwrightHelpers'); + +(async function run() { + await openPlaywrightBrowser(false /* headless */); +})(); diff --git a/test/support/playwrightHelpers.js b/test/support/playwrightHelpers.js new file mode 100644 index 000000000..1ff0a467d --- /dev/null +++ b/test/support/playwrightHelpers.js @@ -0,0 +1,63 @@ +const path = require('path'); +const util = require('util'); +const exec = util.promisify(require('child_process').exec); +const playwright = require('playwright'); +const { randomUUID } = require('crypto'); +const playwrightBrowsers = ['chromium', 'firefox', 'webkit']; + +async function openPlaywrightBrowser(headless) { + const browserEnv = process.env.PLAYWRIGHT_BROWSER; + + if (!playwrightBrowsers.includes(browserEnv)) { + throw new Error( + `PLAYWRIGHT_BROWSER environment variable must be one of: ${playwrightBrowsers.join( + ', ', + )}. Currently: ${browserEnv}`, + ); + } + + const browserType = playwright[browserEnv]; + + const options = { + headless, + // bypass localhost so that the proxy doesn’t need to be running in order for us to contact the control API to tell it to be started; TODO there is quite possibly a less convoluted way of starting the proxy in this case, also think in a more holistic manner about the various ways in which we make sure that only certain traffic is intercepted (there are notes dotted around about this) + proxy: { server: 'localhost:8080', bypass: 'localhost' }, + }; + + // (I originally tried using the ignoreHTTPSErrors Playwright option, but that doesn’t seem to work for CORS preflight requests) + + let browser; + + if (browserEnv === 'firefox') { + // TODO clean up when closing + const profileDirectory = path.join('tmp', 'browser-profiles', `browserEnv-${randomUUID()}`); + + // We create and then discard a browser instance just to create the structure of the profile directory, which I guess certutil needs + // TODO this probably isn’t necessary; I think we can just create the directory ahead of time and then use certutil to create the DB, like we do for Chromium + const throwawayBrowser = await browserType.launchPersistentContext(profileDirectory, { + ...options, + headless: true, + }); + await throwawayBrowser.close(); + + // Install the mitmproxy root CA cert + // https://github.com/microsoft/playwright/issues/18115#issuecomment-2067175748 + // https://wiki.mozilla.org/CA/AddRootToFirefox + // https://sadique.io/blog/2012/06/05/managing-security-certificates-from-the-console-on-windows-mac-os-x-and-linux/#firefox + // TODO document that on macOS you get certutil from `brew install nss` + await exec( + `certutil -A -d ${profileDirectory} -t C -n "Mitmproxy Root Cert" -i ~/.mitmproxy/mitmproxy-ca-cert.pem`, + ); + + browser = await browserType.launchPersistentContext(profileDirectory, options); + } else { + // TODO explain what to do for trust + browser = await browserType.launch(options); + } + + const page = await browser.newPage(options); + + return { browserType, browser, page }; +} + +module.exports = { openPlaywrightBrowser }; diff --git a/test/support/root_hooks.js b/test/support/root_hooks.js index aab15e140..95e6524d1 100644 --- a/test/support/root_hooks.js +++ b/test/support/root_hooks.js @@ -1,4 +1,8 @@ -define(['shared_helper'], function (helper) { +define(['shared_helper', 'interception_proxy_client'], function (helper, interceptionProxyClient) { + before(async function () { + await interceptionProxyClient.connect(); + }); + after(function (done) { this.timeout(10 * 1000); helper.tearDownApp(function (err) { @@ -10,8 +14,21 @@ define(['shared_helper'], function (helper) { }); }); + after(async () => { + await interceptionProxyClient.disconnect(); + }); + + // The `START TEST` and `END TEST` logs are to make it easy to see the IDs of interception proxy connections that were started during the test, to correlate with the proxy logs + afterEach(helper.closeActiveClients); afterEach(helper.logTestResults); afterEach(helper.flushTestLogs); + afterEach(function () { + console.log(`END TEST: ${this.currentTest.fullTitle()}`); + }); + + beforeEach(function () { + console.log(`START TEST: ${this.currentTest.fullTitle()}`); + }); beforeEach(helper.clearTransportPreference); }); diff --git a/test/support/runPlaywrightTests.js b/test/support/runPlaywrightTests.js index 5dd1ca2b5..dd7452148 100644 --- a/test/support/runPlaywrightTests.js +++ b/test/support/runPlaywrightTests.js @@ -1,18 +1,17 @@ -const playwright = require('playwright'); const path = require('path'); const MochaServer = require('../web_server'); const fs = require('fs'); const jUnitDirectoryPath = require('./junit_directory_path'); +const { openPlaywrightBrowser } = require('./playwrightHelpers'); const port = process.env.PORT || 3000; const host = 'localhost'; -const playwrightBrowsers = ['chromium', 'firefox', 'webkit']; const mochaServer = new MochaServer(/* playwrightTest: */ true); -const runTests = async (browserType) => { - mochaServer.listen(); - const browser = await browserType.launch(); - const page = await browser.newPage(); +const runTests = async () => { + const { browserType, browser, page } = await openPlaywrightBrowser(true /* headless */); + + await mochaServer.listen(); await page.goto(`http://${host}:${port}`); console.log(`\nrunning tests in ${browserType.name()}`); @@ -67,17 +66,7 @@ const runTests = async (browserType) => { let caughtError; try { - const browserEnv = process.env.PLAYWRIGHT_BROWSER; - - if (!playwrightBrowsers.includes(browserEnv)) { - throw new Error( - `PLAYWRIGHT_BROWSER environment variable must be one of: ${playwrightBrowsers.join( - ', ', - )}. Currently: ${browserEnv}`, - ); - } - - await runTests(playwright[browserEnv]); + await runTests(); } catch (error) { // save error for now, we must ensure we end mocha web server first. // if we end current process too early, mocha web server will be left running, diff --git a/test/web_server.js b/test/web_server.js index bc5c29bdb..b90a76aba 100755 --- a/test/web_server.js +++ b/test/web_server.js @@ -46,7 +46,7 @@ class MochaServer { } close() { - this.server.close(); + this.server?.close(); } } diff --git a/with-failure-logs-2.txt b/with-failure-logs-2.txt new file mode 100644 index 000000000..5074fa8f0 --- /dev/null +++ b/with-failure-logs-2.txt @@ -0,0 +1,1232 @@ +favicon.ico:1 Failed to load resource: the server responded with a status of 404 (Not Found) + START TEST: browser/modular Rest BaseRealtime with Rest allows you to use push admin functionality + END TEST: browser/modular Rest BaseRealtime with Rest allows you to use push admin functionality + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `time()` + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `time()` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `stats()` + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `stats()` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `request(...)` + interception proxy got message {"jsonrpc":"2.0","id":"202a23cb-27ad-4a19-9028-d2a9d3c5b935","method":"transformInterceptedMessage","params":{"id":"66dacd99-47dd-465d-bb76-5084e587c1df","connectionID":"70912198-025c-4e15-a5a7-e14b6d209647","type":"text","data":"{\"action\":4,\"connectionId\":\"qKKTgqkj6u\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!qKKTgqkj6uATT81gtWDe3G-2ea\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 66dacd99-47dd-465d-bb76-5084e587c1df unaltered + interception proxy got result of transforming message 66dacd99-47dd-465d-bb76-5084e587c1df Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"aa51b081-cbdc-423c-8ad2-a51d87ef5d58","method":"transformInterceptedMessage","params":{"id":"e8a9cfde-5cae-47b3-9ae5-5858762fea0d","connectionID":"c3f539da-8082-4db4-a859-8cf2db3c4887","type":"text","data":"{\"action\":4,\"connectionId\":\"r-OnBTETJl\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!r-OnBTETJlARC8Am8mrbJM-18b4\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message e8a9cfde-5cae-47b3-9ae5-5858762fea0d unaltered + interception proxy got result of transforming message e8a9cfde-5cae-47b3-9ae5-5858762fea0d Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `request(...)` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPublish(...)` + interception proxy got message {"jsonrpc":"2.0","id":"3db960bb-e139-424a-9e54-255e0dccdf83","method":"transformInterceptedMessage","params":{"id":"4003e45b-bbfc-4964-b6cf-ee91fdb9f59a","connectionID":"7637f8e0-a9d6-493b-bd06-537ba0be5c3e","type":"text","data":"{\"action\":4,\"connectionId\":\"V6wGU-1eW3\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!V6wGU-1eW3Adg87gbBVG8T-30c\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 4003e45b-bbfc-4964-b6cf-ee91fdb9f59a unaltered + interception proxy got result of transforming message 4003e45b-bbfc-4964-b6cf-ee91fdb9f59a Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPublish(...)` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPresence(...)` + interception proxy got message {"jsonrpc":"2.0","id":"5d8a75cd-0689-4d7e-9062-3835395391c4","method":"transformInterceptedMessage","params":{"id":"9d3823a9-fae2-443f-bf7f-20177dfea485","connectionID":"e23c4a14-44ab-46fd-a0f4-4edb829afaf1","type":"text","data":"{\"action\":4,\"connectionId\":\"OFaaeT3HIG\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!OFaaeT3HIGAVMLUN7KI_nD-e75\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 9d3823a9-fae2-443f-bf7f-20177dfea485 unaltered + interception proxy got result of transforming message 9d3823a9-fae2-443f-bf7f-20177dfea485 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPresence(...)` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.revokeTokens(...)` + interception proxy got message {"jsonrpc":"2.0","id":"bed37fed-4559-4c92-a86b-f8c3b765a751","method":"transformInterceptedMessage","params":{"id":"e9c71794-d289-4f2b-95ad-7447703b9ffa","connectionID":"4abeba2e-2382-4148-bc56-51e5370cff35","type":"text","data":"{\"action\":4,\"connectionId\":\"Ku64ix2yXy\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!Ku64ix2yXyAQLVAY6LWFRT-ed1\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message e9c71794-d289-4f2b-95ad-7447703b9ffa unaltered + interception proxy got result of transforming message e9c71794-d289-4f2b-95ad-7447703b9ffa Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.revokeTokens(...)` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `history()` + interception proxy got message {"jsonrpc":"2.0","id":"cb4b45ad-8835-424b-9827-509fc558b6b6","method":"transformInterceptedMessage","params":{"id":"9f2f0bee-89e6-4a51-a407-579bc364a4a8","connectionID":"d28b1b1e-3bab-4445-b632-30c86c4a5b99","type":"text","data":"{\"action\":4,\"connectionId\":\"6ex4uKUgws\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!6ex4uKUgwsATI2Du5dAYUx-30e\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 9f2f0bee-89e6-4a51-a407-579bc364a4a8 unaltered + interception proxy got result of transforming message 9f2f0bee-89e6-4a51-a407-579bc364a4a8 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `history()` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `presence.history()` + interception proxy got message {"jsonrpc":"2.0","id":"e74d92e4-df2d-4324-bb8d-ab9d620a9f5b","method":"transformInterceptedMessage","params":{"id":"29fd8141-7421-4d4c-96c8-c7aea4efe8c0","connectionID":"5fb28df8-6168-4f1c-8cca-9848a76982b4","type":"text","data":"{\"action\":4,\"connectionId\":\"xkM1Fo7WPq\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!xkM1Fo7WPqAUk0yz_-ATJ2-2eb\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 29fd8141-7421-4d4c-96c8-c7aea4efe8c0 unaltered + interception proxy got result of transforming message 29fd8141-7421-4d4c-96c8-c7aea4efe8c0 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `presence.history()` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `status()` + interception proxy got message {"jsonrpc":"2.0","id":"bb4326a8-3bbc-4634-b78b-1f88555d3bf6","method":"transformInterceptedMessage","params":{"id":"43b4ed20-2616-47a4-b979-5930b36bb2f6","connectionID":"639be235-16ca-40e8-ad4e-0d386175fa7c","type":"text","data":"{\"action\":4,\"connectionId\":\"t8hjdXb15j\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!t8hjdXb15jATF_fd9ERUXx-1923\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 43b4ed20-2616-47a4-b979-5930b36bb2f6 unaltered + interception proxy got result of transforming message 43b4ed20-2616-47a4-b979-5930b36bb2f6 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `status()` + START TEST: browser/modular Rest BaseRealtime without Rest still allows publishing and subscribing + interception proxy got message {"jsonrpc":"2.0","id":"76aaf8c5-08c9-4150-9214-b4b36a6e8b4d","method":"transformInterceptedMessage","params":{"id":"1611eb6f-e787-4abe-9821-4b8e96cf6fdc","connectionID":"29812980-815d-4f23-a715-40adb3876177","type":"text","data":"{\"action\":4,\"connectionId\":\"VAiW2X96iY\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!VAiW2X96iYAe9PHE9IV8Gm-1925\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 1611eb6f-e787-4abe-9821-4b8e96cf6fdc unaltered + interception proxy got result of transforming message 1611eb6f-e787-4abe-9821-4b8e96cf6fdc Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"bcaaafc1-f543-43cf-895a-d1dd6d9b9663","method":"transformInterceptedMessage","params":{"id":"35e0140b-5848-4ada-bc56-daa00f2a814c","connectionID":"cb9abcdc-448e-46f1-be4e-01a28451defb","type":"text","data":"{\"action\":4,\"connectionId\":\"UU7ArG2Ypa\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!UU7ArG2YpaAazDHF5yqKjD-1927\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 35e0140b-5848-4ada-bc56-daa00f2a814c unaltered + interception proxy got result of transforming message 35e0140b-5848-4ada-bc56-daa00f2a814c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"2037c90c-eb56-4dcc-9cdb-a56eb3b1f3fc","method":"transformInterceptedMessage","params":{"id":"ccc68e4f-eca4-4279-b36a-cd830954cc09","connectionID":"68eaba90-334f-48dd-b9dd-6011c24bf167","type":"text","data":"{\"action\":4,\"connectionId\":\"16MoSbwqcx\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!16MoSbwqcxAe2SocOJinCH-ed4\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ccc68e4f-eca4-4279-b36a-cd830954cc09 unaltered + interception proxy got result of transforming message ccc68e4f-eca4-4279-b36a-cd830954cc09 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d3bf0997-4bb0-4c54-8eaf-271118dacd24","method":"transformInterceptedMessage","params":{"id":"105233de-f419-4275-a3a8-a9dc3b0accf3","connectionID":"1144e935-7078-4e6c-8853-a1378937e60c","type":"text","data":"{\"action\":4,\"connectionId\":\"URLn_dHgkG\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!URLn_dHgkGAXF8i8UCMyAj-2f0\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 105233de-f419-4275-a3a8-a9dc3b0accf3 unaltered + interception proxy got result of transforming message 105233de-f419-4275-a3a8-a9dc3b0accf3 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"1d302656-e71a-4df9-a119-02c605fcedea","method":"transformInterceptedMessage","params":{"id":"11348e60-dd45-4e2f-a03b-42f5f9e33ecf","connectionID":"1144e935-7078-4e6c-8853-a1378937e60c","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 11348e60-dd45-4e2f-a03b-42f5f9e33ecf unaltered + interception proxy got result of transforming message 11348e60-dd45-4e2f-a03b-42f5f9e33ecf Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"84813ef0-773b-4263-86bd-ebcee0abba4d","method":"transformInterceptedMessage","params":{"id":"c474c215-6b21-4c51-9fae-ed573429c188","connectionID":"1144e935-7078-4e6c-8853-a1378937e60c","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971088060-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message c474c215-6b21-4c51-9fae-ed573429c188 unaltered + interception proxy got result of transforming message c474c215-6b21-4c51-9fae-ed573429c188 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"54c2eb6e-2b74-47d5-b369-3e95883b9a43","method":"transformInterceptedMessage","params":{"id":"14ae5396-8b37-4220-a431-d1dfb594aa69","connectionID":"1144e935-7078-4e6c-8853-a1378937e60c","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"encoding\":\"json\",\"data\":\"{\\\"foo\\\":\\\"bar\\\"}\"}],\"msgSerial\":0}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 14ae5396-8b37-4220-a431-d1dfb594aa69 unaltered + interception proxy got result of transforming message 14ae5396-8b37-4220-a431-d1dfb594aa69 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"747b5fa3-add9-4d14-a0e2-13932aeb6a75","method":"transformInterceptedMessage","params":{"id":"6950117f-5ab3-41bc-bc54-e01acfb692e0","connectionID":"1144e935-7078-4e6c-8853-a1378937e60c","type":"text","data":"{\"action\":15,\"id\":\"URLn_dHgkG:0\",\"connectionId\":\"URLn_dHgkG\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971089552-0\",\"timestamp\":1715971089552,\"messages\":[{\"encoding\":\"json\",\"data\":\"{\\\"foo\\\":\\\"bar\\\"}\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 6950117f-5ab3-41bc-bc54-e01acfb692e0 unaltered + interception proxy got result of transforming message 6950117f-5ab3-41bc-bc54-e01acfb692e0 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"8505459b-dc45-4e19-ae86-cb29d6b7f15e","method":"transformInterceptedMessage","params":{"id":"b57bf572-9b70-4784-b98c-dc780898c262","connectionID":"1144e935-7078-4e6c-8853-a1378937e60c","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b57bf572-9b70-4784-b98c-dc780898c262 unaltered + interception proxy got result of transforming message b57bf572-9b70-4784-b98c-dc780898c262 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime without Rest still allows publishing and subscribing + START TEST: browser/modular Rest BaseRealtime without Rest allows `auth.createTokenRequest()` without `queryTime` option enabled + END TEST: browser/modular Rest BaseRealtime without Rest allows `auth.createTokenRequest()` without `queryTime` option enabled + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to use push admin functionality + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to use push admin functionality + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `time()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `time()` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.createTokenRequest()` with `queryTime` option enabled + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.createTokenRequest()` with `queryTime` option enabled + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `stats()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `stats()` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `request(...)` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `request(...)` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPublish(...)` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPublish(...)` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPresence(...)` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPresence(...)` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.revokeTokens(...)` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.revokeTokens(...)` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `history()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `history()` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `presence.history()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `presence.history()` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `status()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `status()` + START TEST: browser/modular Crypto standalone functions generateRandomKey + END TEST: browser/modular Crypto standalone functions generateRandomKey + START TEST: browser/modular Crypto standalone functions getDefaultCryptoParams + END TEST: browser/modular Crypto standalone functions getDefaultCryptoParams + START TEST: browser/modular Message standalone functions decodeMessage decodes a message’s data + END TEST: browser/modular Message standalone functions decodeMessage decodes a message’s data + START TEST: browser/modular Message standalone functions decodeMessage throws an error when given channel options with a cipher + END TEST: browser/modular Message standalone functions decodeMessage throws an error when given channel options with a cipher + START TEST: browser/modular Message standalone functions decodeEncryptedMessage decodes a message’s data + END TEST: browser/modular Message standalone functions decodeEncryptedMessage decodes a message’s data + START TEST: browser/modular Message standalone functions decodeEncryptedMessage decrypts a message + END TEST: browser/modular Message standalone functions decodeEncryptedMessage decrypts a message + START TEST: browser/modular Message standalone functions decodeMessages decodes messages’ data + END TEST: browser/modular Message standalone functions decodeMessages decodes messages’ data + START TEST: browser/modular Message standalone functions decodeMessages throws an error when given channel options with a cipher + END TEST: browser/modular Message standalone functions decodeMessages throws an error when given channel options with a cipher + START TEST: browser/modular Message standalone functions decodeEncryptedMessages decodes messages’ data + END TEST: browser/modular Message standalone functions decodeEncryptedMessages decodes messages’ data + START TEST: browser/modular Message standalone functions decodeEncryptedMessages decrypts messages + END TEST: browser/modular Message standalone functions decodeEncryptedMessages decrypts messages + START TEST: browser/modular Crypto without Crypto BaseRest throws an error when given channel options with a cipher + END TEST: browser/modular Crypto without Crypto BaseRest throws an error when given channel options with a cipher + START TEST: browser/modular Crypto without Crypto _BaseRealtime throws an error when given channel options with a cipher + END TEST: browser/modular Crypto without Crypto _BaseRealtime throws an error when given channel options with a cipher + START TEST: browser/modular Crypto with Crypto BaseRest is able to publish encrypted messages + interception proxy got message {"jsonrpc":"2.0","id":"14e08dcf-d28f-4444-8318-a08f4aa1230d","method":"transformInterceptedMessage","params":{"id":"0762d96a-07a2-4bf6-ba91-b71d26360fef","connectionID":"4dd52b39-1721-4085-96aa-3537600eff36","type":"text","data":"{\"action\":4,\"connectionId\":\"5edZbwnaD-\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!5edZbwnaD-Aeu9h4zY_pfS-18b7\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0762d96a-07a2-4bf6-ba91-b71d26360fef unaltered + interception proxy got result of transforming message 0762d96a-07a2-4bf6-ba91-b71d26360fef Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"7590ae7f-d99d-4c0d-8ed4-a0d53533a7b9","method":"transformInterceptedMessage","params":{"id":"3c06ed78-5ac0-4426-bb62-670b1208ac48","connectionID":"42b847c4-2671-4a1e-9d62-28798690dcd0","type":"text","data":"{\"action\":4,\"connectionId\":\"fzfojWptWT\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!fzfojWptWTAdMWMEWdbtHX-18b8\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 3c06ed78-5ac0-4426-bb62-670b1208ac48 unaltered + interception proxy got result of transforming message 3c06ed78-5ac0-4426-bb62-670b1208ac48 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"50d83498-bc85-4cff-bb7c-cc579e0fd4af","method":"transformInterceptedMessage","params":{"id":"dc71398b-32e1-4fa5-8f26-8f2e8ad7675d","connectionID":"ff80a804-8838-458a-b578-bb2d6316093f","type":"text","data":"{\"action\":4,\"connectionId\":\"Uarf47228w\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!Uarf47228wAdpHugLK-8QV-18b9\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message dc71398b-32e1-4fa5-8f26-8f2e8ad7675d unaltered + interception proxy got result of transforming message dc71398b-32e1-4fa5-8f26-8f2e8ad7675d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"f80a8a24-4a05-4413-933f-3f35501e6b26","method":"transformInterceptedMessage","params":{"id":"6bd69fec-2c4f-4c3e-b994-494dc833e11c","connectionID":"dad6aaab-b993-4745-8a21-3ad96b2f49d5","type":"text","data":"{\"action\":4,\"connectionId\":\"3YiUYSxgzk\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!3YiUYSxgzkAXCoZAB7Hm4U-315\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 6bd69fec-2c4f-4c3e-b994-494dc833e11c unaltered + interception proxy got result of transforming message 6bd69fec-2c4f-4c3e-b994-494dc833e11c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"33c9e37f-ef05-4cd8-b375-04a18a12469e","method":"transformInterceptedMessage","params":{"id":"6f305a15-7c86-451c-8c2f-721be0a605e3","connectionID":"8d9e0fb0-4c18-483a-aeb9-896a0e62afdf","type":"text","data":"{\"action\":4,\"connectionId\":\"l-iWaAziZK\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!l-iWaAziZKAf5tFe_RMqKr-1928\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 6f305a15-7c86-451c-8c2f-721be0a605e3 unaltered + interception proxy got result of transforming message 6f305a15-7c86-451c-8c2f-721be0a605e3 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"701f6223-7510-4d61-ac72-2fe79ac81753","method":"transformInterceptedMessage","params":{"id":"b477f69f-fc5f-4c84-8eef-3cb02cbee132","connectionID":"91386ac1-2026-4326-8f16-eb0d48caa4e4","type":"text","data":"{\"action\":4,\"connectionId\":\"v6_i8N8HfO\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!v6_i8N8HfOAUzg61_S6kQr-1929\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b477f69f-fc5f-4c84-8eef-3cb02cbee132 unaltered + interception proxy got result of transforming message b477f69f-fc5f-4c84-8eef-3cb02cbee132 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ba5124ee-6ccf-4cae-a6cd-8dee19ef0e66","method":"transformInterceptedMessage","params":{"id":"678a1597-5934-4dee-83e2-ff8aa74b18e1","connectionID":"7846579c-e8e5-4935-b78e-5955c8b4bbc8","type":"text","data":"{\"action\":4,\"connectionId\":\"Wm6FeaMzxG\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!Wm6FeaMzxGAQ8NHgh2-PR8-18ba\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 678a1597-5934-4dee-83e2-ff8aa74b18e1 unaltered + interception proxy got result of transforming message 678a1597-5934-4dee-83e2-ff8aa74b18e1 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"91f348b4-c0fd-4559-ae7c-257fd0c18169","method":"transformInterceptedMessage","params":{"id":"485f3454-4e48-4825-ba9e-f8d95453a807","connectionID":"4f46ba17-87f6-458b-81cd-7a6815327c24","type":"text","data":"{\"action\":4,\"connectionId\":\"ggE_4FFWuh\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!ggE_4FFWuhASc0I_-Sg-zn-e7b\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 485f3454-4e48-4825-ba9e-f8d95453a807 unaltered + interception proxy got result of transforming message 485f3454-4e48-4825-ba9e-f8d95453a807 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"974d97b7-479e-4af0-8d53-1de63f07e981","method":"transformInterceptedMessage","params":{"id":"dde731e7-cb21-407b-a001-ae261ad8b57d","connectionID":"13891ae9-995c-4d5a-b002-8b71c3cb16cf","type":"text","data":"{\"action\":4,\"connectionId\":\"ZkHxtNY4NC\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!ZkHxtNY4NCAerag5Ngsg_h-ed6\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message dde731e7-cb21-407b-a001-ae261ad8b57d unaltered + interception proxy got result of transforming message dde731e7-cb21-407b-a001-ae261ad8b57d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"03176f4f-3918-4be4-ba40-7766bbea0653","method":"transformInterceptedMessage","params":{"id":"cab3f5cb-a655-4fb9-803e-0813d89ffbe2","connectionID":"927b4705-7fc3-4412-83b0-79e20216cd37","type":"text","data":"{\"action\":4,\"connectionId\":\"Y7c9Vpxk1H\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!Y7c9Vpxk1HAa88ICQTyh1O-18bb\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message cab3f5cb-a655-4fb9-803e-0813d89ffbe2 unaltered + interception proxy got result of transforming message cab3f5cb-a655-4fb9-803e-0813d89ffbe2 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"eb146e28-1147-4e32-946e-a743f65a2214","method":"transformInterceptedMessage","params":{"id":"49993c90-5041-4d86-a748-eb3672f94893","connectionID":"39d724c8-40d0-42e7-a5d5-2271d18e7397","type":"text","data":"{\"action\":4,\"connectionId\":\"KorpxEJgp4\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!KorpxEJgp4AR2QQCQ73ben-2f1\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 49993c90-5041-4d86-a748-eb3672f94893 unaltered + interception proxy got result of transforming message 49993c90-5041-4d86-a748-eb3672f94893 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"9196bf24-5175-444b-b1e9-006a60eef589","method":"transformInterceptedMessage","params":{"id":"d62ac2b2-c528-4272-85a5-7eaaf65605f0","connectionID":"fa1ca63e-35f9-4df1-9b5a-19ca8c593774","type":"text","data":"{\"action\":4,\"connectionId\":\"kYB1NuCww0\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!kYB1NuCww0ASrC-Z_8QRHY-18bc\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d62ac2b2-c528-4272-85a5-7eaaf65605f0 unaltered + interception proxy got result of transforming message d62ac2b2-c528-4272-85a5-7eaaf65605f0 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"628d34f5-d31d-4631-8604-4cea5a6f9194","method":"transformInterceptedMessage","params":{"id":"0614750a-c7e1-4bf1-82ab-701977011539","connectionID":"19f3b0aa-550f-464c-a34c-38101f6f36d4","type":"text","data":"{\"action\":4,\"connectionId\":\"wBpp3Wvuok\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!wBpp3WvuokAbfio6XWmlNW-192a\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0614750a-c7e1-4bf1-82ab-701977011539 unaltered + interception proxy got result of transforming message 0614750a-c7e1-4bf1-82ab-701977011539 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"c79954f7-d19d-469b-a457-d653f8220381","method":"transformInterceptedMessage","params":{"id":"5fdf1db1-1c30-43ec-a5b6-6ffe7a3d259c","connectionID":"fa1ca63e-35f9-4df1-9b5a-19ca8c593774","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 5fdf1db1-1c30-43ec-a5b6-6ffe7a3d259c unaltered + interception proxy got result of transforming message 5fdf1db1-1c30-43ec-a5b6-6ffe7a3d259c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"73a70e44-0c0d-4f33-803f-13f9ef726275","method":"transformInterceptedMessage","params":{"id":"43e97d4b-b16c-4462-ad88-8f19e9077ccd","connectionID":"41f3bb9d-9eb6-4863-a439-443b13081da5","type":"text","data":"{\"action\":4,\"connectionId\":\"SxGX6DG2jc\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!SxGX6DG2jcAXLM1iWHPNry-18bd\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 43e97d4b-b16c-4462-ad88-8f19e9077ccd unaltered + interception proxy got result of transforming message 43e97d4b-b16c-4462-ad88-8f19e9077ccd Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"1c25e278-68a5-48f5-a27b-5dd11351f735","method":"transformInterceptedMessage","params":{"id":"ddc96e5d-76c7-4664-9162-5b80c7aed233","connectionID":"fa1ca63e-35f9-4df1-9b5a-19ca8c593774","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971089552-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ddc96e5d-76c7-4664-9162-5b80c7aed233 unaltered + interception proxy got result of transforming message ddc96e5d-76c7-4664-9162-5b80c7aed233 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d9329dd5-d428-4a01-ad8e-f2265a244779","method":"transformInterceptedMessage","params":{"id":"4878ae5e-15f3-47b4-9dbc-96ef262cf01e","connectionID":"fa1ca63e-35f9-4df1-9b5a-19ca8c593774","type":"text","data":"{\"action\":15,\"id\":\"JNEnlKzReY4D\",\"connectionId\":\"\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971090578-0\",\"timestamp\":1715971090578,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"gNpONVyIQzDoiYptXz1TFnl0nezPfOTAz7n4uto+DGU=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 4878ae5e-15f3-47b4-9dbc-96ef262cf01e unaltered + interception proxy got result of transforming message 4878ae5e-15f3-47b4-9dbc-96ef262cf01e Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"739bbd97-d020-4c8c-a690-fdca09a4d65f","method":"transformInterceptedMessage","params":{"id":"01801665-fae2-4e58-8e5a-6cbbe0611ab8","connectionID":"1144e935-7078-4e6c-8853-a1378937e60c","type":"text","data":"{\"action\":15,\"id\":\"JNEnlKzReY4D\",\"connectionId\":\"\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971090578-0\",\"timestamp\":1715971090578,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"gNpONVyIQzDoiYptXz1TFnl0nezPfOTAz7n4uto+DGU=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 01801665-fae2-4e58-8e5a-6cbbe0611ab8 unaltered + interception proxy got result of transforming message 01801665-fae2-4e58-8e5a-6cbbe0611ab8 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Crypto with Crypto BaseRest is able to publish encrypted messages + START TEST: browser/modular Crypto with Crypto _BaseRealtime is able to publish encrypted messages + interception proxy got message {"jsonrpc":"2.0","id":"ab859371-c73d-4036-8f73-9f0f154af6c4","method":"transformInterceptedMessage","params":{"id":"dd2a6b72-9ad6-4f0e-a231-083e2097a2af","connectionID":"ffec95f2-a99f-44f2-bf06-3cfe62e98810","type":"text","data":"{\"action\":4,\"connectionId\":\"_RBXWHtgY7\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!_RBXWHtgY7Af23hYWj6imS-e7c\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message dd2a6b72-9ad6-4f0e-a231-083e2097a2af unaltered + interception proxy got result of transforming message dd2a6b72-9ad6-4f0e-a231-083e2097a2af Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"3ce9cb4a-55c0-4943-9d23-3293ebbf8ccf","method":"transformInterceptedMessage","params":{"id":"1374b570-113c-4c01-8591-0e09fefd9446","connectionID":"ffec95f2-a99f-44f2-bf06-3cfe62e98810","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 1374b570-113c-4c01-8591-0e09fefd9446 unaltered + interception proxy got result of transforming message 1374b570-113c-4c01-8591-0e09fefd9446 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"8afaad74-02a5-4f31-8d75-fe01ed307b5c","method":"transformInterceptedMessage","params":{"id":"60a91b0c-809e-4cef-aff7-aa0a9d488413","connectionID":"ffec95f2-a99f-44f2-bf06-3cfe62e98810","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971090578-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 60a91b0c-809e-4cef-aff7-aa0a9d488413 unaltered + interception proxy got result of transforming message 60a91b0c-809e-4cef-aff7-aa0a9d488413 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"9beb3a69-fcd5-485b-94ff-46734a4d4035","method":"transformInterceptedMessage","params":{"id":"4293fc8f-83b5-4414-90b5-9d9465dea3bb","connectionID":"9164a0c3-4c5f-4f25-bc9a-fd68bcc87a70","type":"text","data":"{\"action\":4,\"connectionId\":\"NZMDofGnJR\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!NZMDofGnJRAVGOsHoJHDyJ-2f8\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 4293fc8f-83b5-4414-90b5-9d9465dea3bb unaltered + interception proxy got result of transforming message 4293fc8f-83b5-4414-90b5-9d9465dea3bb Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"153704eb-b154-4d0e-a4c9-ca65dc48c1b1","method":"transformInterceptedMessage","params":{"id":"fead2731-48ba-4921-bb89-be2d569a1d50","connectionID":"9164a0c3-4c5f-4f25-bc9a-fd68bcc87a70","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"name\":\"message\",\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"JzH7YQVktBvOmTCk0orjxVti2f9qFFgz/jWOLYslX9E=\"}],\"msgSerial\":0}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message fead2731-48ba-4921-bb89-be2d569a1d50 unaltered + interception proxy got result of transforming message fead2731-48ba-4921-bb89-be2d569a1d50 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"232633e2-0d33-4080-8896-63f970285577","method":"transformInterceptedMessage","params":{"id":"44173920-3717-4927-b765-8676e46d9fc6","connectionID":"9164a0c3-4c5f-4f25-bc9a-fd68bcc87a70","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 44173920-3717-4927-b765-8676e46d9fc6 unaltered + interception proxy got result of transforming message 44173920-3717-4927-b765-8676e46d9fc6 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"73faf70e-b884-4530-ac06-b4af472b6fb9","method":"transformInterceptedMessage","params":{"id":"c7dca6c9-a604-42ba-9fb7-1626fda12a45","connectionID":"1144e935-7078-4e6c-8853-a1378937e60c","type":"text","data":"{\"action\":15,\"id\":\"NZMDofGnJR:0\",\"connectionId\":\"NZMDofGnJR\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971091978-0\",\"timestamp\":1715971091978,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"JzH7YQVktBvOmTCk0orjxVti2f9qFFgz/jWOLYslX9E=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message c7dca6c9-a604-42ba-9fb7-1626fda12a45 unaltered + interception proxy got result of transforming message c7dca6c9-a604-42ba-9fb7-1626fda12a45 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"8547e0ee-418c-4737-973e-90ed9ae2e87f","method":"transformInterceptedMessage","params":{"id":"c73867e1-d480-4da9-b6ad-6e9198878c65","connectionID":"fa1ca63e-35f9-4df1-9b5a-19ca8c593774","type":"text","data":"{\"action\":15,\"id\":\"NZMDofGnJR:0\",\"connectionId\":\"NZMDofGnJR\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971091978-0\",\"timestamp\":1715971091978,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"JzH7YQVktBvOmTCk0orjxVti2f9qFFgz/jWOLYslX9E=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message c73867e1-d480-4da9-b6ad-6e9198878c65 unaltered + interception proxy got result of transforming message c73867e1-d480-4da9-b6ad-6e9198878c65 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"bc1e6aa4-4fcf-4e93-a5cc-cd30c7946d8d","method":"transformInterceptedMessage","params":{"id":"eb2c65da-5711-4b77-8f32-200d3649c5aa","connectionID":"ffec95f2-a99f-44f2-bf06-3cfe62e98810","type":"text","data":"{\"action\":15,\"id\":\"NZMDofGnJR:0\",\"connectionId\":\"NZMDofGnJR\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971091978-0\",\"timestamp\":1715971091978,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"JzH7YQVktBvOmTCk0orjxVti2f9qFFgz/jWOLYslX9E=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message eb2c65da-5711-4b77-8f32-200d3649c5aa unaltered + interception proxy got result of transforming message eb2c65da-5711-4b77-8f32-200d3649c5aa Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Crypto with Crypto _BaseRealtime is able to publish encrypted messages + START TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRest uses JSON + END TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRest uses JSON + START TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRealtime uses JSON + END TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRealtime uses JSON + START TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRest uses MessagePack + END TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRest uses MessagePack + START TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRealtime uses MessagePack + END TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRealtime uses MessagePack + START TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence throws an error when attempting to access the `presence` property + END TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence throws an error when attempting to access the `presence` property + START TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence doesn’t break when it receives a PRESENCE ProtocolMessage + interception proxy got message {"jsonrpc":"2.0","id":"a840b9ef-a458-4a56-9583-501512571a96","method":"transformInterceptedMessage","params":{"id":"a32ebc1a-ccb0-4cb5-88a8-b8056d9868e2","connectionID":"265b541b-f617-4c39-bed7-8915b4bf9627","type":"text","data":"{\"action\":4,\"connectionId\":\"__GYNj7nBU\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!__GYNj7nBUAajG4suejCcu-2fb\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a32ebc1a-ccb0-4cb5-88a8-b8056d9868e2 unaltered + interception proxy got result of transforming message a32ebc1a-ccb0-4cb5-88a8-b8056d9868e2 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"98f6b771-a1fa-4154-adb0-1253e6908922","method":"transformInterceptedMessage","params":{"id":"9da4c114-f555-4953-b3ee-228b176c8afe","connectionID":"397f435d-23c3-467c-a1ee-ff8d4dfa0cee","type":"text","data":"{\"action\":4,\"connectionId\":\"Scma2pOh2Q\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!Scma2pOh2QAQEKWcAA43UG-edb\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 9da4c114-f555-4953-b3ee-228b176c8afe unaltered + interception proxy got result of transforming message 9da4c114-f555-4953-b3ee-228b176c8afe Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"05cd8fc7-f575-44cb-933c-7455b22fa3ad","method":"transformInterceptedMessage","params":{"id":"916cf480-314f-4217-b4e9-c2695b9bce9e","connectionID":"397f435d-23c3-467c-a1ee-ff8d4dfa0cee","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 916cf480-314f-4217-b4e9-c2695b9bce9e unaltered + interception proxy got result of transforming message 916cf480-314f-4217-b4e9-c2695b9bce9e Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"615d8aa0-e7c7-43de-9507-7acb223c63f4","method":"transformInterceptedMessage","params":{"id":"07756e8c-e9a0-4d7e-b829-0bba27279618","connectionID":"397f435d-23c3-467c-a1ee-ff8d4dfa0cee","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971091978-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 07756e8c-e9a0-4d7e-b829-0bba27279618 unaltered + interception proxy got result of transforming message 07756e8c-e9a0-4d7e-b829-0bba27279618 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"c6f3871a-5a4d-4134-b6a9-6fd3bd3eb53b","method":"transformInterceptedMessage","params":{"id":"3c800a3b-49c5-48a1-87ff-1971246c9b5b","connectionID":"e01b344d-3282-43ed-a7c2-bb43eaabf2ec","type":"text","data":"{\"action\":4,\"connectionId\":\"Omv0TWjqkh\",\"connectionDetails\":{\"clientId\":\"7036884746501788\",\"connectionKey\":\"e7deKLRSQBc0Ap!Omv0TWjqkhASd90LqszaW_-18c3\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 3c800a3b-49c5-48a1-87ff-1971246c9b5b unaltered + interception proxy got result of transforming message 3c800a3b-49c5-48a1-87ff-1971246c9b5b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"f7e2ea96-98d8-4734-8c4f-25b1f4401e79","method":"transformInterceptedMessage","params":{"id":"bbbd03d1-9322-41df-81b4-6de0cbd861f7","connectionID":"e01b344d-3282-43ed-a7c2-bb43eaabf2ec","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"name\":\"message\",\"data\":\"body\"}],\"msgSerial\":0}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message bbbd03d1-9322-41df-81b4-6de0cbd861f7 unaltered + interception proxy got result of transforming message bbbd03d1-9322-41df-81b4-6de0cbd861f7 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"de546ba1-5063-4b22-9dd6-407482c8909c","method":"transformInterceptedMessage","params":{"id":"8d5c2fbb-948c-47a5-b5fb-73b197c5a3fd","connectionID":"fa1ca63e-35f9-4df1-9b5a-19ca8c593774","type":"text","data":"{\"action\":15,\"id\":\"Omv0TWjqkh:0\",\"connectionId\":\"Omv0TWjqkh\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971093461-0\",\"timestamp\":1715971093461,\"messages\":[{\"clientId\":\"7036884746501788\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 8d5c2fbb-948c-47a5-b5fb-73b197c5a3fd unaltered + interception proxy got result of transforming message 8d5c2fbb-948c-47a5-b5fb-73b197c5a3fd Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"a2c2d9c3-efbf-47fb-b977-bd98a2a2ea2a","method":"transformInterceptedMessage","params":{"id":"00ec4dbd-5bd5-49b0-9755-36ea3fb33e3d","connectionID":"e01b344d-3282-43ed-a7c2-bb43eaabf2ec","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 00ec4dbd-5bd5-49b0-9755-36ea3fb33e3d unaltered + interception proxy got result of transforming message 00ec4dbd-5bd5-49b0-9755-36ea3fb33e3d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ebc3e04e-069a-4f91-b8dc-98b940ce15da","method":"transformInterceptedMessage","params":{"id":"ff1acd98-c858-4f35-826e-7eb6702fc3a0","connectionID":"1144e935-7078-4e6c-8853-a1378937e60c","type":"text","data":"{\"action\":15,\"id\":\"Omv0TWjqkh:0\",\"connectionId\":\"Omv0TWjqkh\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971093461-0\",\"timestamp\":1715971093461,\"messages\":[{\"clientId\":\"7036884746501788\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ff1acd98-c858-4f35-826e-7eb6702fc3a0 unaltered + interception proxy got result of transforming message ff1acd98-c858-4f35-826e-7eb6702fc3a0 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"167cbf84-754f-4761-b539-d4b7bec36271","method":"transformInterceptedMessage","params":{"id":"a1d4e069-2926-4e8f-99f1-7b1f78a6fa90","connectionID":"ffec95f2-a99f-44f2-bf06-3cfe62e98810","type":"text","data":"{\"action\":15,\"id\":\"Omv0TWjqkh:0\",\"connectionId\":\"Omv0TWjqkh\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971093461-0\",\"timestamp\":1715971093461,\"messages\":[{\"clientId\":\"7036884746501788\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a1d4e069-2926-4e8f-99f1-7b1f78a6fa90 unaltered + interception proxy got result of transforming message a1d4e069-2926-4e8f-99f1-7b1f78a6fa90 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"e4e3b47e-31e0-4033-bf46-97d512508af6","method":"transformInterceptedMessage","params":{"id":"86d61f15-911d-4209-acc9-9d25871e1f69","connectionID":"397f435d-23c3-467c-a1ee-ff8d4dfa0cee","type":"text","data":"{\"action\":15,\"id\":\"Omv0TWjqkh:0\",\"connectionId\":\"Omv0TWjqkh\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971093461-0\",\"timestamp\":1715971093461,\"messages\":[{\"clientId\":\"7036884746501788\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 86d61f15-911d-4209-acc9-9d25871e1f69 unaltered + interception proxy got result of transforming message 86d61f15-911d-4209-acc9-9d25871e1f69 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"09e9b08e-946a-47ed-9d4c-fe2f1bd47816","method":"transformInterceptedMessage","params":{"id":"92e9a1b7-9e38-4af8-b44c-32fbee118c01","connectionID":"e01b344d-3282-43ed-a7c2-bb43eaabf2ec","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 92e9a1b7-9e38-4af8-b44c-32fbee118c01 unaltered + interception proxy got result of transforming message 92e9a1b7-9e38-4af8-b44c-32fbee118c01 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b122897d-07f4-4392-b52a-6fd0f1b78ce8","method":"transformInterceptedMessage","params":{"id":"de2f2762-8f60-46a4-8a8e-0600d2103ddd","connectionID":"e01b344d-3282-43ed-a7c2-bb43eaabf2ec","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971093461-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message de2f2762-8f60-46a4-8a8e-0600d2103ddd unaltered + interception proxy got result of transforming message de2f2762-8f60-46a4-8a8e-0600d2103ddd Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"7d4bf142-9d50-4a78-ba54-3fd3fa0864a3","method":"transformInterceptedMessage","params":{"id":"af37bf2a-d273-48ed-a7f6-17183b404019","connectionID":"e01b344d-3282-43ed-a7c2-bb43eaabf2ec","type":"text","data":"{\"action\":14,\"channel\":\"channel\",\"presence\":[{\"action\":2}],\"msgSerial\":1}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message af37bf2a-d273-48ed-a7f6-17183b404019 unaltered + interception proxy got result of transforming message af37bf2a-d273-48ed-a7f6-17183b404019 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d811b151-df98-4ea1-82d9-d61f0ab0a959","method":"transformInterceptedMessage","params":{"id":"c744964f-f254-4a29-ab5f-e7b65080ebb0","connectionID":"fa1ca63e-35f9-4df1-9b5a-19ca8c593774","type":"text","data":"{\"action\":14,\"id\":\"Omv0TWjqkh:1\",\"connectionId\":\"Omv0TWjqkh\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971093729-0\",\"timestamp\":1715971093729,\"presence\":[{\"id\":\"Omv0TWjqkh:1:0\",\"clientId\":\"7036884746501788\",\"connectionId\":\"Omv0TWjqkh\",\"timestamp\":1715971093729,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message c744964f-f254-4a29-ab5f-e7b65080ebb0 unaltered + interception proxy got result of transforming message c744964f-f254-4a29-ab5f-e7b65080ebb0 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ca9a9482-b15a-4edf-a010-abd346b20374","method":"transformInterceptedMessage","params":{"id":"00b51cc9-d544-4899-9a5f-a21596616954","connectionID":"e01b344d-3282-43ed-a7c2-bb43eaabf2ec","type":"text","data":"{\"action\":14,\"id\":\"Omv0TWjqkh:1\",\"connectionId\":\"Omv0TWjqkh\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971093729-0\",\"timestamp\":1715971093729,\"presence\":[{\"id\":\"Omv0TWjqkh:1:0\",\"clientId\":\"7036884746501788\",\"connectionId\":\"Omv0TWjqkh\",\"timestamp\":1715971093729,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 00b51cc9-d544-4899-9a5f-a21596616954 unaltered + interception proxy got result of transforming message 00b51cc9-d544-4899-9a5f-a21596616954 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"20dd482c-f53b-4fe5-9aa7-82e589a5fd18","method":"transformInterceptedMessage","params":{"id":"70a96946-8a7e-4502-a97f-fd210d3639fa","connectionID":"ffec95f2-a99f-44f2-bf06-3cfe62e98810","type":"text","data":"{\"action\":14,\"id\":\"Omv0TWjqkh:1\",\"connectionId\":\"Omv0TWjqkh\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971093729-0\",\"timestamp\":1715971093729,\"presence\":[{\"id\":\"Omv0TWjqkh:1:0\",\"clientId\":\"7036884746501788\",\"connectionId\":\"Omv0TWjqkh\",\"timestamp\":1715971093729,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 70a96946-8a7e-4502-a97f-fd210d3639fa unaltered + interception proxy got result of transforming message 70a96946-8a7e-4502-a97f-fd210d3639fa Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"956aa89e-fe9d-4c47-940b-c0317fb17457","method":"transformInterceptedMessage","params":{"id":"29b07bbf-c324-4f66-b841-b5c9d7f16f57","connectionID":"1144e935-7078-4e6c-8853-a1378937e60c","type":"text","data":"{\"action\":14,\"id\":\"Omv0TWjqkh:1\",\"connectionId\":\"Omv0TWjqkh\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971093729-0\",\"timestamp\":1715971093729,\"presence\":[{\"id\":\"Omv0TWjqkh:1:0\",\"clientId\":\"7036884746501788\",\"connectionId\":\"Omv0TWjqkh\",\"timestamp\":1715971093729,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 29b07bbf-c324-4f66-b841-b5c9d7f16f57 unaltered + interception proxy got result of transforming message 29b07bbf-c324-4f66-b841-b5c9d7f16f57 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"70fb705f-3e3f-490d-aa43-b9b914524a1a","method":"transformInterceptedMessage","params":{"id":"8a86d90e-f0b6-4f85-bf8f-0f27e19401ac","connectionID":"397f435d-23c3-467c-a1ee-ff8d4dfa0cee","type":"text","data":"{\"action\":14,\"id\":\"Omv0TWjqkh:1\",\"connectionId\":\"Omv0TWjqkh\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971093729-0\",\"timestamp\":1715971093729,\"presence\":[{\"id\":\"Omv0TWjqkh:1:0\",\"clientId\":\"7036884746501788\",\"connectionId\":\"Omv0TWjqkh\",\"timestamp\":1715971093729,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 8a86d90e-f0b6-4f85-bf8f-0f27e19401ac unaltered + interception proxy got result of transforming message 8a86d90e-f0b6-4f85-bf8f-0f27e19401ac Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"6c020e38-e262-40d4-bb22-1e85c5e77071","method":"transformInterceptedMessage","params":{"id":"e81320e2-4b82-4606-9221-24418b49da59","connectionID":"e01b344d-3282-43ed-a7c2-bb43eaabf2ec","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":1}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message e81320e2-4b82-4606-9221-24418b49da59 unaltered + interception proxy got result of transforming message e81320e2-4b82-4606-9221-24418b49da59 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence doesn’t break when it receives a PRESENCE ProtocolMessage + START TEST: browser/modular RealtimePresence BaseRealtime with RealtimePresence offers realtime presence functionality + rxChannel: Ably: BaseClient(): initialized with clientOptions {"environment":"sandbox","port":80,"tlsPort":443,"tls":true,"logLevel":4,"plugins":{"RealtimePresence":{}},"key":"_tmp_W5rYLA.LjJ4BA:WeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM"} + rxChannel: Ably: BaseClient(): started; version = 2.0.4 + rxChannel: Ably: Auth(): anonymous, using basic auth + rxChannel: Ably: Realtime(): + rxChannel: Ably: Realtime.ConnectionManager(): started + rxChannel: Ably: Realtime.ConnectionManager(): requested transports = [xhr_polling,web_socket] + rxChannel: Ably: Realtime.ConnectionManager(): available transports = [web_socket] + rxChannel: Ably: Realtime.ConnectionManager(): http hosts = [sandbox-rest.ably.io] + rxChannel: Ably: Realtime.connect(): + rxChannel: Ably: Connection.connect(): + rxChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: initialized + rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): + rxChannel: Ably: Connection state: connecting + rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined + rxChannel: Ably: RealtimeChannel(): started; name = channel + txChannel: Ably: BaseClient(): initialized with clientOptions {"environment":"sandbox","port":80,"tlsPort":443,"tls":true,"logLevel":4,"clientId":"6383626078799054","plugins":{"RealtimePresence":{}},"key":"_tmp_W5rYLA.LjJ4BA:WeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM"} + txChannel: Ably: BaseClient(): started; version = 2.0.4 + txChannel: Ably: Auth(): anonymous, using basic auth + txChannel: Ably: Realtime(): + txChannel: Ably: Realtime.ConnectionManager(): started + txChannel: Ably: Realtime.ConnectionManager(): requested transports = [xhr_polling,web_socket] + txChannel: Ably: Realtime.ConnectionManager(): available transports = [web_socket] + txChannel: Ably: Realtime.ConnectionManager(): http hosts = [sandbox-rest.ably.io] + txChannel: Ably: Realtime.connect(): + txChannel: Ably: Connection.connect(): + txChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: initialized + txChannel: Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: Ably: Connection state: connecting + txChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined + txChannel: Ably: RealtimeChannel(): started; name = channel + LAWRENCE: begin waiting for presence subscribe + rxChannel: Ably: RealtimeChannel.requestState: name = channel, state = attaching + rxChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = initialized, notifying state attaching + rxChannel: Ably: Channel state for channel "channel": attaching + rxChannel: Ably: RealtimeChannel.checkPendingState: sendEvents is false; state is connecting + rxChannel: Ably: ConnectionManager.startConnect(): starting connection + rxChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting + rxChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] + rxChannel: Ably: ConnectionManager.connectWs(): undefined + rxChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket + rxChannel: Ably: ConnectionManager.tryATransport(): trying web_socket + rxChannel: Ably: WebSocketTransport.connect(): starting + rxChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ + rxChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_W5rYLA.LjJ4BA:WeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM; err: null + txChannel: Ably: ConnectionManager.startConnect(): starting connection + txChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting + txChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] + txChannel: Ably: ConnectionManager.connectWs(): undefined + txChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket + txChannel: Ably: ConnectionManager.tryATransport(): trying web_socket + txChannel: Ably: WebSocketTransport.connect(): starting + txChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ + txChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_W5rYLA.LjJ4BA:WeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM; err: null + rxChannel: Ably: WebSocketTransport.onWsOpen(): opened WebSocket + rxChannel: Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending + rxChannel: Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = clean + interception proxy got message {"jsonrpc":"2.0","id":"4bbcb1a6-1624-498f-bbbd-d0bc0f3274db","method":"transformInterceptedMessage","params":{"id":"5b6315a1-ed17-4582-a14c-b0bf2245d204","connectionID":"f371c134-be0c-478d-8f1e-48c9ef249765","type":"text","data":"{\"action\":4,\"connectionId\":\"SSn13x5VVd\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!SSn13x5VVdAaZXvyTWO2lx-320\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 5b6315a1-ed17-4582-a14c-b0bf2245d204 unaltered + interception proxy got result of transforming message 5b6315a1-ed17-4582-a14c-b0bf2245d204 Object + interception proxy sending transformInterceptedMessage response Object + rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 353; type = string + rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=CONNECTED; connectionId=SSn13x5VVd]; connectionId = undefined + rxChannel: Ably: ConnectionManager.activateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: Ably: ConnectionManager.activateTransport(): connectionId = SSn13x5VVd + rxChannel: Ably: ConnectionManager.activateTransport(): connectionDetails = {"clientId":"*","connectionKey":"e7dAszwTABc0Ei!SSn13x5VVdAaZXvyTWO2lx-320","maxMessageSize":16384,"maxInboundRate":250,"maxOutboundRate":100,"maxFrameSize":262144,"serverId":"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei","connectionStateTtl":120000,"maxIdleInterval":15000} + rxChannel: Ably: ConnectionManager.activateTransport(): current state = connecting + rxChannel: Ably: ConnectionManager.setConnection(): New connectionId; reattaching any attached channels + rxChannel: Ably: ConnectionManager.notifyState(): new state: connected + rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): + rxChannel: Ably: Connection state: connected + rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: connected; reason = undefined + rxChannel: Ably: ConnectionManager.sendQueuedMessages(): sending 0 queued messages + rxChannel: Ably: RealtimeChannel.checkPendingState: name = channel, state = attaching + rxChannel: Ably: RealtimeChannel.attachImpl(): sending ATTACH message + rxChannel: Ably: ConnectionManager.send(): sending event + rxChannel: Ably: Protocol.send(): sending msg; [ProtocolMessage; action=ATTACH; channel=channel] + interception proxy got message {"jsonrpc":"2.0","id":"61215231-7050-424f-be84-cb8d2d234847","method":"transformInterceptedMessage","params":{"id":"45697ae2-901d-44a5-b6ad-042d4fb02bb9","connectionID":"f371c134-be0c-478d-8f1e-48c9ef249765","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 45697ae2-901d-44a5-b6ad-042d4fb02bb9 unaltered + interception proxy got result of transforming message 45697ae2-901d-44a5-b6ad-042d4fb02bb9 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"0ebd803a-62bd-48ce-abe4-ab0a67ba066a","method":"transformInterceptedMessage","params":{"id":"89525a83-cc6e-4e54-8d9f-dce29ed69bac","connectionID":"f371c134-be0c-478d-8f1e-48c9ef249765","type":"text","data":"{\"action\":11,\"flags\":983105,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq20514813@1715971093729-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 89525a83-cc6e-4e54-8d9f-dce29ed69bac unaltered + interception proxy got result of transforming message 89525a83-cc6e-4e54-8d9f-dce29ed69bac Object + interception proxy sending transformInterceptedMessage response Object + rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 105; type = string + rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ATTACHED; channel=channel; channelSerial=e7dP5PvyABc0Cq20514813@1715971093729-0; flags=HAS_PRESENCE,PRESENCE,PUBLISH,SUBSCRIBE,PRESENCE_SUBSCRIBE]; connectionId = SSn13x5VVd + rxChannel: Ably: RealtimeChannel.setChannelSerial(): Updating channel serial; serial = e7dP5PvyABc0Cq20514813@1715971093729-0; previous = undefined + rxChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = attaching, notifying state attached + rxChannel: Ably: RealtimePresence.onAttached(): channel = channel, hasPresence = true + rxChannel: Ably: PresenceMap.startSync(): channel = channel; syncInProgress = false + rxChannel: Ably: PresenceMap.setInProgress(): inProgress = true + rxChannel: Ably: Channel state for channel "channel": attached + rxChannel: Ably: RealtimeChannel.onAttached: activating channel; name = channel + LAWRENCE: end waiting for presence subscribe + LAWRENCE: begin waiting for presence enter + LAWRENCE: txChannel.presence.enter is + txChannel: Ably: RealtimePresence.enter: undefined + txChannel: Ably: RealtimePresence._enterOrUpdateClient: undefined + txChannel: Ably: RealtimePresence.enterClient(): channel = channel, id = undefined, client = (implicit) 6383626078799054 + txChannel: Ably: RealtimeChannel.requestState: name = channel, state = attaching + txChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = initialized, notifying state attaching + txChannel: Ably: Channel state for channel "channel": attaching + txChannel: Ably: RealtimeChannel.checkPendingState: sendEvents is false; state is connecting + interception proxy got message {"jsonrpc":"2.0","id":"9b63e4b3-03cf-4a20-a97f-2994f3ad9297","method":"transformInterceptedMessage","params":{"id":"f7cf013b-1044-44b4-a4b6-80fa6040c35a","connectionID":"f371c134-be0c-478d-8f1e-48c9ef249765","type":"text","data":"{\"action\":16,\"channel\":\"channel\",\"channelSerial\":\"e7dAszwTABc0Ei09889689:\",\"presence\":[{\"id\":\"Omv0TWjqkh:1:0\",\"clientId\":\"7036884746501788\",\"connectionId\":\"Omv0TWjqkh\",\"timestamp\":1715971093729,\"action\":1}],\"count\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message f7cf013b-1044-44b4-a4b6-80fa6040c35a unaltered + interception proxy got result of transforming message f7cf013b-1044-44b4-a4b6-80fa6040c35a Object + interception proxy sending transformInterceptedMessage response Object + rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 217; type = string + rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=SYNC; channel=channel; channelSerial=e7dAszwTABc0Ei09889689:; count=0; presence=[ [PresenceMessage; action=present; id=Omv0TWjqkh:1:0; timestamp=1715971093729; clientId=7036884746501788; connectionId=Omv0TWjqkh] ]]; connectionId = SSn13x5VVd + rxChannel: Ably: RealtimePresence.setPresence(): received presence for 1 participants; syncChannelSerial = e7dAszwTABc0Ei09889689: + rxChannel: Ably: PresenceMap.startSync(): channel = channel; syncInProgress = true + rxChannel: Ably: PresenceMap.endSync(): channel = channel; syncInProgress = true + rxChannel: Ably: PresenceMap.setInProgress(): inProgress = false + txChannel: Ably: ConnectionManager WebSocket slow timer: checking connectivity + txChannel: Ably: (Fetch)Http.checkConnectivity(): Sending; https://internet-up.ably-realtime.com/is-the-internet-up.txt + txChannel: Ably: (Fetch)Http.checkConnectivity(): Result: true + txChannel: Ably: ConnectionManager WebSocket slow timer: http connectivity check succeeded + interception proxy got message {"jsonrpc":"2.0","id":"ccfcfd6d-d97b-4973-81f4-bcdc2ea56ea0","method":"transformInterceptedMessage","params":{"id":"aa8566d4-ec76-4a8f-b3bd-1a760895fe98","connectionID":"70912198-025c-4e15-a5a7-e14b6d209647","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message aa8566d4-ec76-4a8f-b3bd-1a760895fe98 unaltered + interception proxy got result of transforming message aa8566d4-ec76-4a8f-b3bd-1a760895fe98 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"027753e0-7bbe-45cc-ab54-72de57d06c30","method":"transformInterceptedMessage","params":{"id":"5f754354-c9a9-497e-8f41-ce658dac13ea","connectionID":"c3f539da-8082-4db4-a859-8cf2db3c4887","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 5f754354-c9a9-497e-8f41-ce658dac13ea unaltered + interception proxy got result of transforming message 5f754354-c9a9-497e-8f41-ce658dac13ea Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"8e3f44d7-1b9d-49a9-acff-173b943c8214","method":"transformInterceptedMessage","params":{"id":"01472042-9d34-491e-81fa-3060938fa669","connectionID":"7637f8e0-a9d6-493b-bd06-537ba0be5c3e","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 01472042-9d34-491e-81fa-3060938fa669 unaltered + interception proxy got result of transforming message 01472042-9d34-491e-81fa-3060938fa669 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"2b463ab9-7b36-4a71-8a4a-27537ef57026","method":"transformInterceptedMessage","params":{"id":"1cb2cb40-82f0-424e-9114-f150323ca1ea","connectionID":"e23c4a14-44ab-46fd-a0f4-4edb829afaf1","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 1cb2cb40-82f0-424e-9114-f150323ca1ea unaltered + interception proxy got result of transforming message 1cb2cb40-82f0-424e-9114-f150323ca1ea Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"409e9f5a-6a9e-4ea0-9214-ecff631c8dc2","method":"transformInterceptedMessage","params":{"id":"06ecbb43-aa70-40e0-bedd-2d97bba24ca1","connectionID":"4abeba2e-2382-4148-bc56-51e5370cff35","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 06ecbb43-aa70-40e0-bedd-2d97bba24ca1 unaltered + interception proxy got result of transforming message 06ecbb43-aa70-40e0-bedd-2d97bba24ca1 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"dc59cb8c-c2f7-41ff-aaaa-d9cdc78b55bf","method":"transformInterceptedMessage","params":{"id":"c03facab-a5ac-4906-8493-8a001b91b970","connectionID":"d28b1b1e-3bab-4445-b632-30c86c4a5b99","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message c03facab-a5ac-4906-8493-8a001b91b970 unaltered + interception proxy got result of transforming message c03facab-a5ac-4906-8493-8a001b91b970 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"11dba0bf-d89f-467e-90ba-bac671bc154c","method":"transformInterceptedMessage","params":{"id":"9f9458cc-ea4c-426a-960e-42b7fbc5febe","connectionID":"5fb28df8-6168-4f1c-8cca-9848a76982b4","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 9f9458cc-ea4c-426a-960e-42b7fbc5febe unaltered + interception proxy got result of transforming message 9f9458cc-ea4c-426a-960e-42b7fbc5febe Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d1e771e9-6030-4bba-866d-ea658cc12e3c","method":"transformInterceptedMessage","params":{"id":"1985fa54-50d2-46a1-b225-756d52310831","connectionID":"639be235-16ca-40e8-ad4e-0d386175fa7c","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 1985fa54-50d2-46a1-b225-756d52310831 unaltered + interception proxy got result of transforming message 1985fa54-50d2-46a1-b225-756d52310831 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d656bdad-a036-4b7a-81c9-d44b786415a5","method":"transformInterceptedMessage","params":{"id":"b6dd551a-9397-4ebe-88cf-5749fc30f3e8","connectionID":"29812980-815d-4f23-a715-40adb3876177","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b6dd551a-9397-4ebe-88cf-5749fc30f3e8 unaltered + interception proxy got result of transforming message b6dd551a-9397-4ebe-88cf-5749fc30f3e8 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"8c1c5c35-23ac-4de9-9f4f-0a446b220877","method":"transformInterceptedMessage","params":{"id":"b5716332-b02f-47e2-9046-9f167abc404f","connectionID":"cb9abcdc-448e-46f1-be4e-01a28451defb","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b5716332-b02f-47e2-9046-9f167abc404f unaltered + interception proxy got result of transforming message b5716332-b02f-47e2-9046-9f167abc404f Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular RealtimePresence BaseRealtime with RealtimePresence offers realtime presence functionality + txChannel: Ably: ConnectionManager WebSocket give up timer: websocket connection took more than 10s; + txChannel: Ably: ConnectionManager WebSocket give up timer: websocket connectivity appears to be unavailable but no other transports to try + txChannel: Ably: WebSocketTransport.dispose(): + txChannel: Ably: ConnectionManager.tryATransport(): transport web_socket disconnected, err: [_ErrorInfo: Timeout waiting for transport to indicate itself viable; statusCode=500; code=50000] + txChannel: Ably: ConnectionManager.notifyState(): new state: disconnected + txChannel: Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: Ably: Connection state: disconnected; reason: [_ErrorInfo: Unable to connect (and no more fallback hosts to try); statusCode=404; code=80003] + txChannel: Ably: ConnectionManager.enactStateChange: setting new state: disconnected; reason = Unable to connect (and no more fallback hosts to try) + txChannel: Ably: WebSocketTransport.dispose(): closing websocket + WebSocket connection to 'wss://sandbox-realtime.ably.io/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser' failed: WebSocket is closed before the connection is established. +(anonymous) @ index.mjs:7597 + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined + txChannel: Ably: WebSocketTransport.dispose(): + txChannel: Ably: WebSocketTransport.onError(): Error from WebSocket: undefined + txChannel: Ably: WebSocketTransport.onWsClose(): Unclean disconnection of WebSocket ; code = 1006 + interception proxy got message {"jsonrpc":"2.0","id":"b8531c76-7d05-47bf-a3c6-81ad7398fe18","method":"transformInterceptedMessage","params":{"id":"422ddb16-70af-4f32-88f6-cbacc9e69493","connectionID":"68eaba90-334f-48dd-b9dd-6011c24bf167","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 422ddb16-70af-4f32-88f6-cbacc9e69493 unaltered + interception proxy got result of transforming message 422ddb16-70af-4f32-88f6-cbacc9e69493 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"7759d97b-97ce-48dd-919e-ad61df463999","method":"transformInterceptedMessage","params":{"id":"a1c2b944-5116-4457-9e12-9037cb32e629","connectionID":"1144e935-7078-4e6c-8853-a1378937e60c","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a1c2b944-5116-4457-9e12-9037cb32e629 unaltered + interception proxy got result of transforming message a1c2b944-5116-4457-9e12-9037cb32e629 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ad70a100-c4bf-464a-aac2-a553b9a06bfa","method":"transformInterceptedMessage","params":{"id":"b4f577c6-56d3-4bdf-a88e-64211b266d77","connectionID":"639be235-16ca-40e8-ad4e-0d386175fa7c","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b4f577c6-56d3-4bdf-a88e-64211b266d77 unaltered + interception proxy got result of transforming message b4f577c6-56d3-4bdf-a88e-64211b266d77 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"af278964-1282-4f48-8989-e4c33201d692","method":"transformInterceptedMessage","params":{"id":"6b73a102-3fc3-4e34-846c-bff591c14a67","connectionID":"4abeba2e-2382-4148-bc56-51e5370cff35","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 6b73a102-3fc3-4e34-846c-bff591c14a67 unaltered + interception proxy got result of transforming message 6b73a102-3fc3-4e34-846c-bff591c14a67 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"933b8c87-48a1-4485-a509-8132a88a8c94","method":"transformInterceptedMessage","params":{"id":"47beb617-4c3c-4782-aa33-a60ceff8da48","connectionID":"29812980-815d-4f23-a715-40adb3876177","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 47beb617-4c3c-4782-aa33-a60ceff8da48 unaltered + interception proxy got result of transforming message 47beb617-4c3c-4782-aa33-a60ceff8da48 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"67b6e654-3e69-4884-a5bd-d500d2a534c4","method":"transformInterceptedMessage","params":{"id":"4dd20911-4558-4884-af02-40f377c997c8","connectionID":"7637f8e0-a9d6-493b-bd06-537ba0be5c3e","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 4dd20911-4558-4884-af02-40f377c997c8 unaltered + interception proxy got result of transforming message 4dd20911-4558-4884-af02-40f377c997c8 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"483e6365-b300-4737-b08c-b7a2685a8713","method":"transformInterceptedMessage","params":{"id":"2106ee60-5932-4a18-be05-26945d9a2adf","connectionID":"cb9abcdc-448e-46f1-be4e-01a28451defb","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 2106ee60-5932-4a18-be05-26945d9a2adf unaltered + interception proxy got result of transforming message 2106ee60-5932-4a18-be05-26945d9a2adf Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"4a3eab17-cb91-415e-88c6-56a97d17bfc7","method":"transformInterceptedMessage","params":{"id":"2122d3d7-f7d9-4c15-811a-d925db17f434","connectionID":"68eaba90-334f-48dd-b9dd-6011c24bf167","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 2122d3d7-f7d9-4c15-811a-d925db17f434 unaltered + interception proxy got result of transforming message 2122d3d7-f7d9-4c15-811a-d925db17f434 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"f0a875f3-fd5d-464e-aaa5-b847e6d20c94","method":"transformInterceptedMessage","params":{"id":"9e04fdcf-bf4e-4ac6-9e37-8107a8567a04","connectionID":"8d9e0fb0-4c18-483a-aeb9-896a0e62afdf","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 9e04fdcf-bf4e-4ac6-9e37-8107a8567a04 unaltered + interception proxy got result of transforming message 9e04fdcf-bf4e-4ac6-9e37-8107a8567a04 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"95faa94a-3cc0-4f68-aaaf-90823cd333ba","method":"transformInterceptedMessage","params":{"id":"b20ec16e-93b7-4e68-83be-1e2901088ac8","connectionID":"13891ae9-995c-4d5a-b002-8b71c3cb16cf","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b20ec16e-93b7-4e68-83be-1e2901088ac8 unaltered + interception proxy got result of transforming message b20ec16e-93b7-4e68-83be-1e2901088ac8 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"6c048309-c28c-456d-a11d-3e985998c9b0","method":"transformInterceptedMessage","params":{"id":"3803ac2c-d5ab-451d-b674-f531beec8492","connectionID":"70912198-025c-4e15-a5a7-e14b6d209647","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 3803ac2c-d5ab-451d-b674-f531beec8492 unaltered + interception proxy got result of transforming message 3803ac2c-d5ab-451d-b674-f531beec8492 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"8a82ae58-a7b3-4e83-8cb0-f2ce3b6e3777","method":"transformInterceptedMessage","params":{"id":"d7c8b640-d2d9-4525-a380-5c8269b7af7b","connectionID":"397f435d-23c3-467c-a1ee-ff8d4dfa0cee","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d7c8b640-d2d9-4525-a380-5c8269b7af7b unaltered + interception proxy got result of transforming message d7c8b640-d2d9-4525-a380-5c8269b7af7b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"8d03abef-b2fe-4006-a421-8efa979c7aac","method":"transformInterceptedMessage","params":{"id":"0cc56dc8-4652-443a-ae84-3466b0cbe8db","connectionID":"19f3b0aa-550f-464c-a34c-38101f6f36d4","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0cc56dc8-4652-443a-ae84-3466b0cbe8db unaltered + interception proxy got result of transforming message 0cc56dc8-4652-443a-ae84-3466b0cbe8db Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"97acbaab-ed55-4bb4-b580-469c9f88be99","method":"transformInterceptedMessage","params":{"id":"118f1a27-af64-4a38-a765-7bb55de76581","connectionID":"c3f539da-8082-4db4-a859-8cf2db3c4887","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 118f1a27-af64-4a38-a765-7bb55de76581 unaltered + interception proxy got result of transforming message 118f1a27-af64-4a38-a765-7bb55de76581 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"bbfaf8df-e36a-40f0-af40-f89e6c0f5323","method":"transformInterceptedMessage","params":{"id":"3518a0a9-1d13-4648-9932-ee914119d164","connectionID":"5fb28df8-6168-4f1c-8cca-9848a76982b4","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 3518a0a9-1d13-4648-9932-ee914119d164 unaltered + interception proxy got result of transforming message 3518a0a9-1d13-4648-9932-ee914119d164 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"32c30a77-c5e1-41a1-8446-75d5f65c6bf8","method":"transformInterceptedMessage","params":{"id":"79a031e0-f6ae-4555-96d1-40bd86e18c5b","connectionID":"91386ac1-2026-4326-8f16-eb0d48caa4e4","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 79a031e0-f6ae-4555-96d1-40bd86e18c5b unaltered + interception proxy got result of transforming message 79a031e0-f6ae-4555-96d1-40bd86e18c5b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d6d05b2f-7c6c-4357-9d29-85635ffda56f","method":"transformInterceptedMessage","params":{"id":"4bac88c8-0cf5-4a53-b818-1a1f75ae0dd2","connectionID":"1144e935-7078-4e6c-8853-a1378937e60c","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 4bac88c8-0cf5-4a53-b818-1a1f75ae0dd2 unaltered + interception proxy got result of transforming message 4bac88c8-0cf5-4a53-b818-1a1f75ae0dd2 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"f7e90c86-560f-48f5-9d87-59e5262d4a27","method":"transformInterceptedMessage","params":{"id":"d2b840d0-75d0-475e-ad57-5facb5321c1f","connectionID":"4dd52b39-1721-4085-96aa-3537600eff36","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d2b840d0-75d0-475e-ad57-5facb5321c1f unaltered + interception proxy got result of transforming message d2b840d0-75d0-475e-ad57-5facb5321c1f Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"82ee00df-e4ad-4606-9a37-0ac725f2d852","method":"transformInterceptedMessage","params":{"id":"0b4aff27-207f-460e-b1b7-0fbcfbfb8c2e","connectionID":"d28b1b1e-3bab-4445-b632-30c86c4a5b99","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0b4aff27-207f-460e-b1b7-0fbcfbfb8c2e unaltered + interception proxy got result of transforming message 0b4aff27-207f-460e-b1b7-0fbcfbfb8c2e Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b7ca84d4-a4c8-4207-8b16-9653ba2cb2de","method":"transformInterceptedMessage","params":{"id":"007e9a6d-b0ff-40a1-9900-13fce86ca5ee","connectionID":"39d724c8-40d0-42e7-a5d5-2271d18e7397","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 007e9a6d-b0ff-40a1-9900-13fce86ca5ee unaltered + interception proxy got result of transforming message 007e9a6d-b0ff-40a1-9900-13fce86ca5ee Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ae17861f-2a80-434c-a343-396488c32266","method":"transformInterceptedMessage","params":{"id":"ba61eabe-451d-427b-9101-d314ae783e94","connectionID":"42b847c4-2671-4a1e-9d62-28798690dcd0","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ba61eabe-451d-427b-9101-d314ae783e94 unaltered + interception proxy got result of transforming message ba61eabe-451d-427b-9101-d314ae783e94 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"49d3f8a2-c0f3-4155-8ae6-020d7a9ab41c","method":"transformInterceptedMessage","params":{"id":"3d879c81-9967-46bd-a59c-a55e76cbca04","connectionID":"e23c4a14-44ab-46fd-a0f4-4edb829afaf1","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 3d879c81-9967-46bd-a59c-a55e76cbca04 unaltered + interception proxy got result of transforming message 3d879c81-9967-46bd-a59c-a55e76cbca04 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"0f6062da-f77e-4990-8836-1afaf056596d","method":"transformInterceptedMessage","params":{"id":"35c91c1d-c76e-4439-89c5-aeceac341b99","connectionID":"9164a0c3-4c5f-4f25-bc9a-fd68bcc87a70","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 35c91c1d-c76e-4439-89c5-aeceac341b99 unaltered + interception proxy got result of transforming message 35c91c1d-c76e-4439-89c5-aeceac341b99 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"f0c8feed-8cb2-46d6-ba05-b9de27b1a637","method":"transformInterceptedMessage","params":{"id":"c04f1c9d-4696-4e41-b756-c3229db34bde","connectionID":"dad6aaab-b993-4745-8a21-3ad96b2f49d5","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message c04f1c9d-4696-4e41-b756-c3229db34bde unaltered + interception proxy got result of transforming message c04f1c9d-4696-4e41-b756-c3229db34bde Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"7475d5ef-9897-434b-8468-54992a450917","method":"transformInterceptedMessage","params":{"id":"bff2edeb-b0bf-40d2-a6b4-4460471bf108","connectionID":"ff80a804-8838-458a-b578-bb2d6316093f","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message bff2edeb-b0bf-40d2-a6b4-4460471bf108 unaltered + interception proxy got result of transforming message bff2edeb-b0bf-40d2-a6b4-4460471bf108 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"261be9f9-10f8-407a-891d-ab275d11f346","method":"transformInterceptedMessage","params":{"id":"f94e403a-9e7f-4da7-9bd4-cb5cae9e98e5","connectionID":"265b541b-f617-4c39-bed7-8915b4bf9627","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message f94e403a-9e7f-4da7-9bd4-cb5cae9e98e5 unaltered + interception proxy got result of transforming message f94e403a-9e7f-4da7-9bd4-cb5cae9e98e5 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"3ab87890-c751-497d-aeaa-2f37d280a23d","method":"transformInterceptedMessage","params":{"id":"cd474049-0a14-4b21-b82f-ebde284a57c2","connectionID":"f371c134-be0c-478d-8f1e-48c9ef249765","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message cd474049-0a14-4b21-b82f-ebde284a57c2 unaltered + interception proxy got result of transforming message cd474049-0a14-4b21-b82f-ebde284a57c2 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"4598f48f-ff56-4c2b-b14b-c1f970764a4e","method":"transformInterceptedMessage","params":{"id":"a50a54de-cb25-4907-bc7e-6fa36885d033","connectionID":"927b4705-7fc3-4412-83b0-79e20216cd37","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a50a54de-cb25-4907-bc7e-6fa36885d033 unaltered + interception proxy got result of transforming message a50a54de-cb25-4907-bc7e-6fa36885d033 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"3b0d493f-4e80-4f56-adef-9b209c414f33","method":"transformInterceptedMessage","params":{"id":"ba5523fa-cfb8-4405-af9a-770e3ed8de7c","connectionID":"fa1ca63e-35f9-4df1-9b5a-19ca8c593774","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ba5523fa-cfb8-4405-af9a-770e3ed8de7c unaltered + interception proxy got result of transforming message ba5523fa-cfb8-4405-af9a-770e3ed8de7c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ba50bbb3-106b-4d74-8423-4aa09c19527f","method":"transformInterceptedMessage","params":{"id":"645980dc-6807-4ece-9fe3-b4daacc65b6b","connectionID":"4f46ba17-87f6-458b-81cd-7a6815327c24","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 645980dc-6807-4ece-9fe3-b4daacc65b6b unaltered + interception proxy got result of transforming message 645980dc-6807-4ece-9fe3-b4daacc65b6b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"3c6c15cc-ab8a-4708-8fe4-96c90926df39","method":"transformInterceptedMessage","params":{"id":"a86eb8e6-c719-4839-b451-931893f84210","connectionID":"ffec95f2-a99f-44f2-bf06-3cfe62e98810","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a86eb8e6-c719-4839-b451-931893f84210 unaltered + interception proxy got result of transforming message a86eb8e6-c719-4839-b451-931893f84210 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"553f4e65-5a9f-49a8-ab7d-0a2375e56ddf","method":"transformInterceptedMessage","params":{"id":"5f7195b9-2f4f-4f5e-8dd3-466716a09559","connectionID":"41f3bb9d-9eb6-4863-a439-443b13081da5","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 5f7195b9-2f4f-4f5e-8dd3-466716a09559 unaltered + interception proxy got result of transforming message 5f7195b9-2f4f-4f5e-8dd3-466716a09559 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b93130c0-8563-4c4c-ba96-f81d63a439bb","method":"transformInterceptedMessage","params":{"id":"4a8e65eb-e6b8-4c6b-85bc-42ddcce7010e","connectionID":"7846579c-e8e5-4935-b78e-5955c8b4bbc8","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 4a8e65eb-e6b8-4c6b-85bc-42ddcce7010e unaltered + interception proxy got result of transforming message 4a8e65eb-e6b8-4c6b-85bc-42ddcce7010e Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"0f2e0e07-df31-4024-a4ea-020e365a07ef","method":"transformInterceptedMessage","params":{"id":"65af239b-7866-4c58-b2a0-81748fcd3a1e","connectionID":"e01b344d-3282-43ed-a7c2-bb43eaabf2ec","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 65af239b-7866-4c58-b2a0-81748fcd3a1e unaltered + interception proxy got result of transforming message 65af239b-7866-4c58-b2a0-81748fcd3a1e Object + interception proxy sending transformInterceptedMessage response Object + rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 152; type = string + rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=DISCONNECTED; error=[_ErrorInfo: Account _tmp_XMZaVA disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ]]; connectionId = SSn13x5VVd + rxChannel: Ably: Transport.onDisconnect(): err = [_ErrorInfo: Account _tmp_XMZaVA disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ] + rxChannel: Ably: ConnectionManager.deactivateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: Ably: ConnectionManager.deactivateTransport(): state = disconnected; was active + rxChannel: Ably: ConnectionManager.deactivateTransport(): reason = Account _tmp_XMZaVA disabled + rxChannel: Ably: ConnectionManager.deactivateTransport(): Getting, clearing, and requeuing 0 pending messages + rxChannel: Ably: MessageQueue.clear(): clearing 0 messages + rxChannel: Ably: ConnectionManager.notifyState(): new state: disconnected; will retry connection immediately + rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): + rxChannel: Ably: Connection state: disconnected; reason: [_ErrorInfo: Account _tmp_XMZaVA disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ] + rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: disconnected; reason = Account _tmp_XMZaVA disabled + rxChannel: Ably: WebSocketTransport.dispose(): + rxChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: disconnected + rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): + rxChannel: Ably: Connection state: connecting + rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined + rxChannel: Ably: WebSocketTransport.dispose(): closing websocket + rxChannel: Ably: ConnectionManager.startConnect(): starting connection + rxChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting + rxChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=resume,connectionKey=e7dAszwTABc0Ei!SSn13x5VVdAaZXvyTWO2lx-320,format=json] + rxChannel: Ably: ConnectionManager.connectWs(): undefined + rxChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket + rxChannel: Ably: ConnectionManager.tryATransport(): trying web_socket + rxChannel: Ably: WebSocketTransport.connect(): starting + rxChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ + rxChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_W5rYLA.LjJ4BA:WeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM; err: null + rxChannel: Ably: WebSocketTransport.onWsClose(): Cleanly closed WebSocket + txChannel: Ably: ConnectionManager WebSocket slow timer: ws connectivity check succeeded + interception proxy got message {"jsonrpc":"2.0","id":"6c7da731-54b0-44c0-a306-5f4a903e5b46","method":"transformInterceptedMessage","params":{"id":"e331fa26-d860-4357-908f-1b610326f921","connectionID":"a16a2065-c20f-4882-b4fb-7af537170863","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971105302}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message e331fa26-d860-4357-908f-1b610326f921 unaltered + interception proxy got result of transforming message e331fa26-d860-4357-908f-1b610326f921 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"7b88a7e6-22ab-4b1d-85b9-7974476c4220","method":"transformInterceptedMessage","params":{"id":"24992b27-5b5e-4c52-a67e-cc438cda1ef9","connectionID":"64c0ef19-ba10-4fc7-b2ef-ebbbd846974f","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971105303}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 24992b27-5b5e-4c52-a67e-cc438cda1ef9 unaltered + interception proxy got result of transforming message 24992b27-5b5e-4c52-a67e-cc438cda1ef9 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"a2d0b5ae-52fb-47a1-80f3-06469367a3a0","method":"transformInterceptedMessage","params":{"id":"e101f7a2-e338-4703-b1bf-b4f0208b247c","connectionID":"df02bf77-0f59-4171-a2af-c1d85d1164a2","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971105305}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message e101f7a2-e338-4703-b1bf-b4f0208b247c unaltered + interception proxy got result of transforming message e101f7a2-e338-4703-b1bf-b4f0208b247c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"8c0f2f75-5eef-4668-aae3-c5ea585f38ac","method":"transformInterceptedMessage","params":{"id":"ffdb2d6a-6902-4928-9e66-fb7dedc25fcf","connectionID":"e1767816-a77c-47aa-b926-107ab2515902","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971105304}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ffdb2d6a-6902-4928-9e66-fb7dedc25fcf unaltered + interception proxy got result of transforming message ffdb2d6a-6902-4928-9e66-fb7dedc25fcf Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"4d39d39f-0a9b-4049-b669-7ddbacdbee5e","method":"transformInterceptedMessage","params":{"id":"4829d278-41c4-40c5-9686-d56add656fed","connectionID":"6b787087-5a0f-4d0d-af4d-33dfc2689c0c","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971105306}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 4829d278-41c4-40c5-9686-d56add656fed unaltered + interception proxy got result of transforming message 4829d278-41c4-40c5-9686-d56add656fed Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"22b655a9-2d1f-4c7c-8c54-a49bb15bbe8d","method":"transformInterceptedMessage","params":{"id":"d4228389-eb28-4936-8626-57e1d455bc2a","connectionID":"ee5d131d-c339-4168-9385-9f592591a744","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971105308}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d4228389-eb28-4936-8626-57e1d455bc2a unaltered + interception proxy got result of transforming message d4228389-eb28-4936-8626-57e1d455bc2a Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"c410c008-cbc5-407b-885d-18665a1eb89f","method":"transformInterceptedMessage","params":{"id":"a4b815a7-6c94-45dc-8147-a8486f3732c2","connectionID":"ec57dc77-5992-4cba-baaa-efcb01b243fd","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971105322}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a4b815a7-6c94-45dc-8147-a8486f3732c2 unaltered + interception proxy got result of transforming message a4b815a7-6c94-45dc-8147-a8486f3732c2 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"8b1980ae-0ad0-4015-9a9f-9fe20c93c243","method":"transformInterceptedMessage","params":{"id":"e4b5271d-fdc7-42ee-bf47-4438be5bb38c","connectionID":"bba3fe0f-7684-4c19-ba1c-ca1a0a451e51","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971105330}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message e4b5271d-fdc7-42ee-bf47-4438be5bb38c unaltered + interception proxy got result of transforming message e4b5271d-fdc7-42ee-bf47-4438be5bb38c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"36c5fab7-ee4e-483c-9858-e8ac775776f9","method":"transformInterceptedMessage","params":{"id":"9bcf51c2-b207-4d3f-8ebe-66e4826da943","connectionID":"574e582c-a82b-49e9-9b67-14cbc0f2ecc4","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971105331}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 9bcf51c2-b207-4d3f-8ebe-66e4826da943 unaltered + interception proxy got result of transforming message 9bcf51c2-b207-4d3f-8ebe-66e4826da943 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"6785418d-bf81-461b-8b81-d55643980d68","method":"transformInterceptedMessage","params":{"id":"b74e7968-c5d6-4cbe-bc00-7a7d103044a7","connectionID":"ad47f590-1be8-413a-8c59-8dacc95be7eb","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971105378}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b74e7968-c5d6-4cbe-bc00-7a7d103044a7 unaltered + interception proxy got result of transforming message b74e7968-c5d6-4cbe-bc00-7a7d103044a7 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"9498903d-7e95-4eea-a16b-b6e6a7ba0d65","method":"transformInterceptedMessage","params":{"id":"45610861-16bb-492c-bc30-4f67d1439b11","connectionID":"9efe2c47-aa31-405d-a66a-c837c98245b6","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971105382}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 45610861-16bb-492c-bc30-4f67d1439b11 unaltered + interception proxy got result of transforming message 45610861-16bb-492c-bc30-4f67d1439b11 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b171f48e-b9f9-47f4-8f4a-f196a792777e","method":"transformInterceptedMessage","params":{"id":"f3a02950-9eda-41ec-839f-6271e4e2ec69","connectionID":"a07e967a-d707-41fa-b093-f340fda4db6d","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971105512}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message f3a02950-9eda-41ec-839f-6271e4e2ec69 unaltered + interception proxy got result of transforming message f3a02950-9eda-41ec-839f-6271e4e2ec69 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"14c67273-fbf0-4d87-bb3b-cf7167dc6a80","method":"transformInterceptedMessage","params":{"id":"97f71d0c-6a6c-4286-b23f-9ad634a36c03","connectionID":"b70e22f9-5574-47d0-95f7-baa0c3068a53","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971105747}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 97f71d0c-6a6c-4286-b23f-9ad634a36c03 unaltered + interception proxy got result of transforming message 97f71d0c-6a6c-4286-b23f-9ad634a36c03 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"524e76b2-aeb4-44bb-8060-3ff6b4a22eb1","method":"transformInterceptedMessage","params":{"id":"38bc452d-c91f-49b7-9720-039c7be4d815","connectionID":"04c9abd0-550d-405d-9d2e-76396f6080b0","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971106357}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 38bc452d-c91f-49b7-9720-039c7be4d815 unaltered + interception proxy got result of transforming message 38bc452d-c91f-49b7-9720-039c7be4d815 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"9f6010ee-cb17-4e69-afba-63433c31d458","method":"transformInterceptedMessage","params":{"id":"17d7ccd0-ac81-4a0e-b38b-9dec011f6a6e","connectionID":"d3342545-ffc8-4060-b142-e888fc954259","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971106409}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 17d7ccd0-ac81-4a0e-b38b-9dec011f6a6e unaltered + interception proxy got result of transforming message 17d7ccd0-ac81-4a0e-b38b-9dec011f6a6e Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"4f414207-a316-433a-95ae-9819f79144bf","method":"transformInterceptedMessage","params":{"id":"dcdcc8de-5a09-4584-8791-0d0175f09866","connectionID":"4ae63886-636c-47cd-96f9-a56ba865e7eb","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971106709}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message dcdcc8de-5a09-4584-8791-0d0175f09866 unaltered + interception proxy got result of transforming message dcdcc8de-5a09-4584-8791-0d0175f09866 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"88ba0923-6593-4c16-b91f-baa033640791","method":"transformInterceptedMessage","params":{"id":"94ef0ade-d2da-4fb4-8d7a-d6692aedd3c1","connectionID":"b1b0551b-7151-4257-b5b0-746c4ef0868e","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971106736}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 94ef0ade-d2da-4fb4-8d7a-d6692aedd3c1 unaltered + interception proxy got result of transforming message 94ef0ade-d2da-4fb4-8d7a-d6692aedd3c1 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"0a0be2ce-1ee2-40e4-ae95-4f36033e7196","method":"transformInterceptedMessage","params":{"id":"c8ede121-8ff6-41f9-b7bb-9db050aa709e","connectionID":"ba609f1d-06c2-4c92-9ec8-9fb78f19b10d","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971106760}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message c8ede121-8ff6-41f9-b7bb-9db050aa709e unaltered + interception proxy got result of transforming message c8ede121-8ff6-41f9-b7bb-9db050aa709e Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"25193b40-1f23-46bc-920b-500a43214670","method":"transformInterceptedMessage","params":{"id":"9265944b-5409-48f5-8fa0-8491bc2e82fa","connectionID":"1dd8af02-4c63-4619-bd11-c7e32abee26f","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971106822}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 9265944b-5409-48f5-8fa0-8491bc2e82fa unaltered + interception proxy got result of transforming message 9265944b-5409-48f5-8fa0-8491bc2e82fa Object + interception proxy sending transformInterceptedMessage response Object + rxChannel: Ably: WebSocketTransport.onWsOpen(): opened WebSocket + rxChannel: Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&resume=e7dAszwTABc0Ei!SSn13x5VVdAaZXvyTWO2lx-320&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending + rxChannel: Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&resume=e7dAszwTABc0Ei!SSn13x5VVdAaZXvyTWO2lx-320&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = resume + interception proxy got message {"jsonrpc":"2.0","id":"6e9aaa07-fa1f-4e42-86cc-cece9582dd16","method":"transformInterceptedMessage","params":{"id":"d2f26a05-0331-4153-8b2c-9dd24a78ca52","connectionID":"d6052381-2392-4bb6-be28-f66f72159ed6","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971107163}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d2f26a05-0331-4153-8b2c-9dd24a78ca52 unaltered + interception proxy got result of transforming message d2f26a05-0331-4153-8b2c-9dd24a78ca52 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"1b4bb5a3-8372-48aa-bc36-7997b693e067","method":"transformInterceptedMessage","params":{"id":"a474ecca-8535-4f32-b754-343065b6c255","connectionID":"e7ef87e7-0fcb-43fb-b204-f8235c689c73","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971107399}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a474ecca-8535-4f32-b754-343065b6c255 unaltered + interception proxy got result of transforming message a474ecca-8535-4f32-b754-343065b6c255 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"369fd270-dab1-420f-815b-eb5958e809fd","method":"transformInterceptedMessage","params":{"id":"2dfcad14-71ac-4313-8f55-0ad400377638","connectionID":"7fbaaa04-bad6-49f7-bc4c-bfeb8656531e","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_XMZaVA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971107497}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 2dfcad14-71ac-4313-8f55-0ad400377638 unaltered + interception proxy got result of transforming message 2dfcad14-71ac-4313-8f55-0ad400377638 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"e31da0c0-5f08-449e-aa24-6ba3d4878d35","method":"transformInterceptedMessage","params":{"id":"aafb7761-9c36-46c1-b228-29e27efb143b","connectionID":"a6458cb6-3a13-4d58-adc3-2d226ee26f5f","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971107611}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message aafb7761-9c36-46c1-b228-29e27efb143b unaltered + interception proxy got result of transforming message aafb7761-9c36-46c1-b228-29e27efb143b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ffcddfe9-baa3-4dd0-a94c-b799625f9876","method":"transformInterceptedMessage","params":{"id":"54a70e6b-d0e5-4c5c-9d75-a5287c09eaba","connectionID":"0de84c05-b93f-4f98-86c3-fe1adca9e020","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971107614}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 54a70e6b-d0e5-4c5c-9d75-a5287c09eaba unaltered + interception proxy got result of transforming message 54a70e6b-d0e5-4c5c-9d75-a5287c09eaba Object + interception proxy sending transformInterceptedMessage response Object + rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 232; type = string + rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ERROR; timestamp=1715971107614; error=[_ErrorInfo: Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300]]; connectionId = SSn13x5VVd + rxChannel: Ably: Transport.onProtocolMessage(): received error action; connectionId = SSn13x5VVd; err = {"code":40300,"statusCode":403,"nonfatal":false,"href":"https://help.ably.io/error/40300"} + rxChannel: Ably: Transport.onFatalError(): err = [_ErrorInfo: Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] + rxChannel: Ably: ConnectionManager.deactivateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&resume=e7dAszwTABc0Ei!SSn13x5VVdAaZXvyTWO2lx-320&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: Ably: ConnectionManager.deactivateTransport(): state = failed; was pending + rxChannel: Ably: ConnectionManager.deactivateTransport(): reason = Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.) + rxChannel: Ably: ConnectionManager.notifyState(): new state: failed + rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): + rxChannel: Ably: Connection state: failed; reason: [_ErrorInfo: Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] + rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: failed; reason = Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.) + rxChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = attached, notifying state failed + rxChannel: Ably: PresenceMap.setInProgress(): inProgress = false + rxChannel: Ably: PresenceMap.setInProgress(): inProgress = false + rxChannel: Ably: Channel state for channel "channel": failed; reason: [_ErrorInfo: Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] + rxChannel: Ably: WebSocketTransport.dispose(): + rxChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports + rxChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting pending transport: WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&resume=e7dAszwTABc0Ei!SSn13x5VVdAaZXvyTWO2lx-320&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined + rxChannel: Ably: WebSocketTransport.dispose(): closing websocket + rxChannel: Ably: WebSocketTransport.onWsClose(): Cleanly closed WebSocket + interception proxy got message {"jsonrpc":"2.0","id":"64511bfc-b4bb-4e94-94c1-0e66f320ec92","method":"transformInterceptedMessage","params":{"id":"857c3fc5-e114-4972-a133-e8cb09dd537a","connectionID":"dd84c08d-dd01-4b47-b9b6-806b53bcde32","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971108609}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 857c3fc5-e114-4972-a133-e8cb09dd537a unaltered + interception proxy got result of transforming message 857c3fc5-e114-4972-a133-e8cb09dd537a Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b2af8bd3-c848-41f8-a12a-0223a5bf931d","method":"transformInterceptedMessage","params":{"id":"278817f1-87d4-4272-9996-d4ab8c81f45b","connectionID":"f629c142-3337-4190-a244-82298da62e4e","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971108874}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 278817f1-87d4-4272-9996-d4ab8c81f45b unaltered + interception proxy got result of transforming message 278817f1-87d4-4272-9996-d4ab8c81f45b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"61d7faef-5417-495a-b29b-3507b75b009e","method":"transformInterceptedMessage","params":{"id":"8f54309c-9bf5-4512-b88d-1ab003b0f474","connectionID":"7ec37881-66ba-4f8b-ab80-819133bbeda1","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971109362}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 8f54309c-9bf5-4512-b88d-1ab003b0f474 unaltered + interception proxy got result of transforming message 8f54309c-9bf5-4512-b88d-1ab003b0f474 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"eaf4d7f2-85b7-4cc6-84ab-576e756b91b6","method":"transformInterceptedMessage","params":{"id":"98b9c35b-f90f-4c58-aa66-3daa9ff06056","connectionID":"3f60bd4c-2ff2-44ca-9537-7d59fa0d0028","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971109614}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 98b9c35b-f90f-4c58-aa66-3daa9ff06056 unaltered + interception proxy got result of transforming message 98b9c35b-f90f-4c58-aa66-3daa9ff06056 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"e6880725-676b-46ea-8453-f07176d35529","method":"transformInterceptedMessage","params":{"id":"43fa04e2-6898-4258-b6fa-b03462316429","connectionID":"1359bce5-2313-4af1-90ce-66d8859d791d","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971109656}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 43fa04e2-6898-4258-b6fa-b03462316429 unaltered + interception proxy got result of transforming message 43fa04e2-6898-4258-b6fa-b03462316429 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"a3ac4f6b-c88a-4cbf-b99a-52567bf9e550","method":"transformInterceptedMessage","params":{"id":"532aa1a8-bfbf-4058-922f-f8cf751c9bef","connectionID":"0dfdb8e3-650f-451b-9c1e-bd3462677bda","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971109761}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 532aa1a8-bfbf-4058-922f-f8cf751c9bef unaltered + interception proxy got result of transforming message 532aa1a8-bfbf-4058-922f-f8cf751c9bef Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"2c7c4603-0163-4138-9b59-f57e7914d480","method":"transformInterceptedMessage","params":{"id":"ebdfc554-df3e-4db8-8617-7b4b7cbc415c","connectionID":"d801802d-e8bd-4182-bb02-b485051940e3","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971110010}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ebdfc554-df3e-4db8-8617-7b4b7cbc415c unaltered + interception proxy got result of transforming message ebdfc554-df3e-4db8-8617-7b4b7cbc415c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"12a66faa-67b1-40e5-89db-5bce2ac24fdd","method":"transformInterceptedMessage","params":{"id":"bf4ceccc-1aef-4a57-a62f-5648ed6ea516","connectionID":"f00bc73d-b27f-4e75-ad8f-5b15550341fa","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_W5rYLA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971110077}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message bf4ceccc-1aef-4a57-a62f-5648ed6ea516 unaltered + interception proxy got result of transforming message bf4ceccc-1aef-4a57-a62f-5648ed6ea516 Object + interception proxy sending transformInterceptedMessage response Object + Test App _tmp_W5rYLA has been torn down + interception proxy client disconnected + txChannel: Ably: ConnectionManager retry timer expired: retrying + txChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: disconnected + txChannel: Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: Ably: Connection state: connecting + txChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined + txChannel: Ably: ConnectionManager.startConnect(): starting connection + txChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting + txChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] + txChannel: Ably: ConnectionManager.connectWs(): undefined + txChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket + txChannel: Ably: ConnectionManager.tryATransport(): trying web_socket + txChannel: Ably: WebSocketTransport.connect(): starting + txChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ + txChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_W5rYLA.LjJ4BA:WeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM; err: null + txChannel: Ably: WebSocketTransport.onWsOpen(): opened WebSocket + txChannel: Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending + txChannel: Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = clean + txChannel: Ably: ConnectionManager connecting timer expired: requesting new state: disconnected + txChannel: Ably: ConnectionManager.notifyState(): new state: disconnected + txChannel: Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: Ably: Connection state: disconnected; reason: [_ErrorInfo: Connection to server temporarily unavailable; statusCode=400; code=80003; see https://help.ably.io/error/80003 ] + txChannel: Ably: ConnectionManager.enactStateChange: setting new state: disconnected; reason = Connection to server temporarily unavailable + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting pending transport: WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: Ably: ConnectionManager.deactivateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: Ably: ConnectionManager.deactivateTransport(): state = disconnected; was pending + txChannel: Ably: ConnectionManager.deactivateTransport(): reason = Connection to server temporarily unavailable + txChannel: Ably: ConnectionManager.notifyState(): new state: disconnected + txChannel: Ably: WebSocketTransport.dispose(): + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined + txChannel: Ably: WebSocketTransport.dispose(): closing websocket + txChannel: Ably: WebSocketTransport.onWsClose(): Cleanly closed WebSocket + txChannel: Ably: ConnectionManager retry timer expired: retrying + txChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: disconnected + txChannel: Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: Ably: Connection state: connecting + txChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined + txChannel: Ably: ConnectionManager.startConnect(): starting connection + txChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting + txChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] + txChannel: Ably: ConnectionManager.connectWs(): undefined + txChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket + txChannel: Ably: ConnectionManager.tryATransport(): trying web_socket + txChannel: Ably: WebSocketTransport.connect(): starting + txChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ + txChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_W5rYLA.LjJ4BA:WeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM; err: null + txChannel: Ably: WebSocketTransport.onWsOpen(): opened WebSocket + txChannel: Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending + txChannel: Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = clean + txChannel: Ably: ConnectionManager connecting timer expired: requesting new state: disconnected + txChannel: Ably: ConnectionManager.notifyState(): new state: disconnected + txChannel: Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: Ably: Connection state: disconnected; reason: [_ErrorInfo: Connection to server temporarily unavailable; statusCode=400; code=80003; see https://help.ably.io/error/80003 ] + txChannel: Ably: ConnectionManager.enactStateChange: setting new state: disconnected; reason = Connection to server temporarily unavailable + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting pending transport: WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: Ably: ConnectionManager.deactivateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: Ably: ConnectionManager.deactivateTransport(): state = disconnected; was pending + txChannel: Ably: ConnectionManager.deactivateTransport(): reason = Connection to server temporarily unavailable + txChannel: Ably: ConnectionManager.notifyState(): new state: disconnected + txChannel: Ably: WebSocketTransport.dispose(): + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined + txChannel: Ably: WebSocketTransport.dispose(): closing websocket + txChannel: Ably: WebSocketTransport.onWsClose(): Cleanly closed WebSocket + txChannel: Ably: ConnectionManager retry timer expired: retrying + txChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: disconnected + txChannel: Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: Ably: Connection state: connecting + txChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined + txChannel: Ably: ConnectionManager.startConnect(): starting connection + txChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting + txChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] + txChannel: Ably: ConnectionManager.connectWs(): undefined + txChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket + txChannel: Ably: ConnectionManager.tryATransport(): trying web_socket + txChannel: Ably: WebSocketTransport.connect(): starting + txChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ + txChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_W5rYLA.LjJ4BA:WeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM; err: null + txChannel: Ably: WebSocketTransport.onWsOpen(): opened WebSocket + txChannel: Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending + txChannel: Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = clean + txChannel: Ably: ConnectionManager suspend timer expired: requesting new state: suspended + txChannel: Ably: ConnectionManager.notifyState(): new state: suspended + txChannel: Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: Ably: Connection state: suspended; reason: [_ErrorInfo: Connection to server unavailable; statusCode=400; code=80002; see https://help.ably.io/error/80002 ] + txChannel: Ably: ConnectionManager.enactStateChange: setting new state: suspended; reason = Connection to server unavailable + txChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = attaching, notifying state suspended + txChannel: Ably: RealtimeChannel.failPendingPresence: channel; name = channel, err = [_ErrorInfo: Connection to server unavailable; statusCode=400; code=80002; see https://help.ably.io/error/80002 ] + txChannel: Ably: Channel state for channel "channel": suspended; reason: [_ErrorInfo: Connection to server unavailable; statusCode=400; code=80002; see https://help.ably.io/error/80002 ] + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting pending transport: WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: Ably: ConnectionManager.deactivateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: Ably: ConnectionManager.deactivateTransport(): state = disconnected; was pending + txChannel: Ably: ConnectionManager.deactivateTransport(): reason = Connection to server temporarily unavailable + txChannel: Ably: ConnectionManager.notifyState(): new state: disconnected + txChannel: Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: Ably: Connection state: disconnected; reason: [_ErrorInfo: Connection to server temporarily unavailable; statusCode=400; code=80003; see https://help.ably.io/error/80003 ] + txChannel: Ably: ConnectionManager.enactStateChange: setting new state: disconnected; reason = Connection to server temporarily unavailable + txChannel: Ably: WebSocketTransport.dispose(): + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined +index.mjs:181 Uncaught (in promise) +fromValues @ index.mjs:181 +suspended @ index.mjs:3558 +notifyState @ index.mjs:4780 +(anonymous) @ index.mjs:4629 + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined + txChannel: Ably: WebSocketTransport.dispose(): closing websocket + txChannel: Ably: WebSocketTransport.onWsClose(): Cleanly closed WebSocket + txChannel: Ably: ConnectionManager retry timer expired: retrying + txChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: disconnected + txChannel: Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: Ably: Connection state: connecting + txChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined + txChannel: Ably: ConnectionManager.startConnect(): starting connection + txChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting + txChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] + txChannel: Ably: ConnectionManager.connectWs(): undefined + txChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket + txChannel: Ably: ConnectionManager.tryATransport(): trying web_socket + txChannel: Ably: WebSocketTransport.connect(): starting + txChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ + txChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_W5rYLA.LjJ4BA:WeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM; err: null + txChannel: Ably: WebSocketTransport.onWsOpen(): opened WebSocket + txChannel: Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending + txChannel: Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = clean + txChannel: Ably: ConnectionManager connecting timer expired: requesting new state: suspended + txChannel: Ably: ConnectionManager.notifyState(): new state: suspended + txChannel: Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: Ably: Connection state: suspended; reason: [_ErrorInfo: Connection to server unavailable; statusCode=400; code=80002; see https://help.ably.io/error/80002 ] + txChannel: Ably: ConnectionManager.enactStateChange: setting new state: suspended; reason = Connection to server unavailable + txChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = suspended, notifying state suspended + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports + txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting pending transport: WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: Ably: ConnectionManager.deactivateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: Ably: ConnectionManager.deactivateTransport(): state = disconnected; was pending + txChannel: Ably: ConnectionManager.deactivateTransport(): reason = Connection to server temporarily unavailable + txChannel: Ably: ConnectionManager.notifyState(): new state: disconnected + txChannel: Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: Ably: Connection state: disconnected; reason: [_ErrorInfo: Connection to server temporarily unavailable; statusCode=400; code=80003; see https://help.ably.io/error/80003 ] + txChannel: Ably: ConnectionManager.enactStateChange: setting new state: disconnected; reason = Connection to server temporarily unavailable + txChannel: Ably: WebSocketTransport.dispose(): +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined +modular.test.js:592 txChannel: Ably: WebSocketTransport.dispose(): closing websocket +modular.test.js:592 txChannel: Ably: WebSocketTransport.onWsClose(): Cleanly closed WebSocket +modular.test.js:592 txChannel: Ably: ConnectionManager retry timer expired: retrying +modular.test.js:592 txChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: disconnected +modular.test.js:592 txChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:592 txChannel: Ably: Connection state: connecting +modular.test.js:592 txChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined +modular.test.js:592 txChannel: Ably: ConnectionManager.startConnect(): starting connection +modular.test.js:592 txChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting +modular.test.js:592 txChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] +modular.test.js:592 txChannel: Ably: ConnectionManager.connectWs(): undefined +modular.test.js:592 txChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket +modular.test.js:592 txChannel: Ably: ConnectionManager.tryATransport(): trying web_socket +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): starting +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_W5rYLA.LjJ4BA:WeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM; err: null +modular.test.js:592 txChannel: Ably: WebSocketTransport.onWsOpen(): opened WebSocket +modular.test.js:592 txChannel: Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:592 txChannel: Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending +modular.test.js:592 txChannel: Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = clean +modular.test.js:592 txChannel: Ably: ConnectionManager connecting timer expired: requesting new state: suspended +modular.test.js:592 txChannel: Ably: ConnectionManager.notifyState(): new state: suspended +modular.test.js:592 txChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:592 txChannel: Ably: Connection state: suspended; reason: [_ErrorInfo: Connection to server unavailable; statusCode=400; code=80002; see https://help.ably.io/error/80002 ] +modular.test.js:592 txChannel: Ably: ConnectionManager.enactStateChange: setting new state: suspended; reason = Connection to server unavailable +modular.test.js:592 txChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = suspended, notifying state suspended +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting pending transport: WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:592 txChannel: Ably: ConnectionManager.deactivateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:592 txChannel: Ably: ConnectionManager.deactivateTransport(): state = disconnected; was pending +modular.test.js:592 txChannel: Ably: ConnectionManager.deactivateTransport(): reason = Connection to server temporarily unavailable +modular.test.js:592 txChannel: Ably: ConnectionManager.notifyState(): new state: disconnected +modular.test.js:592 txChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:592 txChannel: Ably: Connection state: disconnected; reason: [_ErrorInfo: Connection to server temporarily unavailable; statusCode=400; code=80003; see https://help.ably.io/error/80003 ] +modular.test.js:592 txChannel: Ably: ConnectionManager.enactStateChange: setting new state: disconnected; reason = Connection to server temporarily unavailable +modular.test.js:592 txChannel: Ably: WebSocketTransport.dispose(): +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined +modular.test.js:592 txChannel: Ably: WebSocketTransport.dispose(): closing websocket +modular.test.js:592 txChannel: Ably: WebSocketTransport.onWsClose(): Cleanly closed WebSocket +modular.test.js:592 txChannel: Ably: ConnectionManager retry timer expired: retrying +modular.test.js:592 txChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: disconnected +modular.test.js:592 txChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:592 txChannel: Ably: Connection state: connecting +modular.test.js:592 txChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined +modular.test.js:592 txChannel: Ably: ConnectionManager.startConnect(): starting connection +modular.test.js:592 txChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting +modular.test.js:592 txChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] +modular.test.js:592 txChannel: Ably: ConnectionManager.connectWs(): undefined +modular.test.js:592 txChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket +modular.test.js:592 txChannel: Ably: ConnectionManager.tryATransport(): trying web_socket +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): starting +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_W5rYLA.LjJ4BA:WeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM; err: null +modular.test.js:592 txChannel: Ably: WebSocketTransport.onWsOpen(): opened WebSocket +modular.test.js:592 txChannel: Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:592 txChannel: Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending +modular.test.js:592 txChannel: Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = clean +modular.test.js:592 txChannel: Ably: ConnectionManager connecting timer expired: requesting new state: suspended +modular.test.js:592 txChannel: Ably: ConnectionManager.notifyState(): new state: suspended +modular.test.js:592 txChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:592 txChannel: Ably: Connection state: suspended; reason: [_ErrorInfo: Connection to server unavailable; statusCode=400; code=80002; see https://help.ably.io/error/80002 ] +modular.test.js:592 txChannel: Ably: ConnectionManager.enactStateChange: setting new state: suspended; reason = Connection to server unavailable +modular.test.js:592 txChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = suspended, notifying state suspended +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting pending transport: WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:592 txChannel: Ably: ConnectionManager.deactivateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:592 txChannel: Ably: ConnectionManager.deactivateTransport(): state = disconnected; was pending +modular.test.js:592 txChannel: Ably: ConnectionManager.deactivateTransport(): reason = Connection to server temporarily unavailable +modular.test.js:592 txChannel: Ably: ConnectionManager.notifyState(): new state: disconnected +modular.test.js:592 txChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:592 txChannel: Ably: Connection state: disconnected; reason: [_ErrorInfo: Connection to server temporarily unavailable; statusCode=400; code=80003; see https://help.ably.io/error/80003 ] +modular.test.js:592 txChannel: Ably: ConnectionManager.enactStateChange: setting new state: disconnected; reason = Connection to server temporarily unavailable +modular.test.js:592 txChannel: Ably: WebSocketTransport.dispose(): +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined +modular.test.js:592 txChannel: Ably: WebSocketTransport.dispose(): closing websocket +modular.test.js:592 txChannel: Ably: WebSocketTransport.onWsClose(): Cleanly closed WebSocket +modular.test.js:592 txChannel: Ably: ConnectionManager retry timer expired: retrying +modular.test.js:592 txChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: disconnected +modular.test.js:592 txChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:592 txChannel: Ably: Connection state: connecting +modular.test.js:592 txChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined +modular.test.js:592 txChannel: Ably: ConnectionManager.startConnect(): starting connection +modular.test.js:592 txChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting +modular.test.js:592 txChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] +modular.test.js:592 txChannel: Ably: ConnectionManager.connectWs(): undefined +modular.test.js:592 txChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket +modular.test.js:592 txChannel: Ably: ConnectionManager.tryATransport(): trying web_socket +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): starting +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_W5rYLA.LjJ4BA:WeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM; err: null +modular.test.js:592 txChannel: Ably: WebSocketTransport.onWsOpen(): opened WebSocket +modular.test.js:592 txChannel: Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:592 txChannel: Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending +modular.test.js:592 txChannel: Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_W5rYLA.LjJ4BA%3AWeZ0ir3T3ZiL04GA6spVSzc2lT6skvqjx_aNMEbgwkM&clientId=6383626078799054&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = clean \ No newline at end of file diff --git a/with-failure-logs-3.txt b/with-failure-logs-3.txt new file mode 100644 index 000000000..360d2e18e --- /dev/null +++ b/with-failure-logs-3.txt @@ -0,0 +1,1594 @@ +favicon.ico:1 + + + Failed to load resource: the server responded with a status of 404 (Not Found) +interception_proxy_client.js:20 connected to interception proxy +interception_proxy_client.js:56 interception proxy sending startInterception request Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"8844936285723484","result":{}} +interception_proxy_client.js:34 startInterception completed +testapp_module.js:38 Test App _tmp_9XT2Hg in environment sandbox has been set up +root_hooks.js:31 START TEST: browser/modular attempting to initialize with no client options BaseRest throws an error +logger.ts:56 15:49:52.205 Ably: BaseRest(): BaseRest must be initialized with a client options object +errorLogger @ logger.ts:56 +(anonymous) @ logger.ts:29 +logAction @ logger.ts:122 +logActionNoStrip @ logger.ts:117 +_Logger.logAction @ logger.ts:110 +objectifyOptions @ defaults.ts:203 +BaseRest @ baserest.ts:21 +(anonymous) @ modular.test.js:48 +assertThrows @ VM6 chai.js:3044 +methodWrapper @ VM6 chai.js:7910 +(anonymous) @ modular.test.js:48 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +Runner.runSuite @ mocha.js:24024 +next @ mocha.js:24008 +next @ mocha.js:23842 +Runner.runTests @ mocha.js:23952 +(anonymous) @ mocha.js:24029 +next @ mocha.js:23572 +cbHookRun @ mocha.js:23641 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22194 +(anonymous) @ testapp_module.js:45 +(anonymous) @ testapp_manager.js:160 +xhr.onreadystatechange @ testapp_manager.js:83 +Show 20 more frames +Show less +root_hooks.js:27 END TEST: browser/modular attempting to initialize with no client options BaseRest throws an error +root_hooks.js:31 START TEST: browser/modular attempting to initialize with no client options _BaseRealtime throws an error +logger.ts:56 15:49:52.214 Ably: BaseRealtime(): BaseRealtime must be initialized with a client options object +errorLogger @ logger.ts:56 +(anonymous) @ logger.ts:29 +logAction @ logger.ts:122 +logActionNoStrip @ logger.ts:117 +_Logger.logAction @ logger.ts:110 +objectifyOptions @ defaults.ts:203 +_BaseRealtime @ baserealtime.ts:36 +(anonymous) @ modular.test.js:48 +assertThrows @ VM6 chai.js:3044 +methodWrapper @ VM6 chai.js:7910 +(anonymous) @ modular.test.js:48 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +Runner.runSuite @ mocha.js:24024 +next @ mocha.js:24008 +next @ mocha.js:23842 +Runner.runTests @ mocha.js:23952 +(anonymous) @ mocha.js:24029 +next @ mocha.js:23572 +cbHookRun @ mocha.js:23641 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22194 +(anonymous) @ testapp_module.js:45 +(anonymous) @ testapp_manager.js:160 +xhr.onreadystatechange @ testapp_manager.js:83 +Show 20 more frames +Show less +root_hooks.js:27 END TEST: browser/modular attempting to initialize with no client options _BaseRealtime throws an error +root_hooks.js:31 START TEST: browser/modular attempting to initialize with just an API key BaseRest throws an error +logger.ts:56 15:49:52.216 Ably: BaseRest(): BaseRest 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’s `key` property.) +errorLogger @ logger.ts:56 +(anonymous) @ logger.ts:29 +logAction @ logger.ts:122 +logActionNoStrip @ logger.ts:117 +_Logger.logAction @ logger.ts:110 +objectifyOptions @ defaults.ts:221 +BaseRest @ baserest.ts:21 +(anonymous) @ modular.test.js:58 +assertThrows @ VM6 chai.js:3044 +methodWrapper @ VM6 chai.js:7910 +(anonymous) @ modular.test.js:58 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +Runner.runSuite @ mocha.js:24024 +next @ mocha.js:24008 +next @ mocha.js:23842 +Runner.runTests @ mocha.js:23952 +(anonymous) @ mocha.js:24029 +next @ mocha.js:23572 +cbHookRun @ mocha.js:23641 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22194 +(anonymous) @ testapp_module.js:45 +(anonymous) @ testapp_manager.js:160 +xhr.onreadystatechange @ testapp_manager.js:83 +Show 20 more frames +Show less +root_hooks.js:27 END TEST: browser/modular attempting to initialize with just an API key BaseRest throws an error +root_hooks.js:31 START TEST: browser/modular attempting to initialize with just an API key _BaseRealtime throws an error +logger.ts:56 15:49:52.217 Ably: BaseRealtime(): BaseRealtime 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’s `key` property.) +errorLogger @ logger.ts:56 +(anonymous) @ logger.ts:29 +logAction @ logger.ts:122 +logActionNoStrip @ logger.ts:117 +_Logger.logAction @ logger.ts:110 +objectifyOptions @ defaults.ts:221 +_BaseRealtime @ baserealtime.ts:36 +(anonymous) @ modular.test.js:58 +assertThrows @ VM6 chai.js:3044 +methodWrapper @ VM6 chai.js:7910 +(anonymous) @ modular.test.js:58 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +Runner.runSuite @ mocha.js:24024 +next @ mocha.js:24008 +next @ mocha.js:23842 +Runner.runTests @ mocha.js:23952 +(anonymous) @ mocha.js:24029 +next @ mocha.js:23572 +cbHookRun @ mocha.js:23641 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22194 +(anonymous) @ testapp_module.js:45 +(anonymous) @ testapp_manager.js:160 +xhr.onreadystatechange @ testapp_manager.js:83 +Show 20 more frames +Show less +root_hooks.js:27 END TEST: browser/modular attempting to initialize with just an API key _BaseRealtime throws an error +root_hooks.js:31 START TEST: browser/modular attempting to initialize with just a token BaseRest throws an error +logger.ts:56 15:49:52.218 Ably: BaseRest(): BaseRest 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’s `token` property.) +errorLogger @ logger.ts:56 +(anonymous) @ logger.ts:29 +logAction @ logger.ts:122 +logActionNoStrip @ logger.ts:117 +_Logger.logAction @ logger.ts:110 +objectifyOptions @ defaults.ts:213 +BaseRest @ baserest.ts:21 +(anonymous) @ modular.test.js:70 +assertThrows @ VM6 chai.js:3044 +methodWrapper @ VM6 chai.js:7910 +(anonymous) @ modular.test.js:70 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +Runner.runSuite @ mocha.js:24024 +next @ mocha.js:24008 +next @ mocha.js:23842 +Runner.runTests @ mocha.js:23952 +(anonymous) @ mocha.js:24029 +next @ mocha.js:23572 +cbHookRun @ mocha.js:23641 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22194 +(anonymous) @ testapp_module.js:45 +(anonymous) @ testapp_manager.js:160 +xhr.onreadystatechange @ testapp_manager.js:83 +Show 20 more frames +Show less +root_hooks.js:27 END TEST: browser/modular attempting to initialize with just a token BaseRest throws an error +root_hooks.js:31 START TEST: browser/modular attempting to initialize with just a token _BaseRealtime throws an error +logger.ts:56 15:49:52.219 Ably: BaseRealtime(): BaseRealtime 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’s `token` property.) +errorLogger @ logger.ts:56 +(anonymous) @ logger.ts:29 +logAction @ logger.ts:122 +logActionNoStrip @ logger.ts:117 +_Logger.logAction @ logger.ts:110 +objectifyOptions @ defaults.ts:213 +_BaseRealtime @ baserealtime.ts:36 +(anonymous) @ modular.test.js:70 +assertThrows @ VM6 chai.js:3044 +methodWrapper @ VM6 chai.js:7910 +(anonymous) @ modular.test.js:70 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +Runner.runSuite @ mocha.js:24024 +next @ mocha.js:24008 +next @ mocha.js:23842 +Runner.runTests @ mocha.js:23952 +(anonymous) @ mocha.js:24029 +next @ mocha.js:23572 +cbHookRun @ mocha.js:23641 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22194 +(anonymous) @ testapp_module.js:45 +(anonymous) @ testapp_manager.js:160 +xhr.onreadystatechange @ testapp_manager.js:83 +Show 20 more frames +Show less +root_hooks.js:27 END TEST: browser/modular attempting to initialize with just a token _BaseRealtime throws an error +root_hooks.js:31 START TEST: browser/modular without any plugins BaseRest throws an error due to the absence of an HTTP plugin +root_hooks.js:27 END TEST: browser/modular without any plugins BaseRest throws an error due to the absence of an HTTP plugin +root_hooks.js:31 START TEST: browser/modular without any plugins _BaseRealtime throws an error due to the absence of an HTTP plugin +root_hooks.js:27 END TEST: browser/modular without any plugins _BaseRealtime throws an error due to the absence of an HTTP plugin +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to use push admin functionality +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to use push admin functionality +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `time()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `time()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `stats()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `stats()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `request(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `request(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPublish(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPublish(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPresence(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPresence(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.revokeTokens(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.revokeTokens(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `history()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `history()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `presence.history()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `presence.history()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `status()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `status()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to use push admin functionality +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"263447be-26b9-49df-87d8-ad1ec5153daf","method":"transformInterceptedMessage","params":{"id":"ae2ef2ba-d4a1-43ca-a199-4125ca389f4e","connectionID":"a7e3cf0d-fd90-47f7-bb03-84f1819789c2","type":"text","data":"{\"action\":4,\"connectionId\":\"RujowVfjAO\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!RujowVfjAOAVeUFl4z-PY8-1f96\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '263447be-26b9-49df-87d8-ad1ec5153daf', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'RujowVfjAO', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message ae2ef2ba-d4a1-43ca-a199-4125ca389f4e unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message ae2ef2ba-d4a1-43ca-a199-4125ca389f4e {action: 4, connectionId: 'RujowVfjAO', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '263447be-26b9-49df-87d8-ad1ec5153daf', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to use push admin functionality +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `time()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `time()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `stats()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `stats()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `request(...)` +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"31d8e0f2-14eb-40d4-ae44-fc2bbcaf0901","method":"transformInterceptedMessage","params":{"id":"ac63f816-5d7a-419b-87b9-10c62d86030d","connectionID":"47b329fe-1eaf-42c3-9b7e-b25c1b748294","type":"text","data":"{\"action\":4,\"connectionId\":\"a-j3bskmO-\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!a-j3bskmO-Aayeq-NWdaQ6-15f1\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '31d8e0f2-14eb-40d4-ae44-fc2bbcaf0901', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'a-j3bskmO-', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message ac63f816-5d7a-419b-87b9-10c62d86030d unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message ac63f816-5d7a-419b-87b9-10c62d86030d {action: 4, connectionId: 'a-j3bskmO-', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '31d8e0f2-14eb-40d4-ae44-fc2bbcaf0901', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `request(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPublish(...)` +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"b837a285-8ef5-4edc-978b-856c5cd1b448","method":"transformInterceptedMessage","params":{"id":"6a5c1e3b-b53a-4dd2-9d7c-03e72dd55e0c","connectionID":"c0dac806-fc46-4d96-bc60-73a87bfb3b7e","type":"text","data":"{\"action\":4,\"connectionId\":\"uqONgC52Z5\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!uqONgC52Z5AbYR6Gn4uLml-1590\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'b837a285-8ef5-4edc-978b-856c5cd1b448', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'uqONgC52Z5', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 6a5c1e3b-b53a-4dd2-9d7c-03e72dd55e0c unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 6a5c1e3b-b53a-4dd2-9d7c-03e72dd55e0c {action: 4, connectionId: 'uqONgC52Z5', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'b837a285-8ef5-4edc-978b-856c5cd1b448', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPublish(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPresence(...)` +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"ea3f8726-0127-4d84-8d2d-458440134605","method":"transformInterceptedMessage","params":{"id":"913b9b73-006a-4a5f-9300-5792bea68d47","connectionID":"3eb07829-659a-4cf9-a288-823a5ae57625","type":"text","data":"{\"action\":4,\"connectionId\":\"X0AwhuZDP_\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!X0AwhuZDP_AWOd0uCH6hNQ-1f9b\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'ea3f8726-0127-4d84-8d2d-458440134605', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'X0AwhuZDP_', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 913b9b73-006a-4a5f-9300-5792bea68d47 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 913b9b73-006a-4a5f-9300-5792bea68d47 {action: 4, connectionId: 'X0AwhuZDP_', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'ea3f8726-0127-4d84-8d2d-458440134605', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPresence(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.revokeTokens(...)` +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"df44b588-8d34-4989-99a4-74e868bd0a22","method":"transformInterceptedMessage","params":{"id":"d5a35634-416e-471b-8d69-824d46a7b600","connectionID":"08f42aac-56b6-42c6-8e1b-bf33342e871f","type":"text","data":"{\"action\":4,\"connectionId\":\"4FfzPI0EZ9\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!4FfzPI0EZ9AXT3d_8iCbTB-15f5\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'df44b588-8d34-4989-99a4-74e868bd0a22', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: '4FfzPI0EZ9', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d5a35634-416e-471b-8d69-824d46a7b600 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d5a35634-416e-471b-8d69-824d46a7b600 {action: 4, connectionId: '4FfzPI0EZ9', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'df44b588-8d34-4989-99a4-74e868bd0a22', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.revokeTokens(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `history()` +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"0b96b4f9-a5f9-4467-95bd-8ee3278200c1","method":"transformInterceptedMessage","params":{"id":"53f58c0a-f02e-4468-a0b5-a8cd72c08726","connectionID":"02704e03-3245-44f3-afcf-2ad94460f3d2","type":"text","data":"{\"action\":4,\"connectionId\":\"J-LZHKN1wK\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!J-LZHKN1wKAdoe2BehlA7A-1591\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '0b96b4f9-a5f9-4467-95bd-8ee3278200c1', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'J-LZHKN1wK', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 53f58c0a-f02e-4468-a0b5-a8cd72c08726 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 53f58c0a-f02e-4468-a0b5-a8cd72c08726 {action: 4, connectionId: 'J-LZHKN1wK', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '0b96b4f9-a5f9-4467-95bd-8ee3278200c1', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `history()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `presence.history()` +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"60182e44-48da-46b6-a75a-e27443416b74","method":"transformInterceptedMessage","params":{"id":"179151a0-ca07-4418-bf84-927ca051490c","connectionID":"846879f8-2ec9-4941-af4c-3294549be371","type":"text","data":"{\"action\":4,\"connectionId\":\"04EugY8mal\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!04EugY8malAcPNEz7aDzSB-1592\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '60182e44-48da-46b6-a75a-e27443416b74', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: '04EugY8mal', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 179151a0-ca07-4418-bf84-927ca051490c unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 179151a0-ca07-4418-bf84-927ca051490c {action: 4, connectionId: '04EugY8mal', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '60182e44-48da-46b6-a75a-e27443416b74', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `presence.history()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `status()` +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"e99e0026-d85d-4a8d-a7eb-c537922d6aed","method":"transformInterceptedMessage","params":{"id":"6a740a0f-e391-424d-a864-a2ad0e72e2c7","connectionID":"d60a874a-2e2e-4926-9600-51308d2dc26c","type":"text","data":"{\"action\":4,\"connectionId\":\"cRA-aiAC9P\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!cRA-aiAC9PARlx8VrBEq5h-206a\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'e99e0026-d85d-4a8d-a7eb-c537922d6aed', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'cRA-aiAC9P', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 6a740a0f-e391-424d-a864-a2ad0e72e2c7 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 6a740a0f-e391-424d-a864-a2ad0e72e2c7 {action: 4, connectionId: 'cRA-aiAC9P', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'e99e0026-d85d-4a8d-a7eb-c537922d6aed', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `status()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest still allows publishing and subscribing +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"88921f06-3637-4035-8287-447ba1612991","method":"transformInterceptedMessage","params":{"id":"484f18f8-0290-4f47-b58c-75d1e4471768","connectionID":"e76ea74c-8258-464d-9298-8bb0bc140e3e","type":"text","data":"{\"action\":4,\"connectionId\":\"tcM0COXxS2\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!tcM0COXxS2ATFCjya5TASW-a28\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '88921f06-3637-4035-8287-447ba1612991', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'tcM0COXxS2', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 484f18f8-0290-4f47-b58c-75d1e4471768 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 484f18f8-0290-4f47-b58c-75d1e4471768 {action: 4, connectionId: 'tcM0COXxS2', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '88921f06-3637-4035-8287-447ba1612991', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"f0ef743a-77d8-4a1c-b55a-943315685f0c","method":"transformInterceptedMessage","params":{"id":"cd9dc717-9dac-459a-a54f-29251a18ea12","connectionID":"95bf5d8d-aa3b-40e2-bb02-62e39508132c","type":"text","data":"{\"action\":4,\"connectionId\":\"nlvVURFJBT\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!nlvVURFJBTAZBSzXHCH4dS-15f9\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'f0ef743a-77d8-4a1c-b55a-943315685f0c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'nlvVURFJBT', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message cd9dc717-9dac-459a-a54f-29251a18ea12 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message cd9dc717-9dac-459a-a54f-29251a18ea12 {action: 4, connectionId: 'nlvVURFJBT', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'f0ef743a-77d8-4a1c-b55a-943315685f0c', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"b80f110d-b90f-45c2-8ced-e201730381a1","method":"transformInterceptedMessage","params":{"id":"8c964817-1cb1-4824-ba4c-2706d65e01f0","connectionID":"5c3decea-dbac-4b72-bd54-e1d9275581d7","type":"text","data":"{\"action\":4,\"connectionId\":\"Bbn9OCYGgL\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!Bbn9OCYGgLATA5w3JzhiX1-a2a\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'b80f110d-b90f-45c2-8ced-e201730381a1', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'Bbn9OCYGgL', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 8c964817-1cb1-4824-ba4c-2706d65e01f0 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 8c964817-1cb1-4824-ba4c-2706d65e01f0 {action: 4, connectionId: 'Bbn9OCYGgL', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'b80f110d-b90f-45c2-8ced-e201730381a1', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"79b01a34-17e5-4e01-bc09-17dfe0e6e739","method":"transformInterceptedMessage","params":{"id":"df94853d-5579-430e-99d6-1de202641330","connectionID":"44a352d6-e1fa-456b-8aec-3ad314a1e518","type":"text","data":"{\"action\":4,\"connectionId\":\"na8WpnUdf7\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!na8WpnUdf7AU2Eu__sdty7-a2b\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '79b01a34-17e5-4e01-bc09-17dfe0e6e739', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'na8WpnUdf7', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message df94853d-5579-430e-99d6-1de202641330 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message df94853d-5579-430e-99d6-1de202641330 {action: 4, connectionId: 'na8WpnUdf7', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '79b01a34-17e5-4e01-bc09-17dfe0e6e739', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"9116ae9e-42b2-4c16-a301-60b7df2e0315","method":"transformInterceptedMessage","params":{"id":"00906601-aa8c-4140-8505-52ad14b87786","connectionID":"44a352d6-e1fa-456b-8aec-3ad314a1e518","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '9116ae9e-42b2-4c16-a301-60b7df2e0315', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 10, channel: 'channel'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 00906601-aa8c-4140-8505-52ad14b87786 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 00906601-aa8c-4140-8505-52ad14b87786 {action: 10, channel: 'channel'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '9116ae9e-42b2-4c16-a301-60b7df2e0315', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"ef3147ad-0534-4f4c-8ae3-f618bfaf958c","method":"transformInterceptedMessage","params":{"id":"336d0da1-f888-4b3a-8bc3-4f71289570f9","connectionID":"44a352d6-e1fa-456b-8aec-3ad314a1e518","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971799028-0\"}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'ef3147ad-0534-4f4c-8ae3-f618bfaf958c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971799028-0'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 336d0da1-f888-4b3a-8bc3-4f71289570f9 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 336d0da1-f888-4b3a-8bc3-4f71289570f9 {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971799028-0'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'ef3147ad-0534-4f4c-8ae3-f618bfaf958c', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"aec7c0fa-c336-4ed6-89aa-1ff922a5a84c","method":"transformInterceptedMessage","params":{"id":"0c18d71e-ab02-4cdf-8617-ca3d57b1fe00","connectionID":"44a352d6-e1fa-456b-8aec-3ad314a1e518","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"encoding\":\"json\",\"data\":\"{\\\"foo\\\":\\\"bar\\\"}\"}],\"msgSerial\":0}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'aec7c0fa-c336-4ed6-89aa-1ff922a5a84c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, channel: 'channel', messages: Array(1), msgSerial: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 0c18d71e-ab02-4cdf-8617-ca3d57b1fe00 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 0c18d71e-ab02-4cdf-8617-ca3d57b1fe00 {action: 15, channel: 'channel', messages: Array(1), msgSerial: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'aec7c0fa-c336-4ed6-89aa-1ff922a5a84c', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"360b73ca-a0b9-4da2-934b-b77bbc0f95f0","method":"transformInterceptedMessage","params":{"id":"259a91be-6fc6-460b-84d4-cc84dfae7443","connectionID":"44a352d6-e1fa-456b-8aec-3ad314a1e518","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '360b73ca-a0b9-4da2-934b-b77bbc0f95f0', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 1, count: 1, msgSerial: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 259a91be-6fc6-460b-84d4-cc84dfae7443 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 259a91be-6fc6-460b-84d4-cc84dfae7443 {action: 1, count: 1, msgSerial: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '360b73ca-a0b9-4da2-934b-b77bbc0f95f0', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"cee309fd-7c4e-4554-a130-cc916cbea9d5","method":"transformInterceptedMessage","params":{"id":"26ec3008-b9a8-4a5a-84dd-3ab04a804ab4","connectionID":"44a352d6-e1fa-456b-8aec-3ad314a1e518","type":"text","data":"{\"action\":15,\"id\":\"na8WpnUdf7:0\",\"connectionId\":\"na8WpnUdf7\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971800469-0\",\"timestamp\":1715971800469,\"messages\":[{\"encoding\":\"json\",\"data\":\"{\\\"foo\\\":\\\"bar\\\"}\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'cee309fd-7c4e-4554-a130-cc916cbea9d5', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'na8WpnUdf7:0', connectionId: 'na8WpnUdf7', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971800469-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 26ec3008-b9a8-4a5a-84dd-3ab04a804ab4 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 26ec3008-b9a8-4a5a-84dd-3ab04a804ab4 {action: 15, id: 'na8WpnUdf7:0', connectionId: 'na8WpnUdf7', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971800469-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'cee309fd-7c4e-4554-a130-cc916cbea9d5', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest still allows publishing and subscribing +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest allows `auth.createTokenRequest()` without `queryTime` option enabled +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest allows `auth.createTokenRequest()` without `queryTime` option enabled +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to use push admin functionality +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to use push admin functionality +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `time()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `time()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.createTokenRequest()` with `queryTime` option enabled +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.createTokenRequest()` with `queryTime` option enabled +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `stats()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `stats()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `request(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `request(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPublish(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPublish(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPresence(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPresence(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.revokeTokens(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.revokeTokens(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `history()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `history()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `presence.history()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `presence.history()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `status()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `status()` +root_hooks.js:31 START TEST: browser/modular Crypto standalone functions generateRandomKey +root_hooks.js:27 END TEST: browser/modular Crypto standalone functions generateRandomKey +root_hooks.js:31 START TEST: browser/modular Crypto standalone functions getDefaultCryptoParams +root_hooks.js:27 END TEST: browser/modular Crypto standalone functions getDefaultCryptoParams +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeMessage decodes a message’s data +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeMessage decodes a message’s data +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeMessage throws an error when given channel options with a cipher +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeMessage throws an error when given channel options with a cipher +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeEncryptedMessage decodes a message’s data +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeEncryptedMessage decodes a message’s data +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeEncryptedMessage decrypts a message +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeEncryptedMessage decrypts a message +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeMessages decodes messages’ data +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeMessages decodes messages’ data +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeMessages throws an error when given channel options with a cipher +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeMessages throws an error when given channel options with a cipher +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeEncryptedMessages decodes messages’ data +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeEncryptedMessages decodes messages’ data +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeEncryptedMessages decrypts messages +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeEncryptedMessages decrypts messages +root_hooks.js:31 START TEST: browser/modular Crypto without Crypto BaseRest throws an error when given channel options with a cipher +root_hooks.js:27 END TEST: browser/modular Crypto without Crypto BaseRest throws an error when given channel options with a cipher +root_hooks.js:31 START TEST: browser/modular Crypto without Crypto _BaseRealtime throws an error when given channel options with a cipher +root_hooks.js:27 END TEST: browser/modular Crypto without Crypto _BaseRealtime throws an error when given channel options with a cipher +root_hooks.js:31 START TEST: browser/modular Crypto with Crypto BaseRest is able to publish encrypted messages +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"cdd4c1ac-5ceb-492d-9dd8-67da73b9c6f5","method":"transformInterceptedMessage","params":{"id":"045f9223-2ce1-4924-ae94-66dd1958a9b4","connectionID":"e60a357c-902b-4a67-bc4d-74862eb5e98f","type":"text","data":"{\"action\":4,\"connectionId\":\"nyZ5lRRSmD\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!nyZ5lRRSmDAfoLX5fCCBK--a2e\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'cdd4c1ac-5ceb-492d-9dd8-67da73b9c6f5', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'nyZ5lRRSmD', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 045f9223-2ce1-4924-ae94-66dd1958a9b4 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 045f9223-2ce1-4924-ae94-66dd1958a9b4 {action: 4, connectionId: 'nyZ5lRRSmD', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'cdd4c1ac-5ceb-492d-9dd8-67da73b9c6f5', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"006a4818-dbf8-44b6-a122-3d6d73fdc164","method":"transformInterceptedMessage","params":{"id":"e4592457-6f53-4297-ade5-4e5634dd9348","connectionID":"12399d8e-c4c5-4c7d-bc23-61525fb5161b","type":"text","data":"{\"action\":4,\"connectionId\":\"-tAJLV-ItX\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!-tAJLV-ItXAYegyQuq3Mm5-15fc\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '006a4818-dbf8-44b6-a122-3d6d73fdc164', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: '-tAJLV-ItX', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message e4592457-6f53-4297-ade5-4e5634dd9348 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message e4592457-6f53-4297-ade5-4e5634dd9348 {action: 4, connectionId: '-tAJLV-ItX', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '006a4818-dbf8-44b6-a122-3d6d73fdc164', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"f415b6b6-52ca-4d6d-bce8-570ff4148cf7","method":"transformInterceptedMessage","params":{"id":"2f737450-64b5-4a92-a428-af100840b256","connectionID":"20394a52-4f25-46ad-b04c-e21c6a886f32","type":"text","data":"{\"action\":4,\"connectionId\":\"F91_UVayTR\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!F91_UVayTRAev631Drcm-B-1fa3\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'f415b6b6-52ca-4d6d-bce8-570ff4148cf7', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'F91_UVayTR', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 2f737450-64b5-4a92-a428-af100840b256 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 2f737450-64b5-4a92-a428-af100840b256 {action: 4, connectionId: 'F91_UVayTR', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'f415b6b6-52ca-4d6d-bce8-570ff4148cf7', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"76728541-2fd0-4f66-894c-9b27336027da","method":"transformInterceptedMessage","params":{"id":"25bc824d-1a69-4667-a347-b1bbbde92f61","connectionID":"4faa409a-3a67-46e7-8121-e1204ddfbe3d","type":"text","data":"{\"action\":4,\"connectionId\":\"6fJL_jpYvD\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!6fJL_jpYvDAamLt9qTNNTV-1fa4\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '76728541-2fd0-4f66-894c-9b27336027da', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: '6fJL_jpYvD', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 25bc824d-1a69-4667-a347-b1bbbde92f61 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 25bc824d-1a69-4667-a347-b1bbbde92f61 {action: 4, connectionId: '6fJL_jpYvD', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '76728541-2fd0-4f66-894c-9b27336027da', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"9bf5ffe3-d6fd-47c1-90bd-14ea63ac667a","method":"transformInterceptedMessage","params":{"id":"499b02a5-bd75-4a81-a568-2db1749b6213","connectionID":"f739dff8-f4ed-4e9b-8bd2-0d59030aeaa7","type":"text","data":"{\"action\":4,\"connectionId\":\"KTmH7Pw_rC\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!KTmH7Pw_rCAYqE9OKnAsjZ-1fa5\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '9bf5ffe3-d6fd-47c1-90bd-14ea63ac667a', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'KTmH7Pw_rC', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 499b02a5-bd75-4a81-a568-2db1749b6213 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 499b02a5-bd75-4a81-a568-2db1749b6213 {action: 4, connectionId: 'KTmH7Pw_rC', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '9bf5ffe3-d6fd-47c1-90bd-14ea63ac667a', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"59bfd052-42f2-423e-a977-849b5d208227","method":"transformInterceptedMessage","params":{"id":"a1b72bf1-34a6-4a65-b759-3a9c0adc29a8","connectionID":"f8868462-7cb5-47eb-a911-dbf54c36cc71","type":"text","data":"{\"action\":4,\"connectionId\":\"on6KQ_ZU7s\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!on6KQ_ZU7sAW7RBukzIxoJ-a10\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '59bfd052-42f2-423e-a977-849b5d208227', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'on6KQ_ZU7s', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message a1b72bf1-34a6-4a65-b759-3a9c0adc29a8 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message a1b72bf1-34a6-4a65-b759-3a9c0adc29a8 {action: 4, connectionId: 'on6KQ_ZU7s', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '59bfd052-42f2-423e-a977-849b5d208227', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"66958145-1635-40a6-a1f4-db46cf14b6fc","method":"transformInterceptedMessage","params":{"id":"70a99277-739f-4d3d-8a35-5855a7037455","connectionID":"7934989a-8d9b-483e-8441-7db3515dcc5c","type":"text","data":"{\"action\":4,\"connectionId\":\"taZpr600yf\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!taZpr600yfAXGt1MmePHY_-1596\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '66958145-1635-40a6-a1f4-db46cf14b6fc', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'taZpr600yf', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 70a99277-739f-4d3d-8a35-5855a7037455 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 70a99277-739f-4d3d-8a35-5855a7037455 {action: 4, connectionId: 'taZpr600yf', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '66958145-1635-40a6-a1f4-db46cf14b6fc', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"a9028c97-cff0-4b4b-99bd-77f0449e9c4a","method":"transformInterceptedMessage","params":{"id":"3a8baa84-29d4-4e8b-bd40-61891659581c","connectionID":"632a1377-f53b-464d-ba67-19d70b0d6093","type":"text","data":"{\"action\":4,\"connectionId\":\"LELrr0rpPm\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!LELrr0rpPmAWTTwyXldDSa-15fe\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'a9028c97-cff0-4b4b-99bd-77f0449e9c4a', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'LELrr0rpPm', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 3a8baa84-29d4-4e8b-bd40-61891659581c unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 3a8baa84-29d4-4e8b-bd40-61891659581c {action: 4, connectionId: 'LELrr0rpPm', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'a9028c97-cff0-4b4b-99bd-77f0449e9c4a', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"9ae18e72-3020-48b0-a6a7-e0fed79e9c6f","method":"transformInterceptedMessage","params":{"id":"30d115dd-8e1f-4285-a208-7c8e81e2dba2","connectionID":"eb0e0968-4015-4127-b6c9-7431531921f9","type":"text","data":"{\"action\":4,\"connectionId\":\"qTQmVVhI46\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!qTQmVVhI46ASXt2DTH3ON1-1597\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '9ae18e72-3020-48b0-a6a7-e0fed79e9c6f', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'qTQmVVhI46', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 30d115dd-8e1f-4285-a208-7c8e81e2dba2 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 30d115dd-8e1f-4285-a208-7c8e81e2dba2 {action: 4, connectionId: 'qTQmVVhI46', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '9ae18e72-3020-48b0-a6a7-e0fed79e9c6f', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"d1ad0537-b46c-4974-ba14-e8fa82f91beb","method":"transformInterceptedMessage","params":{"id":"af98568a-334d-4849-bef7-18edc8227eeb","connectionID":"58bdb787-d9c7-47a5-a3a4-cc4301a9fffe","type":"text","data":"{\"action\":4,\"connectionId\":\"MyRoR6qZx5\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!MyRoR6qZx5Aa13Ts9QfU8D-a11\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'd1ad0537-b46c-4974-ba14-e8fa82f91beb', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'MyRoR6qZx5', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message af98568a-334d-4849-bef7-18edc8227eeb unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message af98568a-334d-4849-bef7-18edc8227eeb {action: 4, connectionId: 'MyRoR6qZx5', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'd1ad0537-b46c-4974-ba14-e8fa82f91beb', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"828fa89d-cd71-4bfa-883a-e41118fdaa47","method":"transformInterceptedMessage","params":{"id":"ce4fb62c-50d1-4f19-b764-d71dd7ff3c0d","connectionID":"01175dcc-0cb9-4aa6-ac95-6cf0e0bf6dd6","type":"text","data":"{\"action\":4,\"connectionId\":\"ntOkZmpWDG\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!ntOkZmpWDGAa29WdAOs83g-1598\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '828fa89d-cd71-4bfa-883a-e41118fdaa47', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'ntOkZmpWDG', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message ce4fb62c-50d1-4f19-b764-d71dd7ff3c0d unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message ce4fb62c-50d1-4f19-b764-d71dd7ff3c0d {action: 4, connectionId: 'ntOkZmpWDG', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '828fa89d-cd71-4bfa-883a-e41118fdaa47', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"3d686cb9-283a-43ff-a1fe-be811f87b7ea","method":"transformInterceptedMessage","params":{"id":"25305cf5-e5af-4770-be77-92ec95e93337","connectionID":"8a42de28-4b1a-4acd-9425-04735cb283fd","type":"text","data":"{\"action\":4,\"connectionId\":\"lumqt1wFfH\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!lumqt1wFfHAXfCneTn3z9m-2072\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '3d686cb9-283a-43ff-a1fe-be811f87b7ea', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'lumqt1wFfH', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 25305cf5-e5af-4770-be77-92ec95e93337 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 25305cf5-e5af-4770-be77-92ec95e93337 {action: 4, connectionId: 'lumqt1wFfH', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '3d686cb9-283a-43ff-a1fe-be811f87b7ea', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"40cd8d9b-9b4a-467b-9b0f-3b5650cf6c3a","method":"transformInterceptedMessage","params":{"id":"603f8762-f05b-46f1-b715-609d9d670d32","connectionID":"73ca7259-d3b4-43a6-a814-fbbd0cd3e202","type":"text","data":"{\"action\":4,\"connectionId\":\"yb6viQkFJL\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!yb6viQkFJLAQylkLTNZdLE-1599\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '40cd8d9b-9b4a-467b-9b0f-3b5650cf6c3a', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'yb6viQkFJL', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 603f8762-f05b-46f1-b715-609d9d670d32 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 603f8762-f05b-46f1-b715-609d9d670d32 {action: 4, connectionId: 'yb6viQkFJL', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '40cd8d9b-9b4a-467b-9b0f-3b5650cf6c3a', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"108693be-5922-41ba-a48c-76e0db128712","method":"transformInterceptedMessage","params":{"id":"d0575b89-7192-43b4-b4bf-a84c17e00288","connectionID":"b1daf8d3-bae7-4324-b6c3-4a3569dfbf4e","type":"text","data":"{\"action\":4,\"connectionId\":\"qRzF5DKhjZ\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!qRzF5DKhjZARpLSuEWX-YR-2073\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '108693be-5922-41ba-a48c-76e0db128712', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'qRzF5DKhjZ', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d0575b89-7192-43b4-b4bf-a84c17e00288 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d0575b89-7192-43b4-b4bf-a84c17e00288 {action: 4, connectionId: 'qRzF5DKhjZ', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '108693be-5922-41ba-a48c-76e0db128712', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"f38a98cf-677e-4355-bf0e-017f8b062dee","method":"transformInterceptedMessage","params":{"id":"40d18267-7fe8-42d3-9cea-104acd7c8fea","connectionID":"b1daf8d3-bae7-4324-b6c3-4a3569dfbf4e","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'f38a98cf-677e-4355-bf0e-017f8b062dee', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 10, channel: 'channel'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 40d18267-7fe8-42d3-9cea-104acd7c8fea unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 40d18267-7fe8-42d3-9cea-104acd7c8fea {action: 10, channel: 'channel'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'f38a98cf-677e-4355-bf0e-017f8b062dee', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"14872259-6942-42be-8f85-0bea4e47afd8","method":"transformInterceptedMessage","params":{"id":"8e558df3-0f18-44d5-b802-5e364ab2223e","connectionID":"b1daf8d3-bae7-4324-b6c3-4a3569dfbf4e","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971800469-0\"}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '14872259-6942-42be-8f85-0bea4e47afd8', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971800469-0'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 8e558df3-0f18-44d5-b802-5e364ab2223e unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 8e558df3-0f18-44d5-b802-5e364ab2223e {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971800469-0'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '14872259-6942-42be-8f85-0bea4e47afd8', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"300dc028-a320-4e80-9233-7823a8219fd8","method":"transformInterceptedMessage","params":{"id":"946ff490-dfa3-4b1c-963e-fa60fb796ec6","connectionID":"44a352d6-e1fa-456b-8aec-3ad314a1e518","type":"text","data":"{\"action\":15,\"id\":\"saaHzCX0WShD\",\"connectionId\":\"\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971801482-0\",\"timestamp\":1715971801482,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"Q7JWKKoZh2CR8btrIsKRc3OKPXptZau5LZUorPK9j/o=\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '300dc028-a320-4e80-9233-7823a8219fd8', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'saaHzCX0WShD', connectionId: '', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971801482-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 946ff490-dfa3-4b1c-963e-fa60fb796ec6 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 946ff490-dfa3-4b1c-963e-fa60fb796ec6 {action: 15, id: 'saaHzCX0WShD', connectionId: '', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971801482-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '300dc028-a320-4e80-9233-7823a8219fd8', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"c80784c7-0ba4-4966-9b6f-7e5e361d0f50","method":"transformInterceptedMessage","params":{"id":"9f4b0644-b31f-433d-b4bf-ccca56423037","connectionID":"b1daf8d3-bae7-4324-b6c3-4a3569dfbf4e","type":"text","data":"{\"action\":15,\"id\":\"saaHzCX0WShD\",\"connectionId\":\"\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971801482-0\",\"timestamp\":1715971801482,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"Q7JWKKoZh2CR8btrIsKRc3OKPXptZau5LZUorPK9j/o=\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'c80784c7-0ba4-4966-9b6f-7e5e361d0f50', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'saaHzCX0WShD', connectionId: '', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971801482-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 9f4b0644-b31f-433d-b4bf-ccca56423037 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 9f4b0644-b31f-433d-b4bf-ccca56423037 {action: 15, id: 'saaHzCX0WShD', connectionId: '', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971801482-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'c80784c7-0ba4-4966-9b6f-7e5e361d0f50', result: {…}} +root_hooks.js:27 END TEST: browser/modular Crypto with Crypto BaseRest is able to publish encrypted messages +root_hooks.js:31 START TEST: browser/modular Crypto with Crypto _BaseRealtime is able to publish encrypted messages +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"e5c12fbf-1b0e-4b9b-bd33-9980460cb363","method":"transformInterceptedMessage","params":{"id":"bcc13dd7-734e-4d49-bf84-8afc1b8b8c1b","connectionID":"f4cec765-91f3-4287-b8cd-85468650dbc2","type":"text","data":"{\"action\":4,\"connectionId\":\"cmX0jiM1Sk\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!cmX0jiM1SkAbJQw1uAcn3t-2076\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'e5c12fbf-1b0e-4b9b-bd33-9980460cb363', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'cmX0jiM1Sk', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message bcc13dd7-734e-4d49-bf84-8afc1b8b8c1b unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message bcc13dd7-734e-4d49-bf84-8afc1b8b8c1b {action: 4, connectionId: 'cmX0jiM1Sk', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'e5c12fbf-1b0e-4b9b-bd33-9980460cb363', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"3ca8f0c2-68d1-44c8-9943-66fb44807cb6","method":"transformInterceptedMessage","params":{"id":"91ffe854-0250-43b2-a2c0-8989565b61da","connectionID":"f4cec765-91f3-4287-b8cd-85468650dbc2","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '3ca8f0c2-68d1-44c8-9943-66fb44807cb6', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 10, channel: 'channel'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 91ffe854-0250-43b2-a2c0-8989565b61da unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 91ffe854-0250-43b2-a2c0-8989565b61da {action: 10, channel: 'channel'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '3ca8f0c2-68d1-44c8-9943-66fb44807cb6', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"9dfa6849-1223-45a5-9aa4-b4742262ee67","method":"transformInterceptedMessage","params":{"id":"56ab0395-b17c-4e7e-a53b-1122f5d2db24","connectionID":"f4cec765-91f3-4287-b8cd-85468650dbc2","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971801482-0\"}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '9dfa6849-1223-45a5-9aa4-b4742262ee67', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971801482-0'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 56ab0395-b17c-4e7e-a53b-1122f5d2db24 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 56ab0395-b17c-4e7e-a53b-1122f5d2db24 {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971801482-0'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '9dfa6849-1223-45a5-9aa4-b4742262ee67', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"7d42b4e3-3e0e-48fe-86ce-42c5abbe954b","method":"transformInterceptedMessage","params":{"id":"9b06933f-71ce-45c0-9627-3b8cae6baccd","connectionID":"b7baf942-378f-40fd-ade0-2c0b16738425","type":"text","data":"{\"action\":4,\"connectionId\":\"vo12g51m_k\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!vo12g51m_kAdT_Jet_shh8-a38\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '7d42b4e3-3e0e-48fe-86ce-42c5abbe954b', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'vo12g51m_k', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 9b06933f-71ce-45c0-9627-3b8cae6baccd unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 9b06933f-71ce-45c0-9627-3b8cae6baccd {action: 4, connectionId: 'vo12g51m_k', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '7d42b4e3-3e0e-48fe-86ce-42c5abbe954b', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"3f2fca76-7117-4e67-b83c-c6491dd830fb","method":"transformInterceptedMessage","params":{"id":"9840b286-80f8-4a86-a0fb-d306ea26a353","connectionID":"b7baf942-378f-40fd-ade0-2c0b16738425","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"name\":\"message\",\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"fgSubIv8ok6C6OXTQoR2uPsJGoYdv5v8C8JnxGo52xk=\"}],\"msgSerial\":0}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '3f2fca76-7117-4e67-b83c-c6491dd830fb', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, channel: 'channel', messages: Array(1), msgSerial: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 9840b286-80f8-4a86-a0fb-d306ea26a353 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 9840b286-80f8-4a86-a0fb-d306ea26a353 {action: 15, channel: 'channel', messages: Array(1), msgSerial: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '3f2fca76-7117-4e67-b83c-c6491dd830fb', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"712d1a17-521a-4c4f-aaaf-84bba98aefb0","method":"transformInterceptedMessage","params":{"id":"bedfc1b6-a386-470c-811c-ce8ed999f0fd","connectionID":"f4cec765-91f3-4287-b8cd-85468650dbc2","type":"text","data":"{\"action\":15,\"id\":\"vo12g51m_k:0\",\"connectionId\":\"vo12g51m_k\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971802910-0\",\"timestamp\":1715971802910,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"fgSubIv8ok6C6OXTQoR2uPsJGoYdv5v8C8JnxGo52xk=\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '712d1a17-521a-4c4f-aaaf-84bba98aefb0', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'vo12g51m_k:0', connectionId: 'vo12g51m_k', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971802910-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message bedfc1b6-a386-470c-811c-ce8ed999f0fd unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message bedfc1b6-a386-470c-811c-ce8ed999f0fd {action: 15, id: 'vo12g51m_k:0', connectionId: 'vo12g51m_k', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971802910-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '712d1a17-521a-4c4f-aaaf-84bba98aefb0', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"5886185a-d7e5-4043-96bd-b3c7c1798d7d","method":"transformInterceptedMessage","params":{"id":"265f3654-d026-4023-bfe9-304c584a8c7d","connectionID":"b1daf8d3-bae7-4324-b6c3-4a3569dfbf4e","type":"text","data":"{\"action\":15,\"id\":\"vo12g51m_k:0\",\"connectionId\":\"vo12g51m_k\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971802910-0\",\"timestamp\":1715971802910,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"fgSubIv8ok6C6OXTQoR2uPsJGoYdv5v8C8JnxGo52xk=\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '5886185a-d7e5-4043-96bd-b3c7c1798d7d', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'vo12g51m_k:0', connectionId: 'vo12g51m_k', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971802910-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 265f3654-d026-4023-bfe9-304c584a8c7d unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 265f3654-d026-4023-bfe9-304c584a8c7d {action: 15, id: 'vo12g51m_k:0', connectionId: 'vo12g51m_k', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971802910-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '5886185a-d7e5-4043-96bd-b3c7c1798d7d', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"ec0e37d2-6309-43c3-adb4-a2312d829f62","method":"transformInterceptedMessage","params":{"id":"289534cf-3fc3-4852-8993-7ad243b2b210","connectionID":"b7baf942-378f-40fd-ade0-2c0b16738425","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'ec0e37d2-6309-43c3-adb4-a2312d829f62', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 1, count: 1, msgSerial: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 289534cf-3fc3-4852-8993-7ad243b2b210 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 289534cf-3fc3-4852-8993-7ad243b2b210 {action: 1, count: 1, msgSerial: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'ec0e37d2-6309-43c3-adb4-a2312d829f62', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"8fb13e96-86d5-4d95-a512-f8b35822a6b0","method":"transformInterceptedMessage","params":{"id":"a4c66550-b756-44da-8d5a-7ade4397b5f8","connectionID":"44a352d6-e1fa-456b-8aec-3ad314a1e518","type":"text","data":"{\"action\":15,\"id\":\"vo12g51m_k:0\",\"connectionId\":\"vo12g51m_k\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971802910-0\",\"timestamp\":1715971802910,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"fgSubIv8ok6C6OXTQoR2uPsJGoYdv5v8C8JnxGo52xk=\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '8fb13e96-86d5-4d95-a512-f8b35822a6b0', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'vo12g51m_k:0', connectionId: 'vo12g51m_k', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971802910-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message a4c66550-b756-44da-8d5a-7ade4397b5f8 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message a4c66550-b756-44da-8d5a-7ade4397b5f8 {action: 15, id: 'vo12g51m_k:0', connectionId: 'vo12g51m_k', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971802910-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '8fb13e96-86d5-4d95-a512-f8b35822a6b0', result: {…}} +root_hooks.js:27 END TEST: browser/modular Crypto with Crypto _BaseRealtime is able to publish encrypted messages +root_hooks.js:31 START TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRest uses JSON +root_hooks.js:27 END TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRest uses JSON +root_hooks.js:31 START TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRealtime uses JSON +root_hooks.js:27 END TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRealtime uses JSON +root_hooks.js:31 START TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRest uses MessagePack +root_hooks.js:27 END TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRest uses MessagePack +root_hooks.js:31 START TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRealtime uses MessagePack +root_hooks.js:27 END TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRealtime uses MessagePack +root_hooks.js:31 START TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence throws an error when attempting to access the `presence` property +root_hooks.js:27 END TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence throws an error when attempting to access the `presence` property +root_hooks.js:31 START TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence doesn’t break when it receives a PRESENCE ProtocolMessage +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"5ab17cbd-6260-49b1-a56e-ee360940c944","method":"transformInterceptedMessage","params":{"id":"96f12c98-db04-41d8-80b4-e353f68071cd","connectionID":"55ec56af-85fc-4476-94d2-2b7fbf7853a1","type":"text","data":"{\"action\":4,\"connectionId\":\"cNGEYsDd3O\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!cNGEYsDd3OAZpiizTsKQVC-207c\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '5ab17cbd-6260-49b1-a56e-ee360940c944', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'cNGEYsDd3O', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 96f12c98-db04-41d8-80b4-e353f68071cd unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 96f12c98-db04-41d8-80b4-e353f68071cd {action: 4, connectionId: 'cNGEYsDd3O', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '5ab17cbd-6260-49b1-a56e-ee360940c944', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"8a59dfb3-36f8-4c7c-adbe-981408455568","method":"transformInterceptedMessage","params":{"id":"83a64cd1-7f8c-47c4-b581-64764060cec6","connectionID":"e5782787-fa06-4b19-b94a-f3d37306329e","type":"text","data":"{\"action\":4,\"connectionId\":\"XAAEwQIOgF\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!XAAEwQIOgFAcG7cTx6y-M3-1fac\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '8a59dfb3-36f8-4c7c-adbe-981408455568', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'XAAEwQIOgF', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 83a64cd1-7f8c-47c4-b581-64764060cec6 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 83a64cd1-7f8c-47c4-b581-64764060cec6 {action: 4, connectionId: 'XAAEwQIOgF', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '8a59dfb3-36f8-4c7c-adbe-981408455568', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"c9f6c846-9a81-4ad5-88d5-001162272101","method":"transformInterceptedMessage","params":{"id":"9e7273b7-62ea-4927-82bc-164b9139788e","connectionID":"e5782787-fa06-4b19-b94a-f3d37306329e","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'c9f6c846-9a81-4ad5-88d5-001162272101', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 10, channel: 'channel'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 9e7273b7-62ea-4927-82bc-164b9139788e unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 9e7273b7-62ea-4927-82bc-164b9139788e {action: 10, channel: 'channel'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'c9f6c846-9a81-4ad5-88d5-001162272101', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"f7682b7e-a5e0-4593-8684-051b47fced57","method":"transformInterceptedMessage","params":{"id":"bfc7a4f5-5640-4720-8990-5d350550e428","connectionID":"e5782787-fa06-4b19-b94a-f3d37306329e","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971802910-0\"}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'f7682b7e-a5e0-4593-8684-051b47fced57', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971802910-0'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message bfc7a4f5-5640-4720-8990-5d350550e428 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message bfc7a4f5-5640-4720-8990-5d350550e428 {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971802910-0'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'f7682b7e-a5e0-4593-8684-051b47fced57', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"d5ba39e9-3bbb-440e-a809-a1bb9390dbbc","method":"transformInterceptedMessage","params":{"id":"983267cc-9852-42b4-9d4c-49f7c920c7fa","connectionID":"ed01c99f-f693-4c5e-8b67-91f8a9689c71","type":"text","data":"{\"action\":4,\"connectionId\":\"ksjPI01-gi\",\"connectionDetails\":{\"clientId\":\"8477848146825762\",\"connectionKey\":\"e7dNIPVFABc0Ei!ksjPI01-giAXAkdKcHumDQ-a1a\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'd5ba39e9-3bbb-440e-a809-a1bb9390dbbc', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'ksjPI01-gi', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 983267cc-9852-42b4-9d4c-49f7c920c7fa unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 983267cc-9852-42b4-9d4c-49f7c920c7fa {action: 4, connectionId: 'ksjPI01-gi', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'd5ba39e9-3bbb-440e-a809-a1bb9390dbbc', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"a18acfe3-7f75-4d2d-95ec-b7b6937949db","method":"transformInterceptedMessage","params":{"id":"943164af-ddd2-46bf-bf3d-97f96506c361","connectionID":"ed01c99f-f693-4c5e-8b67-91f8a9689c71","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"name\":\"message\",\"data\":\"body\"}],\"msgSerial\":0}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'a18acfe3-7f75-4d2d-95ec-b7b6937949db', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, channel: 'channel', messages: Array(1), msgSerial: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 943164af-ddd2-46bf-bf3d-97f96506c361 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 943164af-ddd2-46bf-bf3d-97f96506c361 {action: 15, channel: 'channel', messages: Array(1), msgSerial: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'a18acfe3-7f75-4d2d-95ec-b7b6937949db', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"0584a291-8a62-4d44-9327-b056b8e3c738","method":"transformInterceptedMessage","params":{"id":"f3b7ca8b-15ef-49e3-8fb1-cb41c5aecd1b","connectionID":"f4cec765-91f3-4287-b8cd-85468650dbc2","type":"text","data":"{\"action\":15,\"id\":\"ksjPI01-gi:0\",\"connectionId\":\"ksjPI01-gi\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971804330-0\",\"timestamp\":1715971804330,\"messages\":[{\"clientId\":\"8477848146825762\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '0584a291-8a62-4d44-9327-b056b8e3c738', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'ksjPI01-gi:0', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804330-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message f3b7ca8b-15ef-49e3-8fb1-cb41c5aecd1b unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message f3b7ca8b-15ef-49e3-8fb1-cb41c5aecd1b {action: 15, id: 'ksjPI01-gi:0', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804330-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '0584a291-8a62-4d44-9327-b056b8e3c738', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"0e103450-8e55-4f17-b781-1eab034dc828","method":"transformInterceptedMessage","params":{"id":"4c7ad8f2-f692-4258-9c5a-63495d7436b8","connectionID":"b1daf8d3-bae7-4324-b6c3-4a3569dfbf4e","type":"text","data":"{\"action\":15,\"id\":\"ksjPI01-gi:0\",\"connectionId\":\"ksjPI01-gi\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971804330-0\",\"timestamp\":1715971804330,\"messages\":[{\"clientId\":\"8477848146825762\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '0e103450-8e55-4f17-b781-1eab034dc828', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'ksjPI01-gi:0', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804330-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 4c7ad8f2-f692-4258-9c5a-63495d7436b8 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 4c7ad8f2-f692-4258-9c5a-63495d7436b8 {action: 15, id: 'ksjPI01-gi:0', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804330-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '0e103450-8e55-4f17-b781-1eab034dc828', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"a762637a-933e-48c6-906a-874b322dac17","method":"transformInterceptedMessage","params":{"id":"ed269596-b7d8-47f4-b8d5-ca562e6da9f1","connectionID":"e5782787-fa06-4b19-b94a-f3d37306329e","type":"text","data":"{\"action\":15,\"id\":\"ksjPI01-gi:0\",\"connectionId\":\"ksjPI01-gi\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971804330-0\",\"timestamp\":1715971804330,\"messages\":[{\"clientId\":\"8477848146825762\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'a762637a-933e-48c6-906a-874b322dac17', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'ksjPI01-gi:0', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804330-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message ed269596-b7d8-47f4-b8d5-ca562e6da9f1 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message ed269596-b7d8-47f4-b8d5-ca562e6da9f1 {action: 15, id: 'ksjPI01-gi:0', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804330-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'a762637a-933e-48c6-906a-874b322dac17', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"74fba336-e278-4966-90cb-1c9ee48d21db","method":"transformInterceptedMessage","params":{"id":"66660c52-7b86-4f44-b062-63ae79d5dde0","connectionID":"ed01c99f-f693-4c5e-8b67-91f8a9689c71","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '74fba336-e278-4966-90cb-1c9ee48d21db', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 1, count: 1, msgSerial: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 66660c52-7b86-4f44-b062-63ae79d5dde0 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 66660c52-7b86-4f44-b062-63ae79d5dde0 {action: 1, count: 1, msgSerial: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '74fba336-e278-4966-90cb-1c9ee48d21db', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"91e5af44-1475-403b-af04-c02b0e8e9764","method":"transformInterceptedMessage","params":{"id":"cb4c4a1d-d1a5-455b-9b39-c6b0f7e34f7f","connectionID":"44a352d6-e1fa-456b-8aec-3ad314a1e518","type":"text","data":"{\"action\":15,\"id\":\"ksjPI01-gi:0\",\"connectionId\":\"ksjPI01-gi\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971804330-0\",\"timestamp\":1715971804330,\"messages\":[{\"clientId\":\"8477848146825762\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '91e5af44-1475-403b-af04-c02b0e8e9764', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'ksjPI01-gi:0', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804330-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message cb4c4a1d-d1a5-455b-9b39-c6b0f7e34f7f unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message cb4c4a1d-d1a5-455b-9b39-c6b0f7e34f7f {action: 15, id: 'ksjPI01-gi:0', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804330-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '91e5af44-1475-403b-af04-c02b0e8e9764', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"9fa8f981-2449-4e0a-b251-0e0095137cca","method":"transformInterceptedMessage","params":{"id":"e53ff759-e3bf-4bff-be50-9a7117aefa48","connectionID":"ed01c99f-f693-4c5e-8b67-91f8a9689c71","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '9fa8f981-2449-4e0a-b251-0e0095137cca', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 10, channel: 'channel'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message e53ff759-e3bf-4bff-be50-9a7117aefa48 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message e53ff759-e3bf-4bff-be50-9a7117aefa48 {action: 10, channel: 'channel'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '9fa8f981-2449-4e0a-b251-0e0095137cca', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"1fbc37d4-67be-4db4-9738-38c56c8931e5","method":"transformInterceptedMessage","params":{"id":"d2efa268-ed62-4137-b9d7-e299e387acc7","connectionID":"ed01c99f-f693-4c5e-8b67-91f8a9689c71","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971804330-0\"}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '1fbc37d4-67be-4db4-9738-38c56c8931e5', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804330-0'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d2efa268-ed62-4137-b9d7-e299e387acc7 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d2efa268-ed62-4137-b9d7-e299e387acc7 {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804330-0'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '1fbc37d4-67be-4db4-9738-38c56c8931e5', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"d81a6983-2a38-4f57-8b5a-58b5c36990c5","method":"transformInterceptedMessage","params":{"id":"e796ba6d-4028-4c57-bea0-aeb5058066e2","connectionID":"ed01c99f-f693-4c5e-8b67-91f8a9689c71","type":"text","data":"{\"action\":14,\"channel\":\"channel\",\"presence\":[{\"action\":2}],\"msgSerial\":1}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'd81a6983-2a38-4f57-8b5a-58b5c36990c5', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 14, channel: 'channel', presence: Array(1), msgSerial: 1} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message e796ba6d-4028-4c57-bea0-aeb5058066e2 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message e796ba6d-4028-4c57-bea0-aeb5058066e2 {action: 14, channel: 'channel', presence: Array(1), msgSerial: 1} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'd81a6983-2a38-4f57-8b5a-58b5c36990c5', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"3b4f4cbe-c37a-4e75-879a-e287e12853ed","method":"transformInterceptedMessage","params":{"id":"ed201602-392c-47cb-aa39-c32276ecf4df","connectionID":"44a352d6-e1fa-456b-8aec-3ad314a1e518","type":"text","data":"{\"action\":14,\"id\":\"ksjPI01-gi:1\",\"connectionId\":\"ksjPI01-gi\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971804585-0\",\"timestamp\":1715971804585,\"presence\":[{\"id\":\"ksjPI01-gi:1:0\",\"clientId\":\"8477848146825762\",\"connectionId\":\"ksjPI01-gi\",\"timestamp\":1715971804585,\"action\":2}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '3b4f4cbe-c37a-4e75-879a-e287e12853ed', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 14, id: 'ksjPI01-gi:1', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804585-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message ed201602-392c-47cb-aa39-c32276ecf4df unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message ed201602-392c-47cb-aa39-c32276ecf4df {action: 14, id: 'ksjPI01-gi:1', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804585-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '3b4f4cbe-c37a-4e75-879a-e287e12853ed', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"082e207f-67e7-4373-8270-ee526a001377","method":"transformInterceptedMessage","params":{"id":"a4b87676-665f-4e23-8c53-82daa06087b2","connectionID":"ed01c99f-f693-4c5e-8b67-91f8a9689c71","type":"text","data":"{\"action\":14,\"id\":\"ksjPI01-gi:1\",\"connectionId\":\"ksjPI01-gi\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971804585-0\",\"timestamp\":1715971804585,\"presence\":[{\"id\":\"ksjPI01-gi:1:0\",\"clientId\":\"8477848146825762\",\"connectionId\":\"ksjPI01-gi\",\"timestamp\":1715971804585,\"action\":2}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '082e207f-67e7-4373-8270-ee526a001377', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 14, id: 'ksjPI01-gi:1', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804585-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message a4b87676-665f-4e23-8c53-82daa06087b2 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message a4b87676-665f-4e23-8c53-82daa06087b2 {action: 14, id: 'ksjPI01-gi:1', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804585-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '082e207f-67e7-4373-8270-ee526a001377', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"4ac1cd99-eb72-40f6-8120-6f17e257e53f","method":"transformInterceptedMessage","params":{"id":"d1ff2efb-4f98-429f-866b-99a4e339d195","connectionID":"e5782787-fa06-4b19-b94a-f3d37306329e","type":"text","data":"{\"action\":14,\"id\":\"ksjPI01-gi:1\",\"connectionId\":\"ksjPI01-gi\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971804585-0\",\"timestamp\":1715971804585,\"presence\":[{\"id\":\"ksjPI01-gi:1:0\",\"clientId\":\"8477848146825762\",\"connectionId\":\"ksjPI01-gi\",\"timestamp\":1715971804585,\"action\":2}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '4ac1cd99-eb72-40f6-8120-6f17e257e53f', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 14, id: 'ksjPI01-gi:1', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804585-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d1ff2efb-4f98-429f-866b-99a4e339d195 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d1ff2efb-4f98-429f-866b-99a4e339d195 {action: 14, id: 'ksjPI01-gi:1', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804585-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '4ac1cd99-eb72-40f6-8120-6f17e257e53f', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"9c34887e-e9aa-48c4-95e7-3ce1c478e5c9","method":"transformInterceptedMessage","params":{"id":"2c2f0080-639c-4c4a-a01f-19239b8486a1","connectionID":"b1daf8d3-bae7-4324-b6c3-4a3569dfbf4e","type":"text","data":"{\"action\":14,\"id\":\"ksjPI01-gi:1\",\"connectionId\":\"ksjPI01-gi\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971804585-0\",\"timestamp\":1715971804585,\"presence\":[{\"id\":\"ksjPI01-gi:1:0\",\"clientId\":\"8477848146825762\",\"connectionId\":\"ksjPI01-gi\",\"timestamp\":1715971804585,\"action\":2}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '9c34887e-e9aa-48c4-95e7-3ce1c478e5c9', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 14, id: 'ksjPI01-gi:1', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804585-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 2c2f0080-639c-4c4a-a01f-19239b8486a1 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 2c2f0080-639c-4c4a-a01f-19239b8486a1 {action: 14, id: 'ksjPI01-gi:1', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804585-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '9c34887e-e9aa-48c4-95e7-3ce1c478e5c9', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"c94acf30-8222-4611-9412-0dda36402b7c","method":"transformInterceptedMessage","params":{"id":"ef61be5a-61bb-4186-a8ae-1fdb21f6c325","connectionID":"f4cec765-91f3-4287-b8cd-85468650dbc2","type":"text","data":"{\"action\":14,\"id\":\"ksjPI01-gi:1\",\"connectionId\":\"ksjPI01-gi\",\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971804585-0\",\"timestamp\":1715971804585,\"presence\":[{\"id\":\"ksjPI01-gi:1:0\",\"clientId\":\"8477848146825762\",\"connectionId\":\"ksjPI01-gi\",\"timestamp\":1715971804585,\"action\":2}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'c94acf30-8222-4611-9412-0dda36402b7c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 14, id: 'ksjPI01-gi:1', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804585-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message ef61be5a-61bb-4186-a8ae-1fdb21f6c325 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message ef61be5a-61bb-4186-a8ae-1fdb21f6c325 {action: 14, id: 'ksjPI01-gi:1', connectionId: 'ksjPI01-gi', channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804585-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'c94acf30-8222-4611-9412-0dda36402b7c', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"687130b7-4fc9-4e33-87a4-5e2645972eed","method":"transformInterceptedMessage","params":{"id":"0fc38a58-3c35-4272-b946-305c37376ae6","connectionID":"ed01c99f-f693-4c5e-8b67-91f8a9689c71","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":1}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '687130b7-4fc9-4e33-87a4-5e2645972eed', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 1, count: 1, msgSerial: 1} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 0fc38a58-3c35-4272-b946-305c37376ae6 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 0fc38a58-3c35-4272-b946-305c37376ae6 {action: 1, count: 1, msgSerial: 1} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '687130b7-4fc9-4e33-87a4-5e2645972eed', result: {…}} +root_hooks.js:27 END TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence doesn’t break when it receives a PRESENCE ProtocolMessage +root_hooks.js:31 START TEST: browser/modular RealtimePresence BaseRealtime with RealtimePresence offers realtime presence functionality +modular.test.js:580 rxChannel: Ably: BaseClient(): initialized with clientOptions {"environment":"sandbox","port":80,"tlsPort":443,"tls":true,"logLevel":4,"plugins":{"RealtimePresence":{}},"key":"_tmp_9XT2Hg._ifo5A:Kp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0"} +modular.test.js:580 rxChannel: Ably: BaseClient(): started; version = 2.0.4 +modular.test.js:580 rxChannel: Ably: Auth(): anonymous, using basic auth +modular.test.js:580 rxChannel: Ably: Realtime(): +modular.test.js:580 rxChannel: Ably: Realtime.ConnectionManager(): started +modular.test.js:580 rxChannel: Ably: Realtime.ConnectionManager(): requested transports = [xhr_polling,web_socket] +modular.test.js:580 rxChannel: Ably: Realtime.ConnectionManager(): available transports = [web_socket] +modular.test.js:580 rxChannel: Ably: Realtime.ConnectionManager(): http hosts = [sandbox-rest.ably.io] +modular.test.js:580 rxChannel: Ably: Realtime.connect(): +modular.test.js:580 rxChannel: Ably: Connection.connect(): +modular.test.js:580 rxChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: initialized +modular.test.js:580 rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:580 rxChannel: Ably: Connection state: connecting +modular.test.js:580 rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined +modular.test.js:580 rxChannel: Ably: RealtimeChannel(): started; name = channel +modular.test.js:592 txChannel: Ably: BaseClient(): initialized with clientOptions {"environment":"sandbox","port":80,"tlsPort":443,"tls":true,"logLevel":4,"clientId":"3978951838081659","plugins":{"RealtimePresence":{}},"key":"_tmp_9XT2Hg._ifo5A:Kp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0"} +modular.test.js:592 txChannel: Ably: BaseClient(): started; version = 2.0.4 +modular.test.js:592 txChannel: Ably: Auth(): anonymous, using basic auth +modular.test.js:592 txChannel: Ably: Realtime(): +modular.test.js:592 txChannel: Ably: Realtime.ConnectionManager(): started +modular.test.js:592 txChannel: Ably: Realtime.ConnectionManager(): requested transports = [xhr_polling,web_socket] +modular.test.js:592 txChannel: Ably: Realtime.ConnectionManager(): available transports = [web_socket] +modular.test.js:592 txChannel: Ably: Realtime.ConnectionManager(): http hosts = [sandbox-rest.ably.io] +modular.test.js:592 txChannel: Ably: Realtime.connect(): +modular.test.js:592 txChannel: Ably: Connection.connect(): +modular.test.js:592 txChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: initialized +modular.test.js:592 txChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:592 txChannel: Ably: Connection state: connecting +modular.test.js:592 txChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined +modular.test.js:592 txChannel: Ably: RealtimeChannel(): started; name = channel +modular.test.js:607 LAWRENCE: begin waiting for presence subscribe +modular.test.js:580 rxChannel: Ably: RealtimeChannel.requestState: name = channel, state = attaching +modular.test.js:580 rxChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = initialized, notifying state attaching +modular.test.js:580 rxChannel: Ably: Channel state for channel "channel": attaching +modular.test.js:580 rxChannel: Ably: RealtimeChannel.checkPendingState: sendEvents is false; state is connecting +modular.test.js:580 rxChannel: Ably: ConnectionManager.startConnect(): starting connection +modular.test.js:580 rxChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting +modular.test.js:580 rxChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] +modular.test.js:580 rxChannel: Ably: ConnectionManager.connectWs(): undefined +modular.test.js:580 rxChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket +modular.test.js:580 rxChannel: Ably: ConnectionManager.tryATransport(): trying web_socket +modular.test.js:580 rxChannel: Ably: WebSocketTransport.connect(): starting +modular.test.js:580 rxChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ +modular.test.js:580 rxChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_9XT2Hg._ifo5A:Kp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0; err: null +modular.test.js:580 rxChannel: Ably: WebSocketTransport.createWebSocket(): uri:wss://sandbox-realtime.ably.io:443/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:592 txChannel: Ably: ConnectionManager.startConnect(): starting connection +modular.test.js:592 txChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting +modular.test.js:592 txChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] +modular.test.js:592 txChannel: Ably: ConnectionManager.connectWs(): undefined +modular.test.js:592 txChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket +modular.test.js:592 txChannel: Ably: ConnectionManager.tryATransport(): trying web_socket +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): starting +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_9XT2Hg._ifo5A:Kp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0; err: null +modular.test.js:592 txChannel: Ably: WebSocketTransport.createWebSocket(): uri:wss://sandbox-realtime.ably.io:443/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&clientId=3978951838081659&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:580 rxChannel: Ably: WebSocketTransport.onWsOpen(): opened WebSocket +modular.test.js:580 rxChannel: Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:580 rxChannel: Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending +modular.test.js:580 rxChannel: Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = clean +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"cc869c96-b783-4578-8367-94e0dd77e6b3","method":"transformInterceptedMessage","params":{"id":"68ac84ed-4c6b-40f4-9735-6cad50cb5887","connectionID":"f373f5b7-b6cc-4e1e-a09d-cafdb059dc9a","type":"text","data":"{\"action\":4,\"connectionId\":\"FafetxJtgz\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!FafetxJtgzAe3TvDj75fT6-1faf\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'cc869c96-b783-4578-8367-94e0dd77e6b3', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'FafetxJtgz', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 68ac84ed-4c6b-40f4-9735-6cad50cb5887 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 68ac84ed-4c6b-40f4-9735-6cad50cb5887 {action: 4, connectionId: 'FafetxJtgz', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'cc869c96-b783-4578-8367-94e0dd77e6b3', result: {…}} +modular.test.js:580 rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 354; type = string +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=CONNECTED; connectionId=FafetxJtgz]; connectionId = undefined +modular.test.js:580 rxChannel: Ably: ConnectionManager.activateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:580 rxChannel: Ably: ConnectionManager.activateTransport(): connectionId = FafetxJtgz +modular.test.js:580 rxChannel: Ably: ConnectionManager.activateTransport(): connectionDetails = {"clientId":"*","connectionKey":"e7deKLRSQBc0Ap!FafetxJtgzAe3TvDj75fT6-1faf","maxMessageSize":16384,"maxInboundRate":250,"maxOutboundRate":100,"maxFrameSize":262144,"serverId":"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap","connectionStateTtl":120000,"maxIdleInterval":15000} +modular.test.js:580 rxChannel: Ably: ConnectionManager.activateTransport(): current state = connecting +modular.test.js:580 rxChannel: Ably: ConnectionManager.setConnection(): New connectionId; reattaching any attached channels +modular.test.js:580 rxChannel: Ably: ConnectionManager.notifyState(): new state: connected +modular.test.js:580 rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:580 rxChannel: Ably: Connection state: connected +modular.test.js:580 rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: connected; reason = undefined +modular.test.js:580 rxChannel: Ably: ConnectionManager.sendQueuedMessages(): sending 0 queued messages +modular.test.js:580 rxChannel: Ably: RealtimeChannel.checkPendingState: name = channel, state = attaching +modular.test.js:580 rxChannel: Ably: RealtimeChannel.attachImpl(): sending ATTACH message +modular.test.js:580 rxChannel: Ably: ConnectionManager.send(): sending event +modular.test.js:580 rxChannel: Ably: Protocol.send(): sending msg; [ProtocolMessage; action=ATTACH; channel=channel] +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"3d80e0ed-c98a-4437-a555-eb7a02d7db9c","method":"transformInterceptedMessage","params":{"id":"6cab4830-5647-404b-be0c-a745e4e175cf","connectionID":"f373f5b7-b6cc-4e1e-a09d-cafdb059dc9a","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '3d80e0ed-c98a-4437-a555-eb7a02d7db9c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 10, channel: 'channel'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 6cab4830-5647-404b-be0c-a745e4e175cf unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 6cab4830-5647-404b-be0c-a745e4e175cf {action: 10, channel: 'channel'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '3d80e0ed-c98a-4437-a555-eb7a02d7db9c', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"e2c7b48e-e47f-42ee-9078-2b7308da4c17","method":"transformInterceptedMessage","params":{"id":"a6296ab1-0964-4ac9-b2c8-d17f962311f2","connectionID":"f373f5b7-b6cc-4e1e-a09d-cafdb059dc9a","type":"text","data":"{\"action\":11,\"flags\":983105,\"channel\":\"channel\",\"channelSerial\":\"e7dKB7B4ABc0Ek07737104@1715971804585-0\"}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'e2c7b48e-e47f-42ee-9078-2b7308da4c17', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 11, flags: 983105, channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804585-0'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message a6296ab1-0964-4ac9-b2c8-d17f962311f2 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message a6296ab1-0964-4ac9-b2c8-d17f962311f2 {action: 11, flags: 983105, channel: 'channel', channelSerial: 'e7dKB7B4ABc0Ek07737104@1715971804585-0'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'e2c7b48e-e47f-42ee-9078-2b7308da4c17', result: {…}} +modular.test.js:580 rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 105; type = string +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ATTACHED; channel=channel; channelSerial=e7dKB7B4ABc0Ek07737104@1715971804585-0; flags=HAS_PRESENCE,PRESENCE,PUBLISH,SUBSCRIBE,PRESENCE_SUBSCRIBE]; connectionId = FafetxJtgz +modular.test.js:580 rxChannel: Ably: RealtimeChannel.setChannelSerial(): Updating channel serial; serial = e7dKB7B4ABc0Ek07737104@1715971804585-0; previous = undefined +modular.test.js:580 rxChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = attaching, notifying state attached +modular.test.js:580 rxChannel: Ably: RealtimePresence.onAttached(): channel = channel, hasPresence = true +modular.test.js:580 rxChannel: Ably: PresenceMap.startSync(): channel = channel; syncInProgress = false +modular.test.js:580 rxChannel: Ably: PresenceMap.setInProgress(): inProgress = true +modular.test.js:580 rxChannel: Ably: Channel state for channel "channel": attached +modular.test.js:580 rxChannel: Ably: RealtimeChannel.onAttached: activating channel; name = channel +modular.test.js:609 LAWRENCE: end waiting for presence subscribe +modular.test.js:610 LAWRENCE: begin waiting for presence enter +modular.test.js:611 LAWRENCE: txChannel.presence.enter is ƒ async enter(data) { + logger_default.logAction(this.logger, logger_default.LOG_DEBUG, "RealtimePresence.enter"); + if (isAnonymousOrWildcard(this)) { + throw new ErrorInfo("clientId must be s… +modular.test.js:592 txChannel: Ably: RealtimePresence.enter: undefined +modular.test.js:592 txChannel: Ably: RealtimePresence._enterOrUpdateClient: undefined +modular.test.js:592 txChannel: Ably: RealtimePresence.enterClient(): channel = channel, id = undefined, client = (implicit) 3978951838081659 +modular.test.js:592 txChannel: Ably: RealtimeChannel.requestState: name = channel, state = attaching +modular.test.js:592 txChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = initialized, notifying state attaching +modular.test.js:592 txChannel: Ably: Channel state for channel "channel": attaching +modular.test.js:592 txChannel: Ably: RealtimeChannel.checkPendingState: sendEvents is false; state is connecting +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"b249b653-cc53-4363-bc80-d74f32491b4e","method":"transformInterceptedMessage","params":{"id":"cace9374-1fbe-40dd-bcc7-671902ad4f44","connectionID":"f373f5b7-b6cc-4e1e-a09d-cafdb059dc9a","type":"text","data":"{\"action\":16,\"channel\":\"channel\",\"channelSerial\":\"e7deKLRSQBc0Ap88852863:\",\"presence\":[{\"id\":\"ksjPI01-gi:1:0\",\"clientId\":\"8477848146825762\",\"connectionId\":\"ksjPI01-gi\",\"timestamp\":1715971804585,\"action\":1}],\"count\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'b249b653-cc53-4363-bc80-d74f32491b4e', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 16, channel: 'channel', channelSerial: 'e7deKLRSQBc0Ap88852863:', presence: Array(1), count: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message cace9374-1fbe-40dd-bcc7-671902ad4f44 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message cace9374-1fbe-40dd-bcc7-671902ad4f44 {action: 16, channel: 'channel', channelSerial: 'e7deKLRSQBc0Ap88852863:', presence: Array(1), count: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'b249b653-cc53-4363-bc80-d74f32491b4e', result: {…}} +modular.test.js:580 rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 217; type = string +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=SYNC; channel=channel; channelSerial=e7deKLRSQBc0Ap88852863:; count=0; presence=[ [PresenceMessage; action=present; id=ksjPI01-gi:1:0; timestamp=1715971804585; clientId=8477848146825762; connectionId=ksjPI01-gi] ]]; connectionId = FafetxJtgz +modular.test.js:580 rxChannel: Ably: RealtimePresence.setPresence(): received presence for 1 participants; syncChannelSerial = e7deKLRSQBc0Ap88852863: +modular.test.js:580 rxChannel: Ably: PresenceMap.startSync(): channel = channel; syncInProgress = true +modular.test.js:580 rxChannel: Ably: PresenceMap.endSync(): channel = channel; syncInProgress = true +modular.test.js:580 rxChannel: Ably: PresenceMap.setInProgress(): inProgress = false +modular.test.js:592 txChannel: Ably: ConnectionManager WebSocket slow timer: checking connectivity +modular.test.js:592 txChannel: Ably: (Fetch)Http.checkConnectivity(): Sending; https://internet-up.ably-realtime.com/is-the-internet-up.txt +modular.test.js:592 txChannel: Ably: (Fetch)Http.checkConnectivity(): Result: true +modular.test.js:592 txChannel: Ably: ConnectionManager WebSocket slow timer: http connectivity check succeeded +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"d6ac6127-484a-46b8-a0a4-bb16a5eb10f9","method":"transformInterceptedMessage","params":{"id":"f5f8ed8c-36b2-4002-9229-b5e0878baf6b","connectionID":"a7e3cf0d-fd90-47f7-bb03-84f1819789c2","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'd6ac6127-484a-46b8-a0a4-bb16a5eb10f9', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message f5f8ed8c-36b2-4002-9229-b5e0878baf6b unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message f5f8ed8c-36b2-4002-9229-b5e0878baf6b {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'd6ac6127-484a-46b8-a0a4-bb16a5eb10f9', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"310e605f-22f9-4413-bbb1-a68e953fd408","method":"transformInterceptedMessage","params":{"id":"b9b0e81f-0849-4065-abd2-545249581367","connectionID":"47b329fe-1eaf-42c3-9b7e-b25c1b748294","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '310e605f-22f9-4413-bbb1-a68e953fd408', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message b9b0e81f-0849-4065-abd2-545249581367 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message b9b0e81f-0849-4065-abd2-545249581367 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '310e605f-22f9-4413-bbb1-a68e953fd408', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"f7f15712-c223-463c-9593-bd12e8406084","method":"transformInterceptedMessage","params":{"id":"49bc0052-0c50-473e-a79a-1d05dc087d31","connectionID":"c0dac806-fc46-4d96-bc60-73a87bfb3b7e","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'f7f15712-c223-463c-9593-bd12e8406084', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 49bc0052-0c50-473e-a79a-1d05dc087d31 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 49bc0052-0c50-473e-a79a-1d05dc087d31 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'f7f15712-c223-463c-9593-bd12e8406084', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"2c5900d4-7bcf-4560-8fd2-23e1167aad1c","method":"transformInterceptedMessage","params":{"id":"85c699dd-0af3-4454-810b-da78c60d21b8","connectionID":"3eb07829-659a-4cf9-a288-823a5ae57625","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '2c5900d4-7bcf-4560-8fd2-23e1167aad1c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 85c699dd-0af3-4454-810b-da78c60d21b8 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 85c699dd-0af3-4454-810b-da78c60d21b8 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '2c5900d4-7bcf-4560-8fd2-23e1167aad1c', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"232ba414-8646-43d4-ae9d-5632aa5fb6da","method":"transformInterceptedMessage","params":{"id":"7e2e6d13-b345-4030-9c0a-634167b01f77","connectionID":"08f42aac-56b6-42c6-8e1b-bf33342e871f","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '232ba414-8646-43d4-ae9d-5632aa5fb6da', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 7e2e6d13-b345-4030-9c0a-634167b01f77 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 7e2e6d13-b345-4030-9c0a-634167b01f77 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '232ba414-8646-43d4-ae9d-5632aa5fb6da', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"2118285c-5a18-4c3c-9325-e9268ca2d135","method":"transformInterceptedMessage","params":{"id":"ff89249e-8f13-4109-a863-12b55e07ef96","connectionID":"02704e03-3245-44f3-afcf-2ad94460f3d2","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '2118285c-5a18-4c3c-9325-e9268ca2d135', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message ff89249e-8f13-4109-a863-12b55e07ef96 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message ff89249e-8f13-4109-a863-12b55e07ef96 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '2118285c-5a18-4c3c-9325-e9268ca2d135', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"af895f3b-8932-466e-95f7-b74b866a12e3","method":"transformInterceptedMessage","params":{"id":"0d851b5d-231d-498f-a0fa-730105003184","connectionID":"846879f8-2ec9-4941-af4c-3294549be371","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'af895f3b-8932-466e-95f7-b74b866a12e3', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 0d851b5d-231d-498f-a0fa-730105003184 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 0d851b5d-231d-498f-a0fa-730105003184 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'af895f3b-8932-466e-95f7-b74b866a12e3', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"7ac1534d-0f4a-4f51-8809-358cfdff170c","method":"transformInterceptedMessage","params":{"id":"57514adf-776b-479c-aabb-30abe6c649cc","connectionID":"d60a874a-2e2e-4926-9600-51308d2dc26c","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '7ac1534d-0f4a-4f51-8809-358cfdff170c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 57514adf-776b-479c-aabb-30abe6c649cc unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 57514adf-776b-479c-aabb-30abe6c649cc {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '7ac1534d-0f4a-4f51-8809-358cfdff170c', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"775576ae-c235-4d75-b561-313add2fa38b","method":"transformInterceptedMessage","params":{"id":"2f2dc33b-adf0-4bf4-9c59-04cf935b0ae9","connectionID":"e76ea74c-8258-464d-9298-8bb0bc140e3e","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '775576ae-c235-4d75-b561-313add2fa38b', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 2f2dc33b-adf0-4bf4-9c59-04cf935b0ae9 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 2f2dc33b-adf0-4bf4-9c59-04cf935b0ae9 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '775576ae-c235-4d75-b561-313add2fa38b', result: {…}} +root_hooks.js:27 END TEST: browser/modular RealtimePresence BaseRealtime with RealtimePresence offers realtime presence functionality +modular.test.js:592 txChannel: Ably: ConnectionManager WebSocket give up timer: websocket connection took more than 10s; +modular.test.js:592 txChannel: Ably: ConnectionManager WebSocket give up timer: websocket connectivity appears to be unavailable but no other transports to try +modular.test.js:592 txChannel: Ably: WebSocketTransport.dispose(): +modular.test.js:592 txChannel: Ably: ConnectionManager.tryATransport(): transport web_socket disconnected, err: [_ErrorInfo: Timeout waiting for transport to indicate itself viable; statusCode=500; code=50000] +modular.test.js:592 txChannel: Ably: ConnectionManager.notifyState(): new state: disconnected +modular.test.js:592 txChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:592 txChannel: Ably: Connection state: disconnected; reason: [_ErrorInfo: Unable to connect (and no more fallback hosts to try); statusCode=404; code=80003] +modular.test.js:592 txChannel: Ably: ConnectionManager.enactStateChange: setting new state: disconnected; reason = Unable to connect (and no more fallback hosts to try) +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"d5967bc2-b87c-4aaa-971d-92e75ed7d126","method":"transformInterceptedMessage","params":{"id":"3e7e2834-015e-4947-8f9e-964c51dc26b0","connectionID":"95bf5d8d-aa3b-40e2-bb02-62e39508132c","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'd5967bc2-b87c-4aaa-971d-92e75ed7d126', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 3e7e2834-015e-4947-8f9e-964c51dc26b0 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 3e7e2834-015e-4947-8f9e-964c51dc26b0 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'd5967bc2-b87c-4aaa-971d-92e75ed7d126', result: {…}} +modular.test.js:592 txChannel: Ably: WebSocketTransport.dispose(): closing websocket +websockettransport.ts:220 WebSocket connection to 'wss://sandbox-realtime.ably.io/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&clientId=3978951838081659&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser' failed: WebSocket is closed before the connection is established. +(anonymous) @ websockettransport.ts:220 +setTimeout (async) +Config.nextTick @ config.ts:63 +dispose @ websockettransport.ts:215 +(anonymous) @ transport.ts:315 +setTimeout (async) +tryConnect @ transport.ts:313 +tryATransport @ connectionmanager.ts:499 +tryTransportWithFallbacks @ connectionmanager.ts:1615 +connectWs @ connectionmanager.ts:1507 +connectImpl @ connectionmanager.ts:1485 +(anonymous) @ connectionmanager.ts:1393 +(anonymous) @ connectionmanager.ts:486 +decideMode @ connectionmanager.ts:462 +getTransportParams @ connectionmanager.ts:465 +connect @ connectionmanager.ts:1382 +startConnect @ connectionmanager.ts:1402 +(anonymous) @ connectionmanager.ts:1351 +setTimeout (async) +Config.nextTick @ config.ts:63 +requestState @ connectionmanager.ts:1350 +connect @ connection.ts:46 +connect @ baserealtime.ts:82 +_BaseRealtime @ baserealtime.ts:60 +(anonymous) @ modular.test.js:590 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Show 255 more frames +Show less +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined +modular.test.js:592 txChannel: Ably: WebSocketTransport.dispose(): +modular.test.js:592 txChannel: Ably: WebSocketTransport.onError(): Error from WebSocket: undefined +modular.test.js:592 txChannel: Ably: WebSocketTransport.onWsClose(): Unclean disconnection of WebSocket ; code = 1006 +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"c0f17089-f43f-4ff6-abde-7dc2f1954d4e","method":"transformInterceptedMessage","params":{"id":"f3298677-3882-4656-a85d-25ad12d06af8","connectionID":"5c3decea-dbac-4b72-bd54-e1d9275581d7","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'c0f17089-f43f-4ff6-abde-7dc2f1954d4e', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message f3298677-3882-4656-a85d-25ad12d06af8 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message f3298677-3882-4656-a85d-25ad12d06af8 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'c0f17089-f43f-4ff6-abde-7dc2f1954d4e', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"c188303b-8bf7-403d-a543-f10b3d41b6c1","method":"transformInterceptedMessage","params":{"id":"d1dc9906-b05b-4ee4-8f93-60403e077113","connectionID":"44a352d6-e1fa-456b-8aec-3ad314a1e518","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'c188303b-8bf7-403d-a543-f10b3d41b6c1', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d1dc9906-b05b-4ee4-8f93-60403e077113 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d1dc9906-b05b-4ee4-8f93-60403e077113 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'c188303b-8bf7-403d-a543-f10b3d41b6c1', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"107d15e7-01fa-4b96-8352-0c36c0462e9f","method":"transformInterceptedMessage","params":{"id":"d1b83e39-9470-4027-8da2-e64e10532532","connectionID":"47b329fe-1eaf-42c3-9b7e-b25c1b748294","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '107d15e7-01fa-4b96-8352-0c36c0462e9f', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d1b83e39-9470-4027-8da2-e64e10532532 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d1b83e39-9470-4027-8da2-e64e10532532 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '107d15e7-01fa-4b96-8352-0c36c0462e9f', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"11fc8de2-d426-471a-97c0-77bf952d4c98","method":"transformInterceptedMessage","params":{"id":"da48a547-f790-4b8c-a200-6b1132a277ea","connectionID":"08f42aac-56b6-42c6-8e1b-bf33342e871f","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '11fc8de2-d426-471a-97c0-77bf952d4c98', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message da48a547-f790-4b8c-a200-6b1132a277ea unaltered + interception proxy got result of transforming message da48a547-f790-4b8c-a200-6b1132a277ea {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '11fc8de2-d426-471a-97c0-77bf952d4c98', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"8528c7c3-6513-479d-86b5-e128fc14fdb8","method":"transformInterceptedMessage","params":{"id":"1d86ab51-a15b-4f9f-9877-99e67a833a0d","connectionID":"95bf5d8d-aa3b-40e2-bb02-62e39508132c","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '8528c7c3-6513-479d-86b5-e128fc14fdb8', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 1d86ab51-a15b-4f9f-9877-99e67a833a0d unaltered + interception proxy got result of transforming message 1d86ab51-a15b-4f9f-9877-99e67a833a0d {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '8528c7c3-6513-479d-86b5-e128fc14fdb8', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"58eed8b8-fc22-4ec6-986b-35be830382e3","method":"transformInterceptedMessage","params":{"id":"72c1da1a-ea85-4482-ba67-22c1cde5c737","connectionID":"a7e3cf0d-fd90-47f7-bb03-84f1819789c2","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '58eed8b8-fc22-4ec6-986b-35be830382e3', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 72c1da1a-ea85-4482-ba67-22c1cde5c737 unaltered + interception proxy got result of transforming message 72c1da1a-ea85-4482-ba67-22c1cde5c737 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '58eed8b8-fc22-4ec6-986b-35be830382e3', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"8a0422e5-ca22-4fa8-aa44-28b349958bb5","method":"transformInterceptedMessage","params":{"id":"fed63dce-a379-4996-93db-50da7b02c5c8","connectionID":"c0dac806-fc46-4d96-bc60-73a87bfb3b7e","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '8a0422e5-ca22-4fa8-aa44-28b349958bb5', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message fed63dce-a379-4996-93db-50da7b02c5c8 unaltered + interception proxy got result of transforming message fed63dce-a379-4996-93db-50da7b02c5c8 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '8a0422e5-ca22-4fa8-aa44-28b349958bb5', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"ac8970d3-a204-4a79-9e41-b4e0d3c3d9e5","method":"transformInterceptedMessage","params":{"id":"4636eb21-8ab4-469c-b2cf-f79401dc1f1a","connectionID":"12399d8e-c4c5-4c7d-bc23-61525fb5161b","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'ac8970d3-a204-4a79-9e41-b4e0d3c3d9e5', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 4636eb21-8ab4-469c-b2cf-f79401dc1f1a unaltered + interception proxy got result of transforming message 4636eb21-8ab4-469c-b2cf-f79401dc1f1a {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'ac8970d3-a204-4a79-9e41-b4e0d3c3d9e5', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"6559f61c-5f3a-4fc5-bb73-bef2d01a4e44","method":"transformInterceptedMessage","params":{"id":"137ee4d0-6050-4556-ba24-086d4b8488a3","connectionID":"632a1377-f53b-464d-ba67-19d70b0d6093","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '6559f61c-5f3a-4fc5-bb73-bef2d01a4e44', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 137ee4d0-6050-4556-ba24-086d4b8488a3 unaltered + interception proxy got result of transforming message 137ee4d0-6050-4556-ba24-086d4b8488a3 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '6559f61c-5f3a-4fc5-bb73-bef2d01a4e44', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"ae31887e-420a-40cb-ab20-f1259bbe6c9e","method":"transformInterceptedMessage","params":{"id":"2809318c-86c7-48f0-a816-254437907fe4","connectionID":"20394a52-4f25-46ad-b04c-e21c6a886f32","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'ae31887e-420a-40cb-ab20-f1259bbe6c9e', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 2809318c-86c7-48f0-a816-254437907fe4 unaltered + interception proxy got result of transforming message 2809318c-86c7-48f0-a816-254437907fe4 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'ae31887e-420a-40cb-ab20-f1259bbe6c9e', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"613d1604-711c-4c8c-af61-082dc8c284db","method":"transformInterceptedMessage","params":{"id":"9126265f-af56-47b2-bd8b-e475b9055f06","connectionID":"4faa409a-3a67-46e7-8121-e1204ddfbe3d","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '613d1604-711c-4c8c-af61-082dc8c284db', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 9126265f-af56-47b2-bd8b-e475b9055f06 unaltered + interception proxy got result of transforming message 9126265f-af56-47b2-bd8b-e475b9055f06 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '613d1604-711c-4c8c-af61-082dc8c284db', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"a2392d6f-5139-4af7-a9b2-83dcf75b6cfb","method":"transformInterceptedMessage","params":{"id":"9b03aebc-3e4c-441c-9005-6a2b6ad40cc0","connectionID":"e76ea74c-8258-464d-9298-8bb0bc140e3e","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'a2392d6f-5139-4af7-a9b2-83dcf75b6cfb', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 9b03aebc-3e4c-441c-9005-6a2b6ad40cc0 unaltered + interception proxy got result of transforming message 9b03aebc-3e4c-441c-9005-6a2b6ad40cc0 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'a2392d6f-5139-4af7-a9b2-83dcf75b6cfb', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"8864452b-0432-4319-8bc3-d1484e2b230b","method":"transformInterceptedMessage","params":{"id":"4167ba88-a58b-4ace-9ced-2143cddd82e4","connectionID":"5c3decea-dbac-4b72-bd54-e1d9275581d7","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '8864452b-0432-4319-8bc3-d1484e2b230b', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 4167ba88-a58b-4ace-9ced-2143cddd82e4 unaltered + interception proxy got result of transforming message 4167ba88-a58b-4ace-9ced-2143cddd82e4 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '8864452b-0432-4319-8bc3-d1484e2b230b', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"9432f04a-0d43-4b6d-804c-1438de71e52a","method":"transformInterceptedMessage","params":{"id":"a7826f58-d0d6-4186-95f4-cb5e9cd17b6d","connectionID":"f739dff8-f4ed-4e9b-8bd2-0d59030aeaa7","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '9432f04a-0d43-4b6d-804c-1438de71e52a', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message a7826f58-d0d6-4186-95f4-cb5e9cd17b6d unaltered + interception proxy got result of transforming message a7826f58-d0d6-4186-95f4-cb5e9cd17b6d {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '9432f04a-0d43-4b6d-804c-1438de71e52a', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"19813d31-aab5-482a-8303-28a60d30bf54","method":"transformInterceptedMessage","params":{"id":"37c06f92-75c7-4449-9b64-7d26f667119a","connectionID":"3eb07829-659a-4cf9-a288-823a5ae57625","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '19813d31-aab5-482a-8303-28a60d30bf54', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 37c06f92-75c7-4449-9b64-7d26f667119a unaltered + interception proxy got result of transforming message 37c06f92-75c7-4449-9b64-7d26f667119a {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '19813d31-aab5-482a-8303-28a60d30bf54', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"890ec6cb-6bd1-4ffc-b78d-4067d511f55e","method":"transformInterceptedMessage","params":{"id":"01d4ea43-a439-445d-983a-8cd75b49d6e0","connectionID":"d60a874a-2e2e-4926-9600-51308d2dc26c","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '890ec6cb-6bd1-4ffc-b78d-4067d511f55e', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 01d4ea43-a439-445d-983a-8cd75b49d6e0 unaltered + interception proxy got result of transforming message 01d4ea43-a439-445d-983a-8cd75b49d6e0 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '890ec6cb-6bd1-4ffc-b78d-4067d511f55e', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"8ab596f6-e97c-4ab5-b2c7-79d96ed2ac1d","method":"transformInterceptedMessage","params":{"id":"15d3bd52-cdbc-4766-b261-e630bf279654","connectionID":"f8868462-7cb5-47eb-a911-dbf54c36cc71","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '8ab596f6-e97c-4ab5-b2c7-79d96ed2ac1d', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 15d3bd52-cdbc-4766-b261-e630bf279654 unaltered + interception proxy got result of transforming message 15d3bd52-cdbc-4766-b261-e630bf279654 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '8ab596f6-e97c-4ab5-b2c7-79d96ed2ac1d', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"745b92a0-3bbc-4c29-aa3d-5276ea2489ed","method":"transformInterceptedMessage","params":{"id":"14097bd2-d7eb-4299-8536-413443a0d4b3","connectionID":"02704e03-3245-44f3-afcf-2ad94460f3d2","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '745b92a0-3bbc-4c29-aa3d-5276ea2489ed', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 14097bd2-d7eb-4299-8536-413443a0d4b3 unaltered + interception proxy got result of transforming message 14097bd2-d7eb-4299-8536-413443a0d4b3 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '745b92a0-3bbc-4c29-aa3d-5276ea2489ed', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"a9089962-120d-4203-8d85-2ca6d7e4b7a5","method":"transformInterceptedMessage","params":{"id":"1946f95c-61b8-45db-9ce7-86e957cc3ea3","connectionID":"e5782787-fa06-4b19-b94a-f3d37306329e","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'a9089962-120d-4203-8d85-2ca6d7e4b7a5', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 1946f95c-61b8-45db-9ce7-86e957cc3ea3 unaltered + interception proxy got result of transforming message 1946f95c-61b8-45db-9ce7-86e957cc3ea3 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'a9089962-120d-4203-8d85-2ca6d7e4b7a5', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"79bb43c4-1416-468e-8f47-28e9f92c8e1c","method":"transformInterceptedMessage","params":{"id":"d979577c-46e1-4d7d-b513-4de395a3e116","connectionID":"8a42de28-4b1a-4acd-9425-04735cb283fd","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '79bb43c4-1416-468e-8f47-28e9f92c8e1c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message d979577c-46e1-4d7d-b513-4de395a3e116 unaltered + interception proxy got result of transforming message d979577c-46e1-4d7d-b513-4de395a3e116 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '79bb43c4-1416-468e-8f47-28e9f92c8e1c', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"f6bae397-97f4-4b03-a299-fbb3513da0e6","method":"transformInterceptedMessage","params":{"id":"535cd830-9b05-4433-b4f7-854bc8c7200e","connectionID":"846879f8-2ec9-4941-af4c-3294549be371","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'f6bae397-97f4-4b03-a299-fbb3513da0e6', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 535cd830-9b05-4433-b4f7-854bc8c7200e unaltered + interception proxy got result of transforming message 535cd830-9b05-4433-b4f7-854bc8c7200e {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'f6bae397-97f4-4b03-a299-fbb3513da0e6', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"2b6fb557-750a-49bc-8d23-aee740147160","method":"transformInterceptedMessage","params":{"id":"fc469757-df07-4e68-aa57-43b73e96b25f","connectionID":"e60a357c-902b-4a67-bc4d-74862eb5e98f","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '2b6fb557-750a-49bc-8d23-aee740147160', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message fc469757-df07-4e68-aa57-43b73e96b25f unaltered + interception proxy got result of transforming message fc469757-df07-4e68-aa57-43b73e96b25f {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '2b6fb557-750a-49bc-8d23-aee740147160', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"4ec4905f-797d-49e7-baa8-070932c0a7e6","method":"transformInterceptedMessage","params":{"id":"c9c6b072-1353-4884-86ab-b8b2c9ab7919","connectionID":"b7baf942-378f-40fd-ade0-2c0b16738425","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '4ec4905f-797d-49e7-baa8-070932c0a7e6', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message c9c6b072-1353-4884-86ab-b8b2c9ab7919 unaltered + interception proxy got result of transforming message c9c6b072-1353-4884-86ab-b8b2c9ab7919 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '4ec4905f-797d-49e7-baa8-070932c0a7e6', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"b30dfcd3-5ab1-4d56-8cdb-ae28a20e9394","method":"transformInterceptedMessage","params":{"id":"a0cf7ac1-6681-463e-9fba-6a7e837a1cb9","connectionID":"44a352d6-e1fa-456b-8aec-3ad314a1e518","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'b30dfcd3-5ab1-4d56-8cdb-ae28a20e9394', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message a0cf7ac1-6681-463e-9fba-6a7e837a1cb9 unaltered + interception proxy got result of transforming message a0cf7ac1-6681-463e-9fba-6a7e837a1cb9 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'b30dfcd3-5ab1-4d56-8cdb-ae28a20e9394', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"be411f5c-0fd7-4f43-af3a-f71d7dbbba88","method":"transformInterceptedMessage","params":{"id":"fd71344b-c796-4a79-b512-e2701267ab93","connectionID":"f373f5b7-b6cc-4e1e-a09d-cafdb059dc9a","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'be411f5c-0fd7-4f43-af3a-f71d7dbbba88', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message fd71344b-c796-4a79-b512-e2701267ab93 unaltered + interception proxy got result of transforming message fd71344b-c796-4a79-b512-e2701267ab93 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'be411f5c-0fd7-4f43-af3a-f71d7dbbba88', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"183d8f4f-d1f4-4ef1-aa7d-a6bcfa206a77","method":"transformInterceptedMessage","params":{"id":"e7f6c276-feeb-4206-b346-3f2c5acc2387","connectionID":"b1daf8d3-bae7-4324-b6c3-4a3569dfbf4e","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '183d8f4f-d1f4-4ef1-aa7d-a6bcfa206a77', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message e7f6c276-feeb-4206-b346-3f2c5acc2387 unaltered + interception proxy got result of transforming message e7f6c276-feeb-4206-b346-3f2c5acc2387 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '183d8f4f-d1f4-4ef1-aa7d-a6bcfa206a77', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"d86968ce-a770-49d2-9a63-2df61c7a8b8d","method":"transformInterceptedMessage","params":{"id":"42e1417a-7fa5-49fb-aa51-1ba771d19dd1","connectionID":"f4cec765-91f3-4287-b8cd-85468650dbc2","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'd86968ce-a770-49d2-9a63-2df61c7a8b8d', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 42e1417a-7fa5-49fb-aa51-1ba771d19dd1 unaltered + interception proxy got result of transforming message 42e1417a-7fa5-49fb-aa51-1ba771d19dd1 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'd86968ce-a770-49d2-9a63-2df61c7a8b8d', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"70d2b1ce-665c-435e-8c50-da7b625da763","method":"transformInterceptedMessage","params":{"id":"b62fd49c-7a21-4424-b4e1-da102bef5d31","connectionID":"55ec56af-85fc-4476-94d2-2b7fbf7853a1","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '70d2b1ce-665c-435e-8c50-da7b625da763', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message b62fd49c-7a21-4424-b4e1-da102bef5d31 unaltered + interception proxy got result of transforming message b62fd49c-7a21-4424-b4e1-da102bef5d31 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '70d2b1ce-665c-435e-8c50-da7b625da763', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"14871a44-a571-4f95-955f-deb42e4da8e7","method":"transformInterceptedMessage","params":{"id":"05b9c084-2518-441f-bdbb-fe08f4bdb02d","connectionID":"58bdb787-d9c7-47a5-a3a4-cc4301a9fffe","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '14871a44-a571-4f95-955f-deb42e4da8e7', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 05b9c084-2518-441f-bdbb-fe08f4bdb02d unaltered + interception proxy got result of transforming message 05b9c084-2518-441f-bdbb-fe08f4bdb02d {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '14871a44-a571-4f95-955f-deb42e4da8e7', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"4f5cfa0c-2a02-46fd-a26b-03c2fbbffc34","method":"transformInterceptedMessage","params":{"id":"d95e0c0c-6bee-4106-bc18-ce8dfae0ce94","connectionID":"ed01c99f-f693-4c5e-8b67-91f8a9689c71","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '4f5cfa0c-2a02-46fd-a26b-03c2fbbffc34', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message d95e0c0c-6bee-4106-bc18-ce8dfae0ce94 unaltered + interception proxy got result of transforming message d95e0c0c-6bee-4106-bc18-ce8dfae0ce94 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '4f5cfa0c-2a02-46fd-a26b-03c2fbbffc34', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"767368ca-8fb1-4c4a-9c30-e8056ee7371d","method":"transformInterceptedMessage","params":{"id":"3da91370-94ec-4e9f-ba2e-21b8e867bb8f","connectionID":"eb0e0968-4015-4127-b6c9-7431531921f9","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '767368ca-8fb1-4c4a-9c30-e8056ee7371d', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 3da91370-94ec-4e9f-ba2e-21b8e867bb8f unaltered + interception proxy got result of transforming message 3da91370-94ec-4e9f-ba2e-21b8e867bb8f {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '767368ca-8fb1-4c4a-9c30-e8056ee7371d', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"14a13060-43a3-417b-9be8-aab9988118a2","method":"transformInterceptedMessage","params":{"id":"bdd7183f-f920-456d-bdb7-ecd6b375ebac","connectionID":"7934989a-8d9b-483e-8441-7db3515dcc5c","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '14a13060-43a3-417b-9be8-aab9988118a2', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message bdd7183f-f920-456d-bdb7-ecd6b375ebac unaltered + interception proxy got result of transforming message bdd7183f-f920-456d-bdb7-ecd6b375ebac {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '14a13060-43a3-417b-9be8-aab9988118a2', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"4fd557d4-5c3c-4547-9bb0-1b2752c04d0a","method":"transformInterceptedMessage","params":{"id":"82e87f1d-3a2b-4286-b264-764816eb5cc9","connectionID":"01175dcc-0cb9-4aa6-ac95-6cf0e0bf6dd6","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '4fd557d4-5c3c-4547-9bb0-1b2752c04d0a', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 82e87f1d-3a2b-4286-b264-764816eb5cc9 unaltered + interception proxy got result of transforming message 82e87f1d-3a2b-4286-b264-764816eb5cc9 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '4fd557d4-5c3c-4547-9bb0-1b2752c04d0a', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"b099fad6-9db4-458b-bed8-9f75da2a197e","method":"transformInterceptedMessage","params":{"id":"3f2fa670-b13f-4889-8f36-63600c2cce5c","connectionID":"73ca7259-d3b4-43a6-a814-fbbd0cd3e202","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'b099fad6-9db4-458b-bed8-9f75da2a197e', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 3f2fa670-b13f-4889-8f36-63600c2cce5c unaltered + interception proxy got result of transforming message 3f2fa670-b13f-4889-8f36-63600c2cce5c {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'b099fad6-9db4-458b-bed8-9f75da2a197e', result: {…}} + rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 152; type = string + rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=DISCONNECTED; error=[_ErrorInfo: Account _tmp_hhpZqQ disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ]]; connectionId = FafetxJtgz + rxChannel: Ably: Transport.onDisconnect(): err = [_ErrorInfo: Account _tmp_hhpZqQ disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ] + rxChannel: Ably: ConnectionManager.deactivateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: Ably: ConnectionManager.deactivateTransport(): state = disconnected; was active + rxChannel: Ably: ConnectionManager.deactivateTransport(): reason = Account _tmp_hhpZqQ disabled + rxChannel: Ably: ConnectionManager.deactivateTransport(): Getting, clearing, and requeuing 0 pending messages + rxChannel: Ably: MessageQueue.clear(): clearing 0 messages + rxChannel: Ably: ConnectionManager.notifyState(): new state: disconnected; will retry connection immediately + rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): + rxChannel: Ably: Connection state: disconnected; reason: [_ErrorInfo: Account _tmp_hhpZqQ disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ] + rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: disconnected; reason = Account _tmp_hhpZqQ disabled + rxChannel: Ably: WebSocketTransport.dispose(): + rxChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: disconnected + rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): + rxChannel: Ably: Connection state: connecting + rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined + rxChannel: Ably: WebSocketTransport.dispose(): closing websocket + rxChannel: Ably: ConnectionManager.startConnect(): starting connection + rxChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting + rxChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=resume,connectionKey=e7deKLRSQBc0Ap!FafetxJtgzAe3TvDj75fT6-1faf,format=json] + rxChannel: Ably: ConnectionManager.connectWs(): undefined + rxChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket + rxChannel: Ably: ConnectionManager.tryATransport(): trying web_socket + rxChannel: Ably: WebSocketTransport.connect(): starting + rxChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ + rxChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_9XT2Hg._ifo5A:Kp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0; err: null + rxChannel: Ably: WebSocketTransport.createWebSocket(): uri:wss://sandbox-realtime.ably.io:443/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&resume=e7deKLRSQBc0Ap!FafetxJtgzAe3TvDj75fT6-1faf&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: Ably: WebSocketTransport.onWsClose(): Cleanly closed WebSocket + txChannel: Ably: ConnectionManager WebSocket slow timer: ws connectivity check succeeded + interception proxy got message {"jsonrpc":"2.0","id":"bbece57a-3f6e-4ab2-8bc9-b8fb3b6a6137","method":"transformInterceptedMessage","params":{"id":"cad99012-afe0-4830-b1f7-405bc63eb943","connectionID":"3c572df3-d488-49e9-ad8f-d853b04dd888","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971816306}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'bbece57a-3f6e-4ab2-8bc9-b8fb3b6a6137', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971816306} + default transformInterceptedMessage implementation passing message cad99012-afe0-4830-b1f7-405bc63eb943 unaltered + interception proxy got result of transforming message cad99012-afe0-4830-b1f7-405bc63eb943 {action: 9, error: {…}, timestamp: 1715971816306} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'bbece57a-3f6e-4ab2-8bc9-b8fb3b6a6137', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"3e1a20ca-f067-43dd-95c4-4756cc38b4c5","method":"transformInterceptedMessage","params":{"id":"7c6874c3-2d0f-41ca-af96-3ddafda86b78","connectionID":"06b89d2c-a016-4f6e-82fe-fce0ad250ddd","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971816308}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '3e1a20ca-f067-43dd-95c4-4756cc38b4c5', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971816308} + default transformInterceptedMessage implementation passing message 7c6874c3-2d0f-41ca-af96-3ddafda86b78 unaltered + interception proxy got result of transforming message 7c6874c3-2d0f-41ca-af96-3ddafda86b78 {action: 9, error: {…}, timestamp: 1715971816308} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '3e1a20ca-f067-43dd-95c4-4756cc38b4c5', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"842f6486-b997-47f6-ad33-377fcc1d7671","method":"transformInterceptedMessage","params":{"id":"06314c6f-5670-4806-9eb7-8600e15a5e80","connectionID":"b06400ef-d35b-407a-b206-13b68137d1fb","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971816313}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '842f6486-b997-47f6-ad33-377fcc1d7671', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971816313} + default transformInterceptedMessage implementation passing message 06314c6f-5670-4806-9eb7-8600e15a5e80 unaltered + interception proxy got result of transforming message 06314c6f-5670-4806-9eb7-8600e15a5e80 {action: 9, error: {…}, timestamp: 1715971816313} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '842f6486-b997-47f6-ad33-377fcc1d7671', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"0c4ba6c0-48c5-4887-8ea5-d849228b1889","method":"transformInterceptedMessage","params":{"id":"a7b63edb-c7ac-4c51-8578-e50b2ac5ce97","connectionID":"ea05385d-0a45-4cc8-be4f-fcc04de155e5","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971816317}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '0c4ba6c0-48c5-4887-8ea5-d849228b1889', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971816317} + default transformInterceptedMessage implementation passing message a7b63edb-c7ac-4c51-8578-e50b2ac5ce97 unaltered + interception proxy got result of transforming message a7b63edb-c7ac-4c51-8578-e50b2ac5ce97 {action: 9, error: {…}, timestamp: 1715971816317} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '0c4ba6c0-48c5-4887-8ea5-d849228b1889', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"65adc5f1-4d59-42e9-beee-1df8f2fb8d75","method":"transformInterceptedMessage","params":{"id":"7fd1c030-b36e-43d4-adaf-2bbcf18fe691","connectionID":"8d989a53-719c-4b9a-8964-5ccf0a1a157a","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971816319}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '65adc5f1-4d59-42e9-beee-1df8f2fb8d75', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971816319} + default transformInterceptedMessage implementation passing message 7fd1c030-b36e-43d4-adaf-2bbcf18fe691 unaltered + interception proxy got result of transforming message 7fd1c030-b36e-43d4-adaf-2bbcf18fe691 {action: 9, error: {…}, timestamp: 1715971816319} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '65adc5f1-4d59-42e9-beee-1df8f2fb8d75', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"c02d90cf-8965-46e6-bd0f-0afa2b9758eb","method":"transformInterceptedMessage","params":{"id":"e82bcc72-65b1-44d6-9ee6-99c8648d3836","connectionID":"31a41650-d463-404d-9334-35cc3f952e71","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971816320}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'c02d90cf-8965-46e6-bd0f-0afa2b9758eb', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971816320} + default transformInterceptedMessage implementation passing message e82bcc72-65b1-44d6-9ee6-99c8648d3836 unaltered + interception proxy got result of transforming message e82bcc72-65b1-44d6-9ee6-99c8648d3836 {action: 9, error: {…}, timestamp: 1715971816320} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'c02d90cf-8965-46e6-bd0f-0afa2b9758eb', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"5c910356-c6d7-4162-a3d4-8d47ea38b349","method":"transformInterceptedMessage","params":{"id":"27594008-d8a9-4a76-bdbb-b875bd915c21","connectionID":"c5995417-47cc-4f50-86dc-2738fbf6705b","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971816322}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '5c910356-c6d7-4162-a3d4-8d47ea38b349', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971816322} + default transformInterceptedMessage implementation passing message 27594008-d8a9-4a76-bdbb-b875bd915c21 unaltered + interception proxy got result of transforming message 27594008-d8a9-4a76-bdbb-b875bd915c21 {action: 9, error: {…}, timestamp: 1715971816322} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '5c910356-c6d7-4162-a3d4-8d47ea38b349', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"5ac8b4ed-f555-4ee1-9cfd-e0e69b105c4a","method":"transformInterceptedMessage","params":{"id":"7f9e039d-6f1f-407b-8f08-0613503065cc","connectionID":"a8dc912e-c7a5-43d0-923d-1bb5c88bfe08","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971816327}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '5ac8b4ed-f555-4ee1-9cfd-e0e69b105c4a', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971816327} + default transformInterceptedMessage implementation passing message 7f9e039d-6f1f-407b-8f08-0613503065cc unaltered + interception proxy got result of transforming message 7f9e039d-6f1f-407b-8f08-0613503065cc {action: 9, error: {…}, timestamp: 1715971816327} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '5ac8b4ed-f555-4ee1-9cfd-e0e69b105c4a', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"6d060767-e080-4b13-9e07-3ce3d69c41d3","method":"transformInterceptedMessage","params":{"id":"4e3571ad-2c05-4667-a0d1-eea34b993953","connectionID":"d880470c-54f9-4102-8752-0392f947b0fd","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971816348}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '6d060767-e080-4b13-9e07-3ce3d69c41d3', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971816348} + default transformInterceptedMessage implementation passing message 4e3571ad-2c05-4667-a0d1-eea34b993953 unaltered + interception proxy got result of transforming message 4e3571ad-2c05-4667-a0d1-eea34b993953 {action: 9, error: {…}, timestamp: 1715971816348} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '6d060767-e080-4b13-9e07-3ce3d69c41d3', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"bdc6b82c-2cf4-4b3d-adf1-5cc5167cd8d4","method":"transformInterceptedMessage","params":{"id":"8ce94220-0d97-4d0c-b952-a9dc83283537","connectionID":"5d6b6cd2-f0f9-410c-8f6a-402912436242","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971816360}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'bdc6b82c-2cf4-4b3d-adf1-5cc5167cd8d4', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971816360} + default transformInterceptedMessage implementation passing message 8ce94220-0d97-4d0c-b952-a9dc83283537 unaltered + interception proxy got result of transforming message 8ce94220-0d97-4d0c-b952-a9dc83283537 {action: 9, error: {…}, timestamp: 1715971816360} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'bdc6b82c-2cf4-4b3d-adf1-5cc5167cd8d4', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"6ca9d729-f3d6-4918-98d2-bd6f1675071d","method":"transformInterceptedMessage","params":{"id":"49e30cc0-97c4-4d7a-a1cb-feea7af72c26","connectionID":"c19e380d-33e9-4a3f-8990-c05e754b1985","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971816521}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '6ca9d729-f3d6-4918-98d2-bd6f1675071d', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971816521} + default transformInterceptedMessage implementation passing message 49e30cc0-97c4-4d7a-a1cb-feea7af72c26 unaltered + interception proxy got result of transforming message 49e30cc0-97c4-4d7a-a1cb-feea7af72c26 {action: 9, error: {…}, timestamp: 1715971816521} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '6ca9d729-f3d6-4918-98d2-bd6f1675071d', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"8acc1b11-1ae7-4de9-b819-0f86ed3befe1","method":"transformInterceptedMessage","params":{"id":"2e54077f-2b96-46b9-842a-e5d49eb1f112","connectionID":"27d47ef1-094f-4fe2-9098-182a9c596dfc","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971816539}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '8acc1b11-1ae7-4de9-b819-0f86ed3befe1', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971816539} + default transformInterceptedMessage implementation passing message 2e54077f-2b96-46b9-842a-e5d49eb1f112 unaltered + interception proxy got result of transforming message 2e54077f-2b96-46b9-842a-e5d49eb1f112 {action: 9, error: {…}, timestamp: 1715971816539} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '8acc1b11-1ae7-4de9-b819-0f86ed3befe1', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"634a4ba9-c74f-4fed-bc3c-8df922239352","method":"transformInterceptedMessage","params":{"id":"ea0a3fc7-9d6d-4a18-8c07-8823f8902c49","connectionID":"fc569500-a499-4af3-9983-db52825ec349","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971816885}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '634a4ba9-c74f-4fed-bc3c-8df922239352', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971816885} + default transformInterceptedMessage implementation passing message ea0a3fc7-9d6d-4a18-8c07-8823f8902c49 unaltered + interception proxy got result of transforming message ea0a3fc7-9d6d-4a18-8c07-8823f8902c49 {action: 9, error: {…}, timestamp: 1715971816885} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '634a4ba9-c74f-4fed-bc3c-8df922239352', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"a8e909c0-9fc3-4aa7-ab76-d9d1b1a3918f","method":"transformInterceptedMessage","params":{"id":"315ebc1f-7a43-4fec-b418-e8965aa585f9","connectionID":"d58098db-558d-45a3-b261-2be09413788d","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971817485}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'a8e909c0-9fc3-4aa7-ab76-d9d1b1a3918f', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971817485} + default transformInterceptedMessage implementation passing message 315ebc1f-7a43-4fec-b418-e8965aa585f9 unaltered + interception proxy got result of transforming message 315ebc1f-7a43-4fec-b418-e8965aa585f9 {action: 9, error: {…}, timestamp: 1715971817485} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'a8e909c0-9fc3-4aa7-ab76-d9d1b1a3918f', result: {…}} + rxChannel: Ably: WebSocketTransport.onWsOpen(): opened WebSocket + rxChannel: Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&resume=e7deKLRSQBc0Ap!FafetxJtgzAe3TvDj75fT6-1faf&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending + rxChannel: Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&resume=e7deKLRSQBc0Ap!FafetxJtgzAe3TvDj75fT6-1faf&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = resume + interception proxy got message {"jsonrpc":"2.0","id":"4d7f7d24-be89-4e00-b273-d3ca0ccad346","method":"transformInterceptedMessage","params":{"id":"01a0eb4d-840f-419b-9503-0921d7622e1e","connectionID":"b72ff151-1d3c-4897-b37e-6c3d9572ac02","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971817901}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '4d7f7d24-be89-4e00-b273-d3ca0ccad346', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971817901} + default transformInterceptedMessage implementation passing message 01a0eb4d-840f-419b-9503-0921d7622e1e unaltered + interception proxy got result of transforming message 01a0eb4d-840f-419b-9503-0921d7622e1e {action: 9, error: {…}, timestamp: 1715971817901} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '4d7f7d24-be89-4e00-b273-d3ca0ccad346', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"c99417a8-b1c7-42e3-8e57-75d2a2ab6478","method":"transformInterceptedMessage","params":{"id":"5cc8bb46-2fc3-4a06-a9f8-f753730c3110","connectionID":"48b6f5f0-3fd4-49e3-97fa-c38e85af5fa2","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971818092}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'c99417a8-b1c7-42e3-8e57-75d2a2ab6478', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971818092} + default transformInterceptedMessage implementation passing message 5cc8bb46-2fc3-4a06-a9f8-f753730c3110 unaltered + interception proxy got result of transforming message 5cc8bb46-2fc3-4a06-a9f8-f753730c3110 {action: 9, error: {…}, timestamp: 1715971818092} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'c99417a8-b1c7-42e3-8e57-75d2a2ab6478', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"f0212e2a-3da7-4ee8-a41a-a208baffa504","method":"transformInterceptedMessage","params":{"id":"7263e386-2aa7-435d-b0a5-51cf2b144ce2","connectionID":"72d1f684-c756-4ef4-8b12-e7b0f7b9e071","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_hhpZqQ disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971818139}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'f0212e2a-3da7-4ee8-a41a-a208baffa504', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971818139} + default transformInterceptedMessage implementation passing message 7263e386-2aa7-435d-b0a5-51cf2b144ce2 unaltered + interception proxy got result of transforming message 7263e386-2aa7-435d-b0a5-51cf2b144ce2 {action: 9, error: {…}, timestamp: 1715971818139} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'f0212e2a-3da7-4ee8-a41a-a208baffa504', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"a3bc075e-ff12-4961-81b8-4e4f5edc9fc5","method":"transformInterceptedMessage","params":{"id":"e5502d64-95be-48c8-8aa0-420f23d08df3","connectionID":"58b8315f-9ab8-465f-9c6e-57d2acb930fb","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971818296}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'a3bc075e-ff12-4961-81b8-4e4f5edc9fc5', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971818296} + default transformInterceptedMessage implementation passing message e5502d64-95be-48c8-8aa0-420f23d08df3 unaltered + interception proxy got result of transforming message e5502d64-95be-48c8-8aa0-420f23d08df3 {action: 9, error: {…}, timestamp: 1715971818296} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'a3bc075e-ff12-4961-81b8-4e4f5edc9fc5', result: {…}} + rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 232; type = string + rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ERROR; timestamp=1715971818296; error=[_ErrorInfo: Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300]]; connectionId = FafetxJtgz + rxChannel: Ably: Transport.onProtocolMessage(): received error action; connectionId = FafetxJtgz; err = {"code":40300,"statusCode":403,"nonfatal":false,"href":"https://help.ably.io/error/40300"} + rxChannel: Ably: Transport.onFatalError(): err = [_ErrorInfo: Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] + rxChannel: Ably: ConnectionManager.deactivateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&resume=e7deKLRSQBc0Ap!FafetxJtgzAe3TvDj75fT6-1faf&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: Ably: ConnectionManager.deactivateTransport(): state = failed; was pending + rxChannel: Ably: ConnectionManager.deactivateTransport(): reason = Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.) + rxChannel: Ably: ConnectionManager.notifyState(): new state: failed + rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): + rxChannel: Ably: Connection state: failed; reason: [_ErrorInfo: Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] + rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: failed; reason = Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.) + rxChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = attached, notifying state failed + rxChannel: Ably: PresenceMap.setInProgress(): inProgress = false + rxChannel: Ably: PresenceMap.setInProgress(): inProgress = false + rxChannel: Ably: Channel state for channel "channel": failed; reason: [_ErrorInfo: Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] + rxChannel: Ably: WebSocketTransport.dispose(): + rxChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports + rxChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting pending transport: WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&resume=e7deKLRSQBc0Ap!FafetxJtgzAe3TvDj75fT6-1faf&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined + rxChannel: Ably: WebSocketTransport.dispose(): closing websocket + rxChannel: Ably: WebSocketTransport.onWsClose(): Cleanly closed WebSocket + interception proxy got message {"jsonrpc":"2.0","id":"2c086da0-a3ba-4f6a-b6da-c990dfbbcd16","method":"transformInterceptedMessage","params":{"id":"2a500e86-e514-41ad-b7cb-37206249d1ff","connectionID":"71d4c8a3-a1c9-4752-89cb-37ab0db15fdc","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971818582}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '2c086da0-a3ba-4f6a-b6da-c990dfbbcd16', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971818582} + default transformInterceptedMessage implementation passing message 2a500e86-e514-41ad-b7cb-37206249d1ff unaltered + interception proxy got result of transforming message 2a500e86-e514-41ad-b7cb-37206249d1ff {action: 9, error: {…}, timestamp: 1715971818582} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '2c086da0-a3ba-4f6a-b6da-c990dfbbcd16', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"b8b09d95-aa76-4439-bff6-c46641d0e974","method":"transformInterceptedMessage","params":{"id":"12fdd268-fb0d-468a-b127-7b34a192d8c2","connectionID":"dbe755a1-f0df-4fa5-81ef-41bd7b222231","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971818700}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'b8b09d95-aa76-4439-bff6-c46641d0e974', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971818700} + default transformInterceptedMessage implementation passing message 12fdd268-fb0d-468a-b127-7b34a192d8c2 unaltered + interception proxy got result of transforming message 12fdd268-fb0d-468a-b127-7b34a192d8c2 {action: 9, error: {…}, timestamp: 1715971818700} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'b8b09d95-aa76-4439-bff6-c46641d0e974', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"dd6a316b-e7f5-4f06-b44c-ebbb13ca0952","method":"transformInterceptedMessage","params":{"id":"11172403-abe6-421c-902f-0e6aefdcfb6b","connectionID":"2d847106-2495-4faf-9edd-05199d353208","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971819177}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'dd6a316b-e7f5-4f06-b44c-ebbb13ca0952', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971819177} + default transformInterceptedMessage implementation passing message 11172403-abe6-421c-902f-0e6aefdcfb6b unaltered + interception proxy got result of transforming message 11172403-abe6-421c-902f-0e6aefdcfb6b {action: 9, error: {…}, timestamp: 1715971819177} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'dd6a316b-e7f5-4f06-b44c-ebbb13ca0952', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"6ff5f6e2-c3cb-4b16-9828-ae19334939b5","method":"transformInterceptedMessage","params":{"id":"4390d427-6ca2-4c6c-8dc9-cf6a8d36218e","connectionID":"7b6f51ec-e24a-4d55-b904-a8789d6f48d3","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971819210}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '6ff5f6e2-c3cb-4b16-9828-ae19334939b5', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971819210} + default transformInterceptedMessage implementation passing message 4390d427-6ca2-4c6c-8dc9-cf6a8d36218e unaltered + interception proxy got result of transforming message 4390d427-6ca2-4c6c-8dc9-cf6a8d36218e {action: 9, error: {…}, timestamp: 1715971819210} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '6ff5f6e2-c3cb-4b16-9828-ae19334939b5', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"587d6a02-832b-4ce5-8dbd-53a9282f7627","method":"transformInterceptedMessage","params":{"id":"761034c2-e999-4589-94e9-81263980ce7c","connectionID":"d559d7b9-1678-4263-adcc-067cccdbb325","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971819428}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '587d6a02-832b-4ce5-8dbd-53a9282f7627', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971819428} + default transformInterceptedMessage implementation passing message 761034c2-e999-4589-94e9-81263980ce7c unaltered + interception proxy got result of transforming message 761034c2-e999-4589-94e9-81263980ce7c {action: 9, error: {…}, timestamp: 1715971819428} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '587d6a02-832b-4ce5-8dbd-53a9282f7627', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"0999630e-0c31-43f6-a09d-2a5ebae75319","method":"transformInterceptedMessage","params":{"id":"8f4ebb58-d531-4019-9051-21e257580a36","connectionID":"d09ba4c9-5115-48d8-98d4-87c182640572","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971819629}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '0999630e-0c31-43f6-a09d-2a5ebae75319', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971819629} + default transformInterceptedMessage implementation passing message 8f4ebb58-d531-4019-9051-21e257580a36 unaltered + interception proxy got result of transforming message 8f4ebb58-d531-4019-9051-21e257580a36 {action: 9, error: {…}, timestamp: 1715971819629} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '0999630e-0c31-43f6-a09d-2a5ebae75319', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"ded53df7-c77d-4e36-9aa9-bc03eada7b19","method":"transformInterceptedMessage","params":{"id":"3273d505-896f-4ed3-a739-5254825a2974","connectionID":"876a12f8-b980-43df-8280-04ac87522024","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971819838}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'ded53df7-c77d-4e36-9aa9-bc03eada7b19', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971819838} + default transformInterceptedMessage implementation passing message 3273d505-896f-4ed3-a739-5254825a2974 unaltered + interception proxy got result of transforming message 3273d505-896f-4ed3-a739-5254825a2974 {action: 9, error: {…}, timestamp: 1715971819838} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'ded53df7-c77d-4e36-9aa9-bc03eada7b19', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"f451d49e-7cd9-4ae8-b47e-641c3a517e47","method":"transformInterceptedMessage","params":{"id":"cc76c5e0-eccb-433d-a5ca-b8b5383d4a1e","connectionID":"3286e066-c3f1-4845-9434-c8f3484eab87","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971819996}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'f451d49e-7cd9-4ae8-b47e-641c3a517e47', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971819996} + default transformInterceptedMessage implementation passing message cc76c5e0-eccb-433d-a5ca-b8b5383d4a1e unaltered + interception proxy got result of transforming message cc76c5e0-eccb-433d-a5ca-b8b5383d4a1e {action: 9, error: {…}, timestamp: 1715971819996} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'f451d49e-7cd9-4ae8-b47e-641c3a517e47', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"30b6babb-0ca2-4dd2-a13a-2c4b4d47ece5","method":"transformInterceptedMessage","params":{"id":"28d56140-d862-4622-8894-2e026f04d498","connectionID":"42da748e-2d94-49c0-9138-267e8900531c","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971820271}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '30b6babb-0ca2-4dd2-a13a-2c4b4d47ece5', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971820271} + default transformInterceptedMessage implementation passing message 28d56140-d862-4622-8894-2e026f04d498 unaltered + interception proxy got result of transforming message 28d56140-d862-4622-8894-2e026f04d498 {action: 9, error: {…}, timestamp: 1715971820271} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '30b6babb-0ca2-4dd2-a13a-2c4b4d47ece5', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"65dea4ee-4521-4129-9e5d-39ea01ab9ec9","method":"transformInterceptedMessage","params":{"id":"5d2ce1ef-be15-4a8f-88a0-a6e6b8cd0e26","connectionID":"8ee0b585-449a-4176-b0c6-38f0321d8934","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971820303}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '65dea4ee-4521-4129-9e5d-39ea01ab9ec9', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971820303} + default transformInterceptedMessage implementation passing message 5d2ce1ef-be15-4a8f-88a0-a6e6b8cd0e26 unaltered + interception proxy got result of transforming message 5d2ce1ef-be15-4a8f-88a0-a6e6b8cd0e26 {action: 9, error: {…}, timestamp: 1715971820303} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '65dea4ee-4521-4129-9e5d-39ea01ab9ec9', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"ceb595bc-d6d1-416f-89be-27596e541540","method":"transformInterceptedMessage","params":{"id":"35b3ae9b-d34e-45ee-88d4-7e44ac94e1ca","connectionID":"4491223a-54c1-4984-9567-de698726c038","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971820742}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'ceb595bc-d6d1-416f-89be-27596e541540', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971820742} + default transformInterceptedMessage implementation passing message 35b3ae9b-d34e-45ee-88d4-7e44ac94e1ca unaltered + interception proxy got result of transforming message 35b3ae9b-d34e-45ee-88d4-7e44ac94e1ca {action: 9, error: {…}, timestamp: 1715971820742} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'ceb595bc-d6d1-416f-89be-27596e541540', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"66a0ff9e-d406-4f39-844e-45d453715524","method":"transformInterceptedMessage","params":{"id":"bc30ebc5-d625-4092-9856-31c583b7730c","connectionID":"7e0d0e62-0899-4ace-b658-12b8dffe573d","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971820754}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '66a0ff9e-d406-4f39-844e-45d453715524', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971820754} + default transformInterceptedMessage implementation passing message bc30ebc5-d625-4092-9856-31c583b7730c unaltered + interception proxy got result of transforming message bc30ebc5-d625-4092-9856-31c583b7730c {action: 9, error: {…}, timestamp: 1715971820754} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '66a0ff9e-d406-4f39-844e-45d453715524', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"c03ba8de-6d7b-4285-be4b-c4966fe7f61d","method":"transformInterceptedMessage","params":{"id":"13eb6d33-65bf-4df3-9402-a67bed6ef0c5","connectionID":"05ab3687-fb49-401b-a820-317a644f01f8","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971820988}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'c03ba8de-6d7b-4285-be4b-c4966fe7f61d', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971820988} + default transformInterceptedMessage implementation passing message 13eb6d33-65bf-4df3-9402-a67bed6ef0c5 unaltered + interception proxy got result of transforming message 13eb6d33-65bf-4df3-9402-a67bed6ef0c5 {action: 9, error: {…}, timestamp: 1715971820988} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'c03ba8de-6d7b-4285-be4b-c4966fe7f61d', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"208c55fa-6804-4d8d-a2d6-c7968d24db73","method":"transformInterceptedMessage","params":{"id":"a03c602b-f32a-4d9c-a7ed-8d376e140c1a","connectionID":"bb94c7c3-6d45-4fc3-af06-98c97574eb22","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_9XT2Hg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715971821205}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '208c55fa-6804-4d8d-a2d6-c7968d24db73', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715971821205} + default transformInterceptedMessage implementation passing message a03c602b-f32a-4d9c-a7ed-8d376e140c1a unaltered + interception proxy got result of transforming message a03c602b-f32a-4d9c-a7ed-8d376e140c1a {action: 9, error: {…}, timestamp: 1715971821205} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '208c55fa-6804-4d8d-a2d6-c7968d24db73', result: {…}} + Test App _tmp_9XT2Hg has been torn down + interception proxy client disconnected + txChannel: Ably: ConnectionManager retry timer expired: retrying + txChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: disconnected + txChannel: Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: Ably: Connection state: connecting + txChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined + txChannel: Ably: ConnectionManager.startConnect(): starting connection + txChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting + txChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] + txChannel: Ably: ConnectionManager.connectWs(): undefined + txChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket + txChannel: Ably: ConnectionManager.tryATransport(): trying web_socket + txChannel: Ably: WebSocketTransport.connect(): starting + txChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ + txChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_9XT2Hg._ifo5A:Kp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0; err: null + txChannel: Ably: WebSocketTransport.createWebSocket(): uri:wss://sandbox-realtime.ably.io:443/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&clientId=3978951838081659&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: Ably: WebSocketTransport.onWsOpen(): opened WebSocket + txChannel: Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&clientId=3978951838081659&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending + txChannel: Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_9XT2Hg._ifo5A%3AKp9WToABVmVlHRMIm3fO-MknVaSDCdF9vEMc4SV2SZ0&clientId=3978951838081659&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = clean \ No newline at end of file diff --git a/with-failure-logs-4.txt b/with-failure-logs-4.txt new file mode 100644 index 000000000..ad8ba74b0 --- /dev/null +++ b/with-failure-logs-4.txt @@ -0,0 +1,1575 @@ +favicon.ico:1 + + + Failed to load resource: the server responded with a status of 404 (Not Found) +interception_proxy_client.js:20 connected to interception proxy +interception_proxy_client.js:56 interception proxy sending startInterception request Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"8986566212744509","result":{}} +interception_proxy_client.js:34 startInterception completed +testapp_module.js:38 Test App _tmp_-mDp8g in environment sandbox has been set up +root_hooks.js:31 START TEST: browser/modular attempting to initialize with no client options BaseRest throws an error +logger.ts:56 16:19:21.979 Ably: BaseRest(): BaseRest must be initialized with a client options object +errorLogger @ logger.ts:56 +(anonymous) @ logger.ts:29 +logAction @ logger.ts:122 +logActionNoStrip @ logger.ts:117 +_Logger.logAction @ logger.ts:110 +objectifyOptions @ defaults.ts:203 +BaseRest @ baserest.ts:21 +(anonymous) @ modular.test.js:48 +assertThrows @ VM7 chai.js:3044 +methodWrapper @ VM7 chai.js:7910 +(anonymous) @ modular.test.js:48 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +Runner.runSuite @ mocha.js:24024 +next @ mocha.js:24008 +next @ mocha.js:23842 +Runner.runTests @ mocha.js:23952 +(anonymous) @ mocha.js:24029 +next @ mocha.js:23572 +cbHookRun @ mocha.js:23641 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22194 +(anonymous) @ testapp_module.js:45 +(anonymous) @ testapp_manager.js:160 +xhr.onreadystatechange @ testapp_manager.js:83 +Show 20 more frames +Show less +root_hooks.js:27 END TEST: browser/modular attempting to initialize with no client options BaseRest throws an error +root_hooks.js:31 START TEST: browser/modular attempting to initialize with no client options _BaseRealtime throws an error +logger.ts:56 16:19:21.982 Ably: BaseRealtime(): BaseRealtime must be initialized with a client options object +errorLogger @ logger.ts:56 +(anonymous) @ logger.ts:29 +logAction @ logger.ts:122 +logActionNoStrip @ logger.ts:117 +_Logger.logAction @ logger.ts:110 +objectifyOptions @ defaults.ts:203 +_BaseRealtime @ baserealtime.ts:36 +(anonymous) @ modular.test.js:48 +assertThrows @ VM7 chai.js:3044 +methodWrapper @ VM7 chai.js:7910 +(anonymous) @ modular.test.js:48 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +Runner.runSuite @ mocha.js:24024 +next @ mocha.js:24008 +next @ mocha.js:23842 +Runner.runTests @ mocha.js:23952 +(anonymous) @ mocha.js:24029 +next @ mocha.js:23572 +cbHookRun @ mocha.js:23641 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22194 +(anonymous) @ testapp_module.js:45 +(anonymous) @ testapp_manager.js:160 +xhr.onreadystatechange @ testapp_manager.js:83 +Show 20 more frames +Show less +root_hooks.js:27 END TEST: browser/modular attempting to initialize with no client options _BaseRealtime throws an error +root_hooks.js:31 START TEST: browser/modular attempting to initialize with just an API key BaseRest throws an error +logger.ts:56 16:19:21.983 Ably: BaseRest(): BaseRest 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’s `key` property.) +errorLogger @ logger.ts:56 +(anonymous) @ logger.ts:29 +logAction @ logger.ts:122 +logActionNoStrip @ logger.ts:117 +_Logger.logAction @ logger.ts:110 +objectifyOptions @ defaults.ts:221 +BaseRest @ baserest.ts:21 +(anonymous) @ modular.test.js:58 +assertThrows @ VM7 chai.js:3044 +methodWrapper @ VM7 chai.js:7910 +(anonymous) @ modular.test.js:58 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +Runner.runSuite @ mocha.js:24024 +next @ mocha.js:24008 +next @ mocha.js:23842 +Runner.runTests @ mocha.js:23952 +(anonymous) @ mocha.js:24029 +next @ mocha.js:23572 +cbHookRun @ mocha.js:23641 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22194 +(anonymous) @ testapp_module.js:45 +(anonymous) @ testapp_manager.js:160 +xhr.onreadystatechange @ testapp_manager.js:83 +Show 20 more frames +Show less +root_hooks.js:27 END TEST: browser/modular attempting to initialize with just an API key BaseRest throws an error +root_hooks.js:31 START TEST: browser/modular attempting to initialize with just an API key _BaseRealtime throws an error +logger.ts:56 16:19:21.984 Ably: BaseRealtime(): BaseRealtime 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’s `key` property.) +errorLogger @ logger.ts:56 +(anonymous) @ logger.ts:29 +logAction @ logger.ts:122 +logActionNoStrip @ logger.ts:117 +_Logger.logAction @ logger.ts:110 +objectifyOptions @ defaults.ts:221 +_BaseRealtime @ baserealtime.ts:36 +(anonymous) @ modular.test.js:58 +assertThrows @ VM7 chai.js:3044 +methodWrapper @ VM7 chai.js:7910 +(anonymous) @ modular.test.js:58 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +Runner.runSuite @ mocha.js:24024 +next @ mocha.js:24008 +next @ mocha.js:23842 +Runner.runTests @ mocha.js:23952 +(anonymous) @ mocha.js:24029 +next @ mocha.js:23572 +cbHookRun @ mocha.js:23641 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22194 +(anonymous) @ testapp_module.js:45 +(anonymous) @ testapp_manager.js:160 +xhr.onreadystatechange @ testapp_manager.js:83 +Show 20 more frames +Show less +root_hooks.js:27 END TEST: browser/modular attempting to initialize with just an API key _BaseRealtime throws an error +root_hooks.js:31 START TEST: browser/modular attempting to initialize with just a token BaseRest throws an error +logger.ts:56 16:19:21.984 Ably: BaseRest(): BaseRest 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’s `token` property.) +errorLogger @ logger.ts:56 +(anonymous) @ logger.ts:29 +logAction @ logger.ts:122 +logActionNoStrip @ logger.ts:117 +_Logger.logAction @ logger.ts:110 +objectifyOptions @ defaults.ts:213 +BaseRest @ baserest.ts:21 +(anonymous) @ modular.test.js:70 +assertThrows @ VM7 chai.js:3044 +methodWrapper @ VM7 chai.js:7910 +(anonymous) @ modular.test.js:70 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +Runner.runSuite @ mocha.js:24024 +next @ mocha.js:24008 +next @ mocha.js:23842 +Runner.runTests @ mocha.js:23952 +(anonymous) @ mocha.js:24029 +next @ mocha.js:23572 +cbHookRun @ mocha.js:23641 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22194 +(anonymous) @ testapp_module.js:45 +(anonymous) @ testapp_manager.js:160 +xhr.onreadystatechange @ testapp_manager.js:83 +Show 20 more frames +Show less +root_hooks.js:27 END TEST: browser/modular attempting to initialize with just a token BaseRest throws an error +root_hooks.js:31 START TEST: browser/modular attempting to initialize with just a token _BaseRealtime throws an error +logger.ts:56 16:19:21.985 Ably: BaseRealtime(): BaseRealtime 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’s `token` property.) +errorLogger @ logger.ts:56 +(anonymous) @ logger.ts:29 +logAction @ logger.ts:122 +logActionNoStrip @ logger.ts:117 +_Logger.logAction @ logger.ts:110 +objectifyOptions @ defaults.ts:213 +_BaseRealtime @ baserealtime.ts:36 +(anonymous) @ modular.test.js:70 +assertThrows @ VM7 chai.js:3044 +methodWrapper @ VM7 chai.js:7910 +(anonymous) @ modular.test.js:70 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +Runner.runSuite @ mocha.js:24024 +next @ mocha.js:24008 +next @ mocha.js:23842 +Runner.runTests @ mocha.js:23952 +(anonymous) @ mocha.js:24029 +next @ mocha.js:23572 +cbHookRun @ mocha.js:23641 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22194 +(anonymous) @ testapp_module.js:45 +(anonymous) @ testapp_manager.js:160 +xhr.onreadystatechange @ testapp_manager.js:83 +Show 20 more frames +Show less +root_hooks.js:27 END TEST: browser/modular attempting to initialize with just a token _BaseRealtime throws an error +root_hooks.js:31 START TEST: browser/modular without any plugins BaseRest throws an error due to the absence of an HTTP plugin +root_hooks.js:27 END TEST: browser/modular without any plugins BaseRest throws an error due to the absence of an HTTP plugin +root_hooks.js:31 START TEST: browser/modular without any plugins _BaseRealtime throws an error due to the absence of an HTTP plugin +root_hooks.js:27 END TEST: browser/modular without any plugins _BaseRealtime throws an error due to the absence of an HTTP plugin +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to use push admin functionality +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to use push admin functionality +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `time()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `time()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `stats()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `stats()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `request(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `request(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPublish(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPublish(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPresence(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPresence(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.revokeTokens(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.revokeTokens(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `history()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `history()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `presence.history()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `presence.history()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `status()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `status()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to use push admin functionality +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to use push admin functionality +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `time()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `time()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"2f926bcc-3541-43b4-8db6-f85d5d6a33ab","method":"transformInterceptedMessage","params":{"id":"dc6d33a1-d35a-4c92-89f3-6d4726b0f687","connectionID":"31f0c7d3-133c-4bc3-9297-c198f559fed0","type":"text","data":"{\"action\":4,\"connectionId\":\"9ybkwIgnrh\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!9ybkwIgnrhAVwEvQJUcQjc-3265\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '2f926bcc-3541-43b4-8db6-f85d5d6a33ab', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: '9ybkwIgnrh', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message dc6d33a1-d35a-4c92-89f3-6d4726b0f687 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message dc6d33a1-d35a-4c92-89f3-6d4726b0f687 {action: 4, connectionId: '9ybkwIgnrh', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '2f926bcc-3541-43b4-8db6-f85d5d6a33ab', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `stats()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `stats()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `request(...)` +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"7dd7b3e6-c16b-42fa-bbca-ca6c9ef6fd83","method":"transformInterceptedMessage","params":{"id":"82d14ac3-09a2-47fb-beb9-73dcb58c79a9","connectionID":"6850246b-8d36-4d88-b751-04867a4bf5ac","type":"text","data":"{\"action\":4,\"connectionId\":\"dAHxel6lL3\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!dAHxel6lL3AXo1XFfhh3Oa-3266\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '7dd7b3e6-c16b-42fa-bbca-ca6c9ef6fd83', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'dAHxel6lL3', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 82d14ac3-09a2-47fb-beb9-73dcb58c79a9 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 82d14ac3-09a2-47fb-beb9-73dcb58c79a9 {action: 4, connectionId: 'dAHxel6lL3', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '7dd7b3e6-c16b-42fa-bbca-ca6c9ef6fd83', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `request(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPublish(...)` +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"0ffbc5e2-7d44-40e7-9bb5-cffcb151c252","method":"transformInterceptedMessage","params":{"id":"b61f756d-af6f-439c-bb3a-f725122949e4","connectionID":"82562167-a4ba-4b82-bfd3-5af71a78572c","type":"text","data":"{\"action\":4,\"connectionId\":\"sPcgRXM-EJ\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!sPcgRXM-EJAd0LLheqfmIo-30ec\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '0ffbc5e2-7d44-40e7-9bb5-cffcb151c252', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'sPcgRXM-EJ', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message b61f756d-af6f-439c-bb3a-f725122949e4 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message b61f756d-af6f-439c-bb3a-f725122949e4 {action: 4, connectionId: 'sPcgRXM-EJ', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '0ffbc5e2-7d44-40e7-9bb5-cffcb151c252', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPublish(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPresence(...)` +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"e8176dc4-6dab-4b3a-ba35-94fe1c54a960","method":"transformInterceptedMessage","params":{"id":"06c9678e-2a76-4d30-b86b-a4fedb996b7d","connectionID":"162632c5-d822-44b6-98cf-dafb225f89e1","type":"text","data":"{\"action\":4,\"connectionId\":\"E7swLMHzzI\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!E7swLMHzzIAWtowkgHjGZl-3268\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'e8176dc4-6dab-4b3a-ba35-94fe1c54a960', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'E7swLMHzzI', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 06c9678e-2a76-4d30-b86b-a4fedb996b7d unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 06c9678e-2a76-4d30-b86b-a4fedb996b7d {action: 4, connectionId: 'E7swLMHzzI', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'e8176dc4-6dab-4b3a-ba35-94fe1c54a960', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPresence(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.revokeTokens(...)` +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"a2066269-c766-4b1e-aed3-ba4061c4d38e","method":"transformInterceptedMessage","params":{"id":"1747bf3e-3e34-440e-bfde-77cd19c98dbc","connectionID":"e335f372-842a-4aab-929b-bb240ee25bd2","type":"text","data":"{\"action\":4,\"connectionId\":\"tN7NssEhlk\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!tN7NssEhlkAaCvlV5SkjAv-3269\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'a2066269-c766-4b1e-aed3-ba4061c4d38e', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'tN7NssEhlk', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 1747bf3e-3e34-440e-bfde-77cd19c98dbc unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 1747bf3e-3e34-440e-bfde-77cd19c98dbc {action: 4, connectionId: 'tN7NssEhlk', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'a2066269-c766-4b1e-aed3-ba4061c4d38e', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.revokeTokens(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `history()` +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"30711a90-7af7-4c3a-9752-6680d14b2542","method":"transformInterceptedMessage","params":{"id":"69f5ba7f-c844-4579-b348-b1c3de2db154","connectionID":"d2bb0ee6-8a95-4fcd-bf45-2904e20c5178","type":"text","data":"{\"action\":4,\"connectionId\":\"1bI4epCxCm\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!1bI4epCxCmAfGWSuvIqrhQ-283f\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '30711a90-7af7-4c3a-9752-6680d14b2542', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: '1bI4epCxCm', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 69f5ba7f-c844-4579-b348-b1c3de2db154 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 69f5ba7f-c844-4579-b348-b1c3de2db154 {action: 4, connectionId: '1bI4epCxCm', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '30711a90-7af7-4c3a-9752-6680d14b2542', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `history()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `presence.history()` +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"93dcfeaf-55d6-4f37-b6f9-2aea5d46d19c","method":"transformInterceptedMessage","params":{"id":"3f786797-dbed-4f4d-acfb-da61bbedced9","connectionID":"db83ced7-7dc6-4370-978d-f308cb226a66","type":"text","data":"{\"action\":4,\"connectionId\":\"s1d7FNyflM\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!s1d7FNyflMAUQ9RWyOZ6pq-2840\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '93dcfeaf-55d6-4f37-b6f9-2aea5d46d19c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 's1d7FNyflM', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 3f786797-dbed-4f4d-acfb-da61bbedced9 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 3f786797-dbed-4f4d-acfb-da61bbedced9 {action: 4, connectionId: 's1d7FNyflM', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '93dcfeaf-55d6-4f37-b6f9-2aea5d46d19c', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `presence.history()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `status()` +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"0ae0ff89-c139-4ade-aa28-5db68f8e198a","method":"transformInterceptedMessage","params":{"id":"e581c9a4-92d4-4cd2-a88b-6ebf51d4d1dc","connectionID":"79ca26d7-2d12-4423-b49d-09a3bac53f31","type":"text","data":"{\"action\":4,\"connectionId\":\"VhyX3SFxLf\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!VhyX3SFxLfAeLebj7FIVRN-1bef\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '0ae0ff89-c139-4ade-aa28-5db68f8e198a', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'VhyX3SFxLf', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message e581c9a4-92d4-4cd2-a88b-6ebf51d4d1dc unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message e581c9a4-92d4-4cd2-a88b-6ebf51d4d1dc {action: 4, connectionId: 'VhyX3SFxLf', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '0ae0ff89-c139-4ade-aa28-5db68f8e198a', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `status()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest still allows publishing and subscribing +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"c3a24006-d708-4017-bd34-07f1b58785a5","method":"transformInterceptedMessage","params":{"id":"dbf0296c-3726-4f65-970a-bbaaa6d1088a","connectionID":"418c6412-5c42-4148-96f6-626f74a26577","type":"text","data":"{\"action\":4,\"connectionId\":\"HonYl1xaLQ\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!HonYl1xaLQAY7m4S-wG4ka-2740\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'c3a24006-d708-4017-bd34-07f1b58785a5', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'HonYl1xaLQ', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message dbf0296c-3726-4f65-970a-bbaaa6d1088a unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message dbf0296c-3726-4f65-970a-bbaaa6d1088a {action: 4, connectionId: 'HonYl1xaLQ', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'c3a24006-d708-4017-bd34-07f1b58785a5', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"fbee4fc9-5132-4ccf-8f57-7e95482df497","method":"transformInterceptedMessage","params":{"id":"dc90b9ad-db2c-4092-a4a8-eb579a907222","connectionID":"b732d211-8fc0-4973-9841-13ff80c3cd24","type":"text","data":"{\"action\":4,\"connectionId\":\"bpfaWBdQcV\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!bpfaWBdQcVAY9hXhWuImgw-2742\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'fbee4fc9-5132-4ccf-8f57-7e95482df497', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'bpfaWBdQcV', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message dc90b9ad-db2c-4092-a4a8-eb579a907222 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message dc90b9ad-db2c-4092-a4a8-eb579a907222 {action: 4, connectionId: 'bpfaWBdQcV', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'fbee4fc9-5132-4ccf-8f57-7e95482df497', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"5534211b-33de-411b-8d97-8d10b61189dc","method":"transformInterceptedMessage","params":{"id":"39ccb097-226e-4230-886c-06767179d011","connectionID":"e2eb011b-312e-4c39-aef0-d0c100837329","type":"text","data":"{\"action\":4,\"connectionId\":\"SWi7Z-fAJH\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!SWi7Z-fAJHAQOC8eAmuX0B-1bf3\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '5534211b-33de-411b-8d97-8d10b61189dc', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'SWi7Z-fAJH', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 39ccb097-226e-4230-886c-06767179d011 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 39ccb097-226e-4230-886c-06767179d011 {action: 4, connectionId: 'SWi7Z-fAJH', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '5534211b-33de-411b-8d97-8d10b61189dc', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"39a89cf3-4e9b-410b-aaad-b74e90716881","method":"transformInterceptedMessage","params":{"id":"7fca13c9-ce52-4e01-9ce0-a5cb8b64b550","connectionID":"9756a156-2096-4e31-9f98-bb4a1264463a","type":"text","data":"{\"action\":4,\"connectionId\":\"ixdqxYde0v\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!ixdqxYde0vAbzYP4IsGecS-1c15\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '39a89cf3-4e9b-410b-aaad-b74e90716881', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'ixdqxYde0v', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 7fca13c9-ce52-4e01-9ce0-a5cb8b64b550 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 7fca13c9-ce52-4e01-9ce0-a5cb8b64b550 {action: 4, connectionId: 'ixdqxYde0v', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '39a89cf3-4e9b-410b-aaad-b74e90716881', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"25d772cf-54c0-48e7-9c75-1908cc8b8c3e","method":"transformInterceptedMessage","params":{"id":"c627e2df-0da2-4f4e-9220-2064bdbe67d0","connectionID":"9756a156-2096-4e31-9f98-bb4a1264463a","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '25d772cf-54c0-48e7-9c75-1908cc8b8c3e', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 10, channel: 'channel'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message c627e2df-0da2-4f4e-9220-2064bdbe67d0 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message c627e2df-0da2-4f4e-9220-2064bdbe67d0 {action: 10, channel: 'channel'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '25d772cf-54c0-48e7-9c75-1908cc8b8c3e', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"1760eb6e-7f97-413c-ac7c-1fc36dba57ff","method":"transformInterceptedMessage","params":{"id":"35025ab6-475b-44db-894a-4aa832cbf2d4","connectionID":"9756a156-2096-4e31-9f98-bb4a1264463a","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973569247-0\"}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '1760eb6e-7f97-413c-ac7c-1fc36dba57ff', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973569247-0'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 35025ab6-475b-44db-894a-4aa832cbf2d4 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 35025ab6-475b-44db-894a-4aa832cbf2d4 {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973569247-0'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '1760eb6e-7f97-413c-ac7c-1fc36dba57ff', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"bc299040-e7ff-4f66-a508-dffbac277ff0","method":"transformInterceptedMessage","params":{"id":"21ff3a33-61a4-4dcc-b1d9-05ec69946dad","connectionID":"9756a156-2096-4e31-9f98-bb4a1264463a","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"encoding\":\"json\",\"data\":\"{\\\"foo\\\":\\\"bar\\\"}\"}],\"msgSerial\":0}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'bc299040-e7ff-4f66-a508-dffbac277ff0', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, channel: 'channel', messages: Array(1), msgSerial: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 21ff3a33-61a4-4dcc-b1d9-05ec69946dad unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 21ff3a33-61a4-4dcc-b1d9-05ec69946dad {action: 15, channel: 'channel', messages: Array(1), msgSerial: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'bc299040-e7ff-4f66-a508-dffbac277ff0', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"37e7cac1-b56c-4342-8a47-fbe8701e8288","method":"transformInterceptedMessage","params":{"id":"94ed34de-e22a-49d0-8c75-9a2acffc0f1a","connectionID":"9756a156-2096-4e31-9f98-bb4a1264463a","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '37e7cac1-b56c-4342-8a47-fbe8701e8288', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 1, count: 1, msgSerial: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 94ed34de-e22a-49d0-8c75-9a2acffc0f1a unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 94ed34de-e22a-49d0-8c75-9a2acffc0f1a {action: 1, count: 1, msgSerial: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '37e7cac1-b56c-4342-8a47-fbe8701e8288', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"cd824067-45a9-4639-b1b7-f85d2bebc655","method":"transformInterceptedMessage","params":{"id":"4c8da9f9-a1ab-491b-87db-b248393f3e0c","connectionID":"9756a156-2096-4e31-9f98-bb4a1264463a","type":"text","data":"{\"action\":15,\"id\":\"ixdqxYde0v:0\",\"connectionId\":\"ixdqxYde0v\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973570704-0\",\"timestamp\":1715973570704,\"messages\":[{\"encoding\":\"json\",\"data\":\"{\\\"foo\\\":\\\"bar\\\"}\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'cd824067-45a9-4639-b1b7-f85d2bebc655', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'ixdqxYde0v:0', connectionId: 'ixdqxYde0v', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973570704-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 4c8da9f9-a1ab-491b-87db-b248393f3e0c unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 4c8da9f9-a1ab-491b-87db-b248393f3e0c {action: 15, id: 'ixdqxYde0v:0', connectionId: 'ixdqxYde0v', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973570704-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'cd824067-45a9-4639-b1b7-f85d2bebc655', result: {…}} +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest still allows publishing and subscribing +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest allows `auth.createTokenRequest()` without `queryTime` option enabled +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest allows `auth.createTokenRequest()` without `queryTime` option enabled +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to use push admin functionality +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to use push admin functionality +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `time()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `time()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.createTokenRequest()` with `queryTime` option enabled +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.createTokenRequest()` with `queryTime` option enabled +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `stats()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `stats()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `request(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `request(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPublish(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPublish(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPresence(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPresence(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.revokeTokens(...)` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.revokeTokens(...)` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `history()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `history()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `presence.history()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `presence.history()` +root_hooks.js:31 START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `status()` +root_hooks.js:27 END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `status()` +root_hooks.js:31 START TEST: browser/modular Crypto standalone functions generateRandomKey +root_hooks.js:27 END TEST: browser/modular Crypto standalone functions generateRandomKey +root_hooks.js:31 START TEST: browser/modular Crypto standalone functions getDefaultCryptoParams +root_hooks.js:27 END TEST: browser/modular Crypto standalone functions getDefaultCryptoParams +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeMessage decodes a message’s data +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeMessage decodes a message’s data +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeMessage throws an error when given channel options with a cipher +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeMessage throws an error when given channel options with a cipher +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeEncryptedMessage decodes a message’s data +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeEncryptedMessage decodes a message’s data +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeEncryptedMessage decrypts a message +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeEncryptedMessage decrypts a message +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeMessages decodes messages’ data +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeMessages decodes messages’ data +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeMessages throws an error when given channel options with a cipher +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeMessages throws an error when given channel options with a cipher +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeEncryptedMessages decodes messages’ data +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeEncryptedMessages decodes messages’ data +root_hooks.js:31 START TEST: browser/modular Message standalone functions decodeEncryptedMessages decrypts messages +root_hooks.js:27 END TEST: browser/modular Message standalone functions decodeEncryptedMessages decrypts messages +root_hooks.js:31 START TEST: browser/modular Crypto without Crypto BaseRest throws an error when given channel options with a cipher +root_hooks.js:27 END TEST: browser/modular Crypto without Crypto BaseRest throws an error when given channel options with a cipher +root_hooks.js:31 START TEST: browser/modular Crypto without Crypto _BaseRealtime throws an error when given channel options with a cipher +root_hooks.js:27 END TEST: browser/modular Crypto without Crypto _BaseRealtime throws an error when given channel options with a cipher +root_hooks.js:31 START TEST: browser/modular Crypto with Crypto BaseRest is able to publish encrypted messages +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"a65be137-ea65-4988-a871-d4601f7a4a4f","method":"transformInterceptedMessage","params":{"id":"d41349c4-dcf2-4891-bd49-57358eb566b7","connectionID":"2c42e539-e952-4229-af45-b141494f7023","type":"text","data":"{\"action\":4,\"connectionId\":\"nkeXTfQHbz\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!nkeXTfQHbzAXEchmWQRMHM-30f0\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'a65be137-ea65-4988-a871-d4601f7a4a4f', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'nkeXTfQHbz', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d41349c4-dcf2-4891-bd49-57358eb566b7 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d41349c4-dcf2-4891-bd49-57358eb566b7 {action: 4, connectionId: 'nkeXTfQHbz', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'a65be137-ea65-4988-a871-d4601f7a4a4f', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"af98e064-0cd6-43c2-9575-0143b9fa50b9","method":"transformInterceptedMessage","params":{"id":"11db565f-8e4c-4bdf-bf58-ac49013ca608","connectionID":"28667c02-f1f5-465c-9713-e236c0b68614","type":"text","data":"{\"action\":4,\"connectionId\":\"4R6ExL6DHx\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!4R6ExL6DHxAevOu2D5K5v9-30f1\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'af98e064-0cd6-43c2-9575-0143b9fa50b9', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: '4R6ExL6DHx', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 11db565f-8e4c-4bdf-bf58-ac49013ca608 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 11db565f-8e4c-4bdf-bf58-ac49013ca608 {action: 4, connectionId: '4R6ExL6DHx', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'af98e064-0cd6-43c2-9575-0143b9fa50b9', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"d3b94af3-8518-4545-83e7-cbfd4a13ef23","method":"transformInterceptedMessage","params":{"id":"b188428d-e048-4bd7-8a15-8cf79bf7c980","connectionID":"4e562498-1f6e-4511-a8a9-4e683468fe75","type":"text","data":"{\"action\":4,\"connectionId\":\"iRwMm2cUTL\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!iRwMm2cUTLAaud-mJ-bVH6-3270\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'd3b94af3-8518-4545-83e7-cbfd4a13ef23', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'iRwMm2cUTL', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message b188428d-e048-4bd7-8a15-8cf79bf7c980 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message b188428d-e048-4bd7-8a15-8cf79bf7c980 {action: 4, connectionId: 'iRwMm2cUTL', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'd3b94af3-8518-4545-83e7-cbfd4a13ef23', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"ce414ea7-7c8a-4ee5-bf90-5795e59c8959","method":"transformInterceptedMessage","params":{"id":"bd0f9f4c-ec13-477b-9aea-b8cfb7887bcb","connectionID":"15d3c7c7-c92b-4be5-ab99-6bc8889b6350","type":"text","data":"{\"action\":4,\"connectionId\":\"o9yN-33Hxs\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!o9yN-33HxsAW1dqW1o0bh2-2843\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'ce414ea7-7c8a-4ee5-bf90-5795e59c8959', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'o9yN-33Hxs', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message bd0f9f4c-ec13-477b-9aea-b8cfb7887bcb unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message bd0f9f4c-ec13-477b-9aea-b8cfb7887bcb {action: 4, connectionId: 'o9yN-33Hxs', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'ce414ea7-7c8a-4ee5-bf90-5795e59c8959', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"2792104b-e620-4cf5-9738-d6e04dc9bf0d","method":"transformInterceptedMessage","params":{"id":"4172f892-2c23-4f64-90b0-43eae04adf34","connectionID":"30432a6d-cd20-45f3-b85d-49336233affe","type":"text","data":"{\"action\":4,\"connectionId\":\"OiO5OICAjX\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!OiO5OICAjXAWM4y_6Uorsw-1c16\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '2792104b-e620-4cf5-9738-d6e04dc9bf0d', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'OiO5OICAjX', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 4172f892-2c23-4f64-90b0-43eae04adf34 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 4172f892-2c23-4f64-90b0-43eae04adf34 {action: 4, connectionId: 'OiO5OICAjX', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '2792104b-e620-4cf5-9738-d6e04dc9bf0d', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"982eafb4-2cf2-4b04-b75a-f9f816011ae7","method":"transformInterceptedMessage","params":{"id":"b1cd0fad-9761-40e4-b19f-f212ebbdc2cf","connectionID":"5c6ad7ab-4f3e-4682-ba01-22ca3660ca0a","type":"text","data":"{\"action\":4,\"connectionId\":\"2i5W_qY6sX\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!2i5W_qY6sXAXdClpHM0GPn-2844\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '982eafb4-2cf2-4b04-b75a-f9f816011ae7', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: '2i5W_qY6sX', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message b1cd0fad-9761-40e4-b19f-f212ebbdc2cf unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message b1cd0fad-9761-40e4-b19f-f212ebbdc2cf {action: 4, connectionId: '2i5W_qY6sX', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '982eafb4-2cf2-4b04-b75a-f9f816011ae7', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"61d5000f-bd34-413d-a3a5-9855d7dc046c","method":"transformInterceptedMessage","params":{"id":"f07c3c36-3bee-45ec-aa6f-8f77fe2c2609","connectionID":"2ca5b342-5fbf-4936-9ac7-e2e6f6515b00","type":"text","data":"{\"action\":4,\"connectionId\":\"ldGw9IPe3X\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!ldGw9IPe3XAY_EGFdlOFhA-1c17\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '61d5000f-bd34-413d-a3a5-9855d7dc046c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'ldGw9IPe3X', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message f07c3c36-3bee-45ec-aa6f-8f77fe2c2609 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message f07c3c36-3bee-45ec-aa6f-8f77fe2c2609 {action: 4, connectionId: 'ldGw9IPe3X', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '61d5000f-bd34-413d-a3a5-9855d7dc046c', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"7f341e36-3445-4375-9691-7d02e52848eb","method":"transformInterceptedMessage","params":{"id":"b82eb451-c029-4e34-b1b6-9a0fa41502bc","connectionID":"d1f60c1f-020f-4cb9-998b-9ce29681bb0e","type":"text","data":"{\"action\":4,\"connectionId\":\"LIG-WBitcf\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!LIG-WBitcfAbWo8m81VlFZ-30f2\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '7f341e36-3445-4375-9691-7d02e52848eb', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'LIG-WBitcf', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message b82eb451-c029-4e34-b1b6-9a0fa41502bc unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message b82eb451-c029-4e34-b1b6-9a0fa41502bc {action: 4, connectionId: 'LIG-WBitcf', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '7f341e36-3445-4375-9691-7d02e52848eb', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"b0e8e4d3-cce4-4aa1-9c81-298148812354","method":"transformInterceptedMessage","params":{"id":"e01d95ca-4528-4717-b755-40478b033a08","connectionID":"7cdb4890-b428-4e55-aa47-6a4e57a1018c","type":"text","data":"{\"action\":4,\"connectionId\":\"8Z3wp9Uxe2\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!8Z3wp9Uxe2AeDy07XJ9xVX-1c18\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'b0e8e4d3-cce4-4aa1-9c81-298148812354', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: '8Z3wp9Uxe2', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message e01d95ca-4528-4717-b755-40478b033a08 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message e01d95ca-4528-4717-b755-40478b033a08 {action: 4, connectionId: '8Z3wp9Uxe2', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'b0e8e4d3-cce4-4aa1-9c81-298148812354', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"71552d70-03e2-449d-a113-f4747afd4962","method":"transformInterceptedMessage","params":{"id":"8e0f4da3-d083-40cb-a13a-1aa57a470213","connectionID":"3ab448ff-4273-4a58-99c6-1c6a67cb7f87","type":"text","data":"{\"action\":4,\"connectionId\":\"B-8_1W7J8y\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!B-8_1W7J8yAVWTUZ0MIQ5T-1c19\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '71552d70-03e2-449d-a113-f4747afd4962', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'B-8_1W7J8y', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 8e0f4da3-d083-40cb-a13a-1aa57a470213 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 8e0f4da3-d083-40cb-a13a-1aa57a470213 {action: 4, connectionId: 'B-8_1W7J8y', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '71552d70-03e2-449d-a113-f4747afd4962', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"2ef5f7ef-2788-474b-bd44-05751e3251f6","method":"transformInterceptedMessage","params":{"id":"fea9e105-8368-4de0-8632-15331ad6f244","connectionID":"ee3ef5cb-61ec-41a2-9463-6e4406b658fd","type":"text","data":"{\"action\":4,\"connectionId\":\"AXM1KTQJRK\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!AXM1KTQJRKAc6yRKh6SWQr-2746\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '2ef5f7ef-2788-474b-bd44-05751e3251f6', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'AXM1KTQJRK', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message fea9e105-8368-4de0-8632-15331ad6f244 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message fea9e105-8368-4de0-8632-15331ad6f244 {action: 4, connectionId: 'AXM1KTQJRK', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '2ef5f7ef-2788-474b-bd44-05751e3251f6', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"2d8f62af-f975-48cc-b957-b99930c1ab04","method":"transformInterceptedMessage","params":{"id":"df9129a2-d1b2-4f37-bc60-265b2dd31473","connectionID":"64058e61-f2d6-42d1-9a38-4c076a725099","type":"text","data":"{\"action\":4,\"connectionId\":\"LXGcgI0wz9\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!LXGcgI0wz9AYcEhJUTEDkY-1c1a\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '2d8f62af-f975-48cc-b957-b99930c1ab04', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'LXGcgI0wz9', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message df9129a2-d1b2-4f37-bc60-265b2dd31473 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message df9129a2-d1b2-4f37-bc60-265b2dd31473 {action: 4, connectionId: 'LXGcgI0wz9', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '2d8f62af-f975-48cc-b957-b99930c1ab04', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"838f4ce1-5232-4546-afaa-39e2d6d51070","method":"transformInterceptedMessage","params":{"id":"f0d29b24-6774-43e1-b011-5fccd8ec8777","connectionID":"26ad7d35-a092-48f6-8b34-b5e78314bd34","type":"text","data":"{\"action\":4,\"connectionId\":\"EpkgD6PR8F\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!EpkgD6PR8FAbbXImkCCzA5-30f3\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '838f4ce1-5232-4546-afaa-39e2d6d51070', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'EpkgD6PR8F', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message f0d29b24-6774-43e1-b011-5fccd8ec8777 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message f0d29b24-6774-43e1-b011-5fccd8ec8777 {action: 4, connectionId: 'EpkgD6PR8F', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '838f4ce1-5232-4546-afaa-39e2d6d51070', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"24278b88-d7b2-43ef-a02a-8dd8fad8f400","method":"transformInterceptedMessage","params":{"id":"08a0f041-6e2d-4723-b930-4be321817954","connectionID":"da02e9b5-3e31-449c-bd7f-250bab8d1e50","type":"text","data":"{\"action\":4,\"connectionId\":\"aIEfEuwPUb\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!aIEfEuwPUbAQssqNowBJ1O-3272\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '24278b88-d7b2-43ef-a02a-8dd8fad8f400', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'aIEfEuwPUb', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 08a0f041-6e2d-4723-b930-4be321817954 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 08a0f041-6e2d-4723-b930-4be321817954 {action: 4, connectionId: 'aIEfEuwPUb', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '24278b88-d7b2-43ef-a02a-8dd8fad8f400', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"d489de60-c99c-43f8-8f06-4c9bdb68eb99","method":"transformInterceptedMessage","params":{"id":"c655e852-facd-4514-a55b-24c3e1b3ae3c","connectionID":"26ad7d35-a092-48f6-8b34-b5e78314bd34","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'd489de60-c99c-43f8-8f06-4c9bdb68eb99', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 10, channel: 'channel'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message c655e852-facd-4514-a55b-24c3e1b3ae3c unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message c655e852-facd-4514-a55b-24c3e1b3ae3c {action: 10, channel: 'channel'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'd489de60-c99c-43f8-8f06-4c9bdb68eb99', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"55347b54-b1c1-4af2-bf74-2c68ddb48560","method":"transformInterceptedMessage","params":{"id":"8d05d9a6-1e5c-4489-812b-b4cc956b3127","connectionID":"26ad7d35-a092-48f6-8b34-b5e78314bd34","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973570704-0\"}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '55347b54-b1c1-4af2-bf74-2c68ddb48560', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973570704-0'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 8d05d9a6-1e5c-4489-812b-b4cc956b3127 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 8d05d9a6-1e5c-4489-812b-b4cc956b3127 {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973570704-0'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '55347b54-b1c1-4af2-bf74-2c68ddb48560', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"b5f7eb3a-3bab-4709-bc7d-a27cfba87d19","method":"transformInterceptedMessage","params":{"id":"1edc2119-7a58-4196-857c-a6f72b142d58","connectionID":"26ad7d35-a092-48f6-8b34-b5e78314bd34","type":"text","data":"{\"action\":15,\"id\":\"xw/mQ2EBJgTp\",\"connectionId\":\"\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973571730-0\",\"timestamp\":1715973571730,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"0wQGX2MnpnsWdWoZYhVHS1guJmHIyRkGAy4cr0wv9bQ=\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'b5f7eb3a-3bab-4709-bc7d-a27cfba87d19', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'xw/mQ2EBJgTp', connectionId: '', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973571730-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 1edc2119-7a58-4196-857c-a6f72b142d58 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 1edc2119-7a58-4196-857c-a6f72b142d58 {action: 15, id: 'xw/mQ2EBJgTp', connectionId: '', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973571730-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'b5f7eb3a-3bab-4709-bc7d-a27cfba87d19', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"c005d340-539e-4c9f-b259-ee1e67a3bd5f","method":"transformInterceptedMessage","params":{"id":"566f08e0-8dda-419d-aa12-4bada782f870","connectionID":"9756a156-2096-4e31-9f98-bb4a1264463a","type":"text","data":"{\"action\":15,\"id\":\"xw/mQ2EBJgTp\",\"connectionId\":\"\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973571730-0\",\"timestamp\":1715973571730,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"0wQGX2MnpnsWdWoZYhVHS1guJmHIyRkGAy4cr0wv9bQ=\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'c005d340-539e-4c9f-b259-ee1e67a3bd5f', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'xw/mQ2EBJgTp', connectionId: '', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973571730-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 566f08e0-8dda-419d-aa12-4bada782f870 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 566f08e0-8dda-419d-aa12-4bada782f870 {action: 15, id: 'xw/mQ2EBJgTp', connectionId: '', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973571730-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'c005d340-539e-4c9f-b259-ee1e67a3bd5f', result: {…}} +root_hooks.js:27 END TEST: browser/modular Crypto with Crypto BaseRest is able to publish encrypted messages +root_hooks.js:31 START TEST: browser/modular Crypto with Crypto _BaseRealtime is able to publish encrypted messages +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"4e5aad69-6e59-43c8-991e-394ceaaf812f","method":"transformInterceptedMessage","params":{"id":"444491a1-2f44-4370-87ac-d86d24eb043e","connectionID":"b70757a7-bead-4a00-b4fe-3c28d1cc1fc1","type":"text","data":"{\"action\":4,\"connectionId\":\"iIZ0ykfpY2\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!iIZ0ykfpY2AUWhIvT04XNa-2846\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '4e5aad69-6e59-43c8-991e-394ceaaf812f', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'iIZ0ykfpY2', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 444491a1-2f44-4370-87ac-d86d24eb043e unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 444491a1-2f44-4370-87ac-d86d24eb043e {action: 4, connectionId: 'iIZ0ykfpY2', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '4e5aad69-6e59-43c8-991e-394ceaaf812f', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"e805838c-a280-4c33-942a-c7607777c7dc","method":"transformInterceptedMessage","params":{"id":"910b50eb-7306-43e9-b9bd-11388e4beef5","connectionID":"b70757a7-bead-4a00-b4fe-3c28d1cc1fc1","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'e805838c-a280-4c33-942a-c7607777c7dc', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 10, channel: 'channel'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 910b50eb-7306-43e9-b9bd-11388e4beef5 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 910b50eb-7306-43e9-b9bd-11388e4beef5 {action: 10, channel: 'channel'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'e805838c-a280-4c33-942a-c7607777c7dc', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"629d87ae-2d5d-438d-bcf2-d124f1343f04","method":"transformInterceptedMessage","params":{"id":"c08028c1-c24d-4598-b53f-35347dfdfb45","connectionID":"b70757a7-bead-4a00-b4fe-3c28d1cc1fc1","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973571730-0\"}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '629d87ae-2d5d-438d-bcf2-d124f1343f04', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973571730-0'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message c08028c1-c24d-4598-b53f-35347dfdfb45 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message c08028c1-c24d-4598-b53f-35347dfdfb45 {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973571730-0'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '629d87ae-2d5d-438d-bcf2-d124f1343f04', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"350dbfc6-7409-4f68-8286-7564bd598365","method":"transformInterceptedMessage","params":{"id":"a003c00a-2f51-4405-bfd5-210f83c993ee","connectionID":"bf0e9c66-0ab4-4a21-a1fe-adcf46d4f271","type":"text","data":"{\"action\":4,\"connectionId\":\"dEvLqj3Zvt\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!dEvLqj3ZvtARvxxN70Lz2Y-3275\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '350dbfc6-7409-4f68-8286-7564bd598365', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'dEvLqj3Zvt', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message a003c00a-2f51-4405-bfd5-210f83c993ee unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message a003c00a-2f51-4405-bfd5-210f83c993ee {action: 4, connectionId: 'dEvLqj3Zvt', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '350dbfc6-7409-4f68-8286-7564bd598365', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"0eda989e-2d5a-4db6-916f-4f1b70c8e84b","method":"transformInterceptedMessage","params":{"id":"d8ed6377-ab32-4ef1-bafa-0185442f98b3","connectionID":"bf0e9c66-0ab4-4a21-a1fe-adcf46d4f271","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"name\":\"message\",\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"JO2HuY90IvmUENoM2NAIoPTHZmKNTl1mibQPmuV383E=\"}],\"msgSerial\":0}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '0eda989e-2d5a-4db6-916f-4f1b70c8e84b', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, channel: 'channel', messages: Array(1), msgSerial: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d8ed6377-ab32-4ef1-bafa-0185442f98b3 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d8ed6377-ab32-4ef1-bafa-0185442f98b3 {action: 15, channel: 'channel', messages: Array(1), msgSerial: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '0eda989e-2d5a-4db6-916f-4f1b70c8e84b', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"3cb887fc-e21e-4992-97d4-3d5ad272ddbc","method":"transformInterceptedMessage","params":{"id":"22c06406-b850-4841-96e8-5ec424326dfd","connectionID":"bf0e9c66-0ab4-4a21-a1fe-adcf46d4f271","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '3cb887fc-e21e-4992-97d4-3d5ad272ddbc', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 1, count: 1, msgSerial: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 22c06406-b850-4841-96e8-5ec424326dfd unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 22c06406-b850-4841-96e8-5ec424326dfd {action: 1, count: 1, msgSerial: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '3cb887fc-e21e-4992-97d4-3d5ad272ddbc', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"63a78702-55bc-495b-b0f4-21ed23370805","method":"transformInterceptedMessage","params":{"id":"8a226573-5d97-4672-9496-b16fb3c7bf64","connectionID":"b70757a7-bead-4a00-b4fe-3c28d1cc1fc1","type":"text","data":"{\"action\":15,\"id\":\"dEvLqj3Zvt:0\",\"connectionId\":\"dEvLqj3Zvt\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973573020-0\",\"timestamp\":1715973573020,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"JO2HuY90IvmUENoM2NAIoPTHZmKNTl1mibQPmuV383E=\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '63a78702-55bc-495b-b0f4-21ed23370805', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'dEvLqj3Zvt:0', connectionId: 'dEvLqj3Zvt', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973573020-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 8a226573-5d97-4672-9496-b16fb3c7bf64 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 8a226573-5d97-4672-9496-b16fb3c7bf64 {action: 15, id: 'dEvLqj3Zvt:0', connectionId: 'dEvLqj3Zvt', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973573020-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '63a78702-55bc-495b-b0f4-21ed23370805', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"395647e1-50c6-4838-bdb8-d74d426c3eb6","method":"transformInterceptedMessage","params":{"id":"1a4ca325-5e4d-4298-971a-c016c7ac6f8a","connectionID":"9756a156-2096-4e31-9f98-bb4a1264463a","type":"text","data":"{\"action\":15,\"id\":\"dEvLqj3Zvt:0\",\"connectionId\":\"dEvLqj3Zvt\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973573020-0\",\"timestamp\":1715973573020,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"JO2HuY90IvmUENoM2NAIoPTHZmKNTl1mibQPmuV383E=\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '395647e1-50c6-4838-bdb8-d74d426c3eb6', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'dEvLqj3Zvt:0', connectionId: 'dEvLqj3Zvt', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973573020-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 1a4ca325-5e4d-4298-971a-c016c7ac6f8a unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 1a4ca325-5e4d-4298-971a-c016c7ac6f8a {action: 15, id: 'dEvLqj3Zvt:0', connectionId: 'dEvLqj3Zvt', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973573020-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '395647e1-50c6-4838-bdb8-d74d426c3eb6', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"fdba1d1d-bfe9-4c6d-935f-422f4fdd94c1","method":"transformInterceptedMessage","params":{"id":"e31089bd-56bf-4cf6-8fd1-e809ff167ab3","connectionID":"26ad7d35-a092-48f6-8b34-b5e78314bd34","type":"text","data":"{\"action\":15,\"id\":\"dEvLqj3Zvt:0\",\"connectionId\":\"dEvLqj3Zvt\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973573020-0\",\"timestamp\":1715973573020,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"JO2HuY90IvmUENoM2NAIoPTHZmKNTl1mibQPmuV383E=\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'fdba1d1d-bfe9-4c6d-935f-422f4fdd94c1', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'dEvLqj3Zvt:0', connectionId: 'dEvLqj3Zvt', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973573020-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message e31089bd-56bf-4cf6-8fd1-e809ff167ab3 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message e31089bd-56bf-4cf6-8fd1-e809ff167ab3 {action: 15, id: 'dEvLqj3Zvt:0', connectionId: 'dEvLqj3Zvt', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973573020-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'fdba1d1d-bfe9-4c6d-935f-422f4fdd94c1', result: {…}} +root_hooks.js:27 END TEST: browser/modular Crypto with Crypto _BaseRealtime is able to publish encrypted messages +root_hooks.js:31 START TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRest uses JSON +root_hooks.js:27 END TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRest uses JSON +root_hooks.js:31 START TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRealtime uses JSON +root_hooks.js:27 END TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRealtime uses JSON +root_hooks.js:31 START TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRest uses MessagePack +root_hooks.js:27 END TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRest uses MessagePack +root_hooks.js:31 START TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRealtime uses MessagePack +root_hooks.js:27 END TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRealtime uses MessagePack +root_hooks.js:31 START TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence throws an error when attempting to access the `presence` property +root_hooks.js:27 END TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence throws an error when attempting to access the `presence` property +root_hooks.js:31 START TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence doesn’t break when it receives a PRESENCE ProtocolMessage +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"0abefdba-d525-4e5c-8692-ab58d1b69ff5","method":"transformInterceptedMessage","params":{"id":"caa2f2d5-8c2e-4ba5-8e59-43edc9115d12","connectionID":"3c2bf721-6d09-4435-9920-b89dd8170cb5","type":"text","data":"{\"action\":4,\"connectionId\":\"OqaI0kR1fW\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!OqaI0kR1fWAWQywBHz8IHb-2750\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '0abefdba-d525-4e5c-8692-ab58d1b69ff5', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'OqaI0kR1fW', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message caa2f2d5-8c2e-4ba5-8e59-43edc9115d12 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message caa2f2d5-8c2e-4ba5-8e59-43edc9115d12 {action: 4, connectionId: 'OqaI0kR1fW', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '0abefdba-d525-4e5c-8692-ab58d1b69ff5', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"03b7ed08-5239-4658-9517-c8fb2abb0621","method":"transformInterceptedMessage","params":{"id":"e63f1c47-f66b-410d-98ba-2b40dd1ef885","connectionID":"82521312-911a-450b-963f-f4f701153a78","type":"text","data":"{\"action\":4,\"connectionId\":\"fqM_MYubQD\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!fqM_MYubQDAf4vxPd6moUW-1c1d\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '03b7ed08-5239-4658-9517-c8fb2abb0621', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'fqM_MYubQD', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message e63f1c47-f66b-410d-98ba-2b40dd1ef885 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message e63f1c47-f66b-410d-98ba-2b40dd1ef885 {action: 4, connectionId: 'fqM_MYubQD', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '03b7ed08-5239-4658-9517-c8fb2abb0621', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"e4349ef8-0b46-40a1-8e76-e09ca894f865","method":"transformInterceptedMessage","params":{"id":"1c48c834-6718-4187-a852-745a68115546","connectionID":"82521312-911a-450b-963f-f4f701153a78","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'e4349ef8-0b46-40a1-8e76-e09ca894f865', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 10, channel: 'channel'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 1c48c834-6718-4187-a852-745a68115546 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 1c48c834-6718-4187-a852-745a68115546 {action: 10, channel: 'channel'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'e4349ef8-0b46-40a1-8e76-e09ca894f865', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"bd59f747-e203-40fc-8b86-e3766af916a4","method":"transformInterceptedMessage","params":{"id":"bca318b4-028a-4fd9-9bf8-53574d8a9ec2","connectionID":"82521312-911a-450b-963f-f4f701153a78","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973573020-0\"}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'bd59f747-e203-40fc-8b86-e3766af916a4', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973573020-0'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message bca318b4-028a-4fd9-9bf8-53574d8a9ec2 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message bca318b4-028a-4fd9-9bf8-53574d8a9ec2 {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973573020-0'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'bd59f747-e203-40fc-8b86-e3766af916a4', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"eeb9694e-7a0f-4edb-a53e-2ca5eda3d84b","method":"transformInterceptedMessage","params":{"id":"783541a9-8bdb-42e3-b32a-bc5c3e37d3bc","connectionID":"c101d49d-c862-4d48-b9ae-bb7d76ce9fd4","type":"text","data":"{\"action\":4,\"connectionId\":\"cucYdmrmiW\",\"connectionDetails\":{\"clientId\":\"6395192366358495\",\"connectionKey\":\"e7dbIQeoABc0Cm!cucYdmrmiWAY6eOtBnQuYv-2752\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'eeb9694e-7a0f-4edb-a53e-2ca5eda3d84b', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: 'cucYdmrmiW', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 783541a9-8bdb-42e3-b32a-bc5c3e37d3bc unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 783541a9-8bdb-42e3-b32a-bc5c3e37d3bc {action: 4, connectionId: 'cucYdmrmiW', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'eeb9694e-7a0f-4edb-a53e-2ca5eda3d84b', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"d587e30b-81aa-4174-9bdc-2ce458386c4e","method":"transformInterceptedMessage","params":{"id":"0d112b5e-20f4-4f46-9ad3-2bb604326d28","connectionID":"c101d49d-c862-4d48-b9ae-bb7d76ce9fd4","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"name\":\"message\",\"data\":\"body\"}],\"msgSerial\":0}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'd587e30b-81aa-4174-9bdc-2ce458386c4e', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, channel: 'channel', messages: Array(1), msgSerial: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 0d112b5e-20f4-4f46-9ad3-2bb604326d28 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 0d112b5e-20f4-4f46-9ad3-2bb604326d28 {action: 15, channel: 'channel', messages: Array(1), msgSerial: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'd587e30b-81aa-4174-9bdc-2ce458386c4e', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"bb68135b-a0fa-488e-81ee-e669ac01260c","method":"transformInterceptedMessage","params":{"id":"1965e1ba-22ce-43fa-afec-ec9fab259fd8","connectionID":"26ad7d35-a092-48f6-8b34-b5e78314bd34","type":"text","data":"{\"action\":15,\"id\":\"cucYdmrmiW:0\",\"connectionId\":\"cucYdmrmiW\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973574432-0\",\"timestamp\":1715973574432,\"messages\":[{\"clientId\":\"6395192366358495\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'bb68135b-a0fa-488e-81ee-e669ac01260c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'cucYdmrmiW:0', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574432-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 1965e1ba-22ce-43fa-afec-ec9fab259fd8 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 1965e1ba-22ce-43fa-afec-ec9fab259fd8 {action: 15, id: 'cucYdmrmiW:0', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574432-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'bb68135b-a0fa-488e-81ee-e669ac01260c', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"82f5c8a2-5eaf-43e1-b628-bbc7b5b31214","method":"transformInterceptedMessage","params":{"id":"ef92abe2-456d-4d58-a4a2-72e2573a7e97","connectionID":"c101d49d-c862-4d48-b9ae-bb7d76ce9fd4","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '82f5c8a2-5eaf-43e1-b628-bbc7b5b31214', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 1, count: 1, msgSerial: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message ef92abe2-456d-4d58-a4a2-72e2573a7e97 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message ef92abe2-456d-4d58-a4a2-72e2573a7e97 {action: 1, count: 1, msgSerial: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '82f5c8a2-5eaf-43e1-b628-bbc7b5b31214', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"8350a7af-777f-435a-bf9a-bf147a657f1a","method":"transformInterceptedMessage","params":{"id":"8320692a-7421-40c3-bd41-9fbe0a9ac8d6","connectionID":"82521312-911a-450b-963f-f4f701153a78","type":"text","data":"{\"action\":15,\"id\":\"cucYdmrmiW:0\",\"connectionId\":\"cucYdmrmiW\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973574432-0\",\"timestamp\":1715973574432,\"messages\":[{\"clientId\":\"6395192366358495\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '8350a7af-777f-435a-bf9a-bf147a657f1a', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'cucYdmrmiW:0', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574432-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 8320692a-7421-40c3-bd41-9fbe0a9ac8d6 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 8320692a-7421-40c3-bd41-9fbe0a9ac8d6 {action: 15, id: 'cucYdmrmiW:0', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574432-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '8350a7af-777f-435a-bf9a-bf147a657f1a', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"60c13152-79dd-4bfc-a57e-707cbed4216d","method":"transformInterceptedMessage","params":{"id":"b650b845-b48c-43a0-a2e5-cda7d1de34f4","connectionID":"b70757a7-bead-4a00-b4fe-3c28d1cc1fc1","type":"text","data":"{\"action\":15,\"id\":\"cucYdmrmiW:0\",\"connectionId\":\"cucYdmrmiW\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973574432-0\",\"timestamp\":1715973574432,\"messages\":[{\"clientId\":\"6395192366358495\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '60c13152-79dd-4bfc-a57e-707cbed4216d', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'cucYdmrmiW:0', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574432-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message b650b845-b48c-43a0-a2e5-cda7d1de34f4 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message b650b845-b48c-43a0-a2e5-cda7d1de34f4 {action: 15, id: 'cucYdmrmiW:0', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574432-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '60c13152-79dd-4bfc-a57e-707cbed4216d', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"d555b415-3c7d-4512-be4e-67928e47e0ab","method":"transformInterceptedMessage","params":{"id":"f55ce571-640e-4b3e-9d7e-6cc64ee6a357","connectionID":"9756a156-2096-4e31-9f98-bb4a1264463a","type":"text","data":"{\"action\":15,\"id\":\"cucYdmrmiW:0\",\"connectionId\":\"cucYdmrmiW\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973574432-0\",\"timestamp\":1715973574432,\"messages\":[{\"clientId\":\"6395192366358495\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'd555b415-3c7d-4512-be4e-67928e47e0ab', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 15, id: 'cucYdmrmiW:0', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574432-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message f55ce571-640e-4b3e-9d7e-6cc64ee6a357 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message f55ce571-640e-4b3e-9d7e-6cc64ee6a357 {action: 15, id: 'cucYdmrmiW:0', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574432-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'd555b415-3c7d-4512-be4e-67928e47e0ab', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"1e091413-13b0-480b-a21a-44fe2bd3ccb1","method":"transformInterceptedMessage","params":{"id":"1583749c-7db3-47c8-8c1a-43a0a0df796c","connectionID":"c101d49d-c862-4d48-b9ae-bb7d76ce9fd4","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '1e091413-13b0-480b-a21a-44fe2bd3ccb1', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 10, channel: 'channel'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 1583749c-7db3-47c8-8c1a-43a0a0df796c unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 1583749c-7db3-47c8-8c1a-43a0a0df796c {action: 10, channel: 'channel'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '1e091413-13b0-480b-a21a-44fe2bd3ccb1', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"2f6c27a1-fe94-4451-917b-71af2c16d452","method":"transformInterceptedMessage","params":{"id":"313de074-4661-4994-8dfb-a26f417bef3e","connectionID":"c101d49d-c862-4d48-b9ae-bb7d76ce9fd4","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973574432-0\"}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '2f6c27a1-fe94-4451-917b-71af2c16d452', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574432-0'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 313de074-4661-4994-8dfb-a26f417bef3e unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 313de074-4661-4994-8dfb-a26f417bef3e {action: 11, flags: 983104, channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574432-0'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '2f6c27a1-fe94-4451-917b-71af2c16d452', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"12dfdcf7-52a7-47db-a46f-6796f73894ea","method":"transformInterceptedMessage","params":{"id":"545309e8-85e7-4421-b10c-db04e1084df8","connectionID":"c101d49d-c862-4d48-b9ae-bb7d76ce9fd4","type":"text","data":"{\"action\":14,\"channel\":\"channel\",\"presence\":[{\"action\":2}],\"msgSerial\":1}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '12dfdcf7-52a7-47db-a46f-6796f73894ea', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 14, channel: 'channel', presence: Array(1), msgSerial: 1} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 545309e8-85e7-4421-b10c-db04e1084df8 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 545309e8-85e7-4421-b10c-db04e1084df8 {action: 14, channel: 'channel', presence: Array(1), msgSerial: 1} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '12dfdcf7-52a7-47db-a46f-6796f73894ea', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"8ecc6758-4791-4e87-b5b0-bb8ed9801940","method":"transformInterceptedMessage","params":{"id":"5585037a-cdba-4fcd-adf6-a4d73c3c4d64","connectionID":"82521312-911a-450b-963f-f4f701153a78","type":"text","data":"{\"action\":14,\"id\":\"cucYdmrmiW:1\",\"connectionId\":\"cucYdmrmiW\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973574686-0\",\"timestamp\":1715973574686,\"presence\":[{\"id\":\"cucYdmrmiW:1:0\",\"clientId\":\"6395192366358495\",\"connectionId\":\"cucYdmrmiW\",\"timestamp\":1715973574686,\"action\":2}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '8ecc6758-4791-4e87-b5b0-bb8ed9801940', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 14, id: 'cucYdmrmiW:1', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574686-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 5585037a-cdba-4fcd-adf6-a4d73c3c4d64 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 5585037a-cdba-4fcd-adf6-a4d73c3c4d64 {action: 14, id: 'cucYdmrmiW:1', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574686-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '8ecc6758-4791-4e87-b5b0-bb8ed9801940', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"741fae21-4b92-451a-bea7-b5b0c8f943e8","method":"transformInterceptedMessage","params":{"id":"fdb5c219-07f3-461c-9bbf-5c1eb1e78547","connectionID":"26ad7d35-a092-48f6-8b34-b5e78314bd34","type":"text","data":"{\"action\":14,\"id\":\"cucYdmrmiW:1\",\"connectionId\":\"cucYdmrmiW\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973574686-0\",\"timestamp\":1715973574686,\"presence\":[{\"id\":\"cucYdmrmiW:1:0\",\"clientId\":\"6395192366358495\",\"connectionId\":\"cucYdmrmiW\",\"timestamp\":1715973574686,\"action\":2}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '741fae21-4b92-451a-bea7-b5b0c8f943e8', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 14, id: 'cucYdmrmiW:1', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574686-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message fdb5c219-07f3-461c-9bbf-5c1eb1e78547 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message fdb5c219-07f3-461c-9bbf-5c1eb1e78547 {action: 14, id: 'cucYdmrmiW:1', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574686-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '741fae21-4b92-451a-bea7-b5b0c8f943e8', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"05985a0c-13d2-4d69-8055-e9b4facc9ee3","method":"transformInterceptedMessage","params":{"id":"dbe29800-0f51-48ad-a66b-b64153bb6853","connectionID":"b70757a7-bead-4a00-b4fe-3c28d1cc1fc1","type":"text","data":"{\"action\":14,\"id\":\"cucYdmrmiW:1\",\"connectionId\":\"cucYdmrmiW\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973574686-0\",\"timestamp\":1715973574686,\"presence\":[{\"id\":\"cucYdmrmiW:1:0\",\"clientId\":\"6395192366358495\",\"connectionId\":\"cucYdmrmiW\",\"timestamp\":1715973574686,\"action\":2}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '05985a0c-13d2-4d69-8055-e9b4facc9ee3', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 14, id: 'cucYdmrmiW:1', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574686-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message dbe29800-0f51-48ad-a66b-b64153bb6853 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message dbe29800-0f51-48ad-a66b-b64153bb6853 {action: 14, id: 'cucYdmrmiW:1', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574686-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '05985a0c-13d2-4d69-8055-e9b4facc9ee3', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"116b714e-5c2f-4c5a-bd0b-6263361efe15","method":"transformInterceptedMessage","params":{"id":"68ad5a00-5225-4833-9d1a-a4768b6a9c99","connectionID":"9756a156-2096-4e31-9f98-bb4a1264463a","type":"text","data":"{\"action\":14,\"id\":\"cucYdmrmiW:1\",\"connectionId\":\"cucYdmrmiW\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973574686-0\",\"timestamp\":1715973574686,\"presence\":[{\"id\":\"cucYdmrmiW:1:0\",\"clientId\":\"6395192366358495\",\"connectionId\":\"cucYdmrmiW\",\"timestamp\":1715973574686,\"action\":2}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '116b714e-5c2f-4c5a-bd0b-6263361efe15', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 14, id: 'cucYdmrmiW:1', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574686-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 68ad5a00-5225-4833-9d1a-a4768b6a9c99 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 68ad5a00-5225-4833-9d1a-a4768b6a9c99 {action: 14, id: 'cucYdmrmiW:1', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574686-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '116b714e-5c2f-4c5a-bd0b-6263361efe15', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"6be38eb5-b756-4938-97d3-67bd506eae64","method":"transformInterceptedMessage","params":{"id":"1b234a4e-5bd5-44dd-9813-b3522239f057","connectionID":"c101d49d-c862-4d48-b9ae-bb7d76ce9fd4","type":"text","data":"{\"action\":14,\"id\":\"cucYdmrmiW:1\",\"connectionId\":\"cucYdmrmiW\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973574686-0\",\"timestamp\":1715973574686,\"presence\":[{\"id\":\"cucYdmrmiW:1:0\",\"clientId\":\"6395192366358495\",\"connectionId\":\"cucYdmrmiW\",\"timestamp\":1715973574686,\"action\":2}]}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '6be38eb5-b756-4938-97d3-67bd506eae64', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 14, id: 'cucYdmrmiW:1', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574686-0', …} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 1b234a4e-5bd5-44dd-9813-b3522239f057 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 1b234a4e-5bd5-44dd-9813-b3522239f057 {action: 14, id: 'cucYdmrmiW:1', connectionId: 'cucYdmrmiW', channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574686-0', …} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '6be38eb5-b756-4938-97d3-67bd506eae64', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"7f5d1922-70a2-486c-bd03-af0a04444368","method":"transformInterceptedMessage","params":{"id":"afa3b124-8c87-412b-b818-0b5ffd08fdcd","connectionID":"c101d49d-c862-4d48-b9ae-bb7d76ce9fd4","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":1}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '7f5d1922-70a2-486c-bd03-af0a04444368', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 1, count: 1, msgSerial: 1} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message afa3b124-8c87-412b-b818-0b5ffd08fdcd unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message afa3b124-8c87-412b-b818-0b5ffd08fdcd {action: 1, count: 1, msgSerial: 1} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '7f5d1922-70a2-486c-bd03-af0a04444368', result: {…}} +root_hooks.js:27 END TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence doesn’t break when it receives a PRESENCE ProtocolMessage +root_hooks.js:31 START TEST: browser/modular RealtimePresence BaseRealtime with RealtimePresence offers realtime presence functionality +modular.test.js:580 rxChannel: Ably: BaseClient(): initialized with clientOptions {"environment":"sandbox","port":80,"tlsPort":443,"tls":true,"logLevel":4,"plugins":{"RealtimePresence":{}},"key":"_tmp_-mDp8g.YFggfw:xCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms"} +modular.test.js:580 rxChannel: Ably: BaseClient(): started; version = 2.0.4 +modular.test.js:580 rxChannel: Ably: Auth(): anonymous, using basic auth +modular.test.js:580 rxChannel: Ably: Realtime(): +modular.test.js:580 rxChannel: Ably: Realtime.ConnectionManager(): started +modular.test.js:580 rxChannel: Ably: Realtime.ConnectionManager(): requested transports = [xhr_polling,web_socket] +modular.test.js:580 rxChannel: Ably: Realtime.ConnectionManager(): available transports = [web_socket] +modular.test.js:580 rxChannel: Ably: Realtime.ConnectionManager(): http hosts = [sandbox-rest.ably.io] +modular.test.js:580 rxChannel: Ably: Realtime.connect(): +modular.test.js:580 rxChannel: Ably: Connection.connect(): +modular.test.js:580 rxChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: initialized +modular.test.js:580 rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:580 rxChannel: Ably: Connection state: connecting +modular.test.js:580 rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined +modular.test.js:580 rxChannel: Ably: RealtimeChannel(): started; name = channel +modular.test.js:592 txChannel: Ably: BaseClient(): initialized with clientOptions {"environment":"sandbox","port":80,"tlsPort":443,"tls":true,"logLevel":4,"clientId":"783025333487996","plugins":{"RealtimePresence":{}},"key":"_tmp_-mDp8g.YFggfw:xCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms"} +modular.test.js:592 txChannel: Ably: BaseClient(): started; version = 2.0.4 +modular.test.js:592 txChannel: Ably: Auth(): anonymous, using basic auth +modular.test.js:592 txChannel: Ably: Realtime(): +modular.test.js:592 txChannel: Ably: Realtime.ConnectionManager(): started +modular.test.js:592 txChannel: Ably: Realtime.ConnectionManager(): requested transports = [xhr_polling,web_socket] +modular.test.js:592 txChannel: Ably: Realtime.ConnectionManager(): available transports = [web_socket] +modular.test.js:592 txChannel: Ably: Realtime.ConnectionManager(): http hosts = [sandbox-rest.ably.io] +modular.test.js:592 txChannel: Ably: Realtime.connect(): +modular.test.js:592 txChannel: Ably: Connection.connect(): +modular.test.js:592 txChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: initialized +modular.test.js:592 txChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:592 txChannel: Ably: Connection state: connecting +modular.test.js:592 txChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined +modular.test.js:592 txChannel: Ably: RealtimeChannel(): started; name = channel +modular.test.js:607 LAWRENCE: begin waiting for presence subscribe +modular.test.js:580 rxChannel: Ably: RealtimeChannel.requestState: name = channel, state = attaching +modular.test.js:580 rxChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = initialized, notifying state attaching +modular.test.js:580 rxChannel: Ably: Channel state for channel "channel": attaching +modular.test.js:580 rxChannel: Ably: RealtimeChannel.checkPendingState: sendEvents is false; state is connecting +modular.test.js:580 rxChannel: Ably: ConnectionManager.startConnect(): starting connection +modular.test.js:580 rxChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting +modular.test.js:580 rxChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] +modular.test.js:580 rxChannel: Ably: ConnectionManager.connectWs(): undefined +modular.test.js:580 rxChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket +modular.test.js:580 rxChannel: Ably: ConnectionManager.tryATransport(): trying web_socket +modular.test.js:580 rxChannel: Ably: WebSocketTransport.connect(): starting +modular.test.js:580 rxChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ +modular.test.js:580 rxChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_-mDp8g.YFggfw:xCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms; err: null +modular.test.js:580 rxChannel: Ably: WebSocketTransport.createWebSocket(): uri:wss://sandbox-realtime.ably.io:443/?key=_tmp_-mDp8g.YFggfw%3AxCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:592 txChannel: Ably: ConnectionManager.startConnect(): starting connection +modular.test.js:592 txChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting +modular.test.js:592 txChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] +modular.test.js:592 txChannel: Ably: ConnectionManager.connectWs(): undefined +modular.test.js:592 txChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket +modular.test.js:592 txChannel: Ably: ConnectionManager.tryATransport(): trying web_socket +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): starting +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ +modular.test.js:592 txChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_-mDp8g.YFggfw:xCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms; err: null +modular.test.js:592 txChannel: Ably: WebSocketTransport.createWebSocket(): uri:wss://sandbox-realtime.ably.io:443/?key=_tmp_-mDp8g.YFggfw%3AxCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms&clientId=783025333487996&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:580 rxChannel: Ably: WebSocketTransport.onWsOpen(): opened WebSocket +modular.test.js:580 rxChannel: Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_-mDp8g.YFggfw%3AxCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:580 rxChannel: Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending +modular.test.js:580 rxChannel: Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_-mDp8g.YFggfw%3AxCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = clean +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"da308bf1-0d66-41be-80e2-feb210b3f75c","method":"transformInterceptedMessage","params":{"id":"9fdb0c8c-9c86-4a83-a529-cea9bfc577f0","connectionID":"9af9348c-17b9-408f-8647-4a58a68fea25","type":"text","data":"{\"action\":4,\"connectionId\":\"3g_SVgjirR\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!3g_SVgjirRAUtvni_82zFX-1c23\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'da308bf1-0d66-41be-80e2-feb210b3f75c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 4, connectionId: '3g_SVgjirR', connectionDetails: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 9fdb0c8c-9c86-4a83-a529-cea9bfc577f0 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 9fdb0c8c-9c86-4a83-a529-cea9bfc577f0 {action: 4, connectionId: '3g_SVgjirR', connectionDetails: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'da308bf1-0d66-41be-80e2-feb210b3f75c', result: {…}} +modular.test.js:580 rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 354; type = string +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=CONNECTED; connectionId=3g_SVgjirR]; connectionId = undefined +modular.test.js:580 rxChannel: Ably: ConnectionManager.activateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_-mDp8g.YFggfw%3AxCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:580 rxChannel: Ably: ConnectionManager.activateTransport(): connectionId = 3g_SVgjirR +modular.test.js:580 rxChannel: Ably: ConnectionManager.activateTransport(): connectionDetails = {"clientId":"*","connectionKey":"e7dNIPVFABc0Ei!3g_SVgjirRAUtvni_82zFX-1c23","maxMessageSize":16384,"maxInboundRate":250,"maxOutboundRate":100,"maxFrameSize":262144,"serverId":"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei","connectionStateTtl":120000,"maxIdleInterval":15000} +modular.test.js:580 rxChannel: Ably: ConnectionManager.activateTransport(): current state = connecting +modular.test.js:580 rxChannel: Ably: ConnectionManager.setConnection(): New connectionId; reattaching any attached channels +modular.test.js:580 rxChannel: Ably: ConnectionManager.notifyState(): new state: connected +modular.test.js:580 rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:580 rxChannel: Ably: Connection state: connected +modular.test.js:580 rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: connected; reason = undefined +modular.test.js:580 rxChannel: Ably: ConnectionManager.sendQueuedMessages(): sending 0 queued messages +modular.test.js:580 rxChannel: Ably: RealtimeChannel.checkPendingState: name = channel, state = attaching +modular.test.js:580 rxChannel: Ably: RealtimeChannel.attachImpl(): sending ATTACH message +modular.test.js:580 rxChannel: Ably: ConnectionManager.send(): sending event +modular.test.js:580 rxChannel: Ably: Protocol.send(): sending msg; [ProtocolMessage; action=ATTACH; channel=channel] +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"a7b21aea-f700-40b3-bcad-f7e7da6a2cf8","method":"transformInterceptedMessage","params":{"id":"26a60405-76f6-4f41-a149-3a7f4873c19a","connectionID":"9af9348c-17b9-408f-8647-4a58a68fea25","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'a7b21aea-f700-40b3-bcad-f7e7da6a2cf8', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 10, channel: 'channel'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 26a60405-76f6-4f41-a149-3a7f4873c19a unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 26a60405-76f6-4f41-a149-3a7f4873c19a {action: 10, channel: 'channel'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'a7b21aea-f700-40b3-bcad-f7e7da6a2cf8', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"7b910ee2-56dd-48a1-9236-eac8b1911b24","method":"transformInterceptedMessage","params":{"id":"e4d40569-3dc8-46fd-8886-239147277b5d","connectionID":"9af9348c-17b9-408f-8647-4a58a68fea25","type":"text","data":"{\"action\":11,\"flags\":983105,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq76553928@1715973574686-0\"}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '7b910ee2-56dd-48a1-9236-eac8b1911b24', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 11, flags: 983105, channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574686-0'} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message e4d40569-3dc8-46fd-8886-239147277b5d unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message e4d40569-3dc8-46fd-8886-239147277b5d {action: 11, flags: 983105, channel: 'channel', channelSerial: 'e7dP5PvyABc0Cq76553928@1715973574686-0'} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '7b910ee2-56dd-48a1-9236-eac8b1911b24', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"df212e45-3804-44cd-99b2-62f018a778d4","method":"transformInterceptedMessage","params":{"id":"acf13831-bf4c-4ec9-8e04-d0be615667d2","connectionID":"9af9348c-17b9-408f-8647-4a58a68fea25","type":"text","data":"{\"action\":16,\"channel\":\"channel\",\"channelSerial\":\"e7dNIPVFABc0Ei98690144:\",\"presence\":[{\"id\":\"cucYdmrmiW:1:0\",\"clientId\":\"6395192366358495\",\"connectionId\":\"cucYdmrmiW\",\"timestamp\":1715973574686,\"action\":1}],\"count\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'df212e45-3804-44cd-99b2-62f018a778d4', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 16, channel: 'channel', channelSerial: 'e7dNIPVFABc0Ei98690144:', presence: Array(1), count: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message acf13831-bf4c-4ec9-8e04-d0be615667d2 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message acf13831-bf4c-4ec9-8e04-d0be615667d2 {action: 16, channel: 'channel', channelSerial: 'e7dNIPVFABc0Ei98690144:', presence: Array(1), count: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'df212e45-3804-44cd-99b2-62f018a778d4', result: {…}} +modular.test.js:580 rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 105; type = string +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ATTACHED; channel=channel; channelSerial=e7dP5PvyABc0Cq76553928@1715973574686-0; flags=HAS_PRESENCE,PRESENCE,PUBLISH,SUBSCRIBE,PRESENCE_SUBSCRIBE]; connectionId = 3g_SVgjirR +modular.test.js:580 rxChannel: Ably: RealtimeChannel.setChannelSerial(): Updating channel serial; serial = e7dP5PvyABc0Cq76553928@1715973574686-0; previous = undefined +modular.test.js:580 rxChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = attaching, notifying state attached +modular.test.js:580 rxChannel: Ably: RealtimePresence.onAttached(): channel = channel, hasPresence = true +modular.test.js:580 rxChannel: Ably: PresenceMap.startSync(): channel = channel; syncInProgress = false +modular.test.js:580 rxChannel: Ably: PresenceMap.setInProgress(): inProgress = true +modular.test.js:580 rxChannel: Ably: Channel state for channel "channel": attached +modular.test.js:580 rxChannel: Ably: RealtimeChannel.onAttached: activating channel; name = channel +modular.test.js:609 LAWRENCE: end waiting for presence subscribe +modular.test.js:610 LAWRENCE: begin waiting for presence enter +modular.test.js:611 LAWRENCE: txChannel.presence.enter is ƒ async enter(data) { + logger_default.logAction(this.logger, logger_default.LOG_DEBUG, "RealtimePresence.enter"); + if (isAnonymousOrWildcard(this)) { + throw new ErrorInfo("clientId must be s… +modular.test.js:592 txChannel: Ably: RealtimePresence.enter: undefined +modular.test.js:592 txChannel: Ably: RealtimePresence._enterOrUpdateClient: undefined +modular.test.js:592 txChannel: Ably: RealtimePresence.enterClient(): channel = channel, id = undefined, client = (implicit) 783025333487996 +modular.test.js:592 txChannel: Ably: RealtimeChannel.requestState: name = channel, state = attaching +modular.test.js:592 txChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = initialized, notifying state attaching +modular.test.js:592 txChannel: Ably: Channel state for channel "channel": attaching +modular.test.js:592 txChannel: Ably: RealtimeChannel.checkPendingState: sendEvents is false; state is connecting +modular.test.js:580 rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 217; type = string +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=SYNC; channel=channel; channelSerial=e7dNIPVFABc0Ei98690144:; count=0; presence=[ [PresenceMessage; action=present; id=cucYdmrmiW:1:0; timestamp=1715973574686; clientId=6395192366358495; connectionId=cucYdmrmiW] ]]; connectionId = 3g_SVgjirR +modular.test.js:580 rxChannel: Ably: RealtimePresence.setPresence(): received presence for 1 participants; syncChannelSerial = e7dNIPVFABc0Ei98690144: +modular.test.js:580 rxChannel: Ably: PresenceMap.startSync(): channel = channel; syncInProgress = true +modular.test.js:580 rxChannel: Ably: PresenceMap.endSync(): channel = channel; syncInProgress = true +modular.test.js:580 rxChannel: Ably: PresenceMap.setInProgress(): inProgress = false +modular.test.js:592 txChannel: Ably: ConnectionManager WebSocket slow timer: checking connectivity +modular.test.js:592 txChannel: Ably: (Fetch)Http.checkConnectivity(): Sending; https://internet-up.ably-realtime.com/is-the-internet-up.txt +modular.test.js:592 txChannel: Ably: (Fetch)Http.checkConnectivity(): Result: true +modular.test.js:592 txChannel: Ably: ConnectionManager WebSocket slow timer: http connectivity check succeeded +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"22c24873-6889-4f66-a488-2febcc60954c","method":"transformInterceptedMessage","params":{"id":"ca0da23c-6784-4af3-9325-ac5537bde6fa","connectionID":"31f0c7d3-133c-4bc3-9297-c198f559fed0","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '22c24873-6889-4f66-a488-2febcc60954c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message ca0da23c-6784-4af3-9325-ac5537bde6fa unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message ca0da23c-6784-4af3-9325-ac5537bde6fa {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '22c24873-6889-4f66-a488-2febcc60954c', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"2417686f-5c88-4691-ba63-a0219e4267dc","method":"transformInterceptedMessage","params":{"id":"bfa992b6-4b6c-42a9-baa6-97e3f0068a95","connectionID":"6850246b-8d36-4d88-b751-04867a4bf5ac","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '2417686f-5c88-4691-ba63-a0219e4267dc', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message bfa992b6-4b6c-42a9-baa6-97e3f0068a95 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message bfa992b6-4b6c-42a9-baa6-97e3f0068a95 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '2417686f-5c88-4691-ba63-a0219e4267dc', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"839a0580-9eb6-47af-a2f2-c1d38713bc69","method":"transformInterceptedMessage","params":{"id":"11af65b4-02b7-457c-a271-534b3c514720","connectionID":"82562167-a4ba-4b82-bfd3-5af71a78572c","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '839a0580-9eb6-47af-a2f2-c1d38713bc69', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 11af65b4-02b7-457c-a271-534b3c514720 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 11af65b4-02b7-457c-a271-534b3c514720 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '839a0580-9eb6-47af-a2f2-c1d38713bc69', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"055b3868-e173-4454-8ce0-c34954a06690","method":"transformInterceptedMessage","params":{"id":"2fba6a95-7c03-493d-bc1b-957829bbcda8","connectionID":"162632c5-d822-44b6-98cf-dafb225f89e1","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '055b3868-e173-4454-8ce0-c34954a06690', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 2fba6a95-7c03-493d-bc1b-957829bbcda8 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 2fba6a95-7c03-493d-bc1b-957829bbcda8 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '055b3868-e173-4454-8ce0-c34954a06690', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"38da2b05-5a08-46ca-a769-e3e722e76e45","method":"transformInterceptedMessage","params":{"id":"df4705ff-815f-4c5e-98d8-661b4dbc27b7","connectionID":"e335f372-842a-4aab-929b-bb240ee25bd2","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '38da2b05-5a08-46ca-a769-e3e722e76e45', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message df4705ff-815f-4c5e-98d8-661b4dbc27b7 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message df4705ff-815f-4c5e-98d8-661b4dbc27b7 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '38da2b05-5a08-46ca-a769-e3e722e76e45', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"6a7b97d6-6c3e-419f-879a-9cd8c4ad25bd","method":"transformInterceptedMessage","params":{"id":"c647c16e-aec6-4175-b7dd-8fefcb4f8fe5","connectionID":"d2bb0ee6-8a95-4fcd-bf45-2904e20c5178","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '6a7b97d6-6c3e-419f-879a-9cd8c4ad25bd', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message c647c16e-aec6-4175-b7dd-8fefcb4f8fe5 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message c647c16e-aec6-4175-b7dd-8fefcb4f8fe5 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '6a7b97d6-6c3e-419f-879a-9cd8c4ad25bd', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"abb5e8f0-7c34-485c-a468-a032b6fe16e7","method":"transformInterceptedMessage","params":{"id":"4248a190-eba9-4b2b-8c9f-68358800dcc1","connectionID":"db83ced7-7dc6-4370-978d-f308cb226a66","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'abb5e8f0-7c34-485c-a468-a032b6fe16e7', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 4248a190-eba9-4b2b-8c9f-68358800dcc1 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 4248a190-eba9-4b2b-8c9f-68358800dcc1 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'abb5e8f0-7c34-485c-a468-a032b6fe16e7', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"7f425c48-c981-4535-8d73-09b09daedccc","method":"transformInterceptedMessage","params":{"id":"38457038-a041-48fb-aa51-f45fcdfb037a","connectionID":"79ca26d7-2d12-4423-b49d-09a3bac53f31","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '7f425c48-c981-4535-8d73-09b09daedccc', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 38457038-a041-48fb-aa51-f45fcdfb037a unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 38457038-a041-48fb-aa51-f45fcdfb037a {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '7f425c48-c981-4535-8d73-09b09daedccc', result: {…}} +root_hooks.js:27 END TEST: browser/modular RealtimePresence BaseRealtime with RealtimePresence offers realtime presence functionality +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"ec0f21ae-7fa9-4343-92cf-3dae28afa2b0","method":"transformInterceptedMessage","params":{"id":"a34963ec-abe1-4f03-96d6-86897a24dd41","connectionID":"418c6412-5c42-4148-96f6-626f74a26577","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'ec0f21ae-7fa9-4343-92cf-3dae28afa2b0', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message a34963ec-abe1-4f03-96d6-86897a24dd41 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message a34963ec-abe1-4f03-96d6-86897a24dd41 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'ec0f21ae-7fa9-4343-92cf-3dae28afa2b0', result: {…}} +modular.test.js:592 txChannel: Ably: ConnectionManager WebSocket give up timer: websocket connection took more than 10s; +modular.test.js:592 txChannel: Ably: ConnectionManager WebSocket give up timer: websocket connectivity appears to be unavailable but no other transports to try +modular.test.js:592 txChannel: Ably: WebSocketTransport.dispose(): +modular.test.js:592 txChannel: Ably: ConnectionManager.tryATransport(): transport web_socket disconnected, err: [_ErrorInfo: Timeout waiting for transport to indicate itself viable; statusCode=500; code=50000] +modular.test.js:592 txChannel: Ably: ConnectionManager.notifyState(): new state: disconnected +modular.test.js:592 txChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:592 txChannel: Ably: Connection state: disconnected; reason: [_ErrorInfo: Unable to connect (and no more fallback hosts to try); statusCode=404; code=80003] +modular.test.js:592 txChannel: Ably: ConnectionManager.enactStateChange: setting new state: disconnected; reason = Unable to connect (and no more fallback hosts to try) +modular.test.js:592 txChannel: Ably: WebSocketTransport.dispose(): closing websocket +websockettransport.ts:220 WebSocket connection to 'wss://sandbox-realtime.ably.io/?key=_tmp_-mDp8g.YFggfw%3AxCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms&clientId=783025333487996&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser' failed: WebSocket is closed before the connection is established. +(anonymous) @ websockettransport.ts:220 +setTimeout (async) +Config.nextTick @ config.ts:63 +dispose @ websockettransport.ts:215 +(anonymous) @ transport.ts:315 +setTimeout (async) +tryConnect @ transport.ts:313 +tryATransport @ connectionmanager.ts:499 +tryTransportWithFallbacks @ connectionmanager.ts:1615 +connectWs @ connectionmanager.ts:1507 +connectImpl @ connectionmanager.ts:1485 +(anonymous) @ connectionmanager.ts:1393 +(anonymous) @ connectionmanager.ts:486 +decideMode @ connectionmanager.ts:462 +getTransportParams @ connectionmanager.ts:465 +connect @ connectionmanager.ts:1382 +startConnect @ connectionmanager.ts:1402 +(anonymous) @ connectionmanager.ts:1351 +setTimeout (async) +Config.nextTick @ config.ts:63 +requestState @ connectionmanager.ts:1350 +connect @ connection.ts:46 +connect @ baserealtime.ts:82 +_BaseRealtime @ baserealtime.ts:60 +(anonymous) @ modular.test.js:590 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Promise.then (async) +callFn @ mocha.js:22159 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 +setTimeout (async) +mocha.Runner.immediately @ mocha.js:30005 +Runner.hook @ mocha.js:23663 +next @ mocha.js:23690 +Runner.hooks @ mocha.js:23701 +Runner.hookUp @ mocha.js:23714 +(anonymous) @ mocha.js:23945 +done @ mocha.js:22099 +(anonymous) @ mocha.js:22160 +Show 255 more frames +Show less +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports +modular.test.js:592 txChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined +modular.test.js:592 txChannel: Ably: WebSocketTransport.dispose(): +modular.test.js:592 txChannel: Ably: WebSocketTransport.onError(): Error from WebSocket: undefined +modular.test.js:592 txChannel: Ably: WebSocketTransport.onWsClose(): Unclean disconnection of WebSocket ; code = 1006 +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"97f58865-107a-477f-8a5d-823afd1f9731","method":"transformInterceptedMessage","params":{"id":"a0198e3c-4c75-44ae-910a-a7e8240f6cef","connectionID":"b732d211-8fc0-4973-9841-13ff80c3cd24","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '97f58865-107a-477f-8a5d-823afd1f9731', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message a0198e3c-4c75-44ae-910a-a7e8240f6cef unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message a0198e3c-4c75-44ae-910a-a7e8240f6cef {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '97f58865-107a-477f-8a5d-823afd1f9731', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"b0f9f2cb-655a-47a4-8a48-dc913918d4d6","method":"transformInterceptedMessage","params":{"id":"6304b3f6-298b-4122-a953-6b7ee69142b2","connectionID":"e2eb011b-312e-4c39-aef0-d0c100837329","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'b0f9f2cb-655a-47a4-8a48-dc913918d4d6', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 6304b3f6-298b-4122-a953-6b7ee69142b2 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 6304b3f6-298b-4122-a953-6b7ee69142b2 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'b0f9f2cb-655a-47a4-8a48-dc913918d4d6', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"ba857d06-aa3e-481a-99dd-fa80fbf5e568","method":"transformInterceptedMessage","params":{"id":"c9432f6c-bb92-4d36-8cb0-e8ebe6cb7b84","connectionID":"9756a156-2096-4e31-9f98-bb4a1264463a","type":"text","data":"{\"action\":0}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'ba857d06-aa3e-481a-99dd-fa80fbf5e568', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 0} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message c9432f6c-bb92-4d36-8cb0-e8ebe6cb7b84 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message c9432f6c-bb92-4d36-8cb0-e8ebe6cb7b84 {action: 0} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'ba857d06-aa3e-481a-99dd-fa80fbf5e568', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"b56b7f5f-907e-437f-a6de-59f0a3be82df","method":"transformInterceptedMessage","params":{"id":"d3c16084-c827-40b7-a8eb-59ce8935aaa6","connectionID":"d2bb0ee6-8a95-4fcd-bf45-2904e20c5178","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'b56b7f5f-907e-437f-a6de-59f0a3be82df', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d3c16084-c827-40b7-a8eb-59ce8935aaa6 unaltered + interception proxy got result of transforming message d3c16084-c827-40b7-a8eb-59ce8935aaa6 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'b56b7f5f-907e-437f-a6de-59f0a3be82df', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"fce8f8f2-be2b-448a-bcd8-68b49376200d","method":"transformInterceptedMessage","params":{"id":"12a0acbf-dd68-4ced-a6d1-5be27b37f723","connectionID":"9756a156-2096-4e31-9f98-bb4a1264463a","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'fce8f8f2-be2b-448a-bcd8-68b49376200d', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 12a0acbf-dd68-4ced-a6d1-5be27b37f723 unaltered + interception proxy got result of transforming message 12a0acbf-dd68-4ced-a6d1-5be27b37f723 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'fce8f8f2-be2b-448a-bcd8-68b49376200d', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"20377eb7-e122-4baa-ab25-9a179ab9c19b","method":"transformInterceptedMessage","params":{"id":"3f33b14b-a8ff-4af7-a5bb-a8e66028769e","connectionID":"82562167-a4ba-4b82-bfd3-5af71a78572c","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '20377eb7-e122-4baa-ab25-9a179ab9c19b', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 3f33b14b-a8ff-4af7-a5bb-a8e66028769e unaltered + interception proxy got result of transforming message 3f33b14b-a8ff-4af7-a5bb-a8e66028769e {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '20377eb7-e122-4baa-ab25-9a179ab9c19b', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"bfc73343-6ac8-4d5b-b837-2bc5a7a38232","method":"transformInterceptedMessage","params":{"id":"9bfd82f8-b450-4766-afc0-38f5ca2b5dcd","connectionID":"15d3c7c7-c92b-4be5-ab99-6bc8889b6350","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'bfc73343-6ac8-4d5b-b837-2bc5a7a38232', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 9bfd82f8-b450-4766-afc0-38f5ca2b5dcd unaltered + interception proxy got result of transforming message 9bfd82f8-b450-4766-afc0-38f5ca2b5dcd {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'bfc73343-6ac8-4d5b-b837-2bc5a7a38232', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"cc695bbc-4766-4bd6-af5b-131eaf379aac","method":"transformInterceptedMessage","params":{"id":"6e607eb3-5d98-4a14-9834-647de3bfa419","connectionID":"5c6ad7ab-4f3e-4682-ba01-22ca3660ca0a","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'cc695bbc-4766-4bd6-af5b-131eaf379aac', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 6e607eb3-5d98-4a14-9834-647de3bfa419 unaltered + interception proxy got result of transforming message 6e607eb3-5d98-4a14-9834-647de3bfa419 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'cc695bbc-4766-4bd6-af5b-131eaf379aac', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"3a936631-79a9-4992-a4b4-9bd6cb66e281","method":"transformInterceptedMessage","params":{"id":"50c6e507-fd74-4b35-a867-8e6f0595b563","connectionID":"6850246b-8d36-4d88-b751-04867a4bf5ac","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '3a936631-79a9-4992-a4b4-9bd6cb66e281', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 50c6e507-fd74-4b35-a867-8e6f0595b563 unaltered + interception proxy got result of transforming message 50c6e507-fd74-4b35-a867-8e6f0595b563 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '3a936631-79a9-4992-a4b4-9bd6cb66e281', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"c106e5ba-4aaf-419d-8858-d7e42b07fe20","method":"transformInterceptedMessage","params":{"id":"a874d5b6-ccbf-4851-9aed-4a1f5e87d629","connectionID":"2c42e539-e952-4229-af45-b141494f7023","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'c106e5ba-4aaf-419d-8858-d7e42b07fe20', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message a874d5b6-ccbf-4851-9aed-4a1f5e87d629 unaltered + interception proxy got result of transforming message a874d5b6-ccbf-4851-9aed-4a1f5e87d629 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'c106e5ba-4aaf-419d-8858-d7e42b07fe20', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"4abed275-559f-48fe-ba7d-237b9d8a2507","method":"transformInterceptedMessage","params":{"id":"ca32be8f-53f2-4fe2-a608-9ccf8581e392","connectionID":"31f0c7d3-133c-4bc3-9297-c198f559fed0","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '4abed275-559f-48fe-ba7d-237b9d8a2507', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message ca32be8f-53f2-4fe2-a608-9ccf8581e392 unaltered + interception proxy got result of transforming message ca32be8f-53f2-4fe2-a608-9ccf8581e392 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '4abed275-559f-48fe-ba7d-237b9d8a2507', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"bd47d134-0ec1-4df8-8285-a22c971481c7","method":"transformInterceptedMessage","params":{"id":"a9d6a01d-c6e9-4dcc-8422-b1fa298f230d","connectionID":"2ca5b342-5fbf-4936-9ac7-e2e6f6515b00","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'bd47d134-0ec1-4df8-8285-a22c971481c7', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message a9d6a01d-c6e9-4dcc-8422-b1fa298f230d unaltered + interception proxy got result of transforming message a9d6a01d-c6e9-4dcc-8422-b1fa298f230d {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'bd47d134-0ec1-4df8-8285-a22c971481c7', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"7f6900a7-0e90-432f-8778-ae1e6e9cf41f","method":"transformInterceptedMessage","params":{"id":"8c0e2507-79dc-4156-b7bb-ab2e0f408dde","connectionID":"162632c5-d822-44b6-98cf-dafb225f89e1","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '7f6900a7-0e90-432f-8778-ae1e6e9cf41f', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 8c0e2507-79dc-4156-b7bb-ab2e0f408dde unaltered + interception proxy got result of transforming message 8c0e2507-79dc-4156-b7bb-ab2e0f408dde {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '7f6900a7-0e90-432f-8778-ae1e6e9cf41f', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"6caf30c0-543c-4058-a08d-b73ce6790100","method":"transformInterceptedMessage","params":{"id":"91c0a142-8f15-4da4-a090-410632e6111d","connectionID":"28667c02-f1f5-465c-9713-e236c0b68614","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '6caf30c0-543c-4058-a08d-b73ce6790100', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 91c0a142-8f15-4da4-a090-410632e6111d unaltered + interception proxy got result of transforming message 91c0a142-8f15-4da4-a090-410632e6111d {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '6caf30c0-543c-4058-a08d-b73ce6790100', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"a69fb48f-40dd-4e18-aab3-736b8a7973e6","method":"transformInterceptedMessage","params":{"id":"89027765-824c-496a-86c3-8b60b7025b33","connectionID":"b70757a7-bead-4a00-b4fe-3c28d1cc1fc1","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'a69fb48f-40dd-4e18-aab3-736b8a7973e6', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 89027765-824c-496a-86c3-8b60b7025b33 unaltered + interception proxy got result of transforming message 89027765-824c-496a-86c3-8b60b7025b33 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'a69fb48f-40dd-4e18-aab3-736b8a7973e6', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"d358c394-5597-4a17-a4e1-0dac84336a22","method":"transformInterceptedMessage","params":{"id":"ca06e6bf-7040-4866-8eeb-417ad2b3dcb6","connectionID":"30432a6d-cd20-45f3-b85d-49336233affe","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'd358c394-5597-4a17-a4e1-0dac84336a22', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message ca06e6bf-7040-4866-8eeb-417ad2b3dcb6 unaltered + interception proxy got result of transforming message ca06e6bf-7040-4866-8eeb-417ad2b3dcb6 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'd358c394-5597-4a17-a4e1-0dac84336a22', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"90e57f8b-866f-425b-addb-c73d626150b2","method":"transformInterceptedMessage","params":{"id":"eba73943-d0f9-4b79-b1ed-f8ed8e8dca68","connectionID":"4e562498-1f6e-4511-a8a9-4e683468fe75","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '90e57f8b-866f-425b-addb-c73d626150b2', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message eba73943-d0f9-4b79-b1ed-f8ed8e8dca68 unaltered + interception proxy got result of transforming message eba73943-d0f9-4b79-b1ed-f8ed8e8dca68 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '90e57f8b-866f-425b-addb-c73d626150b2', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"18df4799-f2a9-47a1-b460-560f19e080ac","method":"transformInterceptedMessage","params":{"id":"cd05917a-1a0b-41e8-925b-1549daaa11fc","connectionID":"db83ced7-7dc6-4370-978d-f308cb226a66","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '18df4799-f2a9-47a1-b460-560f19e080ac', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message cd05917a-1a0b-41e8-925b-1549daaa11fc unaltered + interception proxy got result of transforming message cd05917a-1a0b-41e8-925b-1549daaa11fc {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '18df4799-f2a9-47a1-b460-560f19e080ac', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"bced62a3-6485-4baa-9d9e-718bcd66a7e5","method":"transformInterceptedMessage","params":{"id":"a5df9329-ee9e-4152-b55a-e9fa6f274fc8","connectionID":"d1f60c1f-020f-4cb9-998b-9ce29681bb0e","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'bced62a3-6485-4baa-9d9e-718bcd66a7e5', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message a5df9329-ee9e-4152-b55a-e9fa6f274fc8 unaltered + interception proxy got result of transforming message a5df9329-ee9e-4152-b55a-e9fa6f274fc8 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'bced62a3-6485-4baa-9d9e-718bcd66a7e5', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"d76968d1-9914-40c3-a239-d62342911e89","method":"transformInterceptedMessage","params":{"id":"70bded4e-993f-4ac8-9044-a427975171e3","connectionID":"3ab448ff-4273-4a58-99c6-1c6a67cb7f87","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'd76968d1-9914-40c3-a239-d62342911e89', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 70bded4e-993f-4ac8-9044-a427975171e3 unaltered + interception proxy got result of transforming message 70bded4e-993f-4ac8-9044-a427975171e3 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'd76968d1-9914-40c3-a239-d62342911e89', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"e7834bfc-6752-4463-85f1-ee0431ba5264","method":"transformInterceptedMessage","params":{"id":"add3074e-e739-411c-9547-abb84593ff33","connectionID":"26ad7d35-a092-48f6-8b34-b5e78314bd34","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'e7834bfc-6752-4463-85f1-ee0431ba5264', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message add3074e-e739-411c-9547-abb84593ff33 unaltered + interception proxy got result of transforming message add3074e-e739-411c-9547-abb84593ff33 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'e7834bfc-6752-4463-85f1-ee0431ba5264', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"aa0203bd-d9d5-40c5-a556-ac3be440a753","method":"transformInterceptedMessage","params":{"id":"3be9c103-60bb-41b3-b72c-295f35269975","connectionID":"64058e61-f2d6-42d1-9a38-4c076a725099","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'aa0203bd-d9d5-40c5-a556-ac3be440a753', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 3be9c103-60bb-41b3-b72c-295f35269975 unaltered + interception proxy got result of transforming message 3be9c103-60bb-41b3-b72c-295f35269975 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'aa0203bd-d9d5-40c5-a556-ac3be440a753', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"e27be862-764f-44b0-9e9b-3d3993266466","method":"transformInterceptedMessage","params":{"id":"14d0bd4b-9862-480a-85e5-9626e56706a7","connectionID":"418c6412-5c42-4148-96f6-626f74a26577","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'e27be862-764f-44b0-9e9b-3d3993266466', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 14d0bd4b-9862-480a-85e5-9626e56706a7 unaltered + interception proxy got result of transforming message 14d0bd4b-9862-480a-85e5-9626e56706a7 {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'e27be862-764f-44b0-9e9b-3d3993266466', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"30d41141-edf0-4912-9366-bd77bcb274c3","method":"transformInterceptedMessage","params":{"id":"14b02f36-ae42-4ad1-b4b2-1a7b67c69b2a","connectionID":"7cdb4890-b428-4e55-aa47-6a4e57a1018c","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '30d41141-edf0-4912-9366-bd77bcb274c3', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} + default transformInterceptedMessage implementation passing message 14b02f36-ae42-4ad1-b4b2-1a7b67c69b2a unaltered + interception proxy got result of transforming message 14b02f36-ae42-4ad1-b4b2-1a7b67c69b2a {action: 6, error: {…}} + interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '30d41141-edf0-4912-9366-bd77bcb274c3', result: {…}} + interception proxy got message {"jsonrpc":"2.0","id":"0db8a9ad-9d17-4b03-a62e-fdb17120fe73","method":"transformInterceptedMessage","params":{"id":"efc2a215-63e1-4453-9436-301344ace348","connectionID":"e335f372-842a-4aab-929b-bb240ee25bd2","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '0db8a9ad-9d17-4b03-a62e-fdb17120fe73', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message efc2a215-63e1-4453-9436-301344ace348 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message efc2a215-63e1-4453-9436-301344ace348 {action: 6, error: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '0db8a9ad-9d17-4b03-a62e-fdb17120fe73', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"283ec342-7ce4-48ac-b84d-7b2989c138f6","method":"transformInterceptedMessage","params":{"id":"73ca7748-d081-4597-9a3f-4a26dcc6636f","connectionID":"82521312-911a-450b-963f-f4f701153a78","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '283ec342-7ce4-48ac-b84d-7b2989c138f6', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 73ca7748-d081-4597-9a3f-4a26dcc6636f unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 73ca7748-d081-4597-9a3f-4a26dcc6636f {action: 6, error: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '283ec342-7ce4-48ac-b84d-7b2989c138f6', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"8fa8c09e-6b70-458a-84c9-891546e761d8","method":"transformInterceptedMessage","params":{"id":"64453755-66e1-419b-951e-d9880403456c","connectionID":"da02e9b5-3e31-449c-bd7f-250bab8d1e50","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '8fa8c09e-6b70-458a-84c9-891546e761d8', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 64453755-66e1-419b-951e-d9880403456c unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 64453755-66e1-419b-951e-d9880403456c {action: 6, error: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '8fa8c09e-6b70-458a-84c9-891546e761d8', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"456d5f27-9c53-4c3f-8582-8db98104bdad","method":"transformInterceptedMessage","params":{"id":"d27a3e94-da6d-412a-b531-ecb2617f9772","connectionID":"bf0e9c66-0ab4-4a21-a1fe-adcf46d4f271","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '456d5f27-9c53-4c3f-8582-8db98104bdad', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d27a3e94-da6d-412a-b531-ecb2617f9772 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d27a3e94-da6d-412a-b531-ecb2617f9772 {action: 6, error: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '456d5f27-9c53-4c3f-8582-8db98104bdad', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"2d353476-348d-49ed-b783-9d8ac2464714","method":"transformInterceptedMessage","params":{"id":"1be2be5c-b5d0-469b-a3ee-2bfc756a5ad0","connectionID":"9af9348c-17b9-408f-8647-4a58a68fea25","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '2d353476-348d-49ed-b783-9d8ac2464714', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 1be2be5c-b5d0-469b-a3ee-2bfc756a5ad0 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 1be2be5c-b5d0-469b-a3ee-2bfc756a5ad0 {action: 6, error: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '2d353476-348d-49ed-b783-9d8ac2464714', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"b8bd06e8-fcef-462d-8a23-bd8d8b4a92b1","method":"transformInterceptedMessage","params":{"id":"db79b476-6a07-41e9-8b6b-b5de901170c6","connectionID":"79ca26d7-2d12-4423-b49d-09a3bac53f31","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'b8bd06e8-fcef-462d-8a23-bd8d8b4a92b1', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message db79b476-6a07-41e9-8b6b-b5de901170c6 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message db79b476-6a07-41e9-8b6b-b5de901170c6 {action: 6, error: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'b8bd06e8-fcef-462d-8a23-bd8d8b4a92b1', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"fcc9a4da-8738-482c-b1f9-63443c8f92e4","method":"transformInterceptedMessage","params":{"id":"6d25c5dc-591b-475c-9135-1fab16cf8a2f","connectionID":"b732d211-8fc0-4973-9841-13ff80c3cd24","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'fcc9a4da-8738-482c-b1f9-63443c8f92e4', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 6d25c5dc-591b-475c-9135-1fab16cf8a2f unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 6d25c5dc-591b-475c-9135-1fab16cf8a2f {action: 6, error: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'fcc9a4da-8738-482c-b1f9-63443c8f92e4', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"2e13f1d0-ce92-4d48-9e4d-3caf273414f3","method":"transformInterceptedMessage","params":{"id":"365d1f35-224f-4432-b760-3e52062779aa","connectionID":"e2eb011b-312e-4c39-aef0-d0c100837329","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '2e13f1d0-ce92-4d48-9e4d-3caf273414f3', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 365d1f35-224f-4432-b760-3e52062779aa unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 365d1f35-224f-4432-b760-3e52062779aa {action: 6, error: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '2e13f1d0-ce92-4d48-9e4d-3caf273414f3', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"07e75873-5a95-4268-a20c-3349399ce356","method":"transformInterceptedMessage","params":{"id":"2f5f50c6-7a9c-4adf-a0ee-702147c6a6e3","connectionID":"ee3ef5cb-61ec-41a2-9463-6e4406b658fd","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '07e75873-5a95-4268-a20c-3349399ce356', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 2f5f50c6-7a9c-4adf-a0ee-702147c6a6e3 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 2f5f50c6-7a9c-4adf-a0ee-702147c6a6e3 {action: 6, error: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '07e75873-5a95-4268-a20c-3349399ce356', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"92ec3905-73eb-4a64-a7b4-b1b4b73278d3","method":"transformInterceptedMessage","params":{"id":"d3d49fa1-ee51-40f5-ba4e-2462c075faa8","connectionID":"3c2bf721-6d09-4435-9920-b89dd8170cb5","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '92ec3905-73eb-4a64-a7b4-b1b4b73278d3', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d3d49fa1-ee51-40f5-ba4e-2462c075faa8 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d3d49fa1-ee51-40f5-ba4e-2462c075faa8 {action: 6, error: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '92ec3905-73eb-4a64-a7b4-b1b4b73278d3', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"5b493daf-9995-435b-a284-15591a9333f3","method":"transformInterceptedMessage","params":{"id":"bc81053d-9828-4373-bae1-7d9a7586b27b","connectionID":"c101d49d-c862-4d48-b9ae-bb7d76ce9fd4","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '5b493daf-9995-435b-a284-15591a9333f3', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 6, error: {…}} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message bc81053d-9828-4373-bae1-7d9a7586b27b unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message bc81053d-9828-4373-bae1-7d9a7586b27b {action: 6, error: {…}} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '5b493daf-9995-435b-a284-15591a9333f3', result: {…}} +modular.test.js:580 rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 152; type = string +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=DISCONNECTED; error=[_ErrorInfo: Account _tmp_oZKbHg disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ]]; connectionId = 3g_SVgjirR +modular.test.js:580 rxChannel: Ably: Transport.onDisconnect(): err = [_ErrorInfo: Account _tmp_oZKbHg disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ] +modular.test.js:580 rxChannel: Ably: ConnectionManager.deactivateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_-mDp8g.YFggfw%3AxCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:580 rxChannel: Ably: ConnectionManager.deactivateTransport(): state = disconnected; was active +modular.test.js:580 rxChannel: Ably: ConnectionManager.deactivateTransport(): reason = Account _tmp_oZKbHg disabled +modular.test.js:580 rxChannel: Ably: ConnectionManager.deactivateTransport(): Getting, clearing, and requeuing 0 pending messages +modular.test.js:580 rxChannel: Ably: MessageQueue.clear(): clearing 0 messages +modular.test.js:580 rxChannel: Ably: ConnectionManager.notifyState(): new state: disconnected; will retry connection immediately +modular.test.js:580 rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:580 rxChannel: Ably: Connection state: disconnected; reason: [_ErrorInfo: Account _tmp_oZKbHg disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ] +modular.test.js:580 rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: disconnected; reason = Account _tmp_oZKbHg disabled +modular.test.js:580 rxChannel: Ably: WebSocketTransport.dispose(): +modular.test.js:580 rxChannel: Ably: ConnectionManager.requestState(): requested state: connecting; current state: disconnected +modular.test.js:580 rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:580 rxChannel: Ably: Connection state: connecting +modular.test.js:580 rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined +modular.test.js:580 rxChannel: Ably: WebSocketTransport.dispose(): closing websocket +modular.test.js:580 rxChannel: Ably: ConnectionManager.startConnect(): starting connection +modular.test.js:580 rxChannel: Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting +modular.test.js:580 rxChannel: Ably: ConnectionManager.getTransportParams(): Transport params = [mode=resume,connectionKey=e7dNIPVFABc0Ei!3g_SVgjirRAUtvni_82zFX-1c23,format=json] +modular.test.js:580 rxChannel: Ably: ConnectionManager.connectWs(): undefined +modular.test.js:580 rxChannel: Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket +modular.test.js:580 rxChannel: Ably: ConnectionManager.tryATransport(): trying web_socket +modular.test.js:580 rxChannel: Ably: WebSocketTransport.connect(): starting +modular.test.js:580 rxChannel: Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ +modular.test.js:580 rxChannel: Ably: WebSocketTransport.connect(): authParams: key: _tmp_-mDp8g.YFggfw:xCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms; err: null +modular.test.js:580 rxChannel: Ably: WebSocketTransport.createWebSocket(): uri:wss://sandbox-realtime.ably.io:443/?key=_tmp_-mDp8g.YFggfw%3AxCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms&resume=e7dNIPVFABc0Ei!3g_SVgjirRAUtvni_82zFX-1c23&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:580 rxChannel: Ably: WebSocketTransport.onWsClose(): Cleanly closed WebSocket +modular.test.js:592 txChannel: Ably: ConnectionManager WebSocket slow timer: ws connectivity check succeeded +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"fc4cf349-c5f8-43c8-9a29-96866b536a15","method":"transformInterceptedMessage","params":{"id":"fee24074-bc5b-476d-b3a6-606492740688","connectionID":"88fc9b75-6215-43bf-83a2-5bb35124930c","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973586153}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'fc4cf349-c5f8-43c8-9a29-96866b536a15', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973586153} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message fee24074-bc5b-476d-b3a6-606492740688 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message fee24074-bc5b-476d-b3a6-606492740688 {action: 9, error: {…}, timestamp: 1715973586153} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'fc4cf349-c5f8-43c8-9a29-96866b536a15', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"84e90e2b-8bbb-4387-832d-f4cbb5cd3708","method":"transformInterceptedMessage","params":{"id":"b5094b3a-8689-4a65-9c6d-8140cbd13c39","connectionID":"c986dadd-ff6c-405c-a84a-c90fe539e3c0","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973586197}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '84e90e2b-8bbb-4387-832d-f4cbb5cd3708', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973586197} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message b5094b3a-8689-4a65-9c6d-8140cbd13c39 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message b5094b3a-8689-4a65-9c6d-8140cbd13c39 {action: 9, error: {…}, timestamp: 1715973586197} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '84e90e2b-8bbb-4387-832d-f4cbb5cd3708', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"9191cbed-4f27-43ba-a96a-3d522fdf6e04","method":"transformInterceptedMessage","params":{"id":"7b9845e4-29ba-480f-9d3a-7e4e2fdcda31","connectionID":"5e28b02f-2e37-4a4e-9ff3-3f733ce3743f","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973586198}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '9191cbed-4f27-43ba-a96a-3d522fdf6e04', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973586198} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 7b9845e4-29ba-480f-9d3a-7e4e2fdcda31 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 7b9845e4-29ba-480f-9d3a-7e4e2fdcda31 {action: 9, error: {…}, timestamp: 1715973586198} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '9191cbed-4f27-43ba-a96a-3d522fdf6e04', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"b92fdc84-709a-47ba-b567-e384cc8591e1","method":"transformInterceptedMessage","params":{"id":"c99fff3f-6aa8-4285-a980-61a392c1c87b","connectionID":"c4db4e77-4605-4d19-b9e9-f34f94962c93","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973586199}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'b92fdc84-709a-47ba-b567-e384cc8591e1', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973586199} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message c99fff3f-6aa8-4285-a980-61a392c1c87b unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message c99fff3f-6aa8-4285-a980-61a392c1c87b {action: 9, error: {…}, timestamp: 1715973586199} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'b92fdc84-709a-47ba-b567-e384cc8591e1', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"e4112ad4-f95e-4830-8aae-8e3aff417646","method":"transformInterceptedMessage","params":{"id":"0af714c0-fe16-4736-88d9-b90ad9b5aca0","connectionID":"0b9667a6-f206-46e1-a33d-6e1e42686e51","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973586202}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'e4112ad4-f95e-4830-8aae-8e3aff417646', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973586202} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 0af714c0-fe16-4736-88d9-b90ad9b5aca0 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 0af714c0-fe16-4736-88d9-b90ad9b5aca0 {action: 9, error: {…}, timestamp: 1715973586202} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'e4112ad4-f95e-4830-8aae-8e3aff417646', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"a31af30b-e0b4-41c2-9840-66902ac18eab","method":"transformInterceptedMessage","params":{"id":"3e0bffe6-ee35-44a9-a6ba-85e47164c849","connectionID":"826e1af3-e264-425d-92bd-1796b2ef69d2","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973586204}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'a31af30b-e0b4-41c2-9840-66902ac18eab', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973586204} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 3e0bffe6-ee35-44a9-a6ba-85e47164c849 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 3e0bffe6-ee35-44a9-a6ba-85e47164c849 {action: 9, error: {…}, timestamp: 1715973586204} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'a31af30b-e0b4-41c2-9840-66902ac18eab', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"c1084b2e-3c12-4f24-8512-46254b5693e7","method":"transformInterceptedMessage","params":{"id":"40bf7cfa-1b93-4d4f-88e0-655f5c772429","connectionID":"bb47bb6e-1f06-4704-8aec-02cc6580c7fa","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973586206}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'c1084b2e-3c12-4f24-8512-46254b5693e7', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973586206} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 40bf7cfa-1b93-4d4f-88e0-655f5c772429 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 40bf7cfa-1b93-4d4f-88e0-655f5c772429 {action: 9, error: {…}, timestamp: 1715973586206} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'c1084b2e-3c12-4f24-8512-46254b5693e7', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"e0391b7a-9a58-4db8-b602-e842f459182b","method":"transformInterceptedMessage","params":{"id":"f90c3a36-0454-425b-a128-2daccae17f2a","connectionID":"4eea48b5-7de1-41e9-a822-f996be24ff2a","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973586208}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'e0391b7a-9a58-4db8-b602-e842f459182b', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973586208} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message f90c3a36-0454-425b-a128-2daccae17f2a unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message f90c3a36-0454-425b-a128-2daccae17f2a {action: 9, error: {…}, timestamp: 1715973586208} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'e0391b7a-9a58-4db8-b602-e842f459182b', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"98fcd4ac-0558-4dd0-a1f1-7311616e8dd1","method":"transformInterceptedMessage","params":{"id":"c63ec4b6-3879-4c65-881f-dbacccd7feb7","connectionID":"a1e50253-dfd0-4069-abfb-800b035ee99d","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973586209}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '98fcd4ac-0558-4dd0-a1f1-7311616e8dd1', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973586209} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message c63ec4b6-3879-4c65-881f-dbacccd7feb7 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message c63ec4b6-3879-4c65-881f-dbacccd7feb7 {action: 9, error: {…}, timestamp: 1715973586209} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '98fcd4ac-0558-4dd0-a1f1-7311616e8dd1', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"f606ca07-b400-442a-b0af-f9d56c38662e","method":"transformInterceptedMessage","params":{"id":"bc7e4b36-fc70-4efc-ab3b-96e3d978ae20","connectionID":"60efdd4f-003a-42d9-ace4-aa4349346b09","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973586210}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'f606ca07-b400-442a-b0af-f9d56c38662e', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973586210} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message bc7e4b36-fc70-4efc-ab3b-96e3d978ae20 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message bc7e4b36-fc70-4efc-ab3b-96e3d978ae20 {action: 9, error: {…}, timestamp: 1715973586210} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'f606ca07-b400-442a-b0af-f9d56c38662e', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"d6f3c553-771d-44a5-b4d6-713a6522db3c","method":"transformInterceptedMessage","params":{"id":"0e849ce4-1122-4bd7-a21c-5fdcfe6e889b","connectionID":"750067c1-9047-4ba8-a9d2-7f87d7e0f0fc","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973586349}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'd6f3c553-771d-44a5-b4d6-713a6522db3c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973586349} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 0e849ce4-1122-4bd7-a21c-5fdcfe6e889b unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 0e849ce4-1122-4bd7-a21c-5fdcfe6e889b {action: 9, error: {…}, timestamp: 1715973586349} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'd6f3c553-771d-44a5-b4d6-713a6522db3c', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"77a8d8e8-0101-477b-9169-8d6a76ccf55a","method":"transformInterceptedMessage","params":{"id":"85792f46-bec2-427f-8a71-8baa3d3137af","connectionID":"b4a96420-360a-4ecb-ac73-08cfd9b66af8","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973586397}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '77a8d8e8-0101-477b-9169-8d6a76ccf55a', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973586397} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 85792f46-bec2-427f-8a71-8baa3d3137af unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 85792f46-bec2-427f-8a71-8baa3d3137af {action: 9, error: {…}, timestamp: 1715973586397} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '77a8d8e8-0101-477b-9169-8d6a76ccf55a', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"cbe6420f-1e86-4cb1-a459-a22dda33a0c8","method":"transformInterceptedMessage","params":{"id":"43c0ba1e-9ced-40e9-ad6b-5d66fd622641","connectionID":"6dec2242-2274-45bb-872b-4bc37758af58","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973586616}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'cbe6420f-1e86-4cb1-a459-a22dda33a0c8', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973586616} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 43c0ba1e-9ced-40e9-ad6b-5d66fd622641 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 43c0ba1e-9ced-40e9-ad6b-5d66fd622641 {action: 9, error: {…}, timestamp: 1715973586616} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'cbe6420f-1e86-4cb1-a459-a22dda33a0c8', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"c7380969-5a6c-404d-95f4-eda3ba43121b","method":"transformInterceptedMessage","params":{"id":"b5ddb7c5-4024-4381-a870-2b50cc85a0ce","connectionID":"1c2e495a-09d7-4fcd-8119-d482eb3dadb8","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973587280}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'c7380969-5a6c-404d-95f4-eda3ba43121b', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973587280} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message b5ddb7c5-4024-4381-a870-2b50cc85a0ce unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message b5ddb7c5-4024-4381-a870-2b50cc85a0ce {action: 9, error: {…}, timestamp: 1715973587280} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'c7380969-5a6c-404d-95f4-eda3ba43121b', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"1bfe670b-8dad-42a7-964c-7bace554538b","method":"transformInterceptedMessage","params":{"id":"b32499e7-f122-47bb-8c31-a12b4169ac78","connectionID":"93ec6132-3812-43cc-b42f-9b751e59b4af","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973587313}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '1bfe670b-8dad-42a7-964c-7bace554538b', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973587313} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message b32499e7-f122-47bb-8c31-a12b4169ac78 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message b32499e7-f122-47bb-8c31-a12b4169ac78 {action: 9, error: {…}, timestamp: 1715973587313} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '1bfe670b-8dad-42a7-964c-7bace554538b', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"a92cc8bd-0c97-4702-a9d3-9796314adb3a","method":"transformInterceptedMessage","params":{"id":"8d986f17-f7fe-4a31-92da-baafc67e1ac9","connectionID":"a397d46a-73da-4a7f-9235-37b3c300676e","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973587530}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'a92cc8bd-0c97-4702-a9d3-9796314adb3a', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973587530} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 8d986f17-f7fe-4a31-92da-baafc67e1ac9 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 8d986f17-f7fe-4a31-92da-baafc67e1ac9 {action: 9, error: {…}, timestamp: 1715973587530} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'a92cc8bd-0c97-4702-a9d3-9796314adb3a', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"b3ad8a54-cbb2-462c-9979-e9436b878e18","method":"transformInterceptedMessage","params":{"id":"c54888a2-6856-4e85-a1a9-fa660bd04b77","connectionID":"6c31c520-5e53-4d51-8638-d6da340534ab","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973587677}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'b3ad8a54-cbb2-462c-9979-e9436b878e18', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973587677} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message c54888a2-6856-4e85-a1a9-fa660bd04b77 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message c54888a2-6856-4e85-a1a9-fa660bd04b77 {action: 9, error: {…}, timestamp: 1715973587677} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'b3ad8a54-cbb2-462c-9979-e9436b878e18', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"6ca5db84-9998-4fb7-af91-5f17d8f635d2","method":"transformInterceptedMessage","params":{"id":"970278d4-17e1-4836-bd05-918b1f0927ca","connectionID":"60d5f5ec-333e-4b89-9602-a4e98dbb3f39","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_oZKbHg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973587678}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '6ca5db84-9998-4fb7-af91-5f17d8f635d2', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973587678} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 970278d4-17e1-4836-bd05-918b1f0927ca unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 970278d4-17e1-4836-bd05-918b1f0927ca {action: 9, error: {…}, timestamp: 1715973587678} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '6ca5db84-9998-4fb7-af91-5f17d8f635d2', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"20ede9b5-deaf-4966-8863-8b9ef1c44f00","method":"transformInterceptedMessage","params":{"id":"93c08030-e196-4e82-9a90-eb619b15bce3","connectionID":"84ddddeb-23b6-451b-8fc5-e1f309888b98","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973588275}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '20ede9b5-deaf-4966-8863-8b9ef1c44f00', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973588275} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 93c08030-e196-4e82-9a90-eb619b15bce3 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 93c08030-e196-4e82-9a90-eb619b15bce3 {action: 9, error: {…}, timestamp: 1715973588275} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '20ede9b5-deaf-4966-8863-8b9ef1c44f00', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"6331a4a4-f117-41ca-bebd-3f59f75b9f7d","method":"transformInterceptedMessage","params":{"id":"803cbc07-f40e-443a-b7ee-4aa9c3c6f65c","connectionID":"4efe8660-6e26-44f9-a1b4-107627c0dffc","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973588598}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '6331a4a4-f117-41ca-bebd-3f59f75b9f7d', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973588598} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 803cbc07-f40e-443a-b7ee-4aa9c3c6f65c unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 803cbc07-f40e-443a-b7ee-4aa9c3c6f65c {action: 9, error: {…}, timestamp: 1715973588598} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '6331a4a4-f117-41ca-bebd-3f59f75b9f7d', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"1078fade-d9c3-49b0-9672-59f904317d03","method":"transformInterceptedMessage","params":{"id":"dec239ad-2033-4b5a-bf2a-5b16a0f498e5","connectionID":"9bbf20bb-46b4-4694-b7ab-679b85de3ec2","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973588722}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '1078fade-d9c3-49b0-9672-59f904317d03', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973588722} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message dec239ad-2033-4b5a-bf2a-5b16a0f498e5 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message dec239ad-2033-4b5a-bf2a-5b16a0f498e5 {action: 9, error: {…}, timestamp: 1715973588722} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '1078fade-d9c3-49b0-9672-59f904317d03', result: {…}} +modular.test.js:580 rxChannel: Ably: WebSocketTransport.onWsOpen(): opened WebSocket +modular.test.js:580 rxChannel: Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_-mDp8g.YFggfw%3AxCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms&resume=e7dNIPVFABc0Ei!3g_SVgjirRAUtvni_82zFX-1c23&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:580 rxChannel: Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending +modular.test.js:580 rxChannel: Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_-mDp8g.YFggfw%3AxCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms&resume=e7dNIPVFABc0Ei!3g_SVgjirRAUtvni_82zFX-1c23&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = resume +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"fb3ff03b-5b76-4dc3-8a85-550a487ca089","method":"transformInterceptedMessage","params":{"id":"df28e847-0a01-463d-a405-2b9dcca02c59","connectionID":"15ad05ea-96a3-4af9-b7fd-7c212345ccaa","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973588932}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'fb3ff03b-5b76-4dc3-8a85-550a487ca089', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973588932} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message df28e847-0a01-463d-a405-2b9dcca02c59 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message df28e847-0a01-463d-a405-2b9dcca02c59 {action: 9, error: {…}, timestamp: 1715973588932} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'fb3ff03b-5b76-4dc3-8a85-550a487ca089', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"0cf2ccb2-84a1-47fc-a952-9525796ae07f","method":"transformInterceptedMessage","params":{"id":"583ea950-c609-4f74-b375-fda6b13cd1b8","connectionID":"b5220852-46ea-4471-8711-3347a22913fe","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973589004}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '0cf2ccb2-84a1-47fc-a952-9525796ae07f', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973589004} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 583ea950-c609-4f74-b375-fda6b13cd1b8 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 583ea950-c609-4f74-b375-fda6b13cd1b8 {action: 9, error: {…}, timestamp: 1715973589004} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '0cf2ccb2-84a1-47fc-a952-9525796ae07f', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"b3c68847-0d40-4fbe-a540-a82a47c10e15","method":"transformInterceptedMessage","params":{"id":"7d4ab8ef-6eec-40f7-a693-e892f31d159f","connectionID":"6246bfbe-fbb6-4a13-b3dd-7abce08e16b4","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973589235}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'b3c68847-0d40-4fbe-a540-a82a47c10e15', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973589235} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 7d4ab8ef-6eec-40f7-a693-e892f31d159f unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 7d4ab8ef-6eec-40f7-a693-e892f31d159f {action: 9, error: {…}, timestamp: 1715973589235} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'b3c68847-0d40-4fbe-a540-a82a47c10e15', result: {…}} +modular.test.js:580 rxChannel: Ably: WebSocketTransport.onWsData(): data received; length = 232; type = string +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ERROR; timestamp=1715973589235; error=[_ErrorInfo: Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300]]; connectionId = 3g_SVgjirR +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received error action; connectionId = 3g_SVgjirR; err = {"code":40300,"statusCode":403,"nonfatal":false,"href":"https://help.ably.io/error/40300"} +modular.test.js:580 rxChannel: Ably: Transport.onFatalError(): err = [_ErrorInfo: Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] +modular.test.js:580 rxChannel: Ably: ConnectionManager.deactivateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_-mDp8g.YFggfw%3AxCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms&resume=e7dNIPVFABc0Ei!3g_SVgjirRAUtvni_82zFX-1c23&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:580 rxChannel: Ably: ConnectionManager.deactivateTransport(): state = failed; was pending +modular.test.js:580 rxChannel: Ably: ConnectionManager.deactivateTransport(): reason = Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.) +modular.test.js:580 rxChannel: Ably: ConnectionManager.notifyState(): new state: failed +modular.test.js:580 rxChannel: Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:580 rxChannel: Ably: Connection state: failed; reason: [_ErrorInfo: Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] +modular.test.js:580 rxChannel: Ably: ConnectionManager.enactStateChange: setting new state: failed; reason = Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.) +modular.test.js:580 rxChannel: Ably: RealtimeChannel.notifyState: name = channel, current state = attached, notifying state failed +modular.test.js:580 rxChannel: Ably: PresenceMap.setInProgress(): inProgress = false +modular.test.js:580 rxChannel: Ably: PresenceMap.setInProgress(): inProgress = false +modular.test.js:580 rxChannel: Ably: Channel state for channel "channel": failed; reason: [_ErrorInfo: Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] +modular.test.js:580 rxChannel: Ably: WebSocketTransport.dispose(): +modular.test.js:580 rxChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports +modular.test.js:580 rxChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting pending transport: WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_-mDp8g.YFggfw%3AxCT0UWASnAJoiwY05ldYUHeizY5pK0A_DpjVCdVR4ms&resume=e7dNIPVFABc0Ei!3g_SVgjirRAUtvni_82zFX-1c23&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:580 rxChannel: Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined +modular.test.js:580 rxChannel: Ably: WebSocketTransport.dispose(): closing websocket +modular.test.js:580 rxChannel: Ably: WebSocketTransport.onWsClose(): Cleanly closed WebSocket +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"73acbbfb-1278-4254-bc22-c37de1523242","method":"transformInterceptedMessage","params":{"id":"18835690-a082-4342-a03b-4fab59e83f27","connectionID":"0d1d90b9-bc6c-4d93-8d9e-45249f373a29","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973589470}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '73acbbfb-1278-4254-bc22-c37de1523242', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973589470} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 18835690-a082-4342-a03b-4fab59e83f27 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 18835690-a082-4342-a03b-4fab59e83f27 {action: 9, error: {…}, timestamp: 1715973589470} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '73acbbfb-1278-4254-bc22-c37de1523242', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"1a377142-c1a2-4512-9930-0f116424579c","method":"transformInterceptedMessage","params":{"id":"ac61c577-be7e-4db3-aad4-ed25d68d66db","connectionID":"74e79142-b0ae-45d6-85b0-585d31f5af10","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973589950}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '1a377142-c1a2-4512-9930-0f116424579c', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973589950} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message ac61c577-be7e-4db3-aad4-ed25d68d66db unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message ac61c577-be7e-4db3-aad4-ed25d68d66db {action: 9, error: {…}, timestamp: 1715973589950} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '1a377142-c1a2-4512-9930-0f116424579c', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"2a021add-30f2-4bc3-b0d2-71a1de93f725","method":"transformInterceptedMessage","params":{"id":"ec6c29a2-b862-413a-a2c2-ec26ae4c6f0d","connectionID":"4acce3ca-e1c1-4e80-a956-5641799d6bc4","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973590013}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '2a021add-30f2-4bc3-b0d2-71a1de93f725', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973590013} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message ec6c29a2-b862-413a-a2c2-ec26ae4c6f0d unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message ec6c29a2-b862-413a-a2c2-ec26ae4c6f0d {action: 9, error: {…}, timestamp: 1715973590013} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '2a021add-30f2-4bc3-b0d2-71a1de93f725', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"8afcd661-d5fc-4f61-aac6-6ec9784af1db","method":"transformInterceptedMessage","params":{"id":"d59edf46-3c1c-42d3-bc1e-e44b5382ee4e","connectionID":"55694c0d-4450-47f2-b79f-9bf2726670ca","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973590032}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '8afcd661-d5fc-4f61-aac6-6ec9784af1db', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973590032} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d59edf46-3c1c-42d3-bc1e-e44b5382ee4e unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d59edf46-3c1c-42d3-bc1e-e44b5382ee4e {action: 9, error: {…}, timestamp: 1715973590032} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '8afcd661-d5fc-4f61-aac6-6ec9784af1db', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"ba0cd819-9337-42e9-8028-a85992972885","method":"transformInterceptedMessage","params":{"id":"d63bed22-87dc-49ee-ae34-216247440d3a","connectionID":"38edf54c-14f5-4f3f-8c14-516672df1ffd","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973590049}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'ba0cd819-9337-42e9-8028-a85992972885', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973590049} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d63bed22-87dc-49ee-ae34-216247440d3a unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d63bed22-87dc-49ee-ae34-216247440d3a {action: 9, error: {…}, timestamp: 1715973590049} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'ba0cd819-9337-42e9-8028-a85992972885', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"4078354d-b199-4319-91c2-be40cd34cb70","method":"transformInterceptedMessage","params":{"id":"53c4dd34-bce7-48b9-bbd5-bfe810b02858","connectionID":"57cca1dd-97f3-4ef0-939c-291b7d89638f","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973590078}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: '4078354d-b199-4319-91c2-be40cd34cb70', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973590078} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 53c4dd34-bce7-48b9-bbd5-bfe810b02858 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 53c4dd34-bce7-48b9-bbd5-bfe810b02858 {action: 9, error: {…}, timestamp: 1715973590078} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: '4078354d-b199-4319-91c2-be40cd34cb70', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"f8375bcb-4603-4382-9a08-1e7feb3a942a","method":"transformInterceptedMessage","params":{"id":"65b94083-7c47-48dc-9ca5-d1ace51758d4","connectionID":"67ce4fe4-8b70-4a8a-8415-95cfe78fb8d3","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973590734}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'f8375bcb-4603-4382-9a08-1e7feb3a942a', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973590734} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 65b94083-7c47-48dc-9ca5-d1ace51758d4 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 65b94083-7c47-48dc-9ca5-d1ace51758d4 {action: 9, error: {…}, timestamp: 1715973590734} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'f8375bcb-4603-4382-9a08-1e7feb3a942a', result: {…}} +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"f351eabf-adb3-45d3-badc-31b10f55e419","method":"transformInterceptedMessage","params":{"id":"d613dae5-3b28-42a3-9ab3-dfa4894ed635","connectionID":"a4a3ce0b-e6a1-459b-bc4f-50e815b22dbe","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_-mDp8g disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715973590940}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message {jsonrpc: '2.0', id: 'f351eabf-adb3-45d3-badc-31b10f55e419', method: 'transformInterceptedMessage', params: {…}} deserialized to {action: 9, error: {…}, timestamp: 1715973590940} +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d613dae5-3b28-42a3-9ab3-dfa4894ed635 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d613dae5-3b28-42a3-9ab3-dfa4894ed635 {action: 9, error: {…}, timestamp: 1715973590940} +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response {jsonrpc: '2.0', id: 'f351eabf-adb3-45d3-badc-31b10f55e419', result: {…}} +testapp_module.js:76 Test App _tmp_-mDp8g has been torn down +interception_proxy_client.js:73 interception proxy client disconnected \ No newline at end of file diff --git a/with-failure-logs-5.txt b/with-failure-logs-5.txt new file mode 100644 index 000000000..0afe8eb57 --- /dev/null +++ b/with-failure-logs-5.txt @@ -0,0 +1,1003 @@ +favicon.ico:1 Failed to load resource: the server responded with a status of 404 (Not Found) + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `time()` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `time()` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `stats()` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `stats()` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `request(...)` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `request(...)` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPublish(...)` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPublish(...)` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPresence(...)` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPresence(...)` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.revokeTokens(...)` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.revokeTokens(...)` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `history()` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `history()` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `presence.history()` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `presence.history()` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `status()` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `status()` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to use push admin functionality + END TEST: browser/modular Rest BaseRealtime with Rest allows you to use push admin functionality + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `time()` + interception proxy got message {"jsonrpc":"2.0","id":"c7b4b8dd-4c39-4d9c-b90d-5625642f3e47","method":"transformInterceptedMessage","params":{"id":"3b2da9f6-6e48-4d08-b7b8-eadfe74b2849","connectionID":"a2edcd9b-abb2-43d8-9c42-5a2b94142e0b","type":"text","data":"{\"action\":4,\"connectionId\":\"gUuf_u0Gqh\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!gUuf_u0GqhAZNpQ7_atTYi-376e\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 3b2da9f6-6e48-4d08-b7b8-eadfe74b2849 unaltered + interception proxy got result of transforming message 3b2da9f6-6e48-4d08-b7b8-eadfe74b2849 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `time()` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `stats()` + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `stats()` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `request(...)` + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `request(...)` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPublish(...)` + interception proxy got message {"jsonrpc":"2.0","id":"ff035231-a74f-4eec-b6e1-ab4d3f3fedad","method":"transformInterceptedMessage","params":{"id":"cecd9987-8316-461b-902c-79ee1a06d109","connectionID":"5519debd-9271-4efa-a5eb-33b7818ddf56","type":"text","data":"{\"action\":4,\"connectionId\":\"GSCqygclrb\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!GSCqygclrbAcA-SVDnmROz-4e85\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message cecd9987-8316-461b-902c-79ee1a06d109 unaltered + interception proxy got result of transforming message cecd9987-8316-461b-902c-79ee1a06d109 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"fb63d2f5-2b27-436a-bd87-ddba0642fbfc","method":"transformInterceptedMessage","params":{"id":"ec6779eb-b883-4f07-a363-d507f754137d","connectionID":"af5206b9-b434-4cfe-8977-ff04695f3a90","type":"text","data":"{\"action\":4,\"connectionId\":\"vwrRhNUV9m\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!vwrRhNUV9mAYm6VNzwTXWb-4c5a\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ec6779eb-b883-4f07-a363-d507f754137d unaltered + interception proxy got result of transforming message ec6779eb-b883-4f07-a363-d507f754137d Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPublish(...)` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPresence(...)` + interception proxy got message {"jsonrpc":"2.0","id":"31a3813f-532a-487e-b72c-61d5e96d75a5","method":"transformInterceptedMessage","params":{"id":"b8838edb-b134-46db-ba4a-cf286beebf44","connectionID":"f5ed8dae-1f2b-43be-bd2b-6a141be8aa02","type":"text","data":"{\"action\":4,\"connectionId\":\"VKYc-X2EH3\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!VKYc-X2EH3AXohl9FFd7nL-429b\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b8838edb-b134-46db-ba4a-cf286beebf44 unaltered + interception proxy got result of transforming message b8838edb-b134-46db-ba4a-cf286beebf44 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPresence(...)` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.revokeTokens(...)` + interception proxy got message {"jsonrpc":"2.0","id":"ab14b2eb-6545-474c-ba53-d2f24aed2162","method":"transformInterceptedMessage","params":{"id":"59b00316-c75a-4d87-b703-b41e835dc763","connectionID":"b8da5579-4ed1-49c0-bd31-2a3e21cbf86d","type":"text","data":"{\"action\":4,\"connectionId\":\"EufvCwLJ0L\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!EufvCwLJ0LAScTJ9S5YH2O-4c5b\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 59b00316-c75a-4d87-b703-b41e835dc763 unaltered + interception proxy got result of transforming message 59b00316-c75a-4d87-b703-b41e835dc763 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.revokeTokens(...)` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `history()` + interception proxy got message {"jsonrpc":"2.0","id":"90c1120c-929c-4776-85cb-bf669c0175a3","method":"transformInterceptedMessage","params":{"id":"06390826-a692-480b-b2e7-260a16faa50c","connectionID":"f128c8dd-ee50-46ba-83fa-68b1bbad60aa","type":"text","data":"{\"action\":4,\"connectionId\":\"Y631DMhArp\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!Y631DMhArpAWglQC0NKVoa-3774\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 06390826-a692-480b-b2e7-260a16faa50c unaltered + interception proxy got result of transforming message 06390826-a692-480b-b2e7-260a16faa50c Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `history()` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `presence.history()` + interception proxy got message {"jsonrpc":"2.0","id":"b464e732-9f5d-4183-8662-2b4b3cb3a560","method":"transformInterceptedMessage","params":{"id":"67bb714b-10d2-4c65-95ff-3bf32df04c33","connectionID":"1aed8420-9fa2-4789-a49e-3d153011e99c","type":"text","data":"{\"action\":4,\"connectionId\":\"zMBohARhlg\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!zMBohARhlgAVVqUuP2ww23-4c5d\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 67bb714b-10d2-4c65-95ff-3bf32df04c33 unaltered + interception proxy got result of transforming message 67bb714b-10d2-4c65-95ff-3bf32df04c33 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `presence.history()` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `status()` + interception proxy got message {"jsonrpc":"2.0","id":"31677030-5139-470f-8ece-da8502f080eb","method":"transformInterceptedMessage","params":{"id":"70d1d1eb-59a6-45c8-81c8-ab6aa3e40550","connectionID":"2e0669f5-01ca-469b-a5af-edc9f52e41b2","type":"text","data":"{\"action\":4,\"connectionId\":\"HrxNZ2SZeN\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!HrxNZ2SZeNAdZKvjhjmtHR-443e\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 70d1d1eb-59a6-45c8-81c8-ab6aa3e40550 unaltered + interception proxy got result of transforming message 70d1d1eb-59a6-45c8-81c8-ab6aa3e40550 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `status()` + START TEST: browser/modular Rest BaseRealtime without Rest still allows publishing and subscribing + interception proxy got message {"jsonrpc":"2.0","id":"f8868784-2ad4-47c8-ae3b-8c07d02c2c2c","method":"transformInterceptedMessage","params":{"id":"c097e7e0-420e-4040-99c6-f2dc69563790","connectionID":"d76117c7-fce1-4aa5-94b7-28756fb1bc35","type":"text","data":"{\"action\":4,\"connectionId\":\"Oxl7brH-4v\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!Oxl7brH-4vAWFp4bWkXHuv-3875\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message c097e7e0-420e-4040-99c6-f2dc69563790 unaltered + interception proxy got result of transforming message c097e7e0-420e-4040-99c6-f2dc69563790 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"f9236f76-c229-4b45-b965-53ed861ffe0e","method":"transformInterceptedMessage","params":{"id":"1a403891-9778-4a4a-8157-c3df5405a266","connectionID":"48aee968-2e7c-474f-a20a-91c288c90a6d","type":"text","data":"{\"action\":4,\"connectionId\":\"Ko8-UQsl_8\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!Ko8-UQsl_8AVoN8fOU2-b6-3777\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 1a403891-9778-4a4a-8157-c3df5405a266 unaltered + interception proxy got result of transforming message 1a403891-9778-4a4a-8157-c3df5405a266 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"80c21470-23d2-4396-8cf5-cebb9af5ba16","method":"transformInterceptedMessage","params":{"id":"1e634cbc-84cb-4400-911d-a898b2ab7762","connectionID":"debbdfab-f1d7-41d1-809f-22c96426cb73","type":"text","data":"{\"action\":4,\"connectionId\":\"QhceQnazLN\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!QhceQnazLNAQqqbTcfXlcM-429e\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 1e634cbc-84cb-4400-911d-a898b2ab7762 unaltered + interception proxy got result of transforming message 1e634cbc-84cb-4400-911d-a898b2ab7762 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"0c4abe1a-31d1-4f67-8abf-8409c105c2bd","method":"transformInterceptedMessage","params":{"id":"685875f6-362f-45ee-a372-18c8d01e137a","connectionID":"8ece73c5-d1bf-4067-8437-e1c3582a8368","type":"text","data":"{\"action\":4,\"connectionId\":\"-DpN2IY7oV\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!-DpN2IY7oVAZHLYWRYVGc9-3878\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 685875f6-362f-45ee-a372-18c8d01e137a unaltered + interception proxy got result of transforming message 685875f6-362f-45ee-a372-18c8d01e137a Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"a4299306-bdaa-44cc-9136-fb54601a6c3b","method":"transformInterceptedMessage","params":{"id":"368615d1-9660-424f-8062-3413f5d3aca4","connectionID":"8ece73c5-d1bf-4067-8437-e1c3582a8368","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 368615d1-9660-424f-8062-3413f5d3aca4 unaltered + interception proxy got result of transforming message 368615d1-9660-424f-8062-3413f5d3aca4 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"10a3d649-d457-4e6e-b0de-62851125e3f7","method":"transformInterceptedMessage","params":{"id":"1d527488-e506-4d32-b4ae-05c5df3be19f","connectionID":"8ece73c5-d1bf-4067-8437-e1c3582a8368","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976340141-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 1d527488-e506-4d32-b4ae-05c5df3be19f unaltered + interception proxy got result of transforming message 1d527488-e506-4d32-b4ae-05c5df3be19f Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"92c6f9a1-cc2d-48a8-a93d-6316f6151f25","method":"transformInterceptedMessage","params":{"id":"3d3ce038-a2e3-4254-9415-a3b48de9ba0b","connectionID":"8ece73c5-d1bf-4067-8437-e1c3582a8368","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"encoding\":\"json\",\"data\":\"{\\\"foo\\\":\\\"bar\\\"}\"}],\"msgSerial\":0}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 3d3ce038-a2e3-4254-9415-a3b48de9ba0b unaltered + interception proxy got result of transforming message 3d3ce038-a2e3-4254-9415-a3b48de9ba0b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"64e08738-6ec8-4898-a0e2-133e2d315591","method":"transformInterceptedMessage","params":{"id":"d93d12cf-a01e-47e8-9655-5713a337e52c","connectionID":"8ece73c5-d1bf-4067-8437-e1c3582a8368","type":"text","data":"{\"action\":15,\"id\":\"-DpN2IY7oV:0\",\"connectionId\":\"-DpN2IY7oV\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976341689-0\",\"timestamp\":1715976341689,\"messages\":[{\"encoding\":\"json\",\"data\":\"{\\\"foo\\\":\\\"bar\\\"}\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d93d12cf-a01e-47e8-9655-5713a337e52c unaltered + interception proxy got result of transforming message d93d12cf-a01e-47e8-9655-5713a337e52c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b1f2bc84-e0a7-4f2e-b779-876ceff99ec4","method":"transformInterceptedMessage","params":{"id":"5e0f5bc8-bc4b-4412-a916-098c8955dbb2","connectionID":"8ece73c5-d1bf-4067-8437-e1c3582a8368","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 5e0f5bc8-bc4b-4412-a916-098c8955dbb2 unaltered + interception proxy got result of transforming message 5e0f5bc8-bc4b-4412-a916-098c8955dbb2 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime without Rest still allows publishing and subscribing + START TEST: browser/modular Rest BaseRealtime without Rest allows `auth.createTokenRequest()` without `queryTime` option enabled + END TEST: browser/modular Rest BaseRealtime without Rest allows `auth.createTokenRequest()` without `queryTime` option enabled + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to use push admin functionality + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to use push admin functionality + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `time()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `time()` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.createTokenRequest()` with `queryTime` option enabled + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.createTokenRequest()` with `queryTime` option enabled + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `stats()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `stats()` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `request(...)` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `request(...)` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPublish(...)` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPublish(...)` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPresence(...)` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPresence(...)` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.revokeTokens(...)` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.revokeTokens(...)` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `history()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `history()` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `presence.history()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `presence.history()` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `status()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `status()` + START TEST: browser/modular Crypto standalone functions generateRandomKey + END TEST: browser/modular Crypto standalone functions generateRandomKey + START TEST: browser/modular Crypto standalone functions getDefaultCryptoParams + END TEST: browser/modular Crypto standalone functions getDefaultCryptoParams + START TEST: browser/modular Message standalone functions decodeMessage decodes a message’s data + END TEST: browser/modular Message standalone functions decodeMessage decodes a message’s data + START TEST: browser/modular Message standalone functions decodeMessage throws an error when given channel options with a cipher + END TEST: browser/modular Message standalone functions decodeMessage throws an error when given channel options with a cipher + START TEST: browser/modular Message standalone functions decodeEncryptedMessage decodes a message’s data + END TEST: browser/modular Message standalone functions decodeEncryptedMessage decodes a message’s data + START TEST: browser/modular Message standalone functions decodeEncryptedMessage decrypts a message + END TEST: browser/modular Message standalone functions decodeEncryptedMessage decrypts a message + START TEST: browser/modular Message standalone functions decodeMessages decodes messages’ data + END TEST: browser/modular Message standalone functions decodeMessages decodes messages’ data + START TEST: browser/modular Message standalone functions decodeMessages throws an error when given channel options with a cipher + END TEST: browser/modular Message standalone functions decodeMessages throws an error when given channel options with a cipher + START TEST: browser/modular Message standalone functions decodeEncryptedMessages decodes messages’ data + END TEST: browser/modular Message standalone functions decodeEncryptedMessages decodes messages’ data + START TEST: browser/modular Message standalone functions decodeEncryptedMessages decrypts messages + END TEST: browser/modular Message standalone functions decodeEncryptedMessages decrypts messages + START TEST: browser/modular Crypto without Crypto BaseRest throws an error when given channel options with a cipher + END TEST: browser/modular Crypto without Crypto BaseRest throws an error when given channel options with a cipher + START TEST: browser/modular Crypto without Crypto _BaseRealtime throws an error when given channel options with a cipher + END TEST: browser/modular Crypto without Crypto _BaseRealtime throws an error when given channel options with a cipher + START TEST: browser/modular Crypto with Crypto BaseRest is able to publish encrypted messages + interception proxy got message {"jsonrpc":"2.0","id":"9ccd97dd-4970-454d-9116-b0d510a4076c","method":"transformInterceptedMessage","params":{"id":"00e4dad8-aef9-44cc-a43b-c29594c1e571","connectionID":"f15e2d6d-0c1c-4912-a95e-ea5d06439b2c","type":"text","data":"{\"action\":4,\"connectionId\":\"P4M0vM7FBZ\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!P4M0vM7FBZAXH14pah7H4j-42a3\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 00e4dad8-aef9-44cc-a43b-c29594c1e571 unaltered + interception proxy got result of transforming message 00e4dad8-aef9-44cc-a43b-c29594c1e571 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b530551b-2214-44a7-9904-a7454864eb37","method":"transformInterceptedMessage","params":{"id":"00db4581-64e6-4ad7-bd87-524bfec9dda6","connectionID":"8c9d9e19-1397-45c4-97ba-e83c83b268ba","type":"text","data":"{\"action\":4,\"connectionId\":\"QwemqnVwAU\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!QwemqnVwAUAdHZrRhXTATc-4e8b\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 00db4581-64e6-4ad7-bd87-524bfec9dda6 unaltered + interception proxy got result of transforming message 00db4581-64e6-4ad7-bd87-524bfec9dda6 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"61d0221f-e34d-4f4f-ba5f-0c5eeecd7fca","method":"transformInterceptedMessage","params":{"id":"6508feb2-91bb-4d53-9e03-cdd9bc01d5f3","connectionID":"5c3ce37a-18ac-4617-907e-6d09308b69f0","type":"text","data":"{\"action\":4,\"connectionId\":\"7pX4t-CpWB\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!7pX4t-CpWBAddLqW3n3sLE-4e8c\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 6508feb2-91bb-4d53-9e03-cdd9bc01d5f3 unaltered + interception proxy got result of transforming message 6508feb2-91bb-4d53-9e03-cdd9bc01d5f3 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"9ab1bb90-0f83-44c4-9da2-e5f86f45446f","method":"transformInterceptedMessage","params":{"id":"a59a1b51-18bd-491a-9261-b3e35beb4c6c","connectionID":"cb215bd9-0655-4a72-9676-8c7c74ead1f5","type":"text","data":"{\"action\":4,\"connectionId\":\"OAZJSzmrEw\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!OAZJSzmrEwAcvFeiM1CIs9-4e8d\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a59a1b51-18bd-491a-9261-b3e35beb4c6c unaltered + interception proxy got result of transforming message a59a1b51-18bd-491a-9261-b3e35beb4c6c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"c5ac93a3-8791-4c99-a324-788d72c04df2","method":"transformInterceptedMessage","params":{"id":"ff0df625-b4a8-437b-8a37-49bb12445bff","connectionID":"a148dfa2-a37e-472f-8f03-bca2ff804e90","type":"text","data":"{\"action\":4,\"connectionId\":\"UXiVsv9OJx\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!UXiVsv9OJxAUwOvtMXuIgh-3778\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ff0df625-b4a8-437b-8a37-49bb12445bff unaltered + interception proxy got result of transforming message ff0df625-b4a8-437b-8a37-49bb12445bff Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"5841f7c7-88ff-4428-8a9f-f4ef1ffbba52","method":"transformInterceptedMessage","params":{"id":"8fe9461e-8e98-4804-8850-c107e3d7bb69","connectionID":"1197cf65-f25e-48a9-bce7-b1e18cac12d9","type":"text","data":"{\"action\":4,\"connectionId\":\"vCobPGtM6h\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dbIQeoABc0Cm!vCobPGtM6hAdfvU9UV1Emg-42a4\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.c696.1.us-east-1-A.i-05410be3f8b9acc99.e7dbIQeoABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 8fe9461e-8e98-4804-8850-c107e3d7bb69 unaltered + interception proxy got result of transforming message 8fe9461e-8e98-4804-8850-c107e3d7bb69 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"da054b8f-878b-4579-b35d-9e41c7276031","method":"transformInterceptedMessage","params":{"id":"40ace21a-7053-4db0-9433-5e93d6becbef","connectionID":"fe0c80ec-a965-4036-b295-b1bd610d1b14","type":"text","data":"{\"action\":4,\"connectionId\":\"kayc-gqCX6\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!kayc-gqCX6ARXc1WVSg6B6-4440\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 40ace21a-7053-4db0-9433-5e93d6becbef unaltered + interception proxy got result of transforming message 40ace21a-7053-4db0-9433-5e93d6becbef Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"fe496388-da4b-4633-9796-6f449ae57189","method":"transformInterceptedMessage","params":{"id":"2c44cdd2-2db2-456f-b816-5a4df3e20311","connectionID":"379b5cc2-eb70-48c7-a6ac-44ad741e9010","type":"text","data":"{\"action\":4,\"connectionId\":\"d7U_K4h7Y5\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!d7U_K4h7Y5ATMucJf8LMmu-387a\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 2c44cdd2-2db2-456f-b816-5a4df3e20311 unaltered + interception proxy got result of transforming message 2c44cdd2-2db2-456f-b816-5a4df3e20311 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"8d4a5f77-483c-4b23-92e4-9acbf2eddfa2","method":"transformInterceptedMessage","params":{"id":"19644290-96d2-4f49-99b0-745aa989292d","connectionID":"9d5f0fe4-8e1b-4d0a-8b4e-95ba7037f978","type":"text","data":"{\"action\":4,\"connectionId\":\"F0ZlcRB8F6\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!F0ZlcRB8F6Aec9Af1sTcwE-4441\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 19644290-96d2-4f49-99b0-745aa989292d unaltered + interception proxy got result of transforming message 19644290-96d2-4f49-99b0-745aa989292d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"a12f94ef-6fc8-4827-89cc-84e3c1298a0e","method":"transformInterceptedMessage","params":{"id":"45c590eb-19c4-4063-9d22-8411e3278b7d","connectionID":"85f5dfce-6c9d-4a57-bbc2-c45d5d72c4a5","type":"text","data":"{\"action\":4,\"connectionId\":\"2g-NX7Eehf\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!2g-NX7EehfAT5rJUXCTI0k-387b\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 45c590eb-19c4-4063-9d22-8411e3278b7d unaltered + interception proxy got result of transforming message 45c590eb-19c4-4063-9d22-8411e3278b7d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"2f7194a4-19f8-4b18-aa28-9977c92b1822","method":"transformInterceptedMessage","params":{"id":"50676b75-90f9-4184-9d56-58a281c48f8e","connectionID":"be11f962-7b07-40b5-a4b9-4de162c3f76a","type":"text","data":"{\"action\":4,\"connectionId\":\"i3yyrZVMth\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!i3yyrZVMthAbH5M5dHKYj_-4e8e\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 50676b75-90f9-4184-9d56-58a281c48f8e unaltered + interception proxy got result of transforming message 50676b75-90f9-4184-9d56-58a281c48f8e Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"56ba063f-6d17-4328-8000-6fcf5142fd5a","method":"transformInterceptedMessage","params":{"id":"476cdfb4-5674-421b-ad7f-ee7725dcd047","connectionID":"9ef4a169-866d-4990-b066-27280140bda5","type":"text","data":"{\"action\":4,\"connectionId\":\"bqhO9I40zu\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!bqhO9I40zuAeGyCJFUbZLI-4c62\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 476cdfb4-5674-421b-ad7f-ee7725dcd047 unaltered + interception proxy got result of transforming message 476cdfb4-5674-421b-ad7f-ee7725dcd047 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"06d6ba4f-cffc-43b6-aea4-74ab0613482f","method":"transformInterceptedMessage","params":{"id":"0ef81c20-1b96-43c4-86e7-63941b5e0226","connectionID":"12fc4bb7-6c5e-4efe-9ebc-90cc477bdc88","type":"text","data":"{\"action\":4,\"connectionId\":\"bkzRCnNiYp\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!bkzRCnNiYpAaLxvp_eTu-6-387c\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0ef81c20-1b96-43c4-86e7-63941b5e0226 unaltered + interception proxy got result of transforming message 0ef81c20-1b96-43c4-86e7-63941b5e0226 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"0c7fdbbf-d325-45e4-b081-5582ffc7e8a8","method":"transformInterceptedMessage","params":{"id":"7efd5450-8ccc-4c48-a5ac-f34851c9ec09","connectionID":"6f9c70d3-752a-42d8-80b4-bd66350edef5","type":"text","data":"{\"action\":4,\"connectionId\":\"hXSifPL186\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dAszwTABc0Ei!hXSifPL186Ae0tLgm0Wdr6-3779\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.99b8.2.us-east-1-A.i-0d0eb08c978a5c1d0.e7dAszwTABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 7efd5450-8ccc-4c48-a5ac-f34851c9ec09 unaltered + interception proxy got result of transforming message 7efd5450-8ccc-4c48-a5ac-f34851c9ec09 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"997a0505-e8c0-46f1-bc56-f5359229bea1","method":"transformInterceptedMessage","params":{"id":"99b675b7-c526-4fbf-8108-a4bba13db323","connectionID":"6f9c70d3-752a-42d8-80b4-bd66350edef5","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 99b675b7-c526-4fbf-8108-a4bba13db323 unaltered + interception proxy got result of transforming message 99b675b7-c526-4fbf-8108-a4bba13db323 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"31c1ebf7-eff3-43d6-ab72-a2ce96417a6a","method":"transformInterceptedMessage","params":{"id":"43e33d8e-d41e-4f51-a25c-920fee93ff32","connectionID":"6f9c70d3-752a-42d8-80b4-bd66350edef5","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976341689-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 43e33d8e-d41e-4f51-a25c-920fee93ff32 unaltered + interception proxy got result of transforming message 43e33d8e-d41e-4f51-a25c-920fee93ff32 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"8dabe80c-ea37-45b8-a508-3a0041f64c7c","method":"transformInterceptedMessage","params":{"id":"0a94f9f1-6ad7-46e5-8f04-9f0297174827","connectionID":"8ece73c5-d1bf-4067-8437-e1c3582a8368","type":"text","data":"{\"action\":15,\"id\":\"QZ/IJZAqUwhe\",\"connectionId\":\"\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976342739-0\",\"timestamp\":1715976342739,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"o64tN/hA3Ll/LJ3sRhizzV1iR7SyIxKk9gg2hPzxY+s=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0a94f9f1-6ad7-46e5-8f04-9f0297174827 unaltered + interception proxy got result of transforming message 0a94f9f1-6ad7-46e5-8f04-9f0297174827 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"322fcfbb-7739-482c-a212-1c1d876b1ace","method":"transformInterceptedMessage","params":{"id":"f7960462-1322-4936-a1bc-85e520528279","connectionID":"6f9c70d3-752a-42d8-80b4-bd66350edef5","type":"text","data":"{\"action\":15,\"id\":\"QZ/IJZAqUwhe\",\"connectionId\":\"\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976342739-0\",\"timestamp\":1715976342739,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"o64tN/hA3Ll/LJ3sRhizzV1iR7SyIxKk9gg2hPzxY+s=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message f7960462-1322-4936-a1bc-85e520528279 unaltered + interception proxy got result of transforming message f7960462-1322-4936-a1bc-85e520528279 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Crypto with Crypto BaseRest is able to publish encrypted messages + START TEST: browser/modular Crypto with Crypto _BaseRealtime is able to publish encrypted messages + interception proxy got message {"jsonrpc":"2.0","id":"cb17f04d-e431-4e95-8728-c73b66192514","method":"transformInterceptedMessage","params":{"id":"24695999-26ef-441b-a6b3-e98ec10661f5","connectionID":"26f33cb2-a126-479b-aea3-4ff7697c8ea3","type":"text","data":"{\"action\":4,\"connectionId\":\"SvQYBrfiAb\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dZXIKyABc0Ap!SvQYBrfiAbAU-YKxqbHecd-4e91\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.591d.1.us-east-1-A.i-07e5ae922b5503d80.e7dZXIKyABc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 24695999-26ef-441b-a6b3-e98ec10661f5 unaltered + interception proxy got result of transforming message 24695999-26ef-441b-a6b3-e98ec10661f5 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"cdbaebfc-9a90-4692-8505-30c9d908ff8e","method":"transformInterceptedMessage","params":{"id":"096c5edd-21c2-409d-96cd-ea37b650a0d3","connectionID":"26f33cb2-a126-479b-aea3-4ff7697c8ea3","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 096c5edd-21c2-409d-96cd-ea37b650a0d3 unaltered + interception proxy got result of transforming message 096c5edd-21c2-409d-96cd-ea37b650a0d3 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"93d5e83f-1091-4ffa-b7e9-e23383d56b6d","method":"transformInterceptedMessage","params":{"id":"32b14024-eb35-4b51-a518-dddb01ffe97b","connectionID":"26f33cb2-a126-479b-aea3-4ff7697c8ea3","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976342739-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 32b14024-eb35-4b51-a518-dddb01ffe97b unaltered + interception proxy got result of transforming message 32b14024-eb35-4b51-a518-dddb01ffe97b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"0f7497b9-43e1-42c6-8ca7-0c80d3ec44ca","method":"transformInterceptedMessage","params":{"id":"94868710-d977-4887-936b-346f3df434ba","connectionID":"3169e6ab-56d8-45bb-a5f7-06ae93b026af","type":"text","data":"{\"action\":4,\"connectionId\":\"0UAr7pzRLG\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7deKLRSQBc0Ap!0UAr7pzRLGAQVYORTGxy84-4c67\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.9ed2.2.us-east-1-A.i-07e5ae922b5503d80.e7deKLRSQBc0Ap\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 94868710-d977-4887-936b-346f3df434ba unaltered + interception proxy got result of transforming message 94868710-d977-4887-936b-346f3df434ba Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b58c09f4-a4f8-4fff-a77f-71f7075ec054","method":"transformInterceptedMessage","params":{"id":"9c3f3524-0dab-4af5-a19a-714df4138055","connectionID":"3169e6ab-56d8-45bb-a5f7-06ae93b026af","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"name\":\"message\",\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"civN3DmpciBVtVXU/E/I+fwiD92vLcbDMYS6EOF4QkE=\"}],\"msgSerial\":0}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 9c3f3524-0dab-4af5-a19a-714df4138055 unaltered + interception proxy got result of transforming message 9c3f3524-0dab-4af5-a19a-714df4138055 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"81134738-20a7-4605-817a-60b4373d7326","method":"transformInterceptedMessage","params":{"id":"5aaff6bb-f6ec-4363-86a1-bebe495c3bdd","connectionID":"26f33cb2-a126-479b-aea3-4ff7697c8ea3","type":"text","data":"{\"action\":15,\"id\":\"0UAr7pzRLG:0\",\"connectionId\":\"0UAr7pzRLG\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976344168-0\",\"timestamp\":1715976344168,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"civN3DmpciBVtVXU/E/I+fwiD92vLcbDMYS6EOF4QkE=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 5aaff6bb-f6ec-4363-86a1-bebe495c3bdd unaltered + interception proxy got result of transforming message 5aaff6bb-f6ec-4363-86a1-bebe495c3bdd Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b73a813b-b157-47d6-88ad-eac571d20976","method":"transformInterceptedMessage","params":{"id":"9d99a626-ad1f-47d4-8545-3577609b3a51","connectionID":"6f9c70d3-752a-42d8-80b4-bd66350edef5","type":"text","data":"{\"action\":15,\"id\":\"0UAr7pzRLG:0\",\"connectionId\":\"0UAr7pzRLG\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976344168-0\",\"timestamp\":1715976344168,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"civN3DmpciBVtVXU/E/I+fwiD92vLcbDMYS6EOF4QkE=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 9d99a626-ad1f-47d4-8545-3577609b3a51 unaltered + interception proxy got result of transforming message 9d99a626-ad1f-47d4-8545-3577609b3a51 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"9eadf867-ba9f-4c7b-a5fe-5ab0b9c8790f","method":"transformInterceptedMessage","params":{"id":"d1f6b4b9-bf3f-4f50-b66c-b6b6aaef0512","connectionID":"8ece73c5-d1bf-4067-8437-e1c3582a8368","type":"text","data":"{\"action\":15,\"id\":\"0UAr7pzRLG:0\",\"connectionId\":\"0UAr7pzRLG\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976344168-0\",\"timestamp\":1715976344168,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"civN3DmpciBVtVXU/E/I+fwiD92vLcbDMYS6EOF4QkE=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d1f6b4b9-bf3f-4f50-b66c-b6b6aaef0512 unaltered + interception proxy got result of transforming message d1f6b4b9-bf3f-4f50-b66c-b6b6aaef0512 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"93c0bb07-43d7-4ac2-9e79-d76bdbe404de","method":"transformInterceptedMessage","params":{"id":"f708b16c-9fd4-4bb5-a894-4223cdf88999","connectionID":"3169e6ab-56d8-45bb-a5f7-06ae93b026af","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message f708b16c-9fd4-4bb5-a894-4223cdf88999 unaltered + interception proxy got result of transforming message f708b16c-9fd4-4bb5-a894-4223cdf88999 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Crypto with Crypto _BaseRealtime is able to publish encrypted messages + START TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRest uses JSON + END TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRest uses JSON + START TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRealtime uses JSON + END TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRealtime uses JSON + START TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRest uses MessagePack + END TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRest uses MessagePack + START TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRealtime uses MessagePack + END TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRealtime uses MessagePack + START TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence throws an error when attempting to access the `presence` property + END TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence throws an error when attempting to access the `presence` property + START TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence doesn’t break when it receives a PRESENCE ProtocolMessage + interception proxy got message {"jsonrpc":"2.0","id":"23ac2efe-104e-4015-be06-1448f67623c9","method":"transformInterceptedMessage","params":{"id":"6dc6f74f-6b34-4ec0-9701-545345ea0d68","connectionID":"b301e48b-a1f4-42dc-96b1-9ef32bbdad40","type":"text","data":"{\"action\":4,\"connectionId\":\"vFNykP3bg8\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dzQZ4LABc0Cm!vFNykP3bg8AX0HiMh3zDTk-4448\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.a90e.2.us-east-1-A.i-05410be3f8b9acc99.e7dzQZ4LABc0Cm\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 6dc6f74f-6b34-4ec0-9701-545345ea0d68 unaltered + interception proxy got result of transforming message 6dc6f74f-6b34-4ec0-9701-545345ea0d68 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"125fabe6-b5f9-4d0b-b901-ba27809f19f0","method":"transformInterceptedMessage","params":{"id":"52ca9546-7b20-4d29-a710-a204fdff7f62","connectionID":"9708c1de-ea6a-4a7a-99c5-85f7fd00d6f5","type":"text","data":"{\"action\":4,\"connectionId\":\"v12I7jNCFu\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!v12I7jNCFuAVCGXh34-AWB-3883\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 52ca9546-7b20-4d29-a710-a204fdff7f62 unaltered + interception proxy got result of transforming message 52ca9546-7b20-4d29-a710-a204fdff7f62 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"1ab9fd87-82c8-426a-9b0e-a57b864db032","method":"transformInterceptedMessage","params":{"id":"71617ac4-6887-419f-892e-83a3b4b3d81d","connectionID":"9708c1de-ea6a-4a7a-99c5-85f7fd00d6f5","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 71617ac4-6887-419f-892e-83a3b4b3d81d unaltered + interception proxy got result of transforming message 71617ac4-6887-419f-892e-83a3b4b3d81d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b71cb1b2-404a-4cef-b55c-67bd62c96b8c","method":"transformInterceptedMessage","params":{"id":"5307c0b3-4e87-48ff-9cec-122da74e5a86","connectionID":"9708c1de-ea6a-4a7a-99c5-85f7fd00d6f5","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976344168-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 5307c0b3-4e87-48ff-9cec-122da74e5a86 unaltered + interception proxy got result of transforming message 5307c0b3-4e87-48ff-9cec-122da74e5a86 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"e3c09501-fc2d-4d07-aa0d-9d9d3e78640f","method":"transformInterceptedMessage","params":{"id":"c380b8e2-082d-47ea-b98b-732396ab99d1","connectionID":"a4b3e3be-7289-4eb3-9295-3f564521a106","type":"text","data":"{\"action\":4,\"connectionId\":\"Q0NVRwqS6p\",\"connectionDetails\":{\"clientId\":\"1157576467847643\",\"connectionKey\":\"e7dNIPVFABc0Ei!Q0NVRwqS6pAe7HxYVx1AHi-3886\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message c380b8e2-082d-47ea-b98b-732396ab99d1 unaltered + interception proxy got result of transforming message c380b8e2-082d-47ea-b98b-732396ab99d1 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"4f91e904-adb3-42d1-8fde-76c8f17f6ec0","method":"transformInterceptedMessage","params":{"id":"aa75eebd-15b7-47be-b0df-3d65293a2e4d","connectionID":"a4b3e3be-7289-4eb3-9295-3f564521a106","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"name\":\"message\",\"data\":\"body\"}],\"msgSerial\":0}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message aa75eebd-15b7-47be-b0df-3d65293a2e4d unaltered + interception proxy got result of transforming message aa75eebd-15b7-47be-b0df-3d65293a2e4d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"fe697953-9754-49fd-8d9b-3cdbc07ba570","method":"transformInterceptedMessage","params":{"id":"3f489a3f-87ca-4531-9350-ab2b95e23fef","connectionID":"a4b3e3be-7289-4eb3-9295-3f564521a106","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 3f489a3f-87ca-4531-9350-ab2b95e23fef unaltered + interception proxy got result of transforming message 3f489a3f-87ca-4531-9350-ab2b95e23fef Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"af75690c-6bee-4130-8d5a-430ca4fa9b40","method":"transformInterceptedMessage","params":{"id":"a036de63-aa4e-4a16-ad09-ccd9ef1371af","connectionID":"6f9c70d3-752a-42d8-80b4-bd66350edef5","type":"text","data":"{\"action\":15,\"id\":\"Q0NVRwqS6p:0\",\"connectionId\":\"Q0NVRwqS6p\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976345556-0\",\"timestamp\":1715976345556,\"messages\":[{\"clientId\":\"1157576467847643\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a036de63-aa4e-4a16-ad09-ccd9ef1371af unaltered + interception proxy got result of transforming message a036de63-aa4e-4a16-ad09-ccd9ef1371af Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"09dba608-28f0-4665-81d6-5a32dee9a129","method":"transformInterceptedMessage","params":{"id":"91cd2de4-50e4-4b50-96a2-433539b1feea","connectionID":"26f33cb2-a126-479b-aea3-4ff7697c8ea3","type":"text","data":"{\"action\":15,\"id\":\"Q0NVRwqS6p:0\",\"connectionId\":\"Q0NVRwqS6p\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976345556-0\",\"timestamp\":1715976345556,\"messages\":[{\"clientId\":\"1157576467847643\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 91cd2de4-50e4-4b50-96a2-433539b1feea unaltered + interception proxy got result of transforming message 91cd2de4-50e4-4b50-96a2-433539b1feea Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"edc00a6f-7521-4435-a6a5-43228726e370","method":"transformInterceptedMessage","params":{"id":"265c4189-5251-4ad9-98fc-d9162051ba38","connectionID":"8ece73c5-d1bf-4067-8437-e1c3582a8368","type":"text","data":"{\"action\":15,\"id\":\"Q0NVRwqS6p:0\",\"connectionId\":\"Q0NVRwqS6p\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976345556-0\",\"timestamp\":1715976345556,\"messages\":[{\"clientId\":\"1157576467847643\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 265c4189-5251-4ad9-98fc-d9162051ba38 unaltered + interception proxy got result of transforming message 265c4189-5251-4ad9-98fc-d9162051ba38 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"a7aca9ba-64cc-41ac-8b3a-f9bb41f28db7","method":"transformInterceptedMessage","params":{"id":"a9b656db-2c5a-4230-b89a-b0ad62320cfc","connectionID":"9708c1de-ea6a-4a7a-99c5-85f7fd00d6f5","type":"text","data":"{\"action\":15,\"id\":\"Q0NVRwqS6p:0\",\"connectionId\":\"Q0NVRwqS6p\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976345556-0\",\"timestamp\":1715976345556,\"messages\":[{\"clientId\":\"1157576467847643\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a9b656db-2c5a-4230-b89a-b0ad62320cfc unaltered + interception proxy got result of transforming message a9b656db-2c5a-4230-b89a-b0ad62320cfc Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"526c4951-d25b-4697-a17b-e889727bf72b","method":"transformInterceptedMessage","params":{"id":"d1370dd9-8ae8-4c57-a055-fe2c531b18ca","connectionID":"a4b3e3be-7289-4eb3-9295-3f564521a106","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d1370dd9-8ae8-4c57-a055-fe2c531b18ca unaltered + interception proxy got result of transforming message d1370dd9-8ae8-4c57-a055-fe2c531b18ca Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"52bdc0ce-f1ae-4b98-b89c-bea74c07f7e8","method":"transformInterceptedMessage","params":{"id":"2195fe7a-b446-4d47-9253-421456002aa9","connectionID":"a4b3e3be-7289-4eb3-9295-3f564521a106","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976345556-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 2195fe7a-b446-4d47-9253-421456002aa9 unaltered + interception proxy got result of transforming message 2195fe7a-b446-4d47-9253-421456002aa9 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ead0c8c7-90b9-4f26-89b2-0e1d602870a8","method":"transformInterceptedMessage","params":{"id":"5a7adeff-2344-4815-a8e4-7ee6687c29eb","connectionID":"a4b3e3be-7289-4eb3-9295-3f564521a106","type":"text","data":"{\"action\":14,\"channel\":\"channel\",\"presence\":[{\"action\":2}],\"msgSerial\":1}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 5a7adeff-2344-4815-a8e4-7ee6687c29eb unaltered + interception proxy got result of transforming message 5a7adeff-2344-4815-a8e4-7ee6687c29eb Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"fd13a778-9368-46d8-9fdf-97f3f2e536e7","method":"transformInterceptedMessage","params":{"id":"9732de80-589e-42ce-9e96-eca15cfea4ea","connectionID":"a4b3e3be-7289-4eb3-9295-3f564521a106","type":"text","data":"{\"action\":14,\"id\":\"Q0NVRwqS6p:1\",\"connectionId\":\"Q0NVRwqS6p\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976345829-0\",\"timestamp\":1715976345829,\"presence\":[{\"id\":\"Q0NVRwqS6p:1:0\",\"clientId\":\"1157576467847643\",\"connectionId\":\"Q0NVRwqS6p\",\"timestamp\":1715976345829,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 9732de80-589e-42ce-9e96-eca15cfea4ea unaltered + interception proxy got result of transforming message 9732de80-589e-42ce-9e96-eca15cfea4ea Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"5cb3737d-197b-4c1f-a915-97a5c8236db1","method":"transformInterceptedMessage","params":{"id":"6f80f687-7780-469b-b6b5-654bb51c9638","connectionID":"8ece73c5-d1bf-4067-8437-e1c3582a8368","type":"text","data":"{\"action\":14,\"id\":\"Q0NVRwqS6p:1\",\"connectionId\":\"Q0NVRwqS6p\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976345829-0\",\"timestamp\":1715976345829,\"presence\":[{\"id\":\"Q0NVRwqS6p:1:0\",\"clientId\":\"1157576467847643\",\"connectionId\":\"Q0NVRwqS6p\",\"timestamp\":1715976345829,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 6f80f687-7780-469b-b6b5-654bb51c9638 unaltered + interception proxy got result of transforming message 6f80f687-7780-469b-b6b5-654bb51c9638 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"161e37bf-4920-48bc-8cf1-156b720de3a1","method":"transformInterceptedMessage","params":{"id":"bab09a38-8075-4827-a9e3-a5d9e4dcd3a9","connectionID":"6f9c70d3-752a-42d8-80b4-bd66350edef5","type":"text","data":"{\"action\":14,\"id\":\"Q0NVRwqS6p:1\",\"connectionId\":\"Q0NVRwqS6p\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976345829-0\",\"timestamp\":1715976345829,\"presence\":[{\"id\":\"Q0NVRwqS6p:1:0\",\"clientId\":\"1157576467847643\",\"connectionId\":\"Q0NVRwqS6p\",\"timestamp\":1715976345829,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message bab09a38-8075-4827-a9e3-a5d9e4dcd3a9 unaltered + interception proxy got result of transforming message bab09a38-8075-4827-a9e3-a5d9e4dcd3a9 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"8efefb36-e7de-4ae8-a3bb-260e19148ed0","method":"transformInterceptedMessage","params":{"id":"0962ab7c-3456-41ed-a4ed-bbe1b52eab09","connectionID":"9708c1de-ea6a-4a7a-99c5-85f7fd00d6f5","type":"text","data":"{\"action\":14,\"id\":\"Q0NVRwqS6p:1\",\"connectionId\":\"Q0NVRwqS6p\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976345829-0\",\"timestamp\":1715976345829,\"presence\":[{\"id\":\"Q0NVRwqS6p:1:0\",\"clientId\":\"1157576467847643\",\"connectionId\":\"Q0NVRwqS6p\",\"timestamp\":1715976345829,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0962ab7c-3456-41ed-a4ed-bbe1b52eab09 unaltered + interception proxy got result of transforming message 0962ab7c-3456-41ed-a4ed-bbe1b52eab09 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ac952fa7-6e5c-414d-a797-7d9fb490ee77","method":"transformInterceptedMessage","params":{"id":"338cb9be-99ab-4af9-a997-3f9322c2f452","connectionID":"26f33cb2-a126-479b-aea3-4ff7697c8ea3","type":"text","data":"{\"action\":14,\"id\":\"Q0NVRwqS6p:1\",\"connectionId\":\"Q0NVRwqS6p\",\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976345829-0\",\"timestamp\":1715976345829,\"presence\":[{\"id\":\"Q0NVRwqS6p:1:0\",\"clientId\":\"1157576467847643\",\"connectionId\":\"Q0NVRwqS6p\",\"timestamp\":1715976345829,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 338cb9be-99ab-4af9-a997-3f9322c2f452 unaltered + interception proxy got result of transforming message 338cb9be-99ab-4af9-a997-3f9322c2f452 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"da24fc9c-3c1c-4b05-92f2-62bd087c9180","method":"transformInterceptedMessage","params":{"id":"157f1af6-d364-4410-bc01-37b9c41819a9","connectionID":"a4b3e3be-7289-4eb3-9295-3f564521a106","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":1}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 157f1af6-d364-4410-bc01-37b9c41819a9 unaltered + interception proxy got result of transforming message 157f1af6-d364-4410-bc01-37b9c41819a9 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence doesn’t break when it receives a PRESENCE ProtocolMessage + START TEST: browser/modular RealtimePresence BaseRealtime with RealtimePresence offers realtime presence functionality + rxChannel: 17:05:46.132 Ably: BaseClient(): initialized with clientOptions {"environment":"sandbox","port":80,"tlsPort":443,"tls":true,"logLevel":4,"plugins":{"RealtimePresence":{}},"key":"_tmp_arPTlA.eykGKQ:L6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ"} + rxChannel: 17:05:46.133 Ably: BaseClient(): started; version = 2.0.4 + rxChannel: 17:05:46.133 Ably: Auth(): anonymous, using basic auth + rxChannel: 17:05:46.133 Ably: Realtime(): + rxChannel: 17:05:46.133 Ably: Realtime.ConnectionManager(): started + rxChannel: 17:05:46.134 Ably: Realtime.ConnectionManager(): requested transports = [xhr_polling,web_socket] + rxChannel: 17:05:46.134 Ably: Realtime.ConnectionManager(): available transports = [web_socket] + rxChannel: 17:05:46.134 Ably: Realtime.ConnectionManager(): http hosts = [sandbox-rest.ably.io] + rxChannel: 17:05:46.134 Ably: Realtime.connect(): + rxChannel: 17:05:46.134 Ably: Connection.connect(): + rxChannel: 17:05:46.134 Ably: ConnectionManager.requestState(): requested state: connecting; current state: initialized + rxChannel: 17:05:46.134 Ably: ConnectionManager.cancelTransitionTimer(): + rxChannel: 17:05:46.134 Ably: Connection state: connecting + rxChannel: 17:05:46.134 Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined + rxChannel: 17:05:46.134 Ably: RealtimeChannel(): started; name = channel + txChannel: 17:05:46.135 Ably: BaseClient(): initialized with clientOptions {"environment":"sandbox","port":80,"tlsPort":443,"tls":true,"logLevel":4,"clientId":"8075554743894953","plugins":{"RealtimePresence":{}},"key":"_tmp_arPTlA.eykGKQ:L6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ"} + txChannel: 17:05:46.135 Ably: BaseClient(): started; version = 2.0.4 + txChannel: 17:05:46.135 Ably: Auth(): anonymous, using basic auth + txChannel: 17:05:46.135 Ably: Realtime(): + txChannel: 17:05:46.135 Ably: Realtime.ConnectionManager(): started + txChannel: 17:05:46.135 Ably: Realtime.ConnectionManager(): requested transports = [xhr_polling,web_socket] + txChannel: 17:05:46.135 Ably: Realtime.ConnectionManager(): available transports = [web_socket] + txChannel: 17:05:46.135 Ably: Realtime.ConnectionManager(): http hosts = [sandbox-rest.ably.io] + txChannel: 17:05:46.135 Ably: Realtime.connect(): + txChannel: 17:05:46.135 Ably: Connection.connect(): + txChannel: 17:05:46.135 Ably: ConnectionManager.requestState(): requested state: connecting; current state: initialized + txChannel: 17:05:46.135 Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: 17:05:46.135 Ably: Connection state: connecting + txChannel: 17:05:46.136 Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined + txChannel: 17:05:46.136 Ably: RealtimeChannel(): started; name = channel + LAWRENCE: begin waiting for presence subscribe + rxChannel: 17:05:46.136 Ably: RealtimeChannel.requestState: name = channel, state = attaching + rxChannel: 17:05:46.136 Ably: RealtimeChannel.notifyState: name = channel, current state = initialized, notifying state attaching + rxChannel: 17:05:46.136 Ably: Channel state for channel "channel": attaching + rxChannel: 17:05:46.136 Ably: RealtimeChannel.checkPendingState: sendEvents is false; state is connecting + rxChannel: 17:05:46.136 Ably: ConnectionManager.startConnect(): starting connection + rxChannel: 17:05:46.136 Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting + rxChannel: 17:05:46.136 Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] + rxChannel: 17:05:46.137 Ably: ConnectionManager.connectWs(): undefined + rxChannel: 17:05:46.137 Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket + rxChannel: 17:05:46.137 Ably: ConnectionManager.tryATransport(): trying web_socket + rxChannel: 17:05:46.137 Ably: WebSocketTransport.connect(): starting + rxChannel: 17:05:46.137 Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ + rxChannel: 17:05:46.137 Ably: WebSocketTransport.connect(): authParams: key: _tmp_arPTlA.eykGKQ:L6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ; err: null + rxChannel: 17:05:46.137 Ably: WebSocketTransport.createWebSocket(): uri:wss://sandbox-realtime.ably.io:443/?key=_tmp_arPTlA.eykGKQ%3AL6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + txChannel: 17:05:46.137 Ably: ConnectionManager.startConnect(): starting connection + txChannel: 17:05:46.137 Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting + txChannel: 17:05:46.137 Ably: ConnectionManager.getTransportParams(): Transport params = [mode=clean,format=json] + txChannel: 17:05:46.138 Ably: ConnectionManager.connectWs(): undefined + txChannel: 17:05:46.138 Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket + txChannel: 17:05:46.138 Ably: ConnectionManager.tryATransport(): trying web_socket + txChannel: 17:05:46.138 Ably: WebSocketTransport.connect(): starting + txChannel: 17:05:46.138 Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ + txChannel: 17:05:46.138 Ably: WebSocketTransport.connect(): authParams: key: _tmp_arPTlA.eykGKQ:L6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ; err: null + txChannel: 17:05:46.138 Ably: WebSocketTransport.createWebSocket(): uri:wss://sandbox-realtime.ably.io:443/?key=_tmp_arPTlA.eykGKQ%3AL6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ&clientId=8075554743894953&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: 17:05:46.162 Ably: WebSocketTransport.onWsOpen(): opened WebSocket + rxChannel: 17:05:46.162 Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_arPTlA.eykGKQ%3AL6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: 17:05:46.163 Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending + rxChannel: 17:05:46.163 Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_arPTlA.eykGKQ%3AL6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = clean + interception proxy got message {"jsonrpc":"2.0","id":"56fa048d-4c39-4492-bacd-52bd70fdbace","method":"transformInterceptedMessage","params":{"id":"288f2908-ae64-48e3-b0f7-e5454cf3a31a","connectionID":"14abb0ae-e150-4e2f-9a38-9d7c925e9e29","type":"text","data":"{\"action\":4,\"connectionId\":\"HkjZzW_e__\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dNIPVFABc0Ei!HkjZzW_e__ARSo2aGkrnMl-3889\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 288f2908-ae64-48e3-b0f7-e5454cf3a31a unaltered + interception proxy got result of transforming message 288f2908-ae64-48e3-b0f7-e5454cf3a31a Object + interception proxy sending transformInterceptedMessage response Object + rxChannel: 17:05:46.663 Ably: WebSocketTransport.onWsData(): data received; length = 354; type = string + rxChannel: 17:05:46.664 Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=CONNECTED; connectionId=HkjZzW_e__]; connectionId = undefined + rxChannel: 17:05:46.664 Ably: ConnectionManager.activateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_arPTlA.eykGKQ%3AL6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: 17:05:46.664 Ably: ConnectionManager.activateTransport(): connectionId = HkjZzW_e__ + rxChannel: 17:05:46.664 Ably: ConnectionManager.activateTransport(): connectionDetails = {"clientId":"*","connectionKey":"e7dNIPVFABc0Ei!HkjZzW_e__ARSo2aGkrnMl-3889","maxMessageSize":16384,"maxInboundRate":250,"maxOutboundRate":100,"maxFrameSize":262144,"serverId":"frontend.3966.1.us-east-1-A.i-0d0eb08c978a5c1d0.e7dNIPVFABc0Ei","connectionStateTtl":120000,"maxIdleInterval":15000} + rxChannel: 17:05:46.665 Ably: ConnectionManager.activateTransport(): current state = connecting + rxChannel: 17:05:46.665 Ably: ConnectionManager.setConnection(): New connectionId; reattaching any attached channels + rxChannel: 17:05:46.665 Ably: ConnectionManager.notifyState(): new state: connected + rxChannel: 17:05:46.665 Ably: ConnectionManager.cancelTransitionTimer(): + rxChannel: 17:05:46.666 Ably: Connection state: connected + rxChannel: 17:05:46.666 Ably: ConnectionManager.enactStateChange: setting new state: connected; reason = undefined + rxChannel: 17:05:46.666 Ably: ConnectionManager.sendQueuedMessages(): sending 0 queued messages + rxChannel: 17:05:46.666 Ably: RealtimeChannel.checkPendingState: name = channel, state = attaching + rxChannel: 17:05:46.666 Ably: RealtimeChannel.attachImpl(): sending ATTACH message + rxChannel: 17:05:46.666 Ably: ConnectionManager.send(): sending event + rxChannel: 17:05:46.667 Ably: Protocol.send(): sending msg; [ProtocolMessage; action=ATTACH; channel=channel] + interception proxy got message {"jsonrpc":"2.0","id":"b61b5c7b-ce3d-4438-8993-d8b4f11af1e1","method":"transformInterceptedMessage","params":{"id":"3f437cfe-7fe6-429f-8e60-f4acb7e73452","connectionID":"14abb0ae-e150-4e2f-9a38-9d7c925e9e29","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 3f437cfe-7fe6-429f-8e60-f4acb7e73452 unaltered + interception proxy got result of transforming message 3f437cfe-7fe6-429f-8e60-f4acb7e73452 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"84dade75-fb2b-40b2-b5d2-a952d0098c11","method":"transformInterceptedMessage","params":{"id":"1070ec56-a394-4615-9411-2dcdf3e2ce77","connectionID":"14abb0ae-e150-4e2f-9a38-9d7c925e9e29","type":"text","data":"{\"action\":11,\"flags\":983105,\"channel\":\"channel\",\"channelSerial\":\"e7dP5PvyABc0Cq23500427@1715976345829-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 1070ec56-a394-4615-9411-2dcdf3e2ce77 unaltered + interception proxy got result of transforming message 1070ec56-a394-4615-9411-2dcdf3e2ce77 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"6a48d6bc-0271-447e-98db-d76293a5beb3","method":"transformInterceptedMessage","params":{"id":"dceb625e-8355-46f3-965e-c5707970eed3","connectionID":"14abb0ae-e150-4e2f-9a38-9d7c925e9e29","type":"text","data":"{\"action\":16,\"channel\":\"channel\",\"channelSerial\":\"e7dNIPVFABc0Ei11501694:\",\"presence\":[{\"id\":\"Q0NVRwqS6p:1:0\",\"clientId\":\"1157576467847643\",\"connectionId\":\"Q0NVRwqS6p\",\"timestamp\":1715976345829,\"action\":1}],\"count\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message dceb625e-8355-46f3-965e-c5707970eed3 unaltered + interception proxy got result of transforming message dceb625e-8355-46f3-965e-c5707970eed3 Object + interception proxy sending transformInterceptedMessage response Object + rxChannel: 17:05:46.795 Ably: WebSocketTransport.onWsData(): data received; length = 105; type = string + rxChannel: 17:05:46.795 Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ATTACHED; channel=channel; channelSerial=e7dP5PvyABc0Cq23500427@1715976345829-0; flags=HAS_PRESENCE,PRESENCE,PUBLISH,SUBSCRIBE,PRESENCE_SUBSCRIBE]; connectionId = HkjZzW_e__ + rxChannel: 17:05:46.796 Ably: RealtimeChannel.setChannelSerial(): Updating channel serial; serial = e7dP5PvyABc0Cq23500427@1715976345829-0; previous = undefined + rxChannel: 17:05:46.796 Ably: RealtimeChannel.notifyState: name = channel, current state = attaching, notifying state attached + rxChannel: 17:05:46.796 Ably: RealtimePresence.onAttached(): channel = channel, hasPresence = true + rxChannel: 17:05:46.796 Ably: PresenceMap.startSync(): channel = channel; syncInProgress = false + rxChannel: 17:05:46.796 Ably: PresenceMap.setInProgress(): inProgress = true + rxChannel: 17:05:46.797 Ably: Channel state for channel "channel": attached + rxChannel: 17:05:46.797 Ably: RealtimeChannel.onAttached: activating channel; name = channel + LAWRENCE: end waiting for presence subscribe + LAWRENCE: begin waiting for presence enter + LAWRENCE: txChannel.presence.enter is + txChannel: 17:05:46.797 Ably: RealtimePresence.enter: undefined + txChannel: 17:05:46.797 Ably: RealtimePresence._enterOrUpdateClient: undefined + txChannel: 17:05:46.797 Ably: RealtimePresence.enterClient(): channel = channel, id = undefined, client = (implicit) 8075554743894953 + txChannel: 17:05:46.798 Ably: RealtimeChannel.requestState: name = channel, state = attaching + txChannel: 17:05:46.798 Ably: RealtimeChannel.notifyState: name = channel, current state = initialized, notifying state attaching + txChannel: 17:05:46.798 Ably: Channel state for channel "channel": attaching + txChannel: 17:05:46.798 Ably: RealtimeChannel.checkPendingState: sendEvents is false; state is connecting + rxChannel: 17:05:46.798 Ably: WebSocketTransport.onWsData(): data received; length = 217; type = string + rxChannel: 17:05:46.798 Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=SYNC; channel=channel; channelSerial=e7dNIPVFABc0Ei11501694:; count=0; presence=[ [PresenceMessage; action=present; id=Q0NVRwqS6p:1:0; timestamp=1715976345829; clientId=1157576467847643; connectionId=Q0NVRwqS6p] ]]; connectionId = HkjZzW_e__ + rxChannel: 17:05:46.798 Ably: RealtimePresence.setPresence(): received presence for 1 participants; syncChannelSerial = e7dNIPVFABc0Ei11501694: + rxChannel: 17:05:46.798 Ably: PresenceMap.startSync(): channel = channel; syncInProgress = true + rxChannel: 17:05:46.799 Ably: PresenceMap.endSync(): channel = channel; syncInProgress = true + rxChannel: 17:05:46.799 Ably: PresenceMap.setInProgress(): inProgress = false + txChannel: 17:05:50.140 Ably: ConnectionManager WebSocket slow timer: checking connectivity + txChannel: 17:05:50.141 Ably: (Fetch)Http.checkConnectivity(): Sending; https://internet-up.ably-realtime.com/is-the-internet-up.txt + txChannel: 17:05:50.211 Ably: (Fetch)Http.checkConnectivity(): Result: true + txChannel: 17:05:50.211 Ably: ConnectionManager WebSocket slow timer: http connectivity check succeeded + interception proxy got message {"jsonrpc":"2.0","id":"99c0e743-8d73-4c7c-96c1-75eb62ead860","method":"transformInterceptedMessage","params":{"id":"5a91c2f1-ba6c-4d99-82a3-6b01a08a15c5","connectionID":"a2edcd9b-abb2-43d8-9c42-5a2b94142e0b","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 5a91c2f1-ba6c-4d99-82a3-6b01a08a15c5 unaltered + interception proxy got result of transforming message 5a91c2f1-ba6c-4d99-82a3-6b01a08a15c5 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"08d7c5b5-636e-4ed3-99f3-158a5808faa4","method":"transformInterceptedMessage","params":{"id":"4845d63d-04b7-4297-a5b1-fbdfe1e88195","connectionID":"5519debd-9271-4efa-a5eb-33b7818ddf56","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 4845d63d-04b7-4297-a5b1-fbdfe1e88195 unaltered + interception proxy got result of transforming message 4845d63d-04b7-4297-a5b1-fbdfe1e88195 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"93d8283b-637a-45b6-875c-7e278e8441c9","method":"transformInterceptedMessage","params":{"id":"d0e2596f-4ac8-420b-ae39-7fc04ab3a859","connectionID":"af5206b9-b434-4cfe-8977-ff04695f3a90","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d0e2596f-4ac8-420b-ae39-7fc04ab3a859 unaltered + interception proxy got result of transforming message d0e2596f-4ac8-420b-ae39-7fc04ab3a859 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"1d2c9f77-0b55-4f0b-9c63-c0a412efcf32","method":"transformInterceptedMessage","params":{"id":"48246caf-1978-42ee-bc86-a4d825b4a9a3","connectionID":"f5ed8dae-1f2b-43be-bd2b-6a141be8aa02","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 48246caf-1978-42ee-bc86-a4d825b4a9a3 unaltered + interception proxy got result of transforming message 48246caf-1978-42ee-bc86-a4d825b4a9a3 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b30c4ff3-06c6-4ce4-a13a-11962be0d592","method":"transformInterceptedMessage","params":{"id":"71a6dcb1-994c-4688-a21b-10c525bd75c4","connectionID":"b8da5579-4ed1-49c0-bd31-2a3e21cbf86d","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 71a6dcb1-994c-4688-a21b-10c525bd75c4 unaltered + interception proxy got result of transforming message 71a6dcb1-994c-4688-a21b-10c525bd75c4 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"e1927c33-b400-4bfc-b856-d3bd2d544ae8","method":"transformInterceptedMessage","params":{"id":"b70d2be3-822e-44cf-b4d9-400da1ea2e26","connectionID":"f128c8dd-ee50-46ba-83fa-68b1bbad60aa","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b70d2be3-822e-44cf-b4d9-400da1ea2e26 unaltered + interception proxy got result of transforming message b70d2be3-822e-44cf-b4d9-400da1ea2e26 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"c3ad3038-3ec1-49d1-94fa-46362712943a","method":"transformInterceptedMessage","params":{"id":"fa9ad7a7-5bed-4157-98c8-0912a9c72074","connectionID":"1aed8420-9fa2-4789-a49e-3d153011e99c","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message fa9ad7a7-5bed-4157-98c8-0912a9c72074 unaltered + interception proxy got result of transforming message fa9ad7a7-5bed-4157-98c8-0912a9c72074 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"226de186-0365-45ea-b943-5db4510389be","method":"transformInterceptedMessage","params":{"id":"436dbce9-2f3e-46da-baf1-6c23eca891af","connectionID":"2e0669f5-01ca-469b-a5af-edc9f52e41b2","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 436dbce9-2f3e-46da-baf1-6c23eca891af unaltered + interception proxy got result of transforming message 436dbce9-2f3e-46da-baf1-6c23eca891af Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"1eff87b7-480f-47bf-8b28-4a68ab65170f","method":"transformInterceptedMessage","params":{"id":"1d49e402-63eb-4703-8ae6-d3206892e951","connectionID":"d76117c7-fce1-4aa5-94b7-28756fb1bc35","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 1d49e402-63eb-4703-8ae6-d3206892e951 unaltered + interception proxy got result of transforming message 1d49e402-63eb-4703-8ae6-d3206892e951 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular RealtimePresence BaseRealtime with RealtimePresence offers realtime presence functionality + txChannel: 17:05:56.151 Ably: ConnectionManager WebSocket give up timer: websocket connection took more than 10s; + txChannel: 17:05:56.152 Ably: ConnectionManager WebSocket give up timer: websocket connectivity appears to be unavailable but no other transports to try + txChannel: 17:05:56.152 Ably: WebSocketTransport.dispose(): + txChannel: 17:05:56.152 Ably: ConnectionManager.tryATransport(): transport web_socket disconnected, err: [_ErrorInfo: Timeout waiting for transport to indicate itself viable; statusCode=500; code=50000] + txChannel: 17:05:56.152 Ably: ConnectionManager.notifyState(): new state: disconnected + txChannel: 17:05:56.152 Ably: ConnectionManager.cancelTransitionTimer(): + txChannel: 17:05:56.152 Ably: Connection state: disconnected; reason: [_ErrorInfo: Unable to connect (and no more fallback hosts to try); statusCode=404; code=80003] + txChannel: 17:05:56.152 Ably: ConnectionManager.enactStateChange: setting new state: disconnected; reason = Unable to connect (and no more fallback hosts to try) + txChannel: 17:05:56.152 Ably: WebSocketTransport.dispose(): closing websocket + WebSocket connection to 'wss://sandbox-realtime.ably.io/?key=_tmp_arPTlA.eykGKQ%3AL6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ&clientId=8075554743894953&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser' failed: WebSocket is closed before the connection is established. +(anonymous) @ index.mjs:7598 + txChannel: 17:05:56.153 Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports + txChannel: 17:05:56.153 Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined + txChannel: 17:05:56.153 Ably: WebSocketTransport.dispose(): + txChannel: 17:05:56.153 Ably: WebSocketTransport.onError(): Error from WebSocket: undefined + txChannel: 17:05:56.153 Ably: WebSocketTransport.onWsClose(): Unclean disconnection of WebSocket ; code = 1006 + interception proxy got message {"jsonrpc":"2.0","id":"3cf4ce1c-1c7c-4830-9ffa-db3284ecdbb2","method":"transformInterceptedMessage","params":{"id":"99b0c290-4abc-440f-8a49-b391d35c2e69","connectionID":"48aee968-2e7c-474f-a20a-91c288c90a6d","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 99b0c290-4abc-440f-8a49-b391d35c2e69 unaltered + interception proxy got result of transforming message 99b0c290-4abc-440f-8a49-b391d35c2e69 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b79410ee-1f3f-48d6-8953-5dddef5ec304","method":"transformInterceptedMessage","params":{"id":"ae0a2cc6-6fbf-4ad6-89b1-b62d771559f0","connectionID":"debbdfab-f1d7-41d1-809f-22c96426cb73","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ae0a2cc6-6fbf-4ad6-89b1-b62d771559f0 unaltered + interception proxy got result of transforming message ae0a2cc6-6fbf-4ad6-89b1-b62d771559f0 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"6523a4d2-f697-4de6-93d3-758cbffa9396","method":"transformInterceptedMessage","params":{"id":"853dd19d-c573-4359-9300-3671b1a15ee8","connectionID":"8ece73c5-d1bf-4067-8437-e1c3582a8368","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 853dd19d-c573-4359-9300-3671b1a15ee8 unaltered + interception proxy got result of transforming message 853dd19d-c573-4359-9300-3671b1a15ee8 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"f7102363-bc99-49e7-b81f-15f2c793925e","method":"transformInterceptedMessage","params":{"id":"d83dde04-e1ae-4671-89c1-20af73b81b8d","connectionID":"5519debd-9271-4efa-a5eb-33b7818ddf56","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d83dde04-e1ae-4671-89c1-20af73b81b8d unaltered + interception proxy got result of transforming message d83dde04-e1ae-4671-89c1-20af73b81b8d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b56f897c-f2bc-4557-89d4-42dffcd605f7","method":"transformInterceptedMessage","params":{"id":"44f5b8df-f366-44d9-be16-8abd4a495ebc","connectionID":"fe0c80ec-a965-4036-b295-b1bd610d1b14","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 44f5b8df-f366-44d9-be16-8abd4a495ebc unaltered + interception proxy got result of transforming message 44f5b8df-f366-44d9-be16-8abd4a495ebc Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"6c9e1223-e546-4dd4-a031-415c680c0d8c","method":"transformInterceptedMessage","params":{"id":"17cbb04b-f50f-41c2-bf23-da23adb964cd","connectionID":"af5206b9-b434-4cfe-8977-ff04695f3a90","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 17cbb04b-f50f-41c2-bf23-da23adb964cd unaltered + interception proxy got result of transforming message 17cbb04b-f50f-41c2-bf23-da23adb964cd Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"12372f83-7eef-4fd4-a809-96c16a1391fe","method":"transformInterceptedMessage","params":{"id":"ea6450d8-c7bb-4900-a433-ef5579baafc7","connectionID":"9d5f0fe4-8e1b-4d0a-8b4e-95ba7037f978","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ea6450d8-c7bb-4900-a433-ef5579baafc7 unaltered + interception proxy got result of transforming message ea6450d8-c7bb-4900-a433-ef5579baafc7 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"4cc561e0-b49c-4cf9-94e8-ce0c2eae96a9","method":"transformInterceptedMessage","params":{"id":"37bf5e19-eff5-4cc5-b527-8dcdae9c6a1d","connectionID":"f5ed8dae-1f2b-43be-bd2b-6a141be8aa02","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 37bf5e19-eff5-4cc5-b527-8dcdae9c6a1d unaltered + interception proxy got result of transforming message 37bf5e19-eff5-4cc5-b527-8dcdae9c6a1d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"328ab612-bef0-41ac-9cf5-dcb8116b1a80","method":"transformInterceptedMessage","params":{"id":"cd9f3bbb-220e-4eb9-9587-62808151bcdf","connectionID":"8c9d9e19-1397-45c4-97ba-e83c83b268ba","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message cd9f3bbb-220e-4eb9-9587-62808151bcdf unaltered + interception proxy got result of transforming message cd9f3bbb-220e-4eb9-9587-62808151bcdf Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"6735a4ec-4dab-4e1f-9775-2c364f3ec4b4","method":"transformInterceptedMessage","params":{"id":"053abcf5-c111-4e27-87ea-b1b2e1206dcd","connectionID":"b8da5579-4ed1-49c0-bd31-2a3e21cbf86d","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 053abcf5-c111-4e27-87ea-b1b2e1206dcd unaltered + interception proxy got result of transforming message 053abcf5-c111-4e27-87ea-b1b2e1206dcd Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"4f07b1ed-fb57-4498-bd12-c125bb98ba9e","method":"transformInterceptedMessage","params":{"id":"13559a96-831a-4e1e-85e6-06e93d5b8260","connectionID":"b301e48b-a1f4-42dc-96b1-9ef32bbdad40","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 13559a96-831a-4e1e-85e6-06e93d5b8260 unaltered + interception proxy got result of transforming message 13559a96-831a-4e1e-85e6-06e93d5b8260 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d0a27d49-fee6-4c68-bc5c-217f627111b2","method":"transformInterceptedMessage","params":{"id":"afb062dc-15ae-49c5-ae1d-38d5e031d8b4","connectionID":"5c3ce37a-18ac-4617-907e-6d09308b69f0","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message afb062dc-15ae-49c5-ae1d-38d5e031d8b4 unaltered + interception proxy got result of transforming message afb062dc-15ae-49c5-ae1d-38d5e031d8b4 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"0cd87cbe-49c9-4334-8b25-e012e6adb329","method":"transformInterceptedMessage","params":{"id":"ec34a7e0-54e0-4c9d-a097-1a46018229ec","connectionID":"d76117c7-fce1-4aa5-94b7-28756fb1bc35","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ec34a7e0-54e0-4c9d-a097-1a46018229ec unaltered + interception proxy got result of transforming message ec34a7e0-54e0-4c9d-a097-1a46018229ec Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"0041261c-d4e5-4dd8-a90b-a88453ac0a81","method":"transformInterceptedMessage","params":{"id":"475233d8-29ad-4ada-9113-f32c80595670","connectionID":"2e0669f5-01ca-469b-a5af-edc9f52e41b2","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 475233d8-29ad-4ada-9113-f32c80595670 unaltered + interception proxy got result of transforming message 475233d8-29ad-4ada-9113-f32c80595670 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"33443757-6599-4cd1-b4e1-3743da263ef4","method":"transformInterceptedMessage","params":{"id":"82457f28-7606-409e-b65a-b265e95d2d98","connectionID":"26f33cb2-a126-479b-aea3-4ff7697c8ea3","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 82457f28-7606-409e-b65a-b265e95d2d98 unaltered + interception proxy got result of transforming message 82457f28-7606-409e-b65a-b265e95d2d98 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"c487b436-7785-46fd-a57c-65256948ec2f","method":"transformInterceptedMessage","params":{"id":"19bac6fa-821a-4e9d-bae5-296510887e8e","connectionID":"8ece73c5-d1bf-4067-8437-e1c3582a8368","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 19bac6fa-821a-4e9d-bae5-296510887e8e unaltered + interception proxy got result of transforming message 19bac6fa-821a-4e9d-bae5-296510887e8e Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"5ca4b45c-b385-4b2f-9aa4-2a8fcbcfd7b2","method":"transformInterceptedMessage","params":{"id":"752ec0e3-e233-4f0a-9dc3-f39c4017d892","connectionID":"be11f962-7b07-40b5-a4b9-4de162c3f76a","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 752ec0e3-e233-4f0a-9dc3-f39c4017d892 unaltered + interception proxy got result of transforming message 752ec0e3-e233-4f0a-9dc3-f39c4017d892 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b1509495-339c-41d5-9895-68d6df5603cd","method":"transformInterceptedMessage","params":{"id":"6a5205a2-9115-4290-b852-7571e330c949","connectionID":"379b5cc2-eb70-48c7-a6ac-44ad741e9010","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 6a5205a2-9115-4290-b852-7571e330c949 unaltered + interception proxy got result of transforming message 6a5205a2-9115-4290-b852-7571e330c949 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"e4be240f-9294-42cb-907d-fde5ff734e99","method":"transformInterceptedMessage","params":{"id":"9efdd609-8578-4096-ba6c-af9c886791d9","connectionID":"a2edcd9b-abb2-43d8-9c42-5a2b94142e0b","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 9efdd609-8578-4096-ba6c-af9c886791d9 unaltered + interception proxy got result of transforming message 9efdd609-8578-4096-ba6c-af9c886791d9 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"34993b85-e02c-489c-af86-037a24fa0834","method":"transformInterceptedMessage","params":{"id":"e075a4a6-fb94-4272-828d-0c17f750906e","connectionID":"85f5dfce-6c9d-4a57-bbc2-c45d5d72c4a5","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message e075a4a6-fb94-4272-828d-0c17f750906e unaltered + interception proxy got result of transforming message e075a4a6-fb94-4272-828d-0c17f750906e Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"38d0971d-551e-46d0-9b00-7e26e359aaed","method":"transformInterceptedMessage","params":{"id":"b6f0d338-63d7-4fb2-b39b-0e57ec849730","connectionID":"f128c8dd-ee50-46ba-83fa-68b1bbad60aa","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b6f0d338-63d7-4fb2-b39b-0e57ec849730 unaltered + interception proxy got result of transforming message b6f0d338-63d7-4fb2-b39b-0e57ec849730 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"dfc5dec1-ef73-4221-a243-de53a634fe70","method":"transformInterceptedMessage","params":{"id":"66320d9b-ccf9-4cb4-892b-38f17f9260d5","connectionID":"debbdfab-f1d7-41d1-809f-22c96426cb73","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 66320d9b-ccf9-4cb4-892b-38f17f9260d5 unaltered + interception proxy got result of transforming message 66320d9b-ccf9-4cb4-892b-38f17f9260d5 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"f87d4f57-4b3f-42b8-96be-35aae1442f35","method":"transformInterceptedMessage","params":{"id":"c9031b18-85d3-4e5b-b0d3-2a33cb179da2","connectionID":"12fc4bb7-6c5e-4efe-9ebc-90cc477bdc88","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message c9031b18-85d3-4e5b-b0d3-2a33cb179da2 unaltered + interception proxy got result of transforming message c9031b18-85d3-4e5b-b0d3-2a33cb179da2 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"5436bd2e-b4a5-4ab8-98b9-5e71ae0a59b9","method":"transformInterceptedMessage","params":{"id":"ea2b4456-5317-41c5-9916-333189302415","connectionID":"3169e6ab-56d8-45bb-a5f7-06ae93b026af","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ea2b4456-5317-41c5-9916-333189302415 unaltered + interception proxy got result of transforming message ea2b4456-5317-41c5-9916-333189302415 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"2875e5fc-9de5-4f6a-9f4a-1a04017b2fea","method":"transformInterceptedMessage","params":{"id":"0a11cb19-4263-4cb6-9161-59ad38cc3186","connectionID":"9ef4a169-866d-4990-b066-27280140bda5","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0a11cb19-4263-4cb6-9161-59ad38cc3186 unaltered + interception proxy got result of transforming message 0a11cb19-4263-4cb6-9161-59ad38cc3186 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"7bd3a3fc-6636-4fc1-bff1-6d770968562f","method":"transformInterceptedMessage","params":{"id":"07802f1d-8c19-47c1-b53a-fd8f01b666a0","connectionID":"cb215bd9-0655-4a72-9676-8c7c74ead1f5","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 07802f1d-8c19-47c1-b53a-fd8f01b666a0 unaltered + interception proxy got result of transforming message 07802f1d-8c19-47c1-b53a-fd8f01b666a0 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"4859f8b5-86a4-4757-8cbc-9dca407c5685","method":"transformInterceptedMessage","params":{"id":"0e4e835a-aefa-42cb-ba50-067ced6bc960","connectionID":"48aee968-2e7c-474f-a20a-91c288c90a6d","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0e4e835a-aefa-42cb-ba50-067ced6bc960 unaltered + interception proxy got result of transforming message 0e4e835a-aefa-42cb-ba50-067ced6bc960 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ec3c2f00-a527-4152-b25b-fa96bb6f5765","method":"transformInterceptedMessage","params":{"id":"5d737080-ce71-4995-9ac4-20cabe665a5a","connectionID":"9708c1de-ea6a-4a7a-99c5-85f7fd00d6f5","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 5d737080-ce71-4995-9ac4-20cabe665a5a unaltered + interception proxy got result of transforming message 5d737080-ce71-4995-9ac4-20cabe665a5a Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"1a420b94-0fe9-49cc-aa0f-0ecde4be6b54","method":"transformInterceptedMessage","params":{"id":"a0940f6b-58bc-41ff-ab84-4a21e287e2af","connectionID":"a4b3e3be-7289-4eb3-9295-3f564521a106","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a0940f6b-58bc-41ff-ab84-4a21e287e2af unaltered + interception proxy got result of transforming message a0940f6b-58bc-41ff-ab84-4a21e287e2af Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"96c5dc39-ac23-4e19-8ef8-30a40482faeb","method":"transformInterceptedMessage","params":{"id":"0ea5a040-a331-4af4-9120-857a442ff721","connectionID":"1aed8420-9fa2-4789-a49e-3d153011e99c","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0ea5a040-a331-4af4-9120-857a442ff721 unaltered + interception proxy got result of transforming message 0ea5a040-a331-4af4-9120-857a442ff721 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"3a18a56e-f757-496c-a21a-af30e2ae66df","method":"transformInterceptedMessage","params":{"id":"8473cab9-b5df-4e67-be53-56dc5e56c0f4","connectionID":"14abb0ae-e150-4e2f-9a38-9d7c925e9e29","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 8473cab9-b5df-4e67-be53-56dc5e56c0f4 unaltered + interception proxy got result of transforming message 8473cab9-b5df-4e67-be53-56dc5e56c0f4 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"78814af6-b1f6-471f-849a-f39e1a317e9d","method":"transformInterceptedMessage","params":{"id":"1e175f5c-37a7-4da1-81fd-4c751bc2f1da","connectionID":"a148dfa2-a37e-472f-8f03-bca2ff804e90","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 1e175f5c-37a7-4da1-81fd-4c751bc2f1da unaltered + interception proxy got result of transforming message 1e175f5c-37a7-4da1-81fd-4c751bc2f1da Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"38ae58bb-dc1c-4677-9957-aa01f24ef44a","method":"transformInterceptedMessage","params":{"id":"bb8fdac1-f6a8-4535-9145-d304d2da1aa6","connectionID":"1197cf65-f25e-48a9-bce7-b1e18cac12d9","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message bb8fdac1-f6a8-4535-9145-d304d2da1aa6 unaltered + interception proxy got result of transforming message bb8fdac1-f6a8-4535-9145-d304d2da1aa6 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"bee41dc1-80df-4aa5-a31c-db9d1124902c","method":"transformInterceptedMessage","params":{"id":"3f34c54e-d802-497c-a96f-133a10746617","connectionID":"f15e2d6d-0c1c-4912-a95e-ea5d06439b2c","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 3f34c54e-d802-497c-a96f-133a10746617 unaltered + interception proxy got result of transforming message 3f34c54e-d802-497c-a96f-133a10746617 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"9346a690-3ee7-4cf4-b01d-f0333c919831","method":"transformInterceptedMessage","params":{"id":"682018e5-0c70-465f-870f-c9f63d012ba3","connectionID":"6f9c70d3-752a-42d8-80b4-bd66350edef5","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 682018e5-0c70-465f-870f-c9f63d012ba3 unaltered + interception proxy got result of transforming message 682018e5-0c70-465f-870f-c9f63d012ba3 Object + interception proxy sending transformInterceptedMessage response Object + rxChannel: 17:05:56.669 Ably: WebSocketTransport.onWsData(): data received; length = 152; type = string + rxChannel: 17:05:56.669 Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=DISCONNECTED; error=[_ErrorInfo: Account _tmp_nMaZiw disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ]]; connectionId = HkjZzW_e__ + rxChannel: 17:05:56.669 Ably: Transport.onDisconnect(): err = [_ErrorInfo: Account _tmp_nMaZiw disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ] + rxChannel: 17:05:56.669 Ably: ConnectionManager.deactivateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_arPTlA.eykGKQ%3AL6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: 17:05:56.669 Ably: ConnectionManager.deactivateTransport(): state = disconnected; was active + rxChannel: 17:05:56.669 Ably: ConnectionManager.deactivateTransport(): reason = Account _tmp_nMaZiw disabled + rxChannel: 17:05:56.669 Ably: ConnectionManager.deactivateTransport(): Getting, clearing, and requeuing 0 pending messages + rxChannel: 17:05:56.670 Ably: MessageQueue.clear(): clearing 0 messages + rxChannel: 17:05:56.670 Ably: ConnectionManager.notifyState(): new state: disconnected; will retry connection immediately + rxChannel: 17:05:56.670 Ably: ConnectionManager.cancelTransitionTimer(): + rxChannel: 17:05:56.670 Ably: Connection state: disconnected; reason: [_ErrorInfo: Account _tmp_nMaZiw disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ] + rxChannel: 17:05:56.670 Ably: ConnectionManager.enactStateChange: setting new state: disconnected; reason = Account _tmp_nMaZiw disabled + rxChannel: 17:05:56.670 Ably: WebSocketTransport.dispose(): + rxChannel: 17:05:56.670 Ably: ConnectionManager.requestState(): requested state: connecting; current state: disconnected + rxChannel: 17:05:56.670 Ably: ConnectionManager.cancelTransitionTimer(): + rxChannel: 17:05:56.670 Ably: Connection state: connecting + rxChannel: 17:05:56.670 Ably: ConnectionManager.enactStateChange: setting new state: connecting; reason = undefined + rxChannel: 17:05:56.670 Ably: WebSocketTransport.dispose(): closing websocket + rxChannel: 17:05:56.670 Ably: ConnectionManager.startConnect(): starting connection + rxChannel: 17:05:56.670 Ably: ConnectionManager.startTransitionTimer(): transitionState: connecting + rxChannel: 17:05:56.670 Ably: ConnectionManager.getTransportParams(): Transport params = [mode=resume,connectionKey=e7dNIPVFABc0Ei!HkjZzW_e__ARSo2aGkrnMl-3889,format=json] + rxChannel: 17:05:56.670 Ably: ConnectionManager.connectWs(): undefined + rxChannel: 17:05:56.670 Ably: ConnectionManager.tryTransportWithFallbacks(): web_socket + rxChannel: 17:05:56.670 Ably: ConnectionManager.tryATransport(): trying web_socket + rxChannel: 17:05:56.670 Ably: WebSocketTransport.connect(): starting + rxChannel: 17:05:56.670 Ably: WebSocketTransport.connect(): uri: wss://sandbox-realtime.ably.io:443/ + rxChannel: 17:05:56.670 Ably: WebSocketTransport.connect(): authParams: key: _tmp_arPTlA.eykGKQ:L6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ; err: null + rxChannel: 17:05:56.670 Ably: WebSocketTransport.createWebSocket(): uri:wss://sandbox-realtime.ably.io:443/?key=_tmp_arPTlA.eykGKQ%3AL6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ&resume=e7dNIPVFABc0Ei!HkjZzW_e__ARSo2aGkrnMl-3889&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser + rxChannel: 17:05:56.687 Ably: WebSocketTransport.onWsClose(): Cleanly closed WebSocket + txChannel: 17:05:56.773 Ably: ConnectionManager WebSocket slow timer: ws connectivity check succeeded + interception proxy got message {"jsonrpc":"2.0","id":"fd62b1a2-a51f-4d89-a4b2-6fc60c5cd8ab","method":"transformInterceptedMessage","params":{"id":"fdac4b5d-97bf-45f4-80f6-4dd4bc5339af","connectionID":"0dc7b722-a81d-4607-9da6-085980537941","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976357174}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message fdac4b5d-97bf-45f4-80f6-4dd4bc5339af unaltered + interception proxy got result of transforming message fdac4b5d-97bf-45f4-80f6-4dd4bc5339af Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"0d969a12-077d-4864-b594-9a84e1f81faa","method":"transformInterceptedMessage","params":{"id":"9542b5fc-c9c2-454b-b5b7-5753b3cac444","connectionID":"b55eade6-c287-48d1-b681-fe5a0c81b514","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976357176}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 9542b5fc-c9c2-454b-b5b7-5753b3cac444 unaltered + interception proxy got result of transforming message 9542b5fc-c9c2-454b-b5b7-5753b3cac444 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"9cdfe80f-5817-4a13-b9d1-5d050bf72fe2","method":"transformInterceptedMessage","params":{"id":"b408c5c1-31b2-453c-ae85-9680aa4dc9dd","connectionID":"7f569c8f-cb8c-46c0-91be-518a752837c6","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976357176}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b408c5c1-31b2-453c-ae85-9680aa4dc9dd unaltered + interception proxy got result of transforming message b408c5c1-31b2-453c-ae85-9680aa4dc9dd Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"fefa97e4-6510-426d-9b6b-51b958339186","method":"transformInterceptedMessage","params":{"id":"37667415-85b9-4495-af4f-778dfad3c5a6","connectionID":"3d46ae86-30b7-4f4c-ae54-d373eb51e958","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976357178}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 37667415-85b9-4495-af4f-778dfad3c5a6 unaltered + interception proxy got result of transforming message 37667415-85b9-4495-af4f-778dfad3c5a6 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"48a9c322-619c-4d9e-abe5-fedded5a8534","method":"transformInterceptedMessage","params":{"id":"f3aefc34-d2dc-4f89-bd7e-378b7a59c0d9","connectionID":"1af7abf3-86e5-495d-a629-7fad874ef824","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976357179}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message f3aefc34-d2dc-4f89-bd7e-378b7a59c0d9 unaltered + interception proxy got result of transforming message f3aefc34-d2dc-4f89-bd7e-378b7a59c0d9 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ad708ee4-ded6-4219-8e12-8e38abba2f03","method":"transformInterceptedMessage","params":{"id":"8ace6311-632e-4786-ba48-2acc30d28321","connectionID":"fca00b4c-d3e1-48f3-9437-02dc624cd5e5","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976357180}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 8ace6311-632e-4786-ba48-2acc30d28321 unaltered + interception proxy got result of transforming message 8ace6311-632e-4786-ba48-2acc30d28321 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"2b9f5303-454c-4e5c-aff5-471cebdacf4f","method":"transformInterceptedMessage","params":{"id":"b5f2473c-9ad2-4765-a852-8e30211771ee","connectionID":"f39078a6-7d1b-4f7d-8cb6-60a5c11a6b99","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976357180}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b5f2473c-9ad2-4765-a852-8e30211771ee unaltered + interception proxy got result of transforming message b5f2473c-9ad2-4765-a852-8e30211771ee Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"3a94ea7e-0c90-4292-927a-cb0c05500749","method":"transformInterceptedMessage","params":{"id":"30f4f011-9441-440e-a2b2-1d3848eba8a9","connectionID":"9e506871-8718-43c8-9132-f5a134df8002","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976357182}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 30f4f011-9441-440e-a2b2-1d3848eba8a9 unaltered + interception proxy got result of transforming message 30f4f011-9441-440e-a2b2-1d3848eba8a9 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"a3ee7fc3-79b8-4668-b52d-b631fc0bfa53","method":"transformInterceptedMessage","params":{"id":"eb85921b-0ead-410b-b07c-a8faa6d9994b","connectionID":"2481bcce-d1dd-4a08-8456-879dfe2cac12","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976357211}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message eb85921b-0ead-410b-b07c-a8faa6d9994b unaltered + interception proxy got result of transforming message eb85921b-0ead-410b-b07c-a8faa6d9994b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"55f5b617-aad1-4119-97a1-411e79fec84a","method":"transformInterceptedMessage","params":{"id":"526fd9b4-29e3-4e47-8649-cdcc2cea09a8","connectionID":"9faff42f-3b64-488f-99b8-d4ba0a861a86","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976357215}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 526fd9b4-29e3-4e47-8649-cdcc2cea09a8 unaltered + interception proxy got result of transforming message 526fd9b4-29e3-4e47-8649-cdcc2cea09a8 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"bd2c18f5-adea-4a41-a15e-e7633854e2ab","method":"transformInterceptedMessage","params":{"id":"efa9c1df-3f88-48ef-8fec-957e07530f46","connectionID":"48c94a59-59f7-4fde-b112-837519636a70","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976357307}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message efa9c1df-3f88-48ef-8fec-957e07530f46 unaltered + interception proxy got result of transforming message efa9c1df-3f88-48ef-8fec-957e07530f46 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"18754923-ab01-4a10-8879-2428fe65b1de","method":"transformInterceptedMessage","params":{"id":"4011f61d-b2d9-40e5-8cbf-eb1508bea03b","connectionID":"13dde322-87f3-452e-b0d6-ac5e2842ff59","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976357488}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 4011f61d-b2d9-40e5-8cbf-eb1508bea03b unaltered + interception proxy got result of transforming message 4011f61d-b2d9-40e5-8cbf-eb1508bea03b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"9a7f6837-2123-4411-ac49-9643a62ac722","method":"transformInterceptedMessage","params":{"id":"cae5528f-d274-49d7-a6c9-2a6b09e38b4c","connectionID":"f2b116ee-5159-484c-bbca-15a79b209052","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976357503}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message cae5528f-d274-49d7-a6c9-2a6b09e38b4c unaltered + interception proxy got result of transforming message cae5528f-d274-49d7-a6c9-2a6b09e38b4c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"6d430dd9-a43a-4c3a-a885-8a15509d7f9d","method":"transformInterceptedMessage","params":{"id":"b5fd6aba-1252-4837-8169-5e18a598a3a8","connectionID":"2412fe5e-388b-4962-8c12-40ecf7626172","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976358492}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b5fd6aba-1252-4837-8169-5e18a598a3a8 unaltered + interception proxy got result of transforming message b5fd6aba-1252-4837-8169-5e18a598a3a8 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"fae8f6b6-582e-4dbb-8993-ab3085cd591d","method":"transformInterceptedMessage","params":{"id":"2077533d-b542-4e8a-ac2a-2d60f07d346c","connectionID":"1ada4ae7-20b4-4c89-9dbb-4d27e4a5befc","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976358585}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 2077533d-b542-4e8a-ac2a-2d60f07d346c unaltered + interception proxy got result of transforming message 2077533d-b542-4e8a-ac2a-2d60f07d346c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"bbdbbed1-86a8-46fa-b953-2705cfef1a34","method":"transformInterceptedMessage","params":{"id":"abc4243b-441d-41e7-8870-2d8e8cb22231","connectionID":"b9161b92-1cf5-485b-9d7f-a7a536e41885","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976358733}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message abc4243b-441d-41e7-8870-2d8e8cb22231 unaltered + interception proxy got result of transforming message abc4243b-441d-41e7-8870-2d8e8cb22231 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"064ff42d-ee63-4def-92ee-92bf85a22c9d","method":"transformInterceptedMessage","params":{"id":"617f1cb8-0449-4d44-b4b0-b5854a9bd9e9","connectionID":"100b6120-fc77-43fc-b8f5-fa08af996d72","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976358813}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 617f1cb8-0449-4d44-b4b0-b5854a9bd9e9 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 617f1cb8-0449-4d44-b4b0-b5854a9bd9e9 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"f64c17b0-ca0e-40b3-bec8-a731c0a01448","method":"transformInterceptedMessage","params":{"id":"c27cc443-a4f9-420b-8a15-4ea7c9be326e","connectionID":"7d1d06a7-a82d-4fe1-bee4-617bfe480e31","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_nMaZiw disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976358923}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message c27cc443-a4f9-420b-8a15-4ea7c9be326e unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message c27cc443-a4f9-420b-8a15-4ea7c9be326e Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"44c813a3-ac63-4c9f-a3a5-34953862eef3","method":"transformInterceptedMessage","params":{"id":"66d49a52-0a72-4f38-839d-a3bd0d93f63f","connectionID":"a7cbefa9-9041-4514-ab10-94aabe202607","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976359325}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 66d49a52-0a72-4f38-839d-a3bd0d93f63f unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 66d49a52-0a72-4f38-839d-a3bd0d93f63f Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"133f01ed-4023-4c65-85e5-03958726a8db","method":"transformInterceptedMessage","params":{"id":"e387a3bf-afd3-434f-8e23-35b3767924d5","connectionID":"cae33f82-9c23-43d3-b2fd-ead3f3874a09","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976359355}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message e387a3bf-afd3-434f-8e23-35b3767924d5 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message e387a3bf-afd3-434f-8e23-35b3767924d5 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"5a721068-f570-44b4-8eb8-f68249f526eb","method":"transformInterceptedMessage","params":{"id":"30e63c3a-8e14-4cfa-b531-3497d62d8d9e","connectionID":"865f1ec4-34af-46f4-bab9-b623ab0180fd","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976359357}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 30e63c3a-8e14-4cfa-b531-3497d62d8d9e unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 30e63c3a-8e14-4cfa-b531-3497d62d8d9e Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"7d73c15d-f693-4aae-983d-3c9c60b6521c","method":"transformInterceptedMessage","params":{"id":"7fa66d8e-cab3-4035-948f-d03bf6276c97","connectionID":"518c9700-7981-4792-8d00-983b34d63d1b","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976359591}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 7fa66d8e-cab3-4035-948f-d03bf6276c97 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 7fa66d8e-cab3-4035-948f-d03bf6276c97 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"f6b1eda7-94f4-49ea-bce1-9f7de9e1546a","method":"transformInterceptedMessage","params":{"id":"ff56eede-5306-440d-8634-4e51a7322667","connectionID":"a348aaf7-a63d-4ee6-b091-84cf25bda68b","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976359979}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message ff56eede-5306-440d-8634-4e51a7322667 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message ff56eede-5306-440d-8634-4e51a7322667 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"879c7db3-2e5f-406e-ad8a-3f9319f604ef","method":"transformInterceptedMessage","params":{"id":"ee344a0f-cd51-4345-852e-764bd13dc93f","connectionID":"27b3b5a4-e93f-4c2b-85f5-379599dc3cd8","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976360183}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message ee344a0f-cd51-4345-852e-764bd13dc93f unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message ee344a0f-cd51-4345-852e-764bd13dc93f Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +modular.test.js:601 rxChannel: 17:06:00.670 Ably: ConnectionManager WebSocket slow timer: checking connectivity +modular.test.js:601 rxChannel: 17:06:00.671 Ably: (Fetch)Http.checkConnectivity(): Sending; https://internet-up.ably-realtime.com/is-the-internet-up.txt +modular.test.js:601 rxChannel: 17:06:00.673 Ably: (Fetch)Http.checkConnectivity(): Result: true +modular.test.js:601 rxChannel: 17:06:00.673 Ably: ConnectionManager WebSocket slow timer: http connectivity check succeeded +modular.test.js:601 rxChannel: 17:06:00.754 Ably: ConnectionManager WebSocket slow timer: ws connectivity check succeeded +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"8934c305-cc67-472d-befb-15710d67b509","method":"transformInterceptedMessage","params":{"id":"5a6f4d02-394b-431f-b6b5-1f1b29fdaf8a","connectionID":"427ad8cc-9c08-40e6-a163-4b505467dee3","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976360996}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 5a6f4d02-394b-431f-b6b5-1f1b29fdaf8a unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 5a6f4d02-394b-431f-b6b5-1f1b29fdaf8a Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"1374c9e5-2b78-4ae0-ac7f-415c59014cf5","method":"transformInterceptedMessage","params":{"id":"86d67362-62de-4e16-8b59-06beb25a96f8","connectionID":"1a8bbd14-a7d3-4da1-8216-914733acba35","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976361073}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 86d67362-62de-4e16-8b59-06beb25a96f8 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 86d67362-62de-4e16-8b59-06beb25a96f8 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"353d24a6-bdef-446a-a82b-08a25c07c2fd","method":"transformInterceptedMessage","params":{"id":"0c355aa0-8f9e-45dd-bf24-92f6f238dc37","connectionID":"6b9776f5-4b90-40d8-984a-8d50fb93d858","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976361159}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 0c355aa0-8f9e-45dd-bf24-92f6f238dc37 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 0c355aa0-8f9e-45dd-bf24-92f6f238dc37 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +modular.test.js:601 rxChannel: 17:06:01.277 Ably: WebSocketTransport.onWsOpen(): opened WebSocket +modular.test.js:601 rxChannel: 17:06:01.277 Ably: Transport.tryConnect(): viable transport WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_arPTlA.eykGKQ%3AL6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ&resume=e7dNIPVFABc0Ei!HkjZzW_e__ARSo2aGkrnMl-3889&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:601 rxChannel: 17:06:01.277 Ably: ConnectionManager.tryATransport(): viable transport web_socket; setting pending +modular.test.js:601 rxChannel: 17:06:01.277 Ably: ConnectionManager.setTransportPending(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_arPTlA.eykGKQ%3AL6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ&resume=e7dNIPVFABc0Ei!HkjZzW_e__ARSo2aGkrnMl-3889&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser; mode = resume +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"4bd2780a-2cb5-412b-84bc-05c18c748bce","method":"transformInterceptedMessage","params":{"id":"87b904d5-6542-4900-85c9-eb472c31552f","connectionID":"1b504529-a530-48a6-9ba0-c5609a94c26a","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976361553}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 87b904d5-6542-4900-85c9-eb472c31552f unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 87b904d5-6542-4900-85c9-eb472c31552f Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"1e5abc8f-9f3e-4a8c-a710-82e83a876de1","method":"transformInterceptedMessage","params":{"id":"bcac6011-7ad3-4c83-9a51-6028e8a899b3","connectionID":"b0e5bae5-9b35-432c-aef5-ab8480e16414","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976361700}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message bcac6011-7ad3-4c83-9a51-6028e8a899b3 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message bcac6011-7ad3-4c83-9a51-6028e8a899b3 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +modular.test.js:601 rxChannel: 17:06:01.774 Ably: WebSocketTransport.onWsData(): data received; length = 232; type = string +modular.test.js:601 rxChannel: 17:06:01.774 Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ERROR; timestamp=1715976361700; error=[_ErrorInfo: Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300]]; connectionId = HkjZzW_e__ +modular.test.js:601 rxChannel: 17:06:01.774 Ably: Transport.onProtocolMessage(): received error action; connectionId = HkjZzW_e__; err = {"code":40300,"statusCode":403,"nonfatal":false,"href":"https://help.ably.io/error/40300"} +modular.test.js:601 rxChannel: 17:06:01.774 Ably: Transport.onFatalError(): err = [_ErrorInfo: Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] +modular.test.js:601 rxChannel: 17:06:01.775 Ably: ConnectionManager.deactivateTransport(): transport = WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_arPTlA.eykGKQ%3AL6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ&resume=e7dNIPVFABc0Ei!HkjZzW_e__ARSo2aGkrnMl-3889&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:601 rxChannel: 17:06:01.775 Ably: ConnectionManager.deactivateTransport(): state = failed; was pending +modular.test.js:601 rxChannel: 17:06:01.775 Ably: ConnectionManager.deactivateTransport(): reason = Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.) +modular.test.js:601 rxChannel: 17:06:01.775 Ably: ConnectionManager.notifyState(): new state: failed +modular.test.js:601 rxChannel: 17:06:01.775 Ably: ConnectionManager.cancelTransitionTimer(): +modular.test.js:601 rxChannel: 17:06:01.775 Ably: Connection state: failed; reason: [_ErrorInfo: Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] +modular.test.js:601 rxChannel: 17:06:01.775 Ably: ConnectionManager.enactStateChange: setting new state: failed; reason = Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.) +modular.test.js:601 rxChannel: 17:06:01.776 Ably: RealtimeChannel.notifyState: name = channel, current state = attached, notifying state failed +modular.test.js:601 rxChannel: 17:06:01.776 Ably: PresenceMap.setInProgress(): inProgress = false +modular.test.js:601 rxChannel: 17:06:01.776 Ably: PresenceMap.setInProgress(): inProgress = false +modular.test.js:601 rxChannel: 17:06:01.776 Ably: Channel state for channel "channel": failed; reason: [_ErrorInfo: Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] +modular.test.js:601 rxChannel: 17:06:01.776 Ably: WebSocketTransport.dispose(): +modular.test.js:601 rxChannel: 17:06:01.776 Ably: ConnectionManager.disconnectAllTransports(): Disconnecting all transports +modular.test.js:601 rxChannel: 17:06:01.777 Ably: ConnectionManager.disconnectAllTransports(): Disconnecting pending transport: WebSocketTransport; uri=wss://sandbox-realtime.ably.io:443/?key=_tmp_arPTlA.eykGKQ%3AL6apL_FGTQVYNsaOZMZYF899O96LilTfeMECxAyfcfQ&resume=e7dNIPVFABc0Ei!HkjZzW_e__ARSo2aGkrnMl-3889&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser +modular.test.js:601 rxChannel: 17:06:01.777 Ably: ConnectionManager.disconnectAllTransports(): Disconnecting proposed transport: undefined +modular.test.js:601 rxChannel: 17:06:01.777 Ably: WebSocketTransport.dispose(): closing websocket +modular.test.js:601 rxChannel: 17:06:01.779 Ably: WebSocketTransport.onWsClose(): Cleanly closed WebSocket +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"ba30acde-d94f-4c5d-9872-6e95a1d468f7","method":"transformInterceptedMessage","params":{"id":"8eb4ae8f-6783-4d18-8ad0-6a5774482d13","connectionID":"7546728a-a723-455e-8687-6243c24886a0","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_arPTlA disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715976361796}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 8eb4ae8f-6783-4d18-8ad0-6a5774482d13 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 8eb4ae8f-6783-4d18-8ad0-6a5774482d13 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +testapp_module.js:76 Test App _tmp_arPTlA has been torn down +interception_proxy_client.js:73 interception proxy client disconnected \ No newline at end of file diff --git a/with-failure-logs.txt b/with-failure-logs.txt new file mode 100644 index 000000000..bdaa5f115 --- /dev/null +++ b/with-failure-logs.txt @@ -0,0 +1,999 @@ +favicon.ico:1 Failed to load resource: the server responded with a status of 404 (Not Found) + connected to interception proxy + interception proxy sending startInterception request Object + interception proxy got message {"jsonrpc":"2.0","id":"8388829898810493","result":{}} + startInterception completed + Test App _tmp_QGtAug in environment sandbox has been set up + START TEST: browser/modular attempting to initialize with no client options BaseRest throws an error + 10:59:23.822 Ably: BaseRest(): BaseRest must be initialized with a client options object +errorLogger @ index.mjs:63 +(anonymous) @ index.mjs:51 +logAction @ index.mjs:105 +logActionNoStrip @ index.mjs:101 +_Logger.logAction @ index.mjs:136 +objectifyOptions @ index.mjs:549 +BaseRest @ index.mjs:2759 +(anonymous) @ modular.test.js:48 +assertThrows @ chai.js:3044 +methodWrapper @ chai.js:7910 +(anonymous) @ modular.test.js:48 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 + END TEST: browser/modular attempting to initialize with no client options BaseRest throws an error + START TEST: browser/modular attempting to initialize with no client options _BaseRealtime throws an error + 10:59:23.830 Ably: BaseRealtime(): BaseRealtime must be initialized with a client options object +errorLogger @ index.mjs:63 +(anonymous) @ index.mjs:51 +logAction @ index.mjs:105 +logActionNoStrip @ index.mjs:101 +_Logger.logAction @ index.mjs:136 +objectifyOptions @ index.mjs:549 +_BaseRealtime @ index.mjs:5527 +(anonymous) @ modular.test.js:48 +assertThrows @ chai.js:3044 +methodWrapper @ chai.js:7910 +(anonymous) @ modular.test.js:48 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 + END TEST: browser/modular attempting to initialize with no client options _BaseRealtime throws an error + START TEST: browser/modular attempting to initialize with just an API key BaseRest throws an error + 10:59:23.835 Ably: BaseRest(): BaseRest 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’s `key` property.) +errorLogger @ index.mjs:63 +(anonymous) @ index.mjs:51 +logAction @ index.mjs:105 +logActionNoStrip @ index.mjs:101 +_Logger.logAction @ index.mjs:136 +objectifyOptions @ index.mjs:566 +BaseRest @ index.mjs:2759 +(anonymous) @ modular.test.js:58 +assertThrows @ chai.js:3044 +methodWrapper @ chai.js:7910 +(anonymous) @ modular.test.js:58 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 + END TEST: browser/modular attempting to initialize with just an API key BaseRest throws an error + START TEST: browser/modular attempting to initialize with just an API key _BaseRealtime throws an error + 10:59:23.836 Ably: BaseRealtime(): BaseRealtime 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’s `key` property.) +errorLogger @ index.mjs:63 +(anonymous) @ index.mjs:51 +logAction @ index.mjs:105 +logActionNoStrip @ index.mjs:101 +_Logger.logAction @ index.mjs:136 +objectifyOptions @ index.mjs:566 +_BaseRealtime @ index.mjs:5527 +(anonymous) @ modular.test.js:58 +assertThrows @ chai.js:3044 +methodWrapper @ chai.js:7910 +(anonymous) @ modular.test.js:58 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 + END TEST: browser/modular attempting to initialize with just an API key _BaseRealtime throws an error + START TEST: browser/modular attempting to initialize with just a token BaseRest throws an error + 10:59:23.836 Ably: BaseRest(): BaseRest 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’s `token` property.) +errorLogger @ index.mjs:63 +(anonymous) @ index.mjs:51 +logAction @ index.mjs:105 +logActionNoStrip @ index.mjs:101 +_Logger.logAction @ index.mjs:136 +objectifyOptions @ index.mjs:557 +BaseRest @ index.mjs:2759 +(anonymous) @ modular.test.js:70 +assertThrows @ chai.js:3044 +methodWrapper @ chai.js:7910 +(anonymous) @ modular.test.js:70 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 + END TEST: browser/modular attempting to initialize with just a token BaseRest throws an error + START TEST: browser/modular attempting to initialize with just a token _BaseRealtime throws an error + 10:59:23.837 Ably: BaseRealtime(): BaseRealtime 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’s `token` property.) +errorLogger @ index.mjs:63 +(anonymous) @ index.mjs:51 +logAction @ index.mjs:105 +logActionNoStrip @ index.mjs:101 +_Logger.logAction @ index.mjs:136 +objectifyOptions @ index.mjs:557 +_BaseRealtime @ index.mjs:5527 +(anonymous) @ modular.test.js:70 +assertThrows @ chai.js:3044 +methodWrapper @ chai.js:7910 +(anonymous) @ modular.test.js:70 +callFn @ mocha.js:22155 +Runnable.run @ mocha.js:22141 +Runner.runTest @ mocha.js:23779 +(anonymous) @ mocha.js:23910 +next @ mocha.js:23687 +(anonymous) @ mocha.js:23697 +next @ mocha.js:23572 +(anonymous) @ mocha.js:23664 +timeslice @ mocha.js:29987 + END TEST: browser/modular attempting to initialize with just a token _BaseRealtime throws an error + START TEST: browser/modular without any plugins BaseRest throws an error due to the absence of an HTTP plugin + END TEST: browser/modular without any plugins BaseRest throws an error due to the absence of an HTTP plugin + START TEST: browser/modular without any plugins _BaseRealtime throws an error due to the absence of an HTTP plugin + END TEST: browser/modular without any plugins _BaseRealtime throws an error due to the absence of an HTTP plugin + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to use push admin functionality + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to use push admin functionality + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `time()` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `time()` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `stats()` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `stats()` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `request(...)` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `request(...)` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPublish(...)` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPublish(...)` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPresence(...)` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `batchPresence(...)` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.revokeTokens(...)` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call `auth.revokeTokens(...)` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `history()` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `history()` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `presence.history()` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `presence.history()` + START TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `status()` + END TEST: browser/modular Rest BaseRest without explicit Rest allows you to call channel’s `status()` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to use push admin functionality + END TEST: browser/modular Rest BaseRealtime with Rest allows you to use push admin functionality + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `time()` + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `time()` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled + interception proxy got message {"jsonrpc":"2.0","id":"4ba54e93-7485-4498-bf21-621655c6c66f","method":"transformInterceptedMessage","params":{"id":"a2030ea5-2b8e-419e-ad90-33bcbe1cbd69","connectionID":"3bfa65e2-7537-445f-9044-df257de03847","type":"text","data":"{\"action\":4,\"connectionId\":\"C7lxbPHOgM\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dMmMNTQBbzjM!C7lxbPHOgMAdINIq7FZVI3-293a\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.09b0.2.us-east-1-A.i-0fa407612c4f12887.e7dMmMNTQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a2030ea5-2b8e-419e-ad90-33bcbe1cbd69 unaltered + interception proxy got result of transforming message a2030ea5-2b8e-419e-ad90-33bcbe1cbd69 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.createTokenRequest()` with `queryTime` option enabled + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `stats()` + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `stats()` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `request(...)` + interception proxy got message {"jsonrpc":"2.0","id":"25d209a8-6b40-449f-b074-2ffabf0fdb26","method":"transformInterceptedMessage","params":{"id":"8c94dd75-710f-45a9-b3f6-f0617973af7a","connectionID":"7a429b07-dd5f-4d05-b20a-70d8fda0991b","type":"text","data":"{\"action\":4,\"connectionId\":\"I46olZLWRQ\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dMmMNTQBbzjM!I46olZLWRQAc_VrkykdBkf-293d\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.09b0.2.us-east-1-A.i-0fa407612c4f12887.e7dMmMNTQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 8c94dd75-710f-45a9-b3f6-f0617973af7a unaltered + interception proxy got result of transforming message 8c94dd75-710f-45a9-b3f6-f0617973af7a Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `request(...)` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPublish(...)` + interception proxy got message {"jsonrpc":"2.0","id":"1433998f-e25f-4f14-a248-678dfe699feb","method":"transformInterceptedMessage","params":{"id":"b168a78d-52b7-486f-bb00-a8fc5e9bdf72","connectionID":"966dbdca-02d1-4ca9-a7be-027af8d8313b","type":"text","data":"{\"action\":4,\"connectionId\":\"ZBMI8V9vHH\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dQFBPjwBbzfT!ZBMI8V9vHHAWP-1RDXlRTu-423d\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.039b.2.us-east-1-A.i-01fe288a84a67f672.e7dQFBPjwBbzfT\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b168a78d-52b7-486f-bb00-a8fc5e9bdf72 unaltered + interception proxy got result of transforming message b168a78d-52b7-486f-bb00-a8fc5e9bdf72 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPublish(...)` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPresence(...)` + interception proxy got message {"jsonrpc":"2.0","id":"e6b4524b-7660-471b-bdae-1cb7ee6f7106","method":"transformInterceptedMessage","params":{"id":"45180076-60f7-4400-a03f-9c324dc520ba","connectionID":"3af1e5a9-2e17-44a2-88ff-a2ee8bf9cf27","type":"text","data":"{\"action\":4,\"connectionId\":\"eBeniK8XCx\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dHlxZVQBbzjM!eBeniK8XCxAZwMNR0LFLI7-2853\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.2fe8.1.us-east-1-A.i-0fa407612c4f12887.e7dHlxZVQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 45180076-60f7-4400-a03f-9c324dc520ba unaltered + interception proxy got result of transforming message 45180076-60f7-4400-a03f-9c324dc520ba Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `batchPresence(...)` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.revokeTokens(...)` + interception proxy got message {"jsonrpc":"2.0","id":"a4342bab-7d4a-4f37-909d-4b74a0eecb57","method":"transformInterceptedMessage","params":{"id":"39b6fc3b-f350-42d6-8adf-527ab88ed548","connectionID":"e8f9cb77-8b33-4c1c-bd2f-06e23f652dbb","type":"text","data":"{\"action\":4,\"connectionId\":\"167gdE0DTh\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dHlxZVQBbzjM!167gdE0DThAeTgfYeZTYlD-2855\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.2fe8.1.us-east-1-A.i-0fa407612c4f12887.e7dHlxZVQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 39b6fc3b-f350-42d6-8adf-527ab88ed548 unaltered + interception proxy got result of transforming message 39b6fc3b-f350-42d6-8adf-527ab88ed548 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call `auth.revokeTokens(...)` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `history()` + interception proxy got message {"jsonrpc":"2.0","id":"c2b66215-45cb-43f2-b83e-0220b018062c","method":"transformInterceptedMessage","params":{"id":"989f1f54-441b-4801-b405-9b15bbe3671a","connectionID":"9f744df1-ef34-4fd4-bb64-bcff520f9174","type":"text","data":"{\"action\":4,\"connectionId\":\"lyyXJGX6gn\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dHlxZVQBbzjM!lyyXJGX6gnAcUqcEwvA7ZK-2856\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.2fe8.1.us-east-1-A.i-0fa407612c4f12887.e7dHlxZVQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 989f1f54-441b-4801-b405-9b15bbe3671a unaltered + interception proxy got result of transforming message 989f1f54-441b-4801-b405-9b15bbe3671a Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `history()` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `presence.history()` + interception proxy got message {"jsonrpc":"2.0","id":"7385cf8d-ce98-4c11-8f7a-c6368f4eabf6","method":"transformInterceptedMessage","params":{"id":"bd2bd12a-6b42-4b03-aa77-ed9c5fd97d5e","connectionID":"42c5f679-1469-47d1-ba3d-9d560a394924","type":"text","data":"{\"action\":4,\"connectionId\":\"yfQCdPoyQ7\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dHlxZVQBbzjM!yfQCdPoyQ7AYUhUng8Y9XS-2857\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.2fe8.1.us-east-1-A.i-0fa407612c4f12887.e7dHlxZVQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message bd2bd12a-6b42-4b03-aa77-ed9c5fd97d5e unaltered + interception proxy got result of transforming message bd2bd12a-6b42-4b03-aa77-ed9c5fd97d5e Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `presence.history()` + START TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `status()` + interception proxy got message {"jsonrpc":"2.0","id":"30ed09cb-d9b9-4be8-bbfe-764adbb854d7","method":"transformInterceptedMessage","params":{"id":"fb7a9208-2171-4231-ad15-e96ae3af6001","connectionID":"c7b2433c-cb3f-4da2-8b74-6b47d1fab9eb","type":"text","data":"{\"action\":4,\"connectionId\":\"a5_FqhEvyg\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7d5jA5ewBbzhQ!a5_FqhEvygATENzXFsFINV-351a\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.1ca9.1.us-east-1-A.i-0112a1dedf234209a.e7d5jA5ewBbzhQ\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message fb7a9208-2171-4231-ad15-e96ae3af6001 unaltered + interception proxy got result of transforming message fb7a9208-2171-4231-ad15-e96ae3af6001 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime with Rest allows you to call channel’s `status()` + START TEST: browser/modular Rest BaseRealtime without Rest still allows publishing and subscribing + interception proxy got message {"jsonrpc":"2.0","id":"7a8ec9f0-298f-4cff-aecc-092da65b2442","method":"transformInterceptedMessage","params":{"id":"8dc59892-fd1d-42d1-b7ce-1a7ed870317b","connectionID":"141c38ef-ad38-4e56-bb7a-6d8ac3c6d03b","type":"text","data":"{\"action\":4,\"connectionId\":\"j0dho9mEOs\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dQFBPjwBbzfT!j0dho9mEOsARs-bigT1qvS-423f\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.039b.2.us-east-1-A.i-01fe288a84a67f672.e7dQFBPjwBbzfT\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 8dc59892-fd1d-42d1-b7ce-1a7ed870317b unaltered + interception proxy got result of transforming message 8dc59892-fd1d-42d1-b7ce-1a7ed870317b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"1914a58a-4aa9-440e-bb9b-9dc60e2088c8","method":"transformInterceptedMessage","params":{"id":"74b13ab3-b130-4215-a05c-c5b6f7365244","connectionID":"81120032-6cad-49a3-a2ee-839e13f797dc","type":"text","data":"{\"action\":4,\"connectionId\":\"v7FbHwtYOL\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dMmMNTQBbzjM!v7FbHwtYOLAbKZk7S2hjob-293e\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.09b0.2.us-east-1-A.i-0fa407612c4f12887.e7dMmMNTQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 74b13ab3-b130-4215-a05c-c5b6f7365244 unaltered + interception proxy got result of transforming message 74b13ab3-b130-4215-a05c-c5b6f7365244 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"c20428c3-e37d-46e6-b802-8c1618cc08c5","method":"transformInterceptedMessage","params":{"id":"e9414fb1-df13-456b-a04c-abbd5aeb39b1","connectionID":"9da96eea-ef43-462f-90d5-6db5274748ea","type":"text","data":"{\"action\":4,\"connectionId\":\"_MEgq0GFc3\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dj_O36QBbzhQ!_MEgq0GFc3ASR59uH6Sg2x-34ef\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.22ca.2.us-east-1-A.i-0112a1dedf234209a.e7dj_O36QBbzhQ\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message e9414fb1-df13-456b-a04c-abbd5aeb39b1 unaltered + interception proxy got result of transforming message e9414fb1-df13-456b-a04c-abbd5aeb39b1 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"38884047-6105-4dfb-8edf-797d72f9965b","method":"transformInterceptedMessage","params":{"id":"25d24ceb-a2d7-4f1f-b5f3-85ac0376c7e7","connectionID":"6bc0bb24-56f9-415b-bcf7-8eeea02aed22","type":"text","data":"{\"action\":4,\"connectionId\":\"2_dYK13ZvL\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dMmMNTQBbzjM!2_dYK13ZvLAccL24hKd5ii-293f\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.09b0.2.us-east-1-A.i-0fa407612c4f12887.e7dMmMNTQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 25d24ceb-a2d7-4f1f-b5f3-85ac0376c7e7 unaltered + interception proxy got result of transforming message 25d24ceb-a2d7-4f1f-b5f3-85ac0376c7e7 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"74dcb8f6-82b8-48b2-80d5-e7279dcc88d5","method":"transformInterceptedMessage","params":{"id":"dd04d17e-f59a-4804-b707-ab17bd2ba2bc","connectionID":"6bc0bb24-56f9-415b-bcf7-8eeea02aed22","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message dd04d17e-f59a-4804-b707-ab17bd2ba2bc unaltered + interception proxy got result of transforming message dd04d17e-f59a-4804-b707-ab17bd2ba2bc Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"901bc633-434b-4993-ba8d-ad919291d478","method":"transformInterceptedMessage","params":{"id":"941a67cd-0ccf-471a-a904-7adb5d816c4e","connectionID":"6bc0bb24-56f9-415b-bcf7-8eeea02aed22","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954370685-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 941a67cd-0ccf-471a-a904-7adb5d816c4e unaltered + interception proxy got result of transforming message 941a67cd-0ccf-471a-a904-7adb5d816c4e Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"7f2a3c7e-339a-4e83-b3fb-f3b204e8a50c","method":"transformInterceptedMessage","params":{"id":"79a96e57-8368-47ab-868f-34f0327631cc","connectionID":"6bc0bb24-56f9-415b-bcf7-8eeea02aed22","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"encoding\":\"json\",\"data\":\"{\\\"foo\\\":\\\"bar\\\"}\"}],\"msgSerial\":0}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 79a96e57-8368-47ab-868f-34f0327631cc unaltered + interception proxy got result of transforming message 79a96e57-8368-47ab-868f-34f0327631cc Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ab8ef296-dd94-456c-b4f8-a1b61137708f","method":"transformInterceptedMessage","params":{"id":"ef22f3bb-a925-4f79-ba34-e085a996abd5","connectionID":"6bc0bb24-56f9-415b-bcf7-8eeea02aed22","type":"text","data":"{\"action\":15,\"id\":\"2_dYK13ZvL:0\",\"connectionId\":\"2_dYK13ZvL\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954372176-0\",\"timestamp\":1715954372176,\"messages\":[{\"encoding\":\"json\",\"data\":\"{\\\"foo\\\":\\\"bar\\\"}\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ef22f3bb-a925-4f79-ba34-e085a996abd5 unaltered + interception proxy got result of transforming message ef22f3bb-a925-4f79-ba34-e085a996abd5 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"9b94edd1-6616-4127-a0d9-2fe510b5b5d8","method":"transformInterceptedMessage","params":{"id":"7edc7b88-3ae6-44aa-81ca-49c39fda733e","connectionID":"6bc0bb24-56f9-415b-bcf7-8eeea02aed22","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 7edc7b88-3ae6-44aa-81ca-49c39fda733e unaltered + interception proxy got result of transforming message 7edc7b88-3ae6-44aa-81ca-49c39fda733e Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Rest BaseRealtime without Rest still allows publishing and subscribing + START TEST: browser/modular Rest BaseRealtime without Rest allows `auth.createTokenRequest()` without `queryTime` option enabled + END TEST: browser/modular Rest BaseRealtime without Rest allows `auth.createTokenRequest()` without `queryTime` option enabled + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to use push admin functionality + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to use push admin functionality + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `time()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `time()` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.createTokenRequest()` with `queryTime` option enabled + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.createTokenRequest()` with `queryTime` option enabled + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `stats()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `stats()` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `request(...)` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `request(...)` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPublish(...)` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPublish(...)` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPresence(...)` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `batchPresence(...)` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.revokeTokens(...)` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call `auth.revokeTokens(...)` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `history()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `history()` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `presence.history()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `presence.history()` + START TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `status()` + END TEST: browser/modular Rest BaseRealtime without Rest throws an error when attempting to call channel’s `status()` + START TEST: browser/modular Crypto standalone functions generateRandomKey + END TEST: browser/modular Crypto standalone functions generateRandomKey + START TEST: browser/modular Crypto standalone functions getDefaultCryptoParams + END TEST: browser/modular Crypto standalone functions getDefaultCryptoParams + START TEST: browser/modular Message standalone functions decodeMessage decodes a message’s data + END TEST: browser/modular Message standalone functions decodeMessage decodes a message’s data + START TEST: browser/modular Message standalone functions decodeMessage throws an error when given channel options with a cipher + END TEST: browser/modular Message standalone functions decodeMessage throws an error when given channel options with a cipher + START TEST: browser/modular Message standalone functions decodeEncryptedMessage decodes a message’s data + END TEST: browser/modular Message standalone functions decodeEncryptedMessage decodes a message’s data + START TEST: browser/modular Message standalone functions decodeEncryptedMessage decrypts a message + END TEST: browser/modular Message standalone functions decodeEncryptedMessage decrypts a message + START TEST: browser/modular Message standalone functions decodeMessages decodes messages’ data + END TEST: browser/modular Message standalone functions decodeMessages decodes messages’ data + START TEST: browser/modular Message standalone functions decodeMessages throws an error when given channel options with a cipher + END TEST: browser/modular Message standalone functions decodeMessages throws an error when given channel options with a cipher + START TEST: browser/modular Message standalone functions decodeEncryptedMessages decodes messages’ data + END TEST: browser/modular Message standalone functions decodeEncryptedMessages decodes messages’ data + START TEST: browser/modular Message standalone functions decodeEncryptedMessages decrypts messages + END TEST: browser/modular Message standalone functions decodeEncryptedMessages decrypts messages + START TEST: browser/modular Crypto without Crypto BaseRest throws an error when given channel options with a cipher + END TEST: browser/modular Crypto without Crypto BaseRest throws an error when given channel options with a cipher + START TEST: browser/modular Crypto without Crypto _BaseRealtime throws an error when given channel options with a cipher + END TEST: browser/modular Crypto without Crypto _BaseRealtime throws an error when given channel options with a cipher + START TEST: browser/modular Crypto with Crypto BaseRest is able to publish encrypted messages + interception proxy got message {"jsonrpc":"2.0","id":"e1464fda-b460-47da-9259-a1e130c2801e","method":"transformInterceptedMessage","params":{"id":"1fc33138-fd6a-4aef-aa37-de72d7b1deca","connectionID":"8220c20c-829e-48f8-afca-ac5ed3cca3de","type":"text","data":"{\"action\":4,\"connectionId\":\"xaT4xwcFLh\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dMmMNTQBbzjM!xaT4xwcFLhATJXk8YTFfqc-2940\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.09b0.2.us-east-1-A.i-0fa407612c4f12887.e7dMmMNTQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 1fc33138-fd6a-4aef-aa37-de72d7b1deca unaltered + interception proxy got result of transforming message 1fc33138-fd6a-4aef-aa37-de72d7b1deca Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"a8c5703d-d86f-4a9f-a013-cb1157705098","method":"transformInterceptedMessage","params":{"id":"12265104-c11d-4b15-820e-0a52def5bd19","connectionID":"a33f327a-f3c6-44c1-b70c-a634b9e008a5","type":"text","data":"{\"action\":4,\"connectionId\":\"EWmP0Kzpea\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dj_O36QBbzhQ!EWmP0KzpeaAU4_a7jXFXKR-34f1\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.22ca.2.us-east-1-A.i-0112a1dedf234209a.e7dj_O36QBbzhQ\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 12265104-c11d-4b15-820e-0a52def5bd19 unaltered + interception proxy got result of transforming message 12265104-c11d-4b15-820e-0a52def5bd19 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"9c9a059e-760b-4668-a4b9-cc18de487d63","method":"transformInterceptedMessage","params":{"id":"04238321-1274-421f-9cd7-5621f0a8bea0","connectionID":"4a505a02-a3c4-4f5d-8c0d-1919334bc212","type":"text","data":"{\"action\":4,\"connectionId\":\"Su-pME141y\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dHlxZVQBbzjM!Su-pME141yAfbfQEpg4kkJ-285f\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.2fe8.1.us-east-1-A.i-0fa407612c4f12887.e7dHlxZVQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 04238321-1274-421f-9cd7-5621f0a8bea0 unaltered + interception proxy got result of transforming message 04238321-1274-421f-9cd7-5621f0a8bea0 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"6ad19a1f-d552-4971-8985-2f2f1a725126","method":"transformInterceptedMessage","params":{"id":"775187f3-bef0-49f5-a8e4-2125afda638b","connectionID":"4f83a01e-eb76-40fc-ad1b-7e34dde7630d","type":"text","data":"{\"action\":4,\"connectionId\":\"e6BeHZ3CaS\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dUVsT6wBbzfT!e6BeHZ3CaSAfgccS-_jwxq-4371\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.fd57.1.us-east-1-A.i-01fe288a84a67f672.e7dUVsT6wBbzfT\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 775187f3-bef0-49f5-a8e4-2125afda638b unaltered + interception proxy got result of transforming message 775187f3-bef0-49f5-a8e4-2125afda638b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"7b611662-5f44-4154-80be-3f9e3a73abd3","method":"transformInterceptedMessage","params":{"id":"939f1c5e-defc-4388-ad1c-93790c2c3e75","connectionID":"6badd260-aa30-4eb7-838c-f2688355c082","type":"text","data":"{\"action\":4,\"connectionId\":\"YA0KseTNq8\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dUVsT6wBbzfT!YA0KseTNq8Aez1pKn3UHc_-4372\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.fd57.1.us-east-1-A.i-01fe288a84a67f672.e7dUVsT6wBbzfT\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 939f1c5e-defc-4388-ad1c-93790c2c3e75 unaltered + interception proxy got result of transforming message 939f1c5e-defc-4388-ad1c-93790c2c3e75 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ae82863d-ea79-419b-a383-7758314c05d3","method":"transformInterceptedMessage","params":{"id":"ed5dacae-40da-48ba-91f8-e7d2822b7549","connectionID":"60e57a96-2d63-4a6f-9e1b-064b02f16d70","type":"text","data":"{\"action\":4,\"connectionId\":\"JLwI9cncQP\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dj_O36QBbzhQ!JLwI9cncQPAS1ysE8osQ3W-34f3\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.22ca.2.us-east-1-A.i-0112a1dedf234209a.e7dj_O36QBbzhQ\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ed5dacae-40da-48ba-91f8-e7d2822b7549 unaltered + interception proxy got result of transforming message ed5dacae-40da-48ba-91f8-e7d2822b7549 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d8ac5aae-cb61-4a44-988b-379abaf3ef14","method":"transformInterceptedMessage","params":{"id":"eacc4546-bf18-42e3-816e-226a452b2136","connectionID":"9e405b63-9b9e-46de-b318-d20837b070e6","type":"text","data":"{\"action\":4,\"connectionId\":\"yCLrvFFBN5\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dMmMNTQBbzjM!yCLrvFFBN5AUZt_WHoGU2S-2941\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.09b0.2.us-east-1-A.i-0fa407612c4f12887.e7dMmMNTQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message eacc4546-bf18-42e3-816e-226a452b2136 unaltered + interception proxy got result of transforming message eacc4546-bf18-42e3-816e-226a452b2136 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"8a5d243e-7fe6-4898-b671-1340d33f0e86","method":"transformInterceptedMessage","params":{"id":"f3ad8daf-c6c5-44af-85bc-86473705939d","connectionID":"f2ecb0c8-2270-42f7-be22-25749123b9d9","type":"text","data":"{\"action\":4,\"connectionId\":\"mAv7Onh23M\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dHlxZVQBbzjM!mAv7Onh23MAa_xGIY0MQjl-2860\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.2fe8.1.us-east-1-A.i-0fa407612c4f12887.e7dHlxZVQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message f3ad8daf-c6c5-44af-85bc-86473705939d unaltered + interception proxy got result of transforming message f3ad8daf-c6c5-44af-85bc-86473705939d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d522cc95-a349-4550-839c-fa94cf54bfc7","method":"transformInterceptedMessage","params":{"id":"456034f4-7152-415f-a433-70f61b3b805b","connectionID":"deb7f843-f7ce-463e-ab06-422ece0433b0","type":"text","data":"{\"action\":4,\"connectionId\":\"GCsbr2QTfV\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dj_O36QBbzhQ!GCsbr2QTfVASOqFVAVfgnv-34f4\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.22ca.2.us-east-1-A.i-0112a1dedf234209a.e7dj_O36QBbzhQ\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 456034f4-7152-415f-a433-70f61b3b805b unaltered + interception proxy got result of transforming message 456034f4-7152-415f-a433-70f61b3b805b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"529b9c88-71b9-4c1b-b68f-7e51fe616de5","method":"transformInterceptedMessage","params":{"id":"a0cd055a-1346-4cfd-9187-e8f6fa84123d","connectionID":"1acd96f3-8685-4c2b-ac5b-5c26689d1de4","type":"text","data":"{\"action\":4,\"connectionId\":\"qtuvjRt5Ck\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7d5jA5ewBbzhQ!qtuvjRt5CkAcld-svZ-O6M-3521\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.1ca9.1.us-east-1-A.i-0112a1dedf234209a.e7d5jA5ewBbzhQ\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a0cd055a-1346-4cfd-9187-e8f6fa84123d unaltered + interception proxy got result of transforming message a0cd055a-1346-4cfd-9187-e8f6fa84123d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d7271aa7-fcd2-4697-9ccd-3f4674d505f6","method":"transformInterceptedMessage","params":{"id":"81e91bb4-7b60-4e2a-b743-ef8ed6e19adb","connectionID":"f344d151-b39b-448b-8b02-682da750cace","type":"text","data":"{\"action\":4,\"connectionId\":\"X5PxPMxiQG\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dQFBPjwBbzfT!X5PxPMxiQGAT7Z3Z0rpUUb-4244\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.039b.2.us-east-1-A.i-01fe288a84a67f672.e7dQFBPjwBbzfT\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 81e91bb4-7b60-4e2a-b743-ef8ed6e19adb unaltered + interception proxy got result of transforming message 81e91bb4-7b60-4e2a-b743-ef8ed6e19adb Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b9371623-e47e-4bfd-a16a-6cc6f4721804","method":"transformInterceptedMessage","params":{"id":"c4584639-d42a-421d-a8a0-521aa1a1fd47","connectionID":"322d025b-45c9-470c-ae96-c82c959204bc","type":"text","data":"{\"action\":4,\"connectionId\":\"m1f8bYVgkH\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dj_O36QBbzhQ!m1f8bYVgkHAdr9QLKCGhsM-34f6\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.22ca.2.us-east-1-A.i-0112a1dedf234209a.e7dj_O36QBbzhQ\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message c4584639-d42a-421d-a8a0-521aa1a1fd47 unaltered + interception proxy got result of transforming message c4584639-d42a-421d-a8a0-521aa1a1fd47 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"e4ddc476-0430-40e0-8464-dddf53ccb4ae","method":"transformInterceptedMessage","params":{"id":"778a8e8d-106b-47e2-b26f-0cf229327d4c","connectionID":"ab0e622c-2a3a-4be2-9e3f-4f4c98366298","type":"text","data":"{\"action\":4,\"connectionId\":\"xabmnQXBkS\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dj_O36QBbzhQ!xabmnQXBkSAb56-aVwLmJX-34f7\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.22ca.2.us-east-1-A.i-0112a1dedf234209a.e7dj_O36QBbzhQ\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 778a8e8d-106b-47e2-b26f-0cf229327d4c unaltered + interception proxy got result of transforming message 778a8e8d-106b-47e2-b26f-0cf229327d4c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"787bfdd1-612f-4244-91e2-875535771642","method":"transformInterceptedMessage","params":{"id":"c8e4dd5d-150d-4b5e-a58e-1493b0827b22","connectionID":"12cb1acc-f94a-47b6-a9e3-1cf2e58b6e51","type":"text","data":"{\"action\":4,\"connectionId\":\"pW0BYvJs-Y\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dUVsT6wBbzfT!pW0BYvJs-YAYhZWZVHzzv_-4373\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.fd57.1.us-east-1-A.i-01fe288a84a67f672.e7dUVsT6wBbzfT\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message c8e4dd5d-150d-4b5e-a58e-1493b0827b22 unaltered + interception proxy got result of transforming message c8e4dd5d-150d-4b5e-a58e-1493b0827b22 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"1f47fb11-ef05-4473-af3a-d02d2552eade","method":"transformInterceptedMessage","params":{"id":"5c15de36-6a2e-4a2d-b06e-07f11dff9b6d","connectionID":"12cb1acc-f94a-47b6-a9e3-1cf2e58b6e51","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 5c15de36-6a2e-4a2d-b06e-07f11dff9b6d unaltered + interception proxy got result of transforming message 5c15de36-6a2e-4a2d-b06e-07f11dff9b6d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d14c63ca-6a08-472c-b7a3-4d4dac19d6ea","method":"transformInterceptedMessage","params":{"id":"2f5dc95c-017a-41f5-aeb1-c19f1a4617e8","connectionID":"12cb1acc-f94a-47b6-a9e3-1cf2e58b6e51","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954372176-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 2f5dc95c-017a-41f5-aeb1-c19f1a4617e8 unaltered + interception proxy got result of transforming message 2f5dc95c-017a-41f5-aeb1-c19f1a4617e8 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"4f002228-79cd-45ab-afe3-d8ca2e15d763","method":"transformInterceptedMessage","params":{"id":"f551231d-620e-476d-9d4a-b8a94d33df0a","connectionID":"6bc0bb24-56f9-415b-bcf7-8eeea02aed22","type":"text","data":"{\"action\":15,\"id\":\"U9DAF7AL3Dbh\",\"connectionId\":\"\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954373219-0\",\"timestamp\":1715954373219,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"hqloybuJKEC3HEza0UNBCBBxOUHt3R2qvcn96YNtgRs=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message f551231d-620e-476d-9d4a-b8a94d33df0a unaltered + interception proxy got result of transforming message f551231d-620e-476d-9d4a-b8a94d33df0a Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"93faf978-8f72-4d38-b9b8-5e8270ea6131","method":"transformInterceptedMessage","params":{"id":"a7d0b3c7-7c02-45e7-8fe9-84ac13879ff8","connectionID":"12cb1acc-f94a-47b6-a9e3-1cf2e58b6e51","type":"text","data":"{\"action\":15,\"id\":\"U9DAF7AL3Dbh\",\"connectionId\":\"\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954373219-0\",\"timestamp\":1715954373219,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"hqloybuJKEC3HEza0UNBCBBxOUHt3R2qvcn96YNtgRs=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a7d0b3c7-7c02-45e7-8fe9-84ac13879ff8 unaltered + interception proxy got result of transforming message a7d0b3c7-7c02-45e7-8fe9-84ac13879ff8 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Crypto with Crypto BaseRest is able to publish encrypted messages + START TEST: browser/modular Crypto with Crypto _BaseRealtime is able to publish encrypted messages + interception proxy got message {"jsonrpc":"2.0","id":"4f5a557d-88a7-4c2d-bd71-4150053daab7","method":"transformInterceptedMessage","params":{"id":"80cf6264-96b7-4de6-a94e-45fe6b5b2e92","connectionID":"7127178c-ced7-423a-a508-878defe83fc0","type":"text","data":"{\"action\":4,\"connectionId\":\"3SRzdkAKZ7\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dMmMNTQBbzjM!3SRzdkAKZ7AUq81Jw0IsIm-2943\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.09b0.2.us-east-1-A.i-0fa407612c4f12887.e7dMmMNTQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 80cf6264-96b7-4de6-a94e-45fe6b5b2e92 unaltered + interception proxy got result of transforming message 80cf6264-96b7-4de6-a94e-45fe6b5b2e92 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"e493ca08-a9ed-466d-8551-ca7efc92a4c0","method":"transformInterceptedMessage","params":{"id":"301a0763-4a0a-4030-8660-f7974153120a","connectionID":"7127178c-ced7-423a-a508-878defe83fc0","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 301a0763-4a0a-4030-8660-f7974153120a unaltered + interception proxy got result of transforming message 301a0763-4a0a-4030-8660-f7974153120a Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"935a6ca4-29f9-442b-8d4f-7a378c349464","method":"transformInterceptedMessage","params":{"id":"b53f6287-77bb-4b3a-9225-45bd48b488ea","connectionID":"7127178c-ced7-423a-a508-878defe83fc0","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954373219-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b53f6287-77bb-4b3a-9225-45bd48b488ea unaltered + interception proxy got result of transforming message b53f6287-77bb-4b3a-9225-45bd48b488ea Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"2d36c92f-111f-41e3-a5f9-96a9be057964","method":"transformInterceptedMessage","params":{"id":"e48ae76d-3e1b-4c7a-b1b8-45353d00a230","connectionID":"69b0d7ee-84ff-4eb0-a775-ca395ae6b4c0","type":"text","data":"{\"action\":4,\"connectionId\":\"HCPFF0CjE_\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dHlxZVQBbzjM!HCPFF0CjE_AY6RykvAivSO-2864\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.2fe8.1.us-east-1-A.i-0fa407612c4f12887.e7dHlxZVQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message e48ae76d-3e1b-4c7a-b1b8-45353d00a230 unaltered + interception proxy got result of transforming message e48ae76d-3e1b-4c7a-b1b8-45353d00a230 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"2a4b2332-f884-4956-bfe3-8e37a10c16d8","method":"transformInterceptedMessage","params":{"id":"6c63b7d9-2eda-44e1-9a02-1ef091fbc355","connectionID":"69b0d7ee-84ff-4eb0-a775-ca395ae6b4c0","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"name\":\"message\",\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"bFy7lHX7yw5leiiqdMx9vgFUhCBimYfkwLAOGD6sNro=\"}],\"msgSerial\":0}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 6c63b7d9-2eda-44e1-9a02-1ef091fbc355 unaltered + interception proxy got result of transforming message 6c63b7d9-2eda-44e1-9a02-1ef091fbc355 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"5a795fca-88ac-4a4e-97cf-6b46e9684fd6","method":"transformInterceptedMessage","params":{"id":"077672bd-c58e-42a5-b1b5-057919ae65de","connectionID":"7127178c-ced7-423a-a508-878defe83fc0","type":"text","data":"{\"action\":15,\"id\":\"HCPFF0CjE_:0\",\"connectionId\":\"HCPFF0CjE_\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954374507-0\",\"timestamp\":1715954374507,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"bFy7lHX7yw5leiiqdMx9vgFUhCBimYfkwLAOGD6sNro=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 077672bd-c58e-42a5-b1b5-057919ae65de unaltered + interception proxy got result of transforming message 077672bd-c58e-42a5-b1b5-057919ae65de Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b92881ef-f3e4-4e4e-a5aa-d0556d007b17","method":"transformInterceptedMessage","params":{"id":"8acd086e-9cbc-4654-b2c8-977a543f3b8e","connectionID":"69b0d7ee-84ff-4eb0-a775-ca395ae6b4c0","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 8acd086e-9cbc-4654-b2c8-977a543f3b8e unaltered + interception proxy got result of transforming message 8acd086e-9cbc-4654-b2c8-977a543f3b8e Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"438b7cd5-5363-4d26-843e-a893d5e88104","method":"transformInterceptedMessage","params":{"id":"aefa9a37-d91f-4576-9d86-dd6284778a18","connectionID":"12cb1acc-f94a-47b6-a9e3-1cf2e58b6e51","type":"text","data":"{\"action\":15,\"id\":\"HCPFF0CjE_:0\",\"connectionId\":\"HCPFF0CjE_\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954374507-0\",\"timestamp\":1715954374507,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"bFy7lHX7yw5leiiqdMx9vgFUhCBimYfkwLAOGD6sNro=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message aefa9a37-d91f-4576-9d86-dd6284778a18 unaltered + interception proxy got result of transforming message aefa9a37-d91f-4576-9d86-dd6284778a18 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"239545a1-df80-4ff0-af2a-444c4feee1b3","method":"transformInterceptedMessage","params":{"id":"0fa0f478-3129-4e80-848b-742c72d5722e","connectionID":"6bc0bb24-56f9-415b-bcf7-8eeea02aed22","type":"text","data":"{\"action\":15,\"id\":\"HCPFF0CjE_:0\",\"connectionId\":\"HCPFF0CjE_\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954374507-0\",\"timestamp\":1715954374507,\"messages\":[{\"encoding\":\"utf-8/cipher+aes-256-cbc/base64\",\"data\":\"bFy7lHX7yw5leiiqdMx9vgFUhCBimYfkwLAOGD6sNro=\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0fa0f478-3129-4e80-848b-742c72d5722e unaltered + interception proxy got result of transforming message 0fa0f478-3129-4e80-848b-742c72d5722e Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular Crypto with Crypto _BaseRealtime is able to publish encrypted messages + START TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRest uses JSON + END TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRest uses JSON + START TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRealtime uses JSON + END TEST: browser/modular MsgPack with useBinaryProtocol client option without MsgPack BaseRealtime uses JSON + START TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRest uses MessagePack + END TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRest uses MessagePack + START TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRealtime uses MessagePack + END TEST: browser/modular MsgPack with useBinaryProtocol client option with MsgPack BaseRealtime uses MessagePack + START TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence throws an error when attempting to access the `presence` property + END TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence throws an error when attempting to access the `presence` property + START TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence doesn’t break when it receives a PRESENCE ProtocolMessage + interception proxy got message {"jsonrpc":"2.0","id":"6e9e6653-1e62-41ec-b622-021a48fc8530","method":"transformInterceptedMessage","params":{"id":"dd1506ad-10ed-4450-b9df-6373e74bb54a","connectionID":"7384126a-fce2-4136-b2bb-9c1bbf2e9dec","type":"text","data":"{\"action\":4,\"connectionId\":\"-QaQemmba1\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dUVsT6wBbzfT!-QaQemmba1AW24KRu5LMcH-4378\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.fd57.1.us-east-1-A.i-01fe288a84a67f672.e7dUVsT6wBbzfT\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message dd1506ad-10ed-4450-b9df-6373e74bb54a unaltered + interception proxy got result of transforming message dd1506ad-10ed-4450-b9df-6373e74bb54a Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"a9621610-927c-42fd-ad51-1beed899c8a3","method":"transformInterceptedMessage","params":{"id":"21d2175a-f5d0-44f5-aa59-516f5ce1f959","connectionID":"7e0d5cf3-4324-4167-991b-c2b28ca0a1f3","type":"text","data":"{\"action\":4,\"connectionId\":\"jlNdqd2aXo\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dHlxZVQBbzjM!jlNdqd2aXoAS22-70YTmA9-2868\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.2fe8.1.us-east-1-A.i-0fa407612c4f12887.e7dHlxZVQBbzjM\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 21d2175a-f5d0-44f5-aa59-516f5ce1f959 unaltered + interception proxy got result of transforming message 21d2175a-f5d0-44f5-aa59-516f5ce1f959 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"19003acc-2205-4b66-a10c-459938ffb621","method":"transformInterceptedMessage","params":{"id":"fbf31e1c-2dd0-441f-a62a-fca9d201a170","connectionID":"7384126a-fce2-4136-b2bb-9c1bbf2e9dec","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message fbf31e1c-2dd0-441f-a62a-fca9d201a170 unaltered + interception proxy got result of transforming message fbf31e1c-2dd0-441f-a62a-fca9d201a170 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"95563aba-76dd-45c2-92fe-bdc25501d534","method":"transformInterceptedMessage","params":{"id":"2695c7e1-8cde-46a0-93a1-92311f22c62b","connectionID":"7384126a-fce2-4136-b2bb-9c1bbf2e9dec","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954374507-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 2695c7e1-8cde-46a0-93a1-92311f22c62b unaltered + interception proxy got result of transforming message 2695c7e1-8cde-46a0-93a1-92311f22c62b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"783579dc-a13e-487a-94c7-1b75a9fe8285","method":"transformInterceptedMessage","params":{"id":"a18e0401-3b22-4897-9298-387180ef5803","connectionID":"a0f8b6f3-3d35-4b86-b599-a30d9b7f2edd","type":"text","data":"{\"action\":4,\"connectionId\":\"IYVCZpktng\",\"connectionDetails\":{\"clientId\":\"23044067131194756\",\"connectionKey\":\"e7dUVsT6wBbzfT!IYVCZpktngAUQkmMq0w4bt-437a\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.fd57.1.us-east-1-A.i-01fe288a84a67f672.e7dUVsT6wBbzfT\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a18e0401-3b22-4897-9298-387180ef5803 unaltered + interception proxy got result of transforming message a18e0401-3b22-4897-9298-387180ef5803 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ad9d7255-1d2c-4379-892f-0cd520c79430","method":"transformInterceptedMessage","params":{"id":"90ab0491-da76-437c-9837-5b3d04164a13","connectionID":"a0f8b6f3-3d35-4b86-b599-a30d9b7f2edd","type":"text","data":"{\"action\":15,\"channel\":\"channel\",\"messages\":[{\"name\":\"message\",\"data\":\"body\"}],\"msgSerial\":0}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 90ab0491-da76-437c-9837-5b3d04164a13 unaltered + interception proxy got result of transforming message 90ab0491-da76-437c-9837-5b3d04164a13 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"a69d3f6a-aefe-40e3-a8e2-5e78cda9bd64","method":"transformInterceptedMessage","params":{"id":"8133d55a-9738-4c3b-a2ee-b5fdc42a6960","connectionID":"6bc0bb24-56f9-415b-bcf7-8eeea02aed22","type":"text","data":"{\"action\":15,\"id\":\"IYVCZpktng:0\",\"connectionId\":\"IYVCZpktng\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954375828-0\",\"timestamp\":1715954375828,\"messages\":[{\"clientId\":\"23044067131194756\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 8133d55a-9738-4c3b-a2ee-b5fdc42a6960 unaltered + interception proxy got result of transforming message 8133d55a-9738-4c3b-a2ee-b5fdc42a6960 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"924bb806-8d18-4edc-af07-e19bb23515c3","method":"transformInterceptedMessage","params":{"id":"1b2c5910-c1a4-4da8-8435-a75915035683","connectionID":"7127178c-ced7-423a-a508-878defe83fc0","type":"text","data":"{\"action\":15,\"id\":\"IYVCZpktng:0\",\"connectionId\":\"IYVCZpktng\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954375828-0\",\"timestamp\":1715954375828,\"messages\":[{\"clientId\":\"23044067131194756\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 1b2c5910-c1a4-4da8-8435-a75915035683 unaltered + interception proxy got result of transforming message 1b2c5910-c1a4-4da8-8435-a75915035683 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d5961e30-33f8-4e24-91b8-b271d466d0af","method":"transformInterceptedMessage","params":{"id":"b57f3b24-1908-486c-879c-a1424a0f476f","connectionID":"12cb1acc-f94a-47b6-a9e3-1cf2e58b6e51","type":"text","data":"{\"action\":15,\"id\":\"IYVCZpktng:0\",\"connectionId\":\"IYVCZpktng\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954375828-0\",\"timestamp\":1715954375828,\"messages\":[{\"clientId\":\"23044067131194756\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b57f3b24-1908-486c-879c-a1424a0f476f unaltered + interception proxy got result of transforming message b57f3b24-1908-486c-879c-a1424a0f476f Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d690e4a8-b3c5-4d8c-a379-d07afa08a8a4","method":"transformInterceptedMessage","params":{"id":"4f44083a-d75a-4b9a-b7ac-40e12493a55c","connectionID":"7384126a-fce2-4136-b2bb-9c1bbf2e9dec","type":"text","data":"{\"action\":15,\"id\":\"IYVCZpktng:0\",\"connectionId\":\"IYVCZpktng\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954375828-0\",\"timestamp\":1715954375828,\"messages\":[{\"clientId\":\"23044067131194756\",\"data\":\"body\",\"name\":\"message\"}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 4f44083a-d75a-4b9a-b7ac-40e12493a55c unaltered + interception proxy got result of transforming message 4f44083a-d75a-4b9a-b7ac-40e12493a55c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b69d9150-cc13-4fee-94e0-cefa6067f079","method":"transformInterceptedMessage","params":{"id":"edfa16ac-7b73-48f0-8e61-027204b4fa1f","connectionID":"a0f8b6f3-3d35-4b86-b599-a30d9b7f2edd","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message edfa16ac-7b73-48f0-8e61-027204b4fa1f unaltered + interception proxy got result of transforming message edfa16ac-7b73-48f0-8e61-027204b4fa1f Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"a56db62f-5b8d-4a83-9a19-685eb7336fa3","method":"transformInterceptedMessage","params":{"id":"a9a66ba2-f199-4062-b027-9bca430c9d6e","connectionID":"a0f8b6f3-3d35-4b86-b599-a30d9b7f2edd","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a9a66ba2-f199-4062-b027-9bca430c9d6e unaltered + interception proxy got result of transforming message a9a66ba2-f199-4062-b027-9bca430c9d6e Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"3dbeaec6-ff18-4eb3-a5d1-9a74c9174910","method":"transformInterceptedMessage","params":{"id":"be10ba41-7145-4307-a085-0a02eb37e270","connectionID":"a0f8b6f3-3d35-4b86-b599-a30d9b7f2edd","type":"text","data":"{\"action\":11,\"flags\":983104,\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954375828-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message be10ba41-7145-4307-a085-0a02eb37e270 unaltered + interception proxy got result of transforming message be10ba41-7145-4307-a085-0a02eb37e270 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"4c3b35a1-6c79-48dd-8df4-79c8de5ce24d","method":"transformInterceptedMessage","params":{"id":"b1e0468f-47ea-44d3-9785-f96c45c91e4d","connectionID":"a0f8b6f3-3d35-4b86-b599-a30d9b7f2edd","type":"text","data":"{\"action\":14,\"channel\":\"channel\",\"presence\":[{\"action\":2}],\"msgSerial\":1}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b1e0468f-47ea-44d3-9785-f96c45c91e4d unaltered + interception proxy got result of transforming message b1e0468f-47ea-44d3-9785-f96c45c91e4d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ff8e9dbe-1f0f-48f0-a973-3e8b8b78fc06","method":"transformInterceptedMessage","params":{"id":"b5479285-306b-453f-b281-374c169de2ea","connectionID":"7384126a-fce2-4136-b2bb-9c1bbf2e9dec","type":"text","data":"{\"action\":14,\"id\":\"IYVCZpktng:1\",\"connectionId\":\"IYVCZpktng\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954376093-0\",\"timestamp\":1715954376093,\"presence\":[{\"id\":\"IYVCZpktng:1:0\",\"clientId\":\"23044067131194756\",\"connectionId\":\"IYVCZpktng\",\"timestamp\":1715954376093,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b5479285-306b-453f-b281-374c169de2ea unaltered + interception proxy got result of transforming message b5479285-306b-453f-b281-374c169de2ea Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"a3bc48d8-6bea-4146-a3bf-97b8e3143bf9","method":"transformInterceptedMessage","params":{"id":"3c172ec6-cb61-4518-9a8e-ccd551f999b7","connectionID":"12cb1acc-f94a-47b6-a9e3-1cf2e58b6e51","type":"text","data":"{\"action\":14,\"id\":\"IYVCZpktng:1\",\"connectionId\":\"IYVCZpktng\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954376093-0\",\"timestamp\":1715954376093,\"presence\":[{\"id\":\"IYVCZpktng:1:0\",\"clientId\":\"23044067131194756\",\"connectionId\":\"IYVCZpktng\",\"timestamp\":1715954376093,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 3c172ec6-cb61-4518-9a8e-ccd551f999b7 unaltered + interception proxy got result of transforming message 3c172ec6-cb61-4518-9a8e-ccd551f999b7 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"51c5ebdd-8237-4216-8e52-15d8660aa37f","method":"transformInterceptedMessage","params":{"id":"a783357a-6884-4460-a66f-bcacd648e5d9","connectionID":"a0f8b6f3-3d35-4b86-b599-a30d9b7f2edd","type":"text","data":"{\"action\":14,\"id\":\"IYVCZpktng:1\",\"connectionId\":\"IYVCZpktng\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954376093-0\",\"timestamp\":1715954376093,\"presence\":[{\"id\":\"IYVCZpktng:1:0\",\"clientId\":\"23044067131194756\",\"connectionId\":\"IYVCZpktng\",\"timestamp\":1715954376093,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a783357a-6884-4460-a66f-bcacd648e5d9 unaltered + interception proxy got result of transforming message a783357a-6884-4460-a66f-bcacd648e5d9 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"abfbcbf3-4638-46a1-ba9a-31326e355eaa","method":"transformInterceptedMessage","params":{"id":"f5eae806-befb-4729-a958-ab1cd96694de","connectionID":"7127178c-ced7-423a-a508-878defe83fc0","type":"text","data":"{\"action\":14,\"id\":\"IYVCZpktng:1\",\"connectionId\":\"IYVCZpktng\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954376093-0\",\"timestamp\":1715954376093,\"presence\":[{\"id\":\"IYVCZpktng:1:0\",\"clientId\":\"23044067131194756\",\"connectionId\":\"IYVCZpktng\",\"timestamp\":1715954376093,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message f5eae806-befb-4729-a958-ab1cd96694de unaltered + interception proxy got result of transforming message f5eae806-befb-4729-a958-ab1cd96694de Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d18a53d8-2e7e-412d-871f-58fce88e502c","method":"transformInterceptedMessage","params":{"id":"97a89029-6c7a-493e-9ab0-97eee8b5a66a","connectionID":"6bc0bb24-56f9-415b-bcf7-8eeea02aed22","type":"text","data":"{\"action\":14,\"id\":\"IYVCZpktng:1\",\"connectionId\":\"IYVCZpktng\",\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954376093-0\",\"timestamp\":1715954376093,\"presence\":[{\"id\":\"IYVCZpktng:1:0\",\"clientId\":\"23044067131194756\",\"connectionId\":\"IYVCZpktng\",\"timestamp\":1715954376093,\"action\":2}]}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 97a89029-6c7a-493e-9ab0-97eee8b5a66a unaltered + interception proxy got result of transforming message 97a89029-6c7a-493e-9ab0-97eee8b5a66a Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ffa79795-f998-4a80-ad8f-0cc7980b9600","method":"transformInterceptedMessage","params":{"id":"17e82fe7-8866-4c38-98ef-7bc21b8a7422","connectionID":"a0f8b6f3-3d35-4b86-b599-a30d9b7f2edd","type":"text","data":"{\"action\":1,\"count\":1,\"msgSerial\":1}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 17e82fe7-8866-4c38-98ef-7bc21b8a7422 unaltered + interception proxy got result of transforming message 17e82fe7-8866-4c38-98ef-7bc21b8a7422 Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular RealtimePresence BaseRealtime without RealtimePresence doesn’t break when it receives a PRESENCE ProtocolMessage + START TEST: browser/modular RealtimePresence BaseRealtime with RealtimePresence offers realtime presence functionality + LAWRENCE: begin waiting for presence subscribe + interception proxy got message {"jsonrpc":"2.0","id":"3ff14853-92f9-4e42-825c-087e7b1c650c","method":"transformInterceptedMessage","params":{"id":"d8abede0-4c75-4032-9f5a-388b92543a8d","connectionID":"fd6b1724-9e8f-4f7b-9e0a-8d01f5c37168","type":"text","data":"{\"action\":4,\"connectionId\":\"LS0WeOkO2k\",\"connectionDetails\":{\"clientId\":\"*\",\"connectionKey\":\"e7dj_O36QBbzhQ!LS0WeOkO2kAc56q2ZVNIsv-3505\",\"maxMessageSize\":16384,\"maxInboundRate\":250,\"maxOutboundRate\":100,\"maxFrameSize\":262144,\"serverId\":\"frontend.22ca.2.us-east-1-A.i-0112a1dedf234209a.e7dj_O36QBbzhQ\",\"connectionStateTtl\":120000,\"maxIdleInterval\":15000}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d8abede0-4c75-4032-9f5a-388b92543a8d unaltered + interception proxy got result of transforming message d8abede0-4c75-4032-9f5a-388b92543a8d Object + interception proxy sending transformInterceptedMessage response Object + rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=CONNECTED; connectionId=LS0WeOkO2k]; connectionId = undefined + rxChannel: Ably: Protocol.send(): sending msg; [ProtocolMessage; action=ATTACH; channel=channel] + interception proxy got message {"jsonrpc":"2.0","id":"73878989-417f-4cd9-96e9-f5c56126f9e2","method":"transformInterceptedMessage","params":{"id":"a7539c8d-c675-48f4-9da6-02496f764f31","connectionID":"fd6b1724-9e8f-4f7b-9e0a-8d01f5c37168","type":"text","data":"{\"action\":10,\"channel\":\"channel\"}","fromClient":true}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a7539c8d-c675-48f4-9da6-02496f764f31 unaltered + interception proxy got result of transforming message a7539c8d-c675-48f4-9da6-02496f764f31 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"af36b536-1bfd-48f9-ad4d-703617747ec7","method":"transformInterceptedMessage","params":{"id":"b1802286-0eb5-44a2-afe4-315bad9a7708","connectionID":"fd6b1724-9e8f-4f7b-9e0a-8d01f5c37168","type":"text","data":"{\"action\":11,\"flags\":983105,\"channel\":\"channel\",\"channelSerial\":\"e7d-yC80gBbzi999759757@1715954376093-0\"}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b1802286-0eb5-44a2-afe4-315bad9a7708 unaltered + interception proxy got result of transforming message b1802286-0eb5-44a2-afe4-315bad9a7708 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ce12d85b-6c34-464a-917c-d3b33430204e","method":"transformInterceptedMessage","params":{"id":"fdee1561-123f-4f44-a5d2-710a9982135d","connectionID":"fd6b1724-9e8f-4f7b-9e0a-8d01f5c37168","type":"text","data":"{\"action\":16,\"channel\":\"channel\",\"channelSerial\":\"e7dj_O36QBbzhQ63092889:\",\"presence\":[{\"id\":\"IYVCZpktng:1:0\",\"clientId\":\"23044067131194756\",\"connectionId\":\"IYVCZpktng\",\"timestamp\":1715954376093,\"action\":1}],\"count\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message fdee1561-123f-4f44-a5d2-710a9982135d unaltered + interception proxy got result of transforming message fdee1561-123f-4f44-a5d2-710a9982135d Object + interception proxy sending transformInterceptedMessage response Object + rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ATTACHED; channel=channel; channelSerial=e7d-yC80gBbzi999759757@1715954376093-0; flags=HAS_PRESENCE,PRESENCE,PUBLISH,SUBSCRIBE,PRESENCE_SUBSCRIBE]; connectionId = LS0WeOkO2k + LAWRENCE: end waiting for presence subscribe + LAWRENCE: begin waiting for presence enter + rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=SYNC; channel=channel; channelSerial=e7dj_O36QBbzhQ63092889:; count=0; presence=[ [PresenceMessage; action=present; id=IYVCZpktng:1:0; timestamp=1715954376093; clientId=23044067131194756; connectionId=IYVCZpktng] ]]; connectionId = LS0WeOkO2k + interception proxy got message {"jsonrpc":"2.0","id":"8502232d-b1b2-4f7d-8588-a67578502a72","method":"transformInterceptedMessage","params":{"id":"afbfdb81-6eb3-413d-a569-25a34152031b","connectionID":"3bfa65e2-7537-445f-9044-df257de03847","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message afbfdb81-6eb3-413d-a569-25a34152031b unaltered + interception proxy got result of transforming message afbfdb81-6eb3-413d-a569-25a34152031b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"4541aeca-6fb9-41b7-987f-5d3d2c39316f","method":"transformInterceptedMessage","params":{"id":"b27c970f-5fbf-445c-b8a3-2da18542440c","connectionID":"7a429b07-dd5f-4d05-b20a-70d8fda0991b","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message b27c970f-5fbf-445c-b8a3-2da18542440c unaltered + interception proxy got result of transforming message b27c970f-5fbf-445c-b8a3-2da18542440c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"3950e683-906a-480d-8ce2-6da5d9bae8bf","method":"transformInterceptedMessage","params":{"id":"7a233eff-fde3-4ed1-97c1-a4d5fe1ba50e","connectionID":"966dbdca-02d1-4ca9-a7be-027af8d8313b","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 7a233eff-fde3-4ed1-97c1-a4d5fe1ba50e unaltered + interception proxy got result of transforming message 7a233eff-fde3-4ed1-97c1-a4d5fe1ba50e Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"73da4c08-f68b-4a4e-9fd2-4397a01902d2","method":"transformInterceptedMessage","params":{"id":"57dd96d1-af0c-4299-9575-507741edfe3d","connectionID":"3af1e5a9-2e17-44a2-88ff-a2ee8bf9cf27","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 57dd96d1-af0c-4299-9575-507741edfe3d unaltered + interception proxy got result of transforming message 57dd96d1-af0c-4299-9575-507741edfe3d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"1b228655-ddbd-43a1-becc-94672683dad6","method":"transformInterceptedMessage","params":{"id":"7cf919ac-9840-4e5a-8597-f61e0ab1c8eb","connectionID":"e8f9cb77-8b33-4c1c-bd2f-06e23f652dbb","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 7cf919ac-9840-4e5a-8597-f61e0ab1c8eb unaltered + interception proxy got result of transforming message 7cf919ac-9840-4e5a-8597-f61e0ab1c8eb Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"7be1e11a-a3e5-47aa-8750-cdbf0bffb95b","method":"transformInterceptedMessage","params":{"id":"314472a2-c567-4207-863c-ea4ef3e14523","connectionID":"9f744df1-ef34-4fd4-bb64-bcff520f9174","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 314472a2-c567-4207-863c-ea4ef3e14523 unaltered + interception proxy got result of transforming message 314472a2-c567-4207-863c-ea4ef3e14523 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"f19b981b-bf28-4beb-b181-cb95cd79fe37","method":"transformInterceptedMessage","params":{"id":"8fb9dc06-9982-49bb-9e20-6147991a3ffb","connectionID":"42c5f679-1469-47d1-ba3d-9d560a394924","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 8fb9dc06-9982-49bb-9e20-6147991a3ffb unaltered + interception proxy got result of transforming message 8fb9dc06-9982-49bb-9e20-6147991a3ffb Object + interception proxy sending transformInterceptedMessage response Object + END TEST: browser/modular RealtimePresence BaseRealtime with RealtimePresence offers realtime presence functionality + WebSocket connection to 'wss://sandbox-realtime.ably.io/?key=_tmp_QGtAug.bhV_zQ%3AtSS7RkUIJi9O2rryn5QcKKfb3IisPlNT4XETMaIPnSc&clientId=7356945593570525&format=json&heartbeats=true&v=3&agent=ably-js%2F2.0.4%20browser' failed: WebSocket is closed before the connection is established. +(anonymous) @ index.mjs:6715 + interception proxy got message {"jsonrpc":"2.0","id":"8bb93ebf-1fa0-4aea-bb76-1e1e5c7c173e","method":"transformInterceptedMessage","params":{"id":"dcce1d2e-c3e5-47fc-8c1b-34bd5c62c45d","connectionID":"c7b2433c-cb3f-4da2-8b74-6b47d1fab9eb","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message dcce1d2e-c3e5-47fc-8c1b-34bd5c62c45d unaltered + interception proxy got result of transforming message dcce1d2e-c3e5-47fc-8c1b-34bd5c62c45d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"2f526038-87f8-43d5-9107-f1c64feef189","method":"transformInterceptedMessage","params":{"id":"7cab8b8a-429c-4dcb-b447-cfe9c1fcc940","connectionID":"141c38ef-ad38-4e56-bb7a-6d8ac3c6d03b","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 7cab8b8a-429c-4dcb-b447-cfe9c1fcc940 unaltered + interception proxy got result of transforming message 7cab8b8a-429c-4dcb-b447-cfe9c1fcc940 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"a4363315-ceee-49e2-9cf9-ead1c96857c3","method":"transformInterceptedMessage","params":{"id":"0e96085e-2952-4b90-ad0b-9cf10bc0dd48","connectionID":"81120032-6cad-49a3-a2ee-839e13f797dc","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0e96085e-2952-4b90-ad0b-9cf10bc0dd48 unaltered + interception proxy got result of transforming message 0e96085e-2952-4b90-ad0b-9cf10bc0dd48 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"2c9438e8-2712-4122-a86a-e4af9700aa49","method":"transformInterceptedMessage","params":{"id":"0e395847-8a60-4ae4-9bc3-98b46589783a","connectionID":"9da96eea-ef43-462f-90d5-6db5274748ea","type":"text","data":"{\"action\":0}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0e395847-8a60-4ae4-9bc3-98b46589783a unaltered + interception proxy got result of transforming message 0e395847-8a60-4ae4-9bc3-98b46589783a Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"c28fe41c-c207-4179-805b-3c2134d48706","method":"transformInterceptedMessage","params":{"id":"a983ce12-59b5-4df6-9604-4418b88706ba","connectionID":"c7b2433c-cb3f-4da2-8b74-6b47d1fab9eb","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a983ce12-59b5-4df6-9604-4418b88706ba unaltered + interception proxy got result of transforming message a983ce12-59b5-4df6-9604-4418b88706ba Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"8d5352d5-e6e8-45d9-8cc6-62eb08fa4dae","method":"transformInterceptedMessage","params":{"id":"e7a7ef9c-a55b-4ccc-a993-a4393a91c9cc","connectionID":"966dbdca-02d1-4ca9-a7be-027af8d8313b","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message e7a7ef9c-a55b-4ccc-a993-a4393a91c9cc unaltered + interception proxy got result of transforming message e7a7ef9c-a55b-4ccc-a993-a4393a91c9cc Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ca7ad9be-66d6-4e8f-8ba2-7644d7227468","method":"transformInterceptedMessage","params":{"id":"14e4ceae-aef8-468f-b513-ab0cab59b2e2","connectionID":"9da96eea-ef43-462f-90d5-6db5274748ea","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 14e4ceae-aef8-468f-b513-ab0cab59b2e2 unaltered + interception proxy got result of transforming message 14e4ceae-aef8-468f-b513-ab0cab59b2e2 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"52f6ba27-1af5-4a11-a3a7-c5ce98584dbc","method":"transformInterceptedMessage","params":{"id":"88f8f142-1f7e-4423-b84d-1577ec42faaf","connectionID":"1acd96f3-8685-4c2b-ac5b-5c26689d1de4","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 88f8f142-1f7e-4423-b84d-1577ec42faaf unaltered + interception proxy got result of transforming message 88f8f142-1f7e-4423-b84d-1577ec42faaf Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d1894332-e37c-4bd2-9bed-56073a544d00","method":"transformInterceptedMessage","params":{"id":"f621809e-7655-4774-8903-0829adb8e8fd","connectionID":"a33f327a-f3c6-44c1-b70c-a634b9e008a5","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message f621809e-7655-4774-8903-0829adb8e8fd unaltered + interception proxy got result of transforming message f621809e-7655-4774-8903-0829adb8e8fd Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"f1b1b2ea-390d-4734-8bfd-e75b2febca67","method":"transformInterceptedMessage","params":{"id":"0c4d01d7-a2a7-4185-ab48-6929e1be78e4","connectionID":"deb7f843-f7ce-463e-ab06-422ece0433b0","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0c4d01d7-a2a7-4185-ab48-6929e1be78e4 unaltered + interception proxy got result of transforming message 0c4d01d7-a2a7-4185-ab48-6929e1be78e4 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"4a2186a9-6eff-4cb2-b952-3326893d3151","method":"transformInterceptedMessage","params":{"id":"a44be0e7-1565-49c5-b941-a8515d5b4227","connectionID":"60e57a96-2d63-4a6f-9e1b-064b02f16d70","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a44be0e7-1565-49c5-b941-a8515d5b4227 unaltered + interception proxy got result of transforming message a44be0e7-1565-49c5-b941-a8515d5b4227 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"170416ad-f435-4dad-beb7-87294713420b","method":"transformInterceptedMessage","params":{"id":"e276792a-aade-442c-a57b-066a6435c775","connectionID":"141c38ef-ad38-4e56-bb7a-6d8ac3c6d03b","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message e276792a-aade-442c-a57b-066a6435c775 unaltered + interception proxy got result of transforming message e276792a-aade-442c-a57b-066a6435c775 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"006a5c98-0a68-46f8-97fa-ae364ad082b3","method":"transformInterceptedMessage","params":{"id":"fb2f6ea0-c28d-4869-b919-c8ca090a6107","connectionID":"3af1e5a9-2e17-44a2-88ff-a2ee8bf9cf27","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message fb2f6ea0-c28d-4869-b919-c8ca090a6107 unaltered + interception proxy got result of transforming message fb2f6ea0-c28d-4869-b919-c8ca090a6107 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d9ca34a8-cef7-4b43-8d3c-fa8e8e10cf3d","method":"transformInterceptedMessage","params":{"id":"9726f783-8ee0-4901-9bd7-9d56d51bd9f4","connectionID":"3bfa65e2-7537-445f-9044-df257de03847","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 9726f783-8ee0-4901-9bd7-9d56d51bd9f4 unaltered + interception proxy got result of transforming message 9726f783-8ee0-4901-9bd7-9d56d51bd9f4 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"c186acb1-acf0-4a4f-8ef8-cbdf014f9e7d","method":"transformInterceptedMessage","params":{"id":"7a97e9d9-0657-4398-a13d-ad3040084058","connectionID":"322d025b-45c9-470c-ae96-c82c959204bc","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 7a97e9d9-0657-4398-a13d-ad3040084058 unaltered + interception proxy got result of transforming message 7a97e9d9-0657-4398-a13d-ad3040084058 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"7bf10de2-87a2-4b58-bdca-479110fdf65b","method":"transformInterceptedMessage","params":{"id":"40723756-0d1c-46fb-8959-5a519bddbc04","connectionID":"ab0e622c-2a3a-4be2-9e3f-4f4c98366298","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 40723756-0d1c-46fb-8959-5a519bddbc04 unaltered + interception proxy got result of transforming message 40723756-0d1c-46fb-8959-5a519bddbc04 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"80978d15-51c5-4a3f-83c7-46e0c469fe26","method":"transformInterceptedMessage","params":{"id":"27908317-85ed-4b47-8f38-e355e53fe1c6","connectionID":"fd6b1724-9e8f-4f7b-9e0a-8d01f5c37168","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 27908317-85ed-4b47-8f38-e355e53fe1c6 unaltered + interception proxy got result of transforming message 27908317-85ed-4b47-8f38-e355e53fe1c6 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"a595886a-0a94-443b-ba4f-41eefd45471a","method":"transformInterceptedMessage","params":{"id":"38c2e12b-e3b0-4842-97b4-fbb3f0524b37","connectionID":"f344d151-b39b-448b-8b02-682da750cace","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 38c2e12b-e3b0-4842-97b4-fbb3f0524b37 unaltered + interception proxy got result of transforming message 38c2e12b-e3b0-4842-97b4-fbb3f0524b37 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ad4c5ae0-67a1-4b33-a994-ac10bf33b33e","method":"transformInterceptedMessage","params":{"id":"8fa845a7-e36e-4430-a026-3299aec41f80","connectionID":"9f744df1-ef34-4fd4-bb64-bcff520f9174","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 8fa845a7-e36e-4430-a026-3299aec41f80 unaltered + interception proxy got result of transforming message 8fa845a7-e36e-4430-a026-3299aec41f80 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"e1ebc427-b969-41f6-b4f9-3ca06713414e","method":"transformInterceptedMessage","params":{"id":"1e9f54b2-aa53-49cd-b9d3-102294eaa183","connectionID":"4f83a01e-eb76-40fc-ad1b-7e34dde7630d","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 1e9f54b2-aa53-49cd-b9d3-102294eaa183 unaltered + interception proxy got result of transforming message 1e9f54b2-aa53-49cd-b9d3-102294eaa183 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d9d8e262-67f9-4ac7-937e-2746d5ffbf30","method":"transformInterceptedMessage","params":{"id":"46d89743-cd8d-4fe7-a235-c837cb9cda67","connectionID":"7a429b07-dd5f-4d05-b20a-70d8fda0991b","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 46d89743-cd8d-4fe7-a235-c837cb9cda67 unaltered + interception proxy got result of transforming message 46d89743-cd8d-4fe7-a235-c837cb9cda67 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"36c1f0b1-77cc-494e-9785-08fe26e4dd4f","method":"transformInterceptedMessage","params":{"id":"8fce5096-1a8c-4f56-8981-46de30e30d34","connectionID":"6badd260-aa30-4eb7-838c-f2688355c082","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 8fce5096-1a8c-4f56-8981-46de30e30d34 unaltered + interception proxy got result of transforming message 8fce5096-1a8c-4f56-8981-46de30e30d34 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"0872d5e8-b920-4d93-a78b-3acac7e45392","method":"transformInterceptedMessage","params":{"id":"d97c9f32-70c7-4743-9940-214ca701885d","connectionID":"e8f9cb77-8b33-4c1c-bd2f-06e23f652dbb","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d97c9f32-70c7-4743-9940-214ca701885d unaltered + interception proxy got result of transforming message d97c9f32-70c7-4743-9940-214ca701885d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"95631e4d-6f70-4527-913a-6b663af90013","method":"transformInterceptedMessage","params":{"id":"fd72208c-b206-4650-a549-67e6c06d62be","connectionID":"42c5f679-1469-47d1-ba3d-9d560a394924","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message fd72208c-b206-4650-a549-67e6c06d62be unaltered + interception proxy got result of transforming message fd72208c-b206-4650-a549-67e6c06d62be Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"e2ca8bba-a67f-4680-8fac-d18551f05328","method":"transformInterceptedMessage","params":{"id":"f52344f4-8d30-4731-bd3c-e8632d0703dd","connectionID":"7384126a-fce2-4136-b2bb-9c1bbf2e9dec","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message f52344f4-8d30-4731-bd3c-e8632d0703dd unaltered + interception proxy got result of transforming message f52344f4-8d30-4731-bd3c-e8632d0703dd Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"2418a40c-93e5-4bd4-89c3-6c7fb738eee8","method":"transformInterceptedMessage","params":{"id":"d6a3291b-198c-444a-a2d0-6465d7a3d41c","connectionID":"12cb1acc-f94a-47b6-a9e3-1cf2e58b6e51","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d6a3291b-198c-444a-a2d0-6465d7a3d41c unaltered + interception proxy got result of transforming message d6a3291b-198c-444a-a2d0-6465d7a3d41c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"03493556-70a3-4188-9d32-b76d2586a44b","method":"transformInterceptedMessage","params":{"id":"0251f7d3-ac65-49c9-8eab-bae7aed8e9a8","connectionID":"4a505a02-a3c4-4f5d-8c0d-1919334bc212","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0251f7d3-ac65-49c9-8eab-bae7aed8e9a8 unaltered + interception proxy got result of transforming message 0251f7d3-ac65-49c9-8eab-bae7aed8e9a8 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"799f7fb6-0c34-48eb-80a8-56fc254ccf82","method":"transformInterceptedMessage","params":{"id":"3846eef3-5233-43f1-b2e2-55fc5e0ea898","connectionID":"81120032-6cad-49a3-a2ee-839e13f797dc","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 3846eef3-5233-43f1-b2e2-55fc5e0ea898 unaltered + interception proxy got result of transforming message 3846eef3-5233-43f1-b2e2-55fc5e0ea898 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"c1e320b1-553b-4631-9ffd-232911eeb5e3","method":"transformInterceptedMessage","params":{"id":"3bae8869-1466-45a2-a7d7-ad496efaacbe","connectionID":"6bc0bb24-56f9-415b-bcf7-8eeea02aed22","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 3bae8869-1466-45a2-a7d7-ad496efaacbe unaltered + interception proxy got result of transforming message 3bae8869-1466-45a2-a7d7-ad496efaacbe Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"69f4ab25-eb9e-4b87-84ee-e1f8e41c828a","method":"transformInterceptedMessage","params":{"id":"116c46f1-9bb0-4816-a93b-6d6d9dd166cc","connectionID":"a0f8b6f3-3d35-4b86-b599-a30d9b7f2edd","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 116c46f1-9bb0-4816-a93b-6d6d9dd166cc unaltered + interception proxy got result of transforming message 116c46f1-9bb0-4816-a93b-6d6d9dd166cc Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"09ac0788-48d9-44db-b31e-a75ad16522e7","method":"transformInterceptedMessage","params":{"id":"eeb75eb1-6e9a-4c51-a037-33d3e4261250","connectionID":"8220c20c-829e-48f8-afca-ac5ed3cca3de","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message eeb75eb1-6e9a-4c51-a037-33d3e4261250 unaltered + interception proxy got result of transforming message eeb75eb1-6e9a-4c51-a037-33d3e4261250 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"d867af41-f372-419e-99bf-16128b32e259","method":"transformInterceptedMessage","params":{"id":"7a4143ab-d35d-4511-9d8c-5c1bfc3d0b9d","connectionID":"f2ecb0c8-2270-42f7-be22-25749123b9d9","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 7a4143ab-d35d-4511-9d8c-5c1bfc3d0b9d unaltered + interception proxy got result of transforming message 7a4143ab-d35d-4511-9d8c-5c1bfc3d0b9d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"85d6ad09-f190-47f4-9ff8-62c322633fe1","method":"transformInterceptedMessage","params":{"id":"d0220cbc-9ddb-46c5-b4dd-a249bb2aac3f","connectionID":"7e0d5cf3-4324-4167-991b-c2b28ca0a1f3","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d0220cbc-9ddb-46c5-b4dd-a249bb2aac3f unaltered + interception proxy got result of transforming message d0220cbc-9ddb-46c5-b4dd-a249bb2aac3f Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"c84ae26a-57c2-4810-801e-0b0db811e3e9","method":"transformInterceptedMessage","params":{"id":"77a24819-1f02-4751-9ec9-ba6eac6805aa","connectionID":"9e405b63-9b9e-46de-b318-d20837b070e6","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 77a24819-1f02-4751-9ec9-ba6eac6805aa unaltered + interception proxy got result of transforming message 77a24819-1f02-4751-9ec9-ba6eac6805aa Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"b01b2343-c8b3-49ba-b64c-822536d424e8","method":"transformInterceptedMessage","params":{"id":"7bb57475-5600-4f16-a847-7c9ce724f5a6","connectionID":"69b0d7ee-84ff-4eb0-a775-ca395ae6b4c0","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 7bb57475-5600-4f16-a847-7c9ce724f5a6 unaltered + interception proxy got result of transforming message 7bb57475-5600-4f16-a847-7c9ce724f5a6 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"049c4abb-75a5-4a49-b8da-eb7b52c6f716","method":"transformInterceptedMessage","params":{"id":"ce8fe440-5836-4c1b-88ce-f88c5856d72d","connectionID":"7127178c-ced7-423a-a508-878defe83fc0","type":"text","data":"{\"action\":6,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"}}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ce8fe440-5836-4c1b-88ce-f88c5856d72d unaltered + interception proxy got result of transforming message ce8fe440-5836-4c1b-88ce-f88c5856d72d Object + interception proxy sending transformInterceptedMessage response Object + rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=DISCONNECTED; error=[_ErrorInfo: Account _tmp_F2BXYg disabled; statusCode=403; code=40300; see https://help.ably.io/error/40300 ]]; connectionId = LS0WeOkO2k + interception proxy got message {"jsonrpc":"2.0","id":"57886340-9296-4ff1-bb2d-ea2ecf36b5c9","method":"transformInterceptedMessage","params":{"id":"364d9a04-94bc-4ae7-967f-06d5c1e9aa1e","connectionID":"2146108c-fb05-45ea-a374-5f835b849df2","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954387527}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 364d9a04-94bc-4ae7-967f-06d5c1e9aa1e unaltered + interception proxy got result of transforming message 364d9a04-94bc-4ae7-967f-06d5c1e9aa1e Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"20d7f1d3-b7cd-48ae-a8b8-7b8f96835328","method":"transformInterceptedMessage","params":{"id":"d4d6f3c1-6db7-4089-8f04-7af89ef4f13b","connectionID":"d00a62c1-0c0c-4c0b-8ee9-b9ffd7d03117","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954387529}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d4d6f3c1-6db7-4089-8f04-7af89ef4f13b unaltered + interception proxy got result of transforming message d4d6f3c1-6db7-4089-8f04-7af89ef4f13b Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"c6ebacbd-a276-421c-9d0f-10680e5f6cb4","method":"transformInterceptedMessage","params":{"id":"53aa12fe-693a-44e3-9370-6bb07ffab1dd","connectionID":"fa38ecc5-7363-43f7-a79d-89a51bb3172c","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954387530}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 53aa12fe-693a-44e3-9370-6bb07ffab1dd unaltered + interception proxy got result of transforming message 53aa12fe-693a-44e3-9370-6bb07ffab1dd Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"bf92eaef-5fc3-41ee-ba7b-e69acd6adbe8","method":"transformInterceptedMessage","params":{"id":"e924df21-558f-4e0f-a95d-d731a4087688","connectionID":"0077de33-154c-4b8d-b76e-a7fa93d0603b","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954387533}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message e924df21-558f-4e0f-a95d-d731a4087688 unaltered + interception proxy got result of transforming message e924df21-558f-4e0f-a95d-d731a4087688 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"2b9482b0-cb8b-422c-88e7-8b416e7640a8","method":"transformInterceptedMessage","params":{"id":"d715d9a3-9f88-4591-ba4c-535e940ab22d","connectionID":"1aef10cf-3c42-4864-8edb-35af3164cebb","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954387533}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message d715d9a3-9f88-4591-ba4c-535e940ab22d unaltered + interception proxy got result of transforming message d715d9a3-9f88-4591-ba4c-535e940ab22d Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"da785724-a0e7-4d9b-a8c2-bf0e95ad7c9a","method":"transformInterceptedMessage","params":{"id":"605dc004-ff84-4895-88c7-c978bab5e0f8","connectionID":"a366cea0-ebed-4756-863b-f424c9ec8857","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954387535}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 605dc004-ff84-4895-88c7-c978bab5e0f8 unaltered + interception proxy got result of transforming message 605dc004-ff84-4895-88c7-c978bab5e0f8 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"cab0f526-46a5-4ea6-a4b9-f4b37299f5e3","method":"transformInterceptedMessage","params":{"id":"f67ceccc-8db4-49e6-a66f-a657a95e9947","connectionID":"ac1885fa-46ab-44a6-acea-4f23807fcd2a","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954387535}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message f67ceccc-8db4-49e6-a66f-a657a95e9947 unaltered + interception proxy got result of transforming message f67ceccc-8db4-49e6-a66f-a657a95e9947 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"e612c65d-e7a3-4444-9810-ec918cd355f3","method":"transformInterceptedMessage","params":{"id":"dd1528a6-ee15-424f-9d7f-54d61a13302f","connectionID":"0515cba6-46e1-4f5f-9053-e3bdb76d7fcf","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954387536}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message dd1528a6-ee15-424f-9d7f-54d61a13302f unaltered + interception proxy got result of transforming message dd1528a6-ee15-424f-9d7f-54d61a13302f Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"6cdd2576-21ff-4320-af7f-ed3baa2f34e5","method":"transformInterceptedMessage","params":{"id":"a75a4ab8-a808-47b3-96c5-7b36792a6882","connectionID":"dbf251ed-516e-4662-b579-7af4f9e74611","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954387554}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message a75a4ab8-a808-47b3-96c5-7b36792a6882 unaltered + interception proxy got result of transforming message a75a4ab8-a808-47b3-96c5-7b36792a6882 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"ca222b33-625b-4591-baa1-e406aaba9e10","method":"transformInterceptedMessage","params":{"id":"ede37e3d-3d67-408b-aa10-fd0b7dc453f1","connectionID":"734e2ed2-3b70-4a9d-9b44-6067d4838bab","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954387557}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message ede37e3d-3d67-408b-aa10-fd0b7dc453f1 unaltered + interception proxy got result of transforming message ede37e3d-3d67-408b-aa10-fd0b7dc453f1 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"87739fe9-ba5b-48f2-bd45-7b81ea6493d9","method":"transformInterceptedMessage","params":{"id":"0385bf55-5d3d-468c-a85f-31bad40cc73c","connectionID":"fbf853fb-cffc-4d06-925a-2abc2963e3e0","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954387565}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message 0385bf55-5d3d-468c-a85f-31bad40cc73c unaltered + interception proxy got result of transforming message 0385bf55-5d3d-468c-a85f-31bad40cc73c Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"6c6ecc2a-95ec-4725-8170-a77bfd736cff","method":"transformInterceptedMessage","params":{"id":"fea3dc6e-b5f8-485a-b053-eabdc6f9d254","connectionID":"d0a41555-01e9-4baa-b385-0a86b8a2e442","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954387879}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message fea3dc6e-b5f8-485a-b053-eabdc6f9d254 unaltered + interception proxy got result of transforming message fea3dc6e-b5f8-485a-b053-eabdc6f9d254 Object + interception proxy sending transformInterceptedMessage response Object + interception proxy got message {"jsonrpc":"2.0","id":"016366a3-b5d4-491b-b534-30c4fb1bfa31","method":"transformInterceptedMessage","params":{"id":"f4766c0d-2deb-4023-97f0-a3ef0ac28433","connectionID":"f680095a-782d-4c85-8b40-00b1b968a94b","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954387975}","fromClient":false}} + interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object + default transformInterceptedMessage implementation passing message f4766c0d-2deb-4023-97f0-a3ef0ac28433 unaltered + interception proxy got result of transforming message f4766c0d-2deb-4023-97f0-a3ef0ac28433 Object + interception proxy sending transformInterceptedMessage response Object +modular.test.js:580 rxChannel: Ably: Transport.onProtocolMessage(): received on web_socket: [ProtocolMessage; action=ERROR; timestamp=1715954387975; error=[_ErrorInfo: Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300]]; connectionId = LS0WeOkO2k +modular.test.js:580 rxChannel: Ably: Connection state: failed; reason: [_ErrorInfo: Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] +modular.test.js:580 rxChannel: Ably: Channel state for channel "channel": failed; reason: [_ErrorInfo: Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.); statusCode=403; code=40300] +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"a7d07bd9-97e8-4eb8-8c10-bafb0d20d1dd","method":"transformInterceptedMessage","params":{"id":"d026c820-6832-4c51-8064-f648e3b5c0fc","connectionID":"3167f93b-8c13-442d-8c49-b342672fb86b","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954388479}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message d026c820-6832-4c51-8064-f648e3b5c0fc unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message d026c820-6832-4c51-8064-f648e3b5c0fc Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"17ec18de-baa4-4cc7-bf3d-af06706fdae7","method":"transformInterceptedMessage","params":{"id":"18b0eb72-f55b-4118-a3d2-f38cbf52b437","connectionID":"d7d970be-d1d0-4185-9f6b-cb1dab736aaa","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954388942}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 18b0eb72-f55b-4118-a3d2-f38cbf52b437 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 18b0eb72-f55b-4118-a3d2-f38cbf52b437 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"149a45f0-09ab-4ed5-9d4e-0ba7334a8137","method":"transformInterceptedMessage","params":{"id":"b8f656fc-067e-46a9-9b11-207a64ab24f1","connectionID":"08be5d32-9481-4174-8455-81fcc402e7cb","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954389042}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message b8f656fc-067e-46a9-9b11-207a64ab24f1 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message b8f656fc-067e-46a9-9b11-207a64ab24f1 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"c422216a-3a11-4a15-966b-c1227ea13873","method":"transformInterceptedMessage","params":{"id":"33132c73-9259-4d8a-af46-571d2d466de0","connectionID":"94ff7c21-7e20-4ba8-8ec0-0cc6f769ffa6","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954389215}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 33132c73-9259-4d8a-af46-571d2d466de0 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 33132c73-9259-4d8a-af46-571d2d466de0 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"fec78b77-f104-4645-ab26-bf8ea150f522","method":"transformInterceptedMessage","params":{"id":"a7eb2166-7df1-4e45-bc94-915f18f46ff0","connectionID":"d3e9a008-f4d5-4e2d-9ae8-cf62cce8898d","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954389226}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message a7eb2166-7df1-4e45-bc94-915f18f46ff0 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message a7eb2166-7df1-4e45-bc94-915f18f46ff0 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"6914738a-2116-47a5-994e-a0b84ea2a6af","method":"transformInterceptedMessage","params":{"id":"60f09f2e-9de3-48fa-8620-16442c11633a","connectionID":"8a0688e3-5500-4ae4-b9a3-cc137e6630f7","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954389398}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 60f09f2e-9de3-48fa-8620-16442c11633a unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 60f09f2e-9de3-48fa-8620-16442c11633a Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"3536b327-b2fb-42a7-97e6-c5623e1dcee6","method":"transformInterceptedMessage","params":{"id":"50ff2688-4244-4f40-81ed-7bc0876f614d","connectionID":"89b9045d-7d88-432b-be6a-498e307ea569","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954389636}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 50ff2688-4244-4f40-81ed-7bc0876f614d unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 50ff2688-4244-4f40-81ed-7bc0876f614d Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"7cf31be9-f791-48a9-afdd-d60687125918","method":"transformInterceptedMessage","params":{"id":"61e92f8d-ef5a-4a56-b683-fb268b6cce45","connectionID":"c9f2ea21-95d6-4e02-84da-c5638bc87359","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Account _tmp_F2BXYg disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954389654}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 61e92f8d-ef5a-4a56-b683-fb268b6cce45 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 61e92f8d-ef5a-4a56-b683-fb268b6cce45 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"3149f36d-6ea5-4e8e-b7ef-314f60a07cdd","method":"transformInterceptedMessage","params":{"id":"e6d55520-849d-45ad-bfcb-8f32083b81d7","connectionID":"6b6f8381-8129-4b20-a98d-e6d49991cd85","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_QGtAug disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954389713}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message e6d55520-849d-45ad-bfcb-8f32083b81d7 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message e6d55520-849d-45ad-bfcb-8f32083b81d7 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"7c6a1c78-3774-4964-8ece-83a6b9672a41","method":"transformInterceptedMessage","params":{"id":"6428afb0-5477-4e12-b541-66f31339af79","connectionID":"93613b29-3026-449b-9591-a224c392cef7","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_QGtAug disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954390061}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 6428afb0-5477-4e12-b541-66f31339af79 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 6428afb0-5477-4e12-b541-66f31339af79 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"6126f41b-4de1-4de2-bfb3-0fea81653ffd","method":"transformInterceptedMessage","params":{"id":"689231bc-b946-4f12-b5cc-9b69680454d3","connectionID":"985dc8ed-0898-42a8-8ea2-b167b26303ee","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_QGtAug disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954390416}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 689231bc-b946-4f12-b5cc-9b69680454d3 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 689231bc-b946-4f12-b5cc-9b69680454d3 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"ee52af3a-3d32-48f5-b0e9-db4155caf295","method":"transformInterceptedMessage","params":{"id":"ce011165-d4e3-4377-bcff-c75dbc10c44e","connectionID":"31512da6-657a-479c-a7e1-1f16fc8d623e","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_QGtAug disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954390542}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message ce011165-d4e3-4377-bcff-c75dbc10c44e unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message ce011165-d4e3-4377-bcff-c75dbc10c44e Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"27bac2a7-712d-4512-bf9a-d51e2b3b8e50","method":"transformInterceptedMessage","params":{"id":"296d21c7-873d-41e4-84d4-3e6f612678b1","connectionID":"7c42294c-13dd-424c-91ff-6478908e4307","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_QGtAug disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954390544}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 296d21c7-873d-41e4-84d4-3e6f612678b1 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 296d21c7-873d-41e4-84d4-3e6f612678b1 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"7ec76dd5-7e9d-4176-8425-3b2fa4b9f65f","method":"transformInterceptedMessage","params":{"id":"207d9ffb-a59c-4bb2-92d9-ab2e1d0aa4ac","connectionID":"d6b90afa-2af6-42d1-aa1a-fbbe8cd13989","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_QGtAug disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954391444}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 207d9ffb-a59c-4bb2-92d9-ab2e1d0aa4ac unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 207d9ffb-a59c-4bb2-92d9-ab2e1d0aa4ac Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"9bd14c8c-d909-4f6c-b44c-706cbe9d58e1","method":"transformInterceptedMessage","params":{"id":"07370c70-aaac-4158-8dfa-e35cf5e00a86","connectionID":"68d1e9d8-cb60-405f-bc9c-28cedce2949e","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_QGtAug disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954391474}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 07370c70-aaac-4158-8dfa-e35cf5e00a86 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 07370c70-aaac-4158-8dfa-e35cf5e00a86 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"afb2ce76-4e4a-4d66-8f98-2eb4cc7bb67c","method":"transformInterceptedMessage","params":{"id":"e5b6d9a6-5f9a-4df2-96ad-1390bddfc3f2","connectionID":"02b931c4-1e80-427a-a8f4-d4845618a4cf","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_QGtAug disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954391835}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message e5b6d9a6-5f9a-4df2-96ad-1390bddfc3f2 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message e5b6d9a6-5f9a-4df2-96ad-1390bddfc3f2 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"5b560976-c18f-4515-9f57-7f35e035690d","method":"transformInterceptedMessage","params":{"id":"75e308c0-2a75-45ad-8e91-2ae192aa9eb6","connectionID":"d07164de-fd92-4bea-ac63-59004a246034","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_QGtAug disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954392030}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 75e308c0-2a75-45ad-8e91-2ae192aa9eb6 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 75e308c0-2a75-45ad-8e91-2ae192aa9eb6 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"2cdcb5e9-87c9-4077-bf3b-e97768680309","method":"transformInterceptedMessage","params":{"id":"3fe18c98-d1e8-4768-aefe-779a99ac5de8","connectionID":"d5e31db9-f80f-460e-b0d6-1e464beb376c","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_QGtAug disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954392262}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 3fe18c98-d1e8-4768-aefe-779a99ac5de8 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 3fe18c98-d1e8-4768-aefe-779a99ac5de8 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +interception_proxy_client.js:28 interception proxy got message {"jsonrpc":"2.0","id":"7157966c-8a5f-4063-879d-7e1da385d3c8","method":"transformInterceptedMessage","params":{"id":"84fcb2eb-4545-43dc-9d38-92d82efa4f50","connectionID":"04a886a6-35ad-4840-b08f-2e601183cca9","type":"text","data":"{\"action\":9,\"error\":{\"message\":\"Application _tmp_QGtAug disabled. (See https://help.ably.io/error/40300 for help.)\",\"code\":40300,\"statusCode\":403,\"nonfatal\":false,\"href\":\"https://help.ably.io/error/40300\"},\"timestamp\":1715954392310}","fromClient":false}} +interception_proxy_client.js:138 interception proxy awaiting response of transformInterceptedMessage for message Object deserialized to Object +interception_proxy_client.js:148 default transformInterceptedMessage implementation passing message 84fcb2eb-4545-43dc-9d38-92d82efa4f50 unaltered +interception_proxy_client.js:159 interception proxy got result of transforming message 84fcb2eb-4545-43dc-9d38-92d82efa4f50 Object +interception_proxy_client.js:179 interception proxy sending transformInterceptedMessage response Object +testapp_module.js:76 Test App _tmp_QGtAug has been torn down +interception_proxy_client.js:73 interception proxy client disconnected +index.mjs:179 Uncaught (in promise) Error: Connection to server unavailable + at _ErrorInfo.fromValues (index.mjs:179:34) + at Object.suspended (index.mjs:3284:30) + at _ConnectionManager.notifyState (index.mjs:4273:198) + at index.mjs:4171:14 +fromValues @ index.mjs:179 +suspended @ index.mjs:3284 +notifyState @ index.mjs:4273 +(anonymous) @ index.mjs:4171 \ No newline at end of file