[Update] Known issue with Safari 13 - WebSockets error "Failed to compress frame" - SOLVED (11/20/2019)
Twilio team has implemented the workaround related to failed frame compression on the server side. There should be no WebSockets errors anymore.
For additional information, please refer to the public thread.
Known issue with Safari 13 - WebSockets error "Failed to compress frame"
We are aware of numerous reports of websocket "Failed to compress frame" failures with Safari 13 browsers. Twilio engineering team is working on addressing the issue, escalating to Apple Inc and also exploring any potential workarounds to resolve the problem ASAP.
For additional information, please refer to the public thread. We will provide more details and updates once we have them. There is no ETA for a fix at this point of time (11/15/2019).
Upgrade to Programmable Chat JS SDK v2.0 or higher.
Links are provided to specific patch versions here. We don't recommend using these links unless you have a specific need for a certain patch of a release.
- Extended media message sending documentation
- Fixed media messages send from node.js
- Extended documentation.
- Updated to latest twilio-sync with fixes in objects caching
Client.unsetPushRegistrationIdto resolve only after successful operation.
- Fixed emitting
Client#channelRemovedevent correctly for private channels.
- Imporved documentation: added
- Fixed issues appearing in restrictive browser environments, enabling SDK operation without session storage.
- Updated twilio-sync.js dependency with security fixes
- Fixed a bug when removing a Member from Channel
Channel.getMemberBySidmethod to get Member by provided Sid
Channel.getMemberByIdentitymethod to get Member by provided Identity
Channel.createdBycan be null
Message.authorcan be null
Message.getMembermethod to get authoring Member of Message by
member_sid(if available) and if not found then by
- Fixed a bug, where recovery after a partial network degradations the websocket did not reconnect.
- Consumed new version of Sync JS SDK version 0.10.3
- Link to the token generation material got updated
- Fixed a bug where sending messages while offline caused duplicate messages at network reconnect
- Improved error handling in operations with
In this release we are introducing Member Attributes and the ability to change them.
Member.updateAttributesmethod to set a Member's Attributes (requires new permissions to be added to the according role:
- Fixed a connectivity bug that caused unhandled promise rejections
In this release we are introducing a User Notification Level to each Channel. The assigned level determines whether the currently logged-in User will receive pushes for that Channel. The assigned level be any of
default defers to global Chat Service push configuration.
Channel.setUserNotificationLevelmethod to set User's Notification level
- Fixed a connectivity bug that caused reconnection recovery to fail, including when backgrounding on iOS (react native).
- Improved startup and synchronization time in some cases
- Resolved potential issue in Channel synchronization on startup
- Fixed bug preventing building React Native apps in Release configuration
- Improve diagnostics, start adding timestamps to log lines
@types\loglevelpackage is not required anymore in TypeScript projects using
In this release we have revised all updated events. Each revised event now receives an object which contains:
- updated object itself, i.e.
- array of reasons the event is being triggered, i.e. object is updated because of update in
Channel.LastMessage structure is updated to contain only last message's creation
index (effectively removing
- updated events now include reasons for the update. Changed events are:
channel.sendMessage()promise resolve type to
logLevelis now set to
silent, log lines now includes timestamp
- adjust docs for
Client.shutdown(), introducing new types for various methods
- adding new events on client:
tokenExpired(essentially removing need for
- Added method
Client.unsetPushRegistrationIdto unregister from push notifications
- Added helper method
Client.getLocalChannelsto get (sorted) locally known channels, sorting is possible by
- Fixed re-using of
ClientOptionsbetween two clients creations in the same browser or node.js session
- Various updates and fixes for documentation
bodyproperty now is null (instead of placeholder about unsupported media messaging)
- fixed race in session initialization
- various updates and fixes for documentation
This release is identical to 2.0.0. The sole purpose is to publish the new version to npmjs.com.
Client constructor and
Client.initialize function, the correct way now is to use static function
Behavioral breaking change in adding Member and joining Channel, now if User is already in the Channel, then
Channel.join will throw
SessionError. Changed function signature in Consumption Horizon functions, after successful setting of last message consumed these functions returns unread messages count in given Channel for logged in User.
Channel.joinfunctions will throw an
SessionErrorin case of User already exists in the Channel
- Consumption horizon functions now returns
Promise<number>with count of unread messages in the channel after the operation:
Client.versionproperty now correctly displays Client's version
- fixed getting next page of Channel's User Descriptors after calling
- Fixed incorrect handling of network timeouts in React Native
- Fixed session errors handling
- Added Multimedia Messaging (beta) API (see Media Support for more information). Note: Sending media messages on existing instances requires adding a new permission in your channel roles.
Channel.sendMessagemethod you can provide
FormData(for browsers) or
SendMediaOptions(browsers and node.js apps) to send media from your client
Messageclass is extended with
Messageclass is extended with
mediaattribute which holds
- role should contain Channel level
sendMediaMessagepermission for users to be able to send Media Messages
- Fixed a big in client creation which caused the operation to fail in rare cases
PushNotificationinterface for push notification representation
- added static method
Client.parsePushNotificationto handle push payload and return the
PushNotificationinstance back to client (intended use is Firebase service worker)
- Fixed unhandled promise rejections on new client creation in some rare cases
- SDK Reference Documentation fixes and updates
- Fixed additional issues related to Channel and ChannelDescriptor status updates not behaving as expected (which were not addressed in the 1.0.3 release)
- Fixed issues related to Channel status and uniqueName updates not behaving as expected
- SDK Reference Documentation fixes and updates
- Improvements made to the reliability of retrieval of Channel and User Descriptors
- Fix for clients with identities containing spaces / pluses / etc. during fetching Channel Descriptors
- Fix for object properties accessors in User, Member, Channel, Message
- Documentation fixes
- Added a new Factory method for creating the SDK Chat Client instance, specifically to avoid issues caused by using client that was created but not fully initialized. Note that the old manual constructor has been marked as
- Fixed a rare issue whereby the client did not correctly initialise. This caused the typing indicator feature not to work correctly
- Fixed an issue whereby
messageRemovedevents were not correctly firing for messages that present at client init (i.e. not added after client init)
- The JS library should now be React Native friendly
- Various Documentation fixes
Client initialization has been simplified to reflect most users typical usage of the system. All user channels (channels for which the current user is joined to or an owner of) will be subscribed to from client startup but only the members roster will be synchronized initially. This keeps client startup fast while still reflecting the latest activity immediately to the client.
UserInfo has been deprecated and replaced with two distinct classed,
UserDescriptor. Similar to
ChannelDescriptor class, a
UserDescriptor represents a snapshot of data in time that should be utilized directly after obtaining it but not retained since it will not be updated with new data over time.
Users are no longer implicitly subscribed to to improve performance on large instances. You can subscribe up to a maximum 100 of users at once after which your least recently subscribed User will be unsubscribed.
- Enable optimised UserInfo retrieval
- Fixed a bug whereby a Client init race condition caused issues in some browsers (EDGE and other browsers more rarely)
- Ensure callbacks will arrive for channel left (fixed a race)
- Fixed an issue whereby leaving and rejoining a channel caused events to not be received after the rejoin
- Fixed an issue so that the
channelAddedevent for public channels being joined was correctly fired again
endpoint_ididentifier specified in access tokens is now automatically generated and persisted in the client browser cache. The following should be observed with this change:
endpoint_idis no longer a required identifier in your generated access tokens, you may omit it from this build forward
endpoint_idwill be ignored if specified with your access token
- Added a
directionparameter to channel.getMessage method.
backwardsis default direction to keep api compatible with previous versions
- Fixed a bug whereby the
anchorparameter in channel.getMessage method was incorrectly processed.
- Fixed an issue where sometimes a 404 error was returned when querying a channel for messages and members, when the channel was retreived through
getChannelByUniqueNamediretly after the client start
- Fixed an issue where the client sometimes failed to successfully start with a subscription setup error
- Fixed an issue where under certain conditions, the incorrect connection state was for the client instance
- constructor doesn't accept AccessManager interface anymore. Just token. Also user has to call client.updateToken himself when needed.
client.identityproperty. Use client.userInfo.identity
- client.getUserChannels is now paged and returns only channels which are related to the identity (statuses are: invited, joined, and private channels)
- client.getPublicChannels returns list of channelDescriptor, also in paged manner
- channel.getMessagesPaged is removed
- channel.getMessages() returns paginator instead of array
- Added counter methods: channel.getMessagesCount, channel.getUnreadMessagesCount, channel.getMembersCount
- userInfo#updated event now also reports a name of a key which has been updated