# Change log

## master

## 1.1.6 (2026-02-13)

- Fix parsing empty presence sets.

## 1.1.5 (2026-01-28)

- Minor fixes

## 1.1.4 (2025-11-11)

- Add `whisper` to Action Cable compatibility. ([@palkan][])

## 1.1.3 (2025-11-10)

- Improve Action Cable JS/TS compatibility. ([@palkan][])

## 1.1.2 (2025-04-05)

- Add `disableSessionRecovery` option for extended protocol. ([@palkan][])

- Prevent session recovery after `disconnect` message is received. ([@palkan][])

## 1.1.1 (2025-04-02)

- Added `reconnected` flag to Action Cable connected callback payload. ([@d4rky-pl
][])

## 1.1.0 (2025-02-19)

- Add `websocketAuthStrategy` option to `createCable` to specify how to pass a token for WebSocket connections (using a query param, a header, or a sub-protocol). ([@palkan][])

- Add `auth: {token: '...'}` option to `createCable` to pass the initial authentiation token. ([@palkan][])

- Add `transportConfigurator` parameter to `createCable` to perform arbitrary transport modifications (like, fetching the initial token) before opening a connection. ([@palkan][])

## 1.0.0 (2024-12-26)

- Add `channel.presence` API. ([@palkan][])

  See [docs](https://docs.anycable.io/edge/anycable-go/presence).

## 0.9.2 (2024-12-12)

- Add `performFailures: 'throw' | 'warn' | 'ignore'` option to `createCable()`. ([@palkan][])

## 0.9.1 (2024-07-31)

- Add `info` event to Cable and Channel. ([@palkan][])

  This event can be used to notify of some protocol-level events that happen under the hood and have no representation at the Channel API level. A example of such notification is a stream history retrieval failure.

## 0.9.0 (2024-05-21)

- Types improvements. ([@cmdoptesc][])

- Node 18+ is required.

## 0.8.3 (2024-04-09)

- Fix closing WebSocket right after opening. ([@palkan][])

## 0.8.2 (2024-03-27)

- Fix whispering for pub/sub channels. ([@palkan][])

## 0.8.1 (2024-03-27)

- Added `channel.whisper(...)`. ([@palkan][])

## 0.8.0 (2024-03-14) 🥧

- Added AnyCable signed streams support. ([@palkan][])

  Two new methods have been added to connect to streams directly without any channels: `cable.streamFrom(name)` and `cable.streamFromSigned(signedName)`. See [signed streams docs](https://docs.anycable.io/edge/anycable-go/signed_streams).

## 0.7.13 (2024-02-26)

- Do not try to send `pong` if cable is no longer connected. ([@palkan][])

## 0.7.12 (2024-01-08)

- Omit `undefined` within Channels' params to fix invalid JSON serialization. ([@ardecvz][])

It's intended to mimic the ActionCable behavior when using `JSON.stringify`.

Also, extend the type signature to allow `null` values.

## 0.7.11 (2023-11-29)

- Implement `subscriptions.findAll` for Action Cable compat. ([@palkan][])

## 0.7.10 (2023-11-07)

- Fix subscription state tracking when recovered. ([@palkan][])

- Treat any incoming message as keepalive. ([@palkan][])

  See the corresponding [Rails PR](https://github.com/rails/rails/pull/49168).

## 0.7.9 (2023-10-13)

- Set `cable.sessionId` when using Action Cable (base) protocol. ([@palkan][])

## 0.7.8 (2023-09-21)

- Fix default ActionsType type (any). ([@palkan][])

## 0.7.7 (2023-09-21)

- Add ActionsType to `Channel` class. ([@palkan][])

  Now you can specify which actions can be _performed_ by the channel.

## 0.7.6 (2023-08-17)

- Add `concurrentSubscribes: false` option to prevent sending multiple `subscribe` commands concurrently.

## 0.7.5 (2023-08-10)

- Recognize `actioncable-v1-ext-msgpack` and `actioncable-v1-ext-protobuf` protocols.

- Fix re-subscription attempt to include history request.

## 0.7.4 (2023-08-10)

- Add PONGs support to the extended protocol and allow passing protocol options via `protocolOptions`.

## 0.7.3 (2023-08-09)

- Handle WebSocket error messages on close gracefully.

## 0.7.2 (2023-08-07)

- Remove stale WS connection event listeners on close.

## 0.7.1 (2023-06-28)

- Add FallbackTransport.

## 0.7.0 (2023-04-18)

- Add `actioncable-v1-ext-json` protocol support.

## 0.6.0 (2023-02-06)

- Dependencies upgrade and minor types changes.

## 0.5.7 (2022-08-31)

- Treat stale connection as disconnect error.

## 0.5.6 (2022-08-16)

- Reduce the number of commands when subscribe/unsubscribe is called many times on the same subscription.

New _command-locking_ mechanism prevents from `subscribe-unsubscribe-subscribe-...` cycles by dropping the unnecessary calls.
For example, calling `subscribe-unsubsribe-subscribe` would only result into a single `subscribe` command being sent to the server.

## 0.5.5 (2022-08-16)

- Fixed protocol race conditions.

Fixes [#20](https://github.com/anycable/anycable-client/issues/20).

## ~~0.5.3~~ 0.5.4 (2022-08-16)

- Add `Channel.send` function.

- Use custom object as Action Cable subscription instead of a channel instance.

That prevents from potential incompatible extensions (e.g., `graphql-ruby` sets the `closed` property thus overriding the `closed()` function).

## 0.5.2 (2022-08-16)

- Fix monitor triggering reconnect when cable was closed by user.

## 0.5.0 (2022-07-21)

- **BREAKING** `channelsCache` is deprecated/removed in favour of support for using multiple channel instances for the same identifier.

Channels cache has been added as a workaround for automatically re-using the same channel instance to avoid double-subscrpition problems (since a single client may only have a single subscrpition for the specified identifier).

Not it's possible (and recommended) to create multiple channel instances, AnyCable client takes care of creating a single subscription under the hood. Each channel instance is independent, which means that, for example, calling `channel.disconnect()` removes this channels from the subscribers list and no messages are sent to this particular instance (which could lead to an unexpected behaviour when channels cache was used).

- **BREAKING** `cable.subscribe(channel)` is now **sync** and returns the passed channel itself, so you can chain the execution. The actual `subscribe` command is sent asynchrounously.

If you still want to wait for channel to be connected, you can use the new `ensureSubscribed` function:

```js
# Before
await cable.subscribe(channel)

# After
await cable.subscribe(channel).ensureSubscribed()
```

Similarly, `cable.subscribeTo(...)` is not longer async and returns the channel instance immediately. You can call `channel.ensureSubscribed()` to make sure the channel has been connected to the server.

The `channel.disconnect()` function is no longer async and has not return value. It records the **intention** to unsubscribe. The actual `unsubscribe` command is sent asynchrounously (if requried, i.e., if there are no other channel instances with the same identifier).

## 0.4.1 (2022-07-13)

- Make token refresher is not affected by connection failures.

Previosly, we stopped handling `token_expired` errors if the reconnection attempt made by the refresher failed.

- Do not emit 'close' for channels when cable is closed.

The `close` event should indicate unsubscription (initiated by a user). When the cable is closed, subscriptions are disconnected, not closed (since they got restored if cable is connected back).

## 0.4.0 (2022-07-12)

- Standardize `close` and `disconnect` events and the corresponding methods to always emit/return ReasonError instances (not just DisconnectEvents). Transport errors (e.g., connection failure) are now also wrapped into `DisconnectedError` with the reason `transport_close`. You can access the original error via `error.cause` property.

- Added `closed` state to indicate that a cable or a channel was intentionally disconnected (by user or by server) without further reconnections.

Now `disconnected` always implies reconnection (which might be done by a monitor).

- Make `cable.subscribe(channel)` optimistic (i.e., wait for the cable to be connected, ignore "disconnected" state).

This makes it possible to use `await cable.subscribe(channel)` and don't care about underlying cable state (unless it's closed manually or subscription is rejected).

The `channel.disconnect()` works similarly in a sense that it considers lack of connection as success, and tries to send the `unsubscribe` command otherwise.

## 0.3.5 (2022-07-02)

- Prevent unsubscribe/subscribe race conditions. ([@palkan][])

Since Action Cable protocol doesn't support `unsubscribe` acks, we need to hack around to make sure subsequent `subscribe` commands arrived at the server after the previous `unsubscribe` has been processed.

## 0.3.4 (2022-06-03)

- Add WebSocket options (e.g., headers) support. ([@palkan][])

## 0.3.3 (2022-05-24)

- Fixed channels caching for anonymous channels. ([@palkan][])

## 0.3.1 (2022-01-26)

- Fixed subscriptions cache by switching to a WeakMap. ([@palkan][], [@lokkirill][])

## 0.3.0 (2021-12-14)

- Added optional memoization to `cable.subscribeTo`. ([@palkan][])

- Added `cable.subscribeTo(channelClass, params)` support. ([@palkan][])

- Support multiple `cable.subscribe(channel)` and `cable.unsubscribe(identifier)`. ([@palkan][])

It is possible to reuse the same channel instance independently from different _components_.
Each component takes care of subscribing and unsubsribing; the actual subscription (or unsubscription) only happens once.

## 0.2.0 (2021-11-08)

- Added a cable implementation (`TestCable`) for unit testing purpose to `@anycable/core`. ([@TheSeally][])

## 0.1.0 (2021-09-23)

- Added `tokenRefresher` option to `createCable` to handle `token_expired` disconnections. ([@palkan][])

- Fix unhandled Promise rejection in Monitor. ([@tienle][], [@gydroperit][], [@palkan][])

[@palkan]: https://github.com/palkan
[@tienle]: https://github.com/tienle
[@gydroperit]: https://github.com/gydroperit
[@TheSeally]: https://github.com/TheSeally
[@lokkirill]: https://github.com/lokkirill
[@ardecvz]: https://github.com/ardecvz
[@cmdoptesc]: https://github.com/cmdoptesc
[@d4rky-pl]: https://github.com/d4rky-pl
