Viewing version 0.21.0. Open the latest package page.
centrifuge
0.21.0Dart client to communicate with Centrifuge and Centrifugo from Flutter and VM over WebSockets
Readme
Websocket client for Centrifugo server and Centrifuge library.
Since there is no v1 release yet, patch version updates only contain backwards compatible changes, minor version updates can have backwards incompatible API changes.
Check out client SDK API specification to learn how this SDK behaves. It's recommended to read that before starting to work with this SDK as the spec covers common SDK behavior - describes client and subscription state transitions, main options and methods. Also check out examples folder.
The features implemented by this SDK can be found in SDK feature matrix.
Note that custom WebSocket connection Upgrade headers are sent natively on platforms that support dart:io and in web context headers are sent using Centrifugo v6 Headers Emulation feature.
The latest
centrifuge-dartis compatible with Centrifugo server v6, v5 and v4 and Centrifuge >= 0.25.0. For Centrifugo v2, Centrifugo v3 and Centrifuge < 0.25.0 you should usecentrifuge-dartv0.8.0.
Examples
example\flutter_appsimple chat applicationexample\consolesimple console application
Usage in background
When a mobile application goes to the background there are OS-specific limitations for established persistent connections - which can be silently closed shortly. Thus in most cases you need to disconnect from a server when app moves to the background and connect again when app goes to the foreground.
Errors in event listeners
Event listeners should not throw: catch errors in your listeners. The SDK can't know what a throwing listener left undone, so it fails loudly instead of going on as if nothing happened:
- the error is reported to the zone the listener was registered in, as an uncaught error;
- the client disconnects with code
2(bad protocol) and the reasonexception in event handler: <error>, and doesn't reconnect – callconnect()to start again; - the listeners after the failing one don't get that event; the SDK's own work completes as if the listener had returned;
- a publication whose listener threw is not counted as delivered: after
connect(), a recoverable subscription receives it again.
Alternative SDK
See also PlugFox/spinify for an alternative Dart (Flutter) real-time client SDK implementation.
Run tests locally
Start test Centrifugo server:
docker compose up
Then run tests:
dart run test --reporter expanded
Instructions for maintainers/contributors
How to update protobuf definitions
- Install
protoccompiler - Install
protoc_pluginhttps://pub.dev/packages/protoc_plugin (dart pub global activate protoc_plugin) - cd
lib/src/protoand runprotoc --dart_out=. -I . client.proto - cd to root and run
dartfmt -w lib/ test/(install dartfmt withdart pub global activate dart_style)
How to release
- Update CHANGELOG.md, bump version in
pubspec.yaml, push, create new tag - [ONLY IF THERE ARE ISSUES WITH CI PUBLISH]
dart pub publish
Author
German Saprykin, saprykin.h@gmail.com
Changelog
[0.21.0]
A stability release. Connection, subscription and token handling were reviewed against a validation harness and against centrifuge-js. The harness covers seeded chaos against a fake server, a real Centrifugo behind fault-injecting proxies, and browsers under dart2js and dart2wasm. Most fixes cover races between reconnects, event listeners calling back into the client, teardown, token refresh, and browser behaviour. Every fix comes with a regression test.
Centrifugo v6.9.6 or later is recommended; see "Server versions" below.
Behaviour changes to check when upgrading
connect()validates the endpoint. It throws the newConfigurationError, without changing the client state, when the endpoint can't be opened as a websocket on the platform. Such endpoints used to be retried forever as transport errors, callinggetTokenandgetDataon every attempt.- An expired connection token with no
getTokenstops the client. The client emits aConfigurationErrorerror event and disconnects as unauthorized, as centrifuge-js does, instead of reconnecting with the expired token forever. CallsetToken()with a new token, thenconnect(). WithgetTokenconfigured, the next attempt still callsgetToken, even aftersetToken(). PRs: #129, #154. - An exception while handling a message from the server stops the client. An example is a fossil delta publication without base data. The client disconnects with
badProtocoland reason "exception during message handling: ...", without reconnecting, as centrifuge-js does. The exception is still reported as uncaught. Before, the rest of that websocket message was lost, including replies to pending calls, and the client went on. The same now applies to a publication recovered in a subscribe reply that fails to decode, e.g. a delta without base data: before, the error went unnoticed and the rest of the recovered publications were dropped. PRs: #131, #177. - An exception thrown by an event listener stops the client. The client disconnects with
badProtocoland reason "exception in event handler: ...", without reconnecting, as centrifuge-js does; callconnect()to start again. The exception is still reported as uncaught in the listener's zone. Listeners after the failing one don't get that event, and the SDK's own processing completes as if the listener had returned. A publication whose listener threw doesn't count as delivered, so afterconnect()a recoverable subscription receives it again. Before, the exception was reported and otherwise ignored, and the client went on. Catch errors in your listeners. PR: #177. - The websocket handshake is limited by
ClientConfig.timeout(10s by default). It's aborted on timeout, and ondisconnect()orclose()while in progress. Before, a server that accepted the connection but never answered the upgrade left the client connecting forever, and every attempt against it leaked its socket: two file descriptors per attempt, measured at 824 open descriptors after 400 attempts, until the process hit its limit and could no longer connect at all. unsubscribedis emitted whenunsubscribe()is called, before the server replies, instead of after the reply. The Unsubscribe command is sent before the event, so asubscribe()from its listener follows it. PRs: #128, #133.removeSubscription()unregisters the subscription at once.subscriptions()returns an unmodifiable copy instead of the client's live registry. Code can remove subscriptions while iterating over it. PR: #150.ready()returns a failed future instead of throwing synchronously when the client is disconnected or closed, or the subscription is unsubscribed.await ready()insidetrycatches the error as before;ready().catchError(...)now gets it too. PR: #163.- A repeated
connect()orsubscribe()doesn't fail. A second call while connecting or subscribing still waits for the attempt in progress. Like the first call, it now completes without an error if that attempt ends in a disconnect or unsubscribe, instead of leaving an uncaught error when not awaited. PR: #164. - A server unsubscribe push is ignored while a subscription is still subscribing, as centrifuge-js does. The server sends it also for a channel the connection isn't subscribed to yet. PR: #155.
- Nested events are delivered immediately. An event emitted while a listener handles another one is delivered right away, still synchronously, instead of throwing
StateError: Cannot fire new event. PR: #127. - Close reasons below 3000 are normalized. A websocket close with a code below 3000, other than 1009, is reported as code 1 with reason "transport closed", as centrifuge-js does. It used to carry the socket's reason, which is empty in browsers for a dropped connection. PR: #167.
- A zero
timeoutmeans no timeout also for calls waiting for the client or a subscription to become ready; they used to fail at once. PR: #156. - A static token survives state invalidation. After a 3014 disconnect or a 2502 unsubscribe, a connection or subscription token without
getTokenis kept, and the client reconnects or resubscribes with it. The server rejects it if it's no longer valid. PRs: #129, #152.
Connection fixes
- Superseded connect attempts:
disconnect(),setToken()andconnect()during a pending attempt no longer connect with the old token.connect()afterdisconnect()is no longer dropped while the old attempt runs.disconnect()closes the pending attempt's transport.- A transport closing while
getDatais awaited no longer loses its reconnect. - PR: #126.
- Listeners calling back into the client:
disconnect()orconnect()fromconnecting,connected,disconnected,subscribinganderrorlisteners leaves consistent state and one connection attempt, with no duplicate events, noConcurrentModificationErrorand no leftover ping or refresh timers.- A listener's reaction to a failed connect or subscribe is no longer undone by the failure handling that followed.
- PRs: #127, #137.
connect()from adisconnectedlistener aftergetTokenthrewUnauthorizedExceptionno longer leaves the client connecting forever. PR: #124.- Closed connections:
- A closed connection is processed before its pending calls fail, so a pending subscribe or refresh no longer emits an error event for a close the client recovers from on its own.
- A listener sending a command while those calls fail no longer leaves the client connected to a closed connection.
- PRs: #138, #140.
- Calls and timeouts:
- A call racing
disconnect()fails withClientDisconnectedErrorinstead of a null-checkTypeError. - When a suspended process resumes, replies and pings already received are processed before call timeouts and the ping timeout. That avoids failing a call the server handled, and "no ping" reconnects of healthy connections.
- Calls that time out waiting for
ready()no longer leave waiters behind. - PRs: #130, #145, #148.
- A call racing
- Data that isn't the protocol while connecting closes the connection and reconnects at once, instead of waiting for the connect timeout. PR: #160.
Subscription and recovery fixes
- No deliveries after a teardown. Publications, joins and leaves are no longer delivered, and the stored position no longer moves, after
unsubscribe(),disconnect()orremoveSubscription(). This covers:- the rest of a message
- the rest of the recovered publications
- publications of server-side subscriptions from the connect reply
- PR: #128.
- Ghost subscriptions:
- A subscribe superseded by
unsubscribe()can no longer mark the subscription subscribed, or leave a server-side subscription the client doesn't track. - A subscribe pending when the connection is lost, e.g. in a browser whose network dropped, no longer blocks the next connection's resubscribe.
- When
unsubscribe()during a subscribe in flight sends an Unsubscribe and it fails, the client reconnects, as after a failed Unsubscribe of a subscribed subscription and as in centrifuge-js. Before, the server could keep the subscription and push its publications until the connection ended. A failure arriving after that connection ended no longer reconnects the next one. - PRs: #128, #134, #177.
- A subscribe superseded by
- Recovery without an epoch: when a subscribe or connect reply had no epoch (a channel without a stream yet), subscriptions and server-side subscriptions recovered with an empty epoch, which skips the server's epoch check. The epoch sent with the channel's first publication is now used, as in centrifuge-js. The bundled protocol gains
Publication.epoch. PR: #170. unsubscribe()andsubscribe()from a publication listener no longer recover that publication again. PR: #142.- A subscription
getTokenthat throwsTimeoutExceptionis handled like othergetTokenerrors instead of reconnecting the whole client. PR: #143. - State invalidation:
removeSubscription()and subscribe:ready()no longer resolves after asubscribedlistener tore the subscription down. PR: #148.- Channel compaction: a subscription moved back to subscribing by the server drops its channel compaction ID, so pushes for another channel reusing that ID aren't delivered to it. PR: #123.
Token fixes
- Refresh chains: a token refresh whose
getTokenresolves after a reconnect or resubscribe no longer starts a second refresh chain for the life of the connection or subscription. PR: #129. - Empty refresh token: an empty token returned by
getTokenduring a refresh means unauthorized, as documented and as in centrifuge-js. It disconnects the client, or unsubscribes the subscription, instead of sending a refresh without a token. PR: #122. - Static subscription token: a subscription with a token but without
getTokenno longer fails into an endless retry loop when the server reports an expiry. PR: #120. - Expired token and error listeners: an expired token is dropped before the error event, so
connect()orsubscribe()from its listener gets a new token. PR: #137.
Other fixes
toString():UnauthorizedException.toString()includes its message, andMessageEvent.toString()is well-formed. PRs: #118, #119.
Server versions
Two Centrifugo bugs found during this validation are fixed in Centrifugo v6.9.6 (centrifugal/centrifuge#629 and #627):
- Fossil delta after an empty recovery. On older servers, a subscription with fossil delta that recovers no publications, for example one subscribing with
sinceat the top of the stream, gets the next publication as a delta without base data. With this release the client then disconnects withbadProtocol; earlier versions dropped every publication on the channel. - Expired subscription token accepted on refresh. On older servers a subscription refresh with an expired token was accepted, and the subscription then never expired. v6.9.6 disconnects with 3006, and the client reconnects and gets a new token.
Tests and CI
- Centrifugo version: CI runs against Centrifugo v6.9.6, with a real-server test for the fossil delta fix. PR: #168.
- Browser tests:
test/web_endpoint_test.dartruns in a browser:dart test -p chrome test/web_endpoint_test.dart, optionally with--compiler dart2wasm. CI runs it in Chrome under both compilers. - Tooling: the analyzer uses
package:lintswith strict casts and raw types, and covers the tests too. The code is formatted withdart format, and CI checks it. The unusedmockitoandbuild_runnerdev dependencies and the oldtool/test.share removed.example/chat_appis removed too: it depended on the discontinueddash_chatpackage and no longer built. The public API and the minimum Dart SDK (3.7) are unchanged. - Flaky tests and comments: a timing-sensitive ping test was made independent of CPU load, a call timeout race test was made deterministic, outdated comments were updated, and the fake test server now documents that it keeps every command it received. PRs: #165, #169, #171, #177.
Some PRs in this release fix issues introduced by earlier PRs of the same release: #135, #136, #144, #149, #157 and parts of the PRs above. They are not listed separately, since v0.20.1 was not affected.
[0.20.1]
- Fix
Transportresolving to thedart:io(IOWebSocketChannel) implementation instead of the browser one (HtmlWebSocketChannel) when compiled withdart2wasm. The conditional import intransport.dartused to checkdart.library.html, which is not declared under the wasm compile target — Flutter Web's wasm target has nodart:htmland relies ondart:js_interopinstead — so the WebSocket transport silently fell back to the VM implementation and never connected in the browser. Switched the check todart.library.js_interop, which is declared for bothdart2jsanddart2wasmweb builds while remaining unavailable on native (VM) targets, so native platforms keep usingdart:ioas before.
[0.20.0]
- Add
SubscriptionConfig.getStatecallback support (requires Centrifugo >= 6.8.0), mirroring the same option in centrifuge-js. The callback lets the application load its state from its own source of truth and return the corresponding stream position — the SDK then subscribes with recovery from that position, so no publications are lost between the state read and the subscribe. The callback is invoked on initial subscribe (when there is no saved position) and again when the server reports an unrecoverable position (error 112 — the SDK requests this behavior via thereject_unrecoveredsubscribe flag). It is NOT called on reconnects where server-side recovery succeeds. Errors thrown from the callback emit a subscription error event with the newSubscriptionGetStateErrortype and are retried with backoff. - Support channel compaction, mirroring centrifuge-js: every subscribe request now offers the
channel_compactionflag, and when the server supports and allows it (Centrifugo PROallow_channel_compactionnamespace option) publication/join/leave pushes carry a short numeric channel ID instead of the string channel name — the SDK routes such pushes via an internal ID registry. Servers without compaction support simply ignore the flag, so behavior is unchanged there. - Support publication filtering by tags, mirroring centrifuge-js: a subscription can carry a tags filter so the server delivers only publications whose tags match, saving bandwidth. Build the filter with the new
Filterhelpers and pass it viaSubscriptionConfig.tagsFilter, or change it at runtime withSubscription.setTagsFilter(). A tags filter cannot be combined with delta compression. #112 - Resubscribe from an unrecoverable position on state invalidation: on state invalidation the SDK now resets the recovery position to a sentinel epoch the server cannot match instead of clearing it, so a recoverable subscription resubscribes with
wasRecovering=true,recovered=false— letting the app reload via its existing recovery-failure path rather than looking like a brand-new first subscribe. A non-recoverable subscription simply resubscribes. #113
[0.19.1]
- More connection and subscription stability fixes #109:
- Fix
Client.send()to useSendRequestinstead of the deprecatedMessagetype so async messages reach the server again. - Server-initiated unsubscribes that move the subscription to
subscribing(codes 2500/3007 and other temporary codes) now trigger an immediate resubscribe instead of waiting for a reconnect that may never come. - Subscription resubscribe is now guarded against re-entry, and bails out cleanly if
unsubscribe()ordisconnect()arrives whilegetTokenis awaiting. Client.close()andSubscription.close()no longer emit error/unsubscribed events after the resource is closed; pendingready()futures on a closed subscription are completed withSubscriptionUnsubscribedErrorand any timers are cancelled.ClientDisconnectedErrorthrown by an in-flightConnectRequestno longer cancels the reconnect timer that the transport'sonDonealready scheduled (previously left the client stuck inconnecting).- Reply decoding errors are now routed through the transport's
onErrorcallback instead of crashing the socket listener. - Errors thrown from the
getDatacallback are caught: an error event is emitted and the transport is closed (instead of an unhandled async exception). _refreshTokenno longer issues aRefreshRequestif the client is not connected anymore by the time the token callback resolves.getTokenis no longer invoked when the user did not configure one (previous check could call a null callback in edge cases).backoffDelayreturnsminDelaywhen the computed range collapses to zero, avoidingRangeErrorfromRandom.nextInt(0).
- Fix
[0.19.0]
- Add
Client.close()— disconnects and releases all client resources (closes every event stream and removes every subscription). The client is unusable afterclose(); subsequent public method calls throwClientClosedError. UseClient.disconnect()for a temporary disconnect that keeps the client usable. #106 - Multiple connection stability fixes, see #106 for the full list. Highlights:
await client.disconnect()now actually waits for transport teardown before resolving.- Disconnect code
3014(connection state invalidated) and unsubscribe code2502(subscription state invalidated) now correctly clear the relevant token and recovery state, forcing a freshgetTokenon reconnect. - WebSocket close code
1009(message size limit) is now terminal (no auto-reconnect), matching the behavior in centrifuge-js. - Cancelling a subscription while its
SubscribeRequestis in flight now sends a cleanupUnsubscribeto the server, preventing a "ghost" server-side subscription that keeps pushing publications to the local sub. - Concurrent
unsubscribe()/disconnect during a subscribe round-trip can no longer flip the subscription state back toSubscribed. - Several smaller correctness fixes around connect-mutex resets, async error handling, ping-reply decoding, and the
ClientDisconnectedErrorthrown type.
- Wire
ClientConfig.tlsSkipVerifythrough to the WebSocket transport on VM/Flutter (dart:io) platforms — was a silent no-op before. Useful forwss://development against a self-signed cert. Web platforms ignore the flag, since the browser owns TLS validation. #107 - Substantially expand the integration test suite: server-initiated reconnection scenarios, extended stream recovery edge cases, client/subscription lifecycle ordering,
getTokenretries, and several race-condition tests, all running against the docker-compose Centrifugo.
[0.18.0]
- Min SDK version is 3.7
- Allow usage of protobuf v6 as dependency
- Drop support for Protobuf v3, v4.
[0.17.0]
- Allow usage of protobuf v5 as dependency
[0.16.0]
- Allow usage of protobuf v4 as dependency, drop protobuf v2
[0.15.1]
- Support Fossil delta compression, #97
[0.15.0]
- Update
web_socket_channel, min SDK is now 3.3 #91 - Support headers emulation. Also added
setHeadersmethod to update headers #92.
This release changes headers in ClientConfig from Map<String, dynamic> to Map<String, String>. This is a breaking change, but it must not cause huge troubles beyond a simple refactoring.
Usages of dart.html were removed in this release. Also some internal optimizations were done to allocate less when constructing Protobuf command data.
[0.14.1]
- Add callback to update connection data #88
[0.14.0]
connInfoandchanInfofor join/leave events by @hetao29 #84
[0.13.0]
- Relax Protobuf dependency requirements to be
>=2.0.0 <4.0.0instead of^3.0.0
[0.12.0]
- Fix websocket usage in web env (fixes
The method 'sendByteBuffer' isn't defined for the type 'WebSocket'error), add simple web example #85
[0.11.0]
- Update protobuf dependency from
^2.0.0to^3.0.0. Requires Dart 2.19
[0.10.0]
Breaking change! This release changes the semantics of working with connection tokens described in Centrifugo v5 release post.
Previously, returning an empty token string from getToken callback resulted in client disconnection with unauthorized reason.
Now returning an empty string from getToken is a valid scenario which won't result into disconnect on the client side. It's still possible to disconnect client by throwing a special UnauthorizedException from getToken function.
And we are putting back setToken method to the SDK – so it's now possible to reset the token to be empty upon user logout.
[0.9.4]
- Improving reconnect behaviour upon bad network conditions (like connect timeout), #79
- #79 also handles ClientDisconnectedError in _onPing method, addresses #76
[0.9.3]
- Add support for web platform – #73
[0.9.2]
[0.9.1]
- Fix setting initial connection token
- Fix setting connection data
- Fix LateInitializationError if transport is not initialized yet
- Better string representation of
UnsubscribedEvent
[0.9.0]
Breaking changes
This release adopts a new iteration of Centrifugal protocol and a new iteration of API. Client now behaves according to the client SDK API specification. The work has been done according to Centrifugo v4 roadmap.
Check out Centrifugo v4 release post that covers the reasoning behind changes.
All the current core features of Centrifugal client protocol are now supported here.
New release only works with Centrifugo >= v4.0.0 and Centrifuge >= 0.25.0. See Centrifugo v4 migration guide for details about the changes in the ecosystem.
Note, that Centrifugo v4 supports clients working over the previous protocol iteration, so you can update Centrifugo to v4 without any changes on the client side (but you need to turn on use_client_protocol_v1_by_default option in the configuration of Centrifugo, see Centrifugo v4 migration guide for details).
[0.8.0]
Version 0.8.0 is the next iteration of centrifuge-dart development. It pushes client closer to other clients in the ecosystem. It also contains several backwards incompatible changes.
- Return Futures from
Client.connect,Client.disconnect,Subscription.subscribe,Subscription.unsubscribemethods - addresses #31. - On initial connect fire
DisconnectEventon connection error - this makes behavior ofcentrifuge-dartsimilar to all other our clients - addresses #56. - Add client error stream to consume
ErrorEvent- each transport failure will emit error to this stream - addresses #56. - Refactor subscription statuses - add
subscribinganderrorstatuses. This change is mostly internal should not affect working with Subscriptions. - Do not call
UnsubscribeEventif subscription is not successfully subscribed (i.e. insubscribedstate). This makes behavior ofcentrifuge-dartsimilar to all other our clients. - Update disconnect reasons due to failed connection and calling
Client.Disconnectmethod - make it more similar to all other connector libraries in ecosystem. - Add default transport timeout (10 sec) – on connect and subscribe timeouts client will auto reconnect, calls like publish, history, rpc can now throw
TimeoutException. Also - properly pass timeout to the transport (was not before!). Again – this makes client behave similarly to all other connectors. - Add
presenceandpresenceStatsmethods for Subscription and on client top level (for server-side subscriptions). - Support
streamPositioninSubscribeSuccessEvent. - Support
streamPositioninServerSubscribeEvent. - Support
datainServerSubscribeEvent. - Implement
sendmethod to send async messages to a server. - Fix deletion during iteration over map when working with server-side subscriptions.
- Better event String representations.
- Improvements and fixes in examples.
[0.7.1]
- Add support for
datainSubscribeSuccessEvent. This is a custom data which can be sent by a server towards client connection in subscribe result. Note that due to the bug in Centrifugo server this feature only works in Centrifugo >= v3.0.3.
[0.7.0]
Update to work with Centrifuge >= v0.18.0 and Centrifugo v3.
Breaking change in server behavior. Client History API behavior changed in Centrifuge >= v0.18.0 and Centrifugo >= v3.0.0. When using history call it won't return all publications in a stream by default. See Centrifuge v0.18.0 release notes or Centrifugo v3 migration guide for more information and workaround on server-side.
- Protocol definitions updated to the latest version
- History method now accepts optional
limit,sinceandreversearguments and returnsHistoryResult - RPC call now requires method name as first argument (you can pass empty string to mimic previous behavior)
- Publish now returns
PublishResult - When working with Centrifugo v3 or Centrifuge >= v0.18.0 it's now possible to avoid using
?format=protobufin connection URL. Client will negotiate Protobuf protocol with a server using WebSocket subprotocol mechanism (in request headers).
[0.6.0]
Null safety migration
- library dependencies updated to null safe versions
- library code updated to support null safety in places where required
See issue #47 and pull request #48 for details.
[0.5.1]
- Skip handling for events from server-side subscriptions resulted in null pointer dereference
[0.5.0]
- Update protobuf dependency to
^1.0.1, thanks @Holofox
[0.4.1]
- Implement
removeSubscriptionmethod, thanks @tiamo
[0.4.0]
- Breaking changes
connectedproperty removed
[0.3.0]
- Breaking changes Changed API to avoid returning futures where they do not make sense – in
connectandsubscribemethods. - Client now uses Websocket Ping/Pong frames to find broken connection
- Support for private channel subscription using
onPrivateSubconfiguration callback function - Fix several null pointer dereferences in edge cases, throw
ClientDisconnectedErrorwhen there is an attempt to send protocol request over non-connected client. - Fix examples where subscribe could happen before stream handlers set
[0.2.0]
- Breaking changes Replaced subscribe method with getSubscription in Client.
- Added reconnection.
- Added history method to Subscription. Thanks vanelizarov.
- Added rpc method.
[0.1.0]
- Added authorization with JWT
- Added subscription to private channel with JWT
[0.0.1]
- Initial release
Installing
export PUB_HOSTED_URL=https://pub.mirror.p-hatan.ir
flutter pub add 'centrifuge:0.21.0'pubspec.yaml
name: centrifuge
version: 0.21.0
description: >
Dart client to communicate with Centrifuge and Centrifugo from Flutter and VM
over WebSockets
homepage: https://github.com/centrifugal/centrifuge-dart
environment:
sdk: '>=3.7.0 <4.0.0'
dependencies:
fixnum: ^1.0.0
meta: ^1.3.0
protobuf: ">=5.0.0 <7.0.0"
web_socket_channel: ">=3.0.0 <4.0.0"
dev_dependencies:
http: ^1.1.0
lints: ">=5.1.1 <7.0.0"
stream_channel: ^2.1.4
test: ^1.17.4
Version history
| Version | Published | Archive | SHA-256 |
|---|---|---|---|
| 0.0.1 | Cached · Upstream SHA-256 matched | Download | db3faacd…bd6395 |
| 0.1.0 | Cached · Upstream SHA-256 matched | Download | 09f7e4de…6b0b62 |
| 0.2.0 | Cached · Upstream SHA-256 matched | Download | 23bb4439…ea7ae6 |
| 0.3.0 | Cached · Upstream SHA-256 matched | Download | 3b377680…8aab61 |
| 0.4.0 | Cached · Upstream SHA-256 matched | Download | 08e6f397…213fbc |
| 0.4.1 | Cached · Upstream SHA-256 matched | Download | 6bb61dec…98094b |
| 0.5.0 | Cached · Upstream SHA-256 matched | Download | fd063805…d18ae1 |
| 0.5.1 | Cached · Upstream SHA-256 matched | Download | 60d5f869…941458 |
| 0.6.0 | Cached · Upstream SHA-256 matched | Download | d219ec9a…037c10 |
| 0.7.0 | Cached · Upstream SHA-256 matched | Download | 6548eff6…235e80 |
| 0.7.1 | Cached · Upstream SHA-256 matched | Download | 56407e60…13ad2c |
| 0.8.0 | Cached · Upstream SHA-256 matched | Download | 5ac2b57e…b7620a |
| 0.9.0 | Cached · Upstream SHA-256 matched | Download | 1f281a39…016252 |
| 0.9.1 | Cached · Upstream SHA-256 matched | Download | 0b9abe02…7ab142 |
| 0.9.2 | Cached · Upstream SHA-256 matched | Download | c261d991…360df3 |
| 0.9.3 | Cached · Upstream SHA-256 matched | Download | 4cd31b8b…bd7d34 |
| 0.9.4 | Cached · Upstream SHA-256 matched | Download | fda87da9…272ec3 |
| 0.10.0 | Cached · Upstream SHA-256 matched | Download | a278ecc0…d447b3 |
| 0.11.0 | Cached · Upstream SHA-256 matched | Download | 26bc8e36…65c5ec |
| 0.12.0 | Cached · Upstream SHA-256 matched | Download | 8a836da8…ea9aef |
| 0.13.0 | Cached · Upstream SHA-256 matched | Download | 8cea9670…6c71c8 |
| 0.14.0 | Cached · Upstream SHA-256 matched | Download | c35b75c7…4e4d47 |
| 0.14.1 | Cached · Upstream SHA-256 matched | Download | 15b9aabc…7e2516 |
| 0.15.0 | Cached · Upstream SHA-256 matched | Download | bc4e20bc…a8eb01 |
| 0.15.1 | Cached · Upstream SHA-256 matched | Download | bcd1e205…ccdf09 |
| 0.16.0 | Cached · Upstream SHA-256 matched | Download | b8b3d3c6…522a6d |
| 0.17.0 | Cached · Upstream SHA-256 matched | Download | 96050368…f97c73 |
| 0.18.0 | Cached · Upstream SHA-256 matched | Download | fa943928…f530ba |
| 0.19.0 | Cached · Upstream SHA-256 matched | Download | 672d21fa…77253d |
| 0.19.1 | Cached · Upstream SHA-256 matched | Download | 27808466…6446ea |
| 0.20.0 | Cached · Upstream SHA-256 matched | Download | fae4f687…b2bc6a |
| 0.20.1 | Cached · Upstream SHA-256 matched | Download | 5f172511…1e177d |
| 0.21.0 | Cached · Upstream SHA-256 matched | Download | 7449dc56…2b7969 |
Dependencies
fixnum "^1.0.0"
meta "^1.3.0"
protobuf "\u003e=5.0.0 \u003c7.0.0"
web_socket_channel "\u003e=3.0.0 \u003c4.0.0"