solana_kit_rpc_subscriptions 0.9.3 copy "solana_kit_rpc_subscriptions: ^0.9.3" to clipboard
solana_kit_rpc_subscriptions: ^0.9.3 copied to clipboard

Subscription client for the Solana Kit Dart SDK.

Changelog #

All notable changes to this project will be documented in this file.

This changelog is managed by monochange.

0.9.3 - 2026-09-12 #

Changed #

  • No package-specific changes were recorded; solana_kit_rpc_subscriptions was updated to 0.9.3 as part of group main.

0.9.2 - 2026-09-06 #

πŸ› Fixed #

Recover failed RPC subscription cache entries

Recover subscription acquisition after transport failures, prevent repeated errors from evicting a replacement subscription, and reuse channel capacity released while the subscription pool was full.

Handle native channel stream errors in subscription coalescing, channel pooling, and keepalive pinging so failed connections are cleaned up without uncaught asynchronous errors.

Owner: @ifiokjr Β· Review: PR #238

Fix subscription protocol and URL validation

Execute the default Solana subscription JSON-RPC handshake, validate its server subscription ID, isolate notifications on pooled channels, and send unsubscribe requests during cancellation. Preserve notifications received during acquisition with a bounded initial buffer and route protocol, channel, and decoding failures to subscribers.

Normalize WebSocket destination literals before applying private-host protection, covering expanded and hexadecimal IPv4-mapped IPv6 forms and trailing DNS root dots without rejecting public hostnames that resemble IPv6 prefixes.

Reject cancelled WebSocket handshakes promptly, close late connections, reject sends after cancellation, and finish public streams when their channel ends.

Owner: @ifiokjr Β· Review: PR #238

0.9.1 - 2026-08-30 #

Changed #

  • No package-specific changes were recorded; solana_kit_rpc_subscriptions was updated to 0.9.1 as part of group main.

0.9.0 - 2026-08-30 #

πŸ“– Documentation #

Unslop package docs and code comments

Rewrote every package README from a reader's perspective with verified, compilable examples, removed AI-tell phrasing from docs and code comments, and added a test that analyzes every Dart block in Markdown so examples cannot drift from the API.

Owner: @ifiokjr Β· Review: PR #223

0.8.0 - 2026-08-19 #

Changed #

  • No package-specific changes were recorded; solana_kit_rpc_subscriptions was updated to 0.8.0 as part of group main.

0.7.0 - 2026-08-18 #

πŸ’₯ Breaking Change #

@solana/kit v7.0.0 upstream sync (foundational breaking changes)

Ports the foundational breaking changes from @solana/kit v7.0.0:

  • solana_kit_errors: new transactionIntrospection error domain + codes (transactionFailedToDecompileInstructionAccountIndexOutOfRange, transactionIntrospectionCannotDecodeJsonParsedTransaction, transactionIntrospectionUnrecognizedGetTransactionResponse) and instruction-plans max-instructions codes (instructionPlansInvalidMaxInstructionsPerTransaction, instructionPlansMaxInstructionsPerTransactionExceeded).
  • solana_kit_codecs_data_structures: createDependentStructDecoder fluent builder for structs whose later fields depend on earlier decoded values.
  • solana_kit_instruction_plans: configurable maxInstructionsPerTransaction (default 16, limit 64) on TransactionPlannerConfig, individual TransactionPlanner invocations, and MessagePacker; invocation-specific planner values take precedence without leaking to later calls.
  • solana_kit_rpc_types: isSolanaRpcResponse runtime guard.
  • solana_kit: removed the local getMinimumBalanceForRentExemption helper (rent exemption is becoming dynamic; use the RPC method instead).
  • solana_kit_subscribable: ReactiveStreamStore v7 rewrite β€” caller-driven connect()/reset()/withSignal(), starts idle, collapses retrying into loading (stale-while-revalidate), renames getUnifiedState() β†’ getState(); removed retry(), value-only getState(), getError(). ReactiveActionStore now passes a fresh CancellationToken to every action, cancels superseded/reset/disposed dispatches, suppresses late outcomes, exposes caller cancellation through withSignal(), and preserves stale results and errors while running.
  • solana_kit_transaction_introspection: new first-class package porting @solana/transaction-introspection β€” RPC transaction decoding, instruction and inner-instruction extraction, loaded-address resolution, and instruction walking helpers; re-exported from the solana_kit umbrella.
  • solana_kit_rpc_parsed_types / solana_kit_rpc_transformers / solana_kit_rpc_api: Agave 4.1.0 parsed-account types β€” vote commissions/latency as int (not BigInt); rent sysvar union (lamportsPerByte vs deprecated burnPercent/exemptionThreshold/ lamportsPerByteYear); stake warmupCooldownRate optional; config slashPenalty/warmupCooldownRate deprecated; keep vote commissions and latency as int in the numeric-keypath allow-lists.

Migration: getMinimumBalanceForRentExemption(space) β†’ rpc.getMinimumBalanceForRentExemption(space).send(); store.retry() β†’ store.connect(); store.getUnifiedState() β†’ store.getState(); the deprecated ReactiveStore/createReactiveStoreFromStreams β†’ createReactiveStreamStore; reactive actions must migrate from (args) async => result to (signal, args) async => result.

// Before
final lamports = getMinimumBalanceForRentExemption(space);
store.retry();
final state = store.getUnifiedState();

// After
final lamports = await rpc.getMinimumBalanceForRentExemption(space).send();
store.connect();
final state = store.getState();

Owner: @ifiokjr Β· Review: PR #204

πŸ› Fixed #

Harden credentials, keys, transports, and untrusted RPC decoding

Align Helius signup and project provisioning with the v3 bearer-JWT API, generate valid Ed25519 authentication keypairs, validate payment inputs, and redact WebSocket credentials.

Dispose or clear SDK-owned key material deterministically, create key files exclusively with safe POSIX permissions, and preserve caller ownership of Surfpool signers.

Reject malformed RPC transaction and inner-instruction data instead of silently dropping it, expand private WebSocket literal filtering, and update JavaScript dependency overrides to releases without the audited advisories. Make the standalone Codama renderer workspace declare its own build tools and explicitly allow only esbuild's required install script.

Owner: @ifiokjr Β· Review: PR #213 Β· Related issues: #159, #163, #186, #198, #203, #204, #205, #206, #207, #208, #210, #211, #34, #37

0.6.0 - 2026-08-12 #

πŸ’₯ Breaking Change #

Remove deprecated APIs across the SDK

Breaking change. Clears every remove_deprecations_in_breaking_versions lint warning by deleting deprecated members and migrating call sites to their documented replacements. No deprecations are suppressed; each deprecated declaration is removed.

createEmptyClient (solana_kit)

Removed the deprecated createEmptyClient alias. Use createClient instead.

// Before
final client = createEmptyClient({'ready': true});
// After
final client = createClient({'ready': true});
Deprecated fixed-point rounding modes (solana_kit_fixed_points)

Removed the deprecated FixedPointRoundingMode values down, up, and halfUp. The surviving modes are strict, floor, ceil, trunc, round.

  • down was a duplicate of trunc β€” use FixedPointRoundingMode.trunc.
  • halfUp was a duplicate of round β€” use FixedPointRoundingMode.round.
  • up ("round away from zero") has no single replacement. Use floor or ceil depending on the sign of the value, or round for nearest.
Deprecated Pipe extension (solana_kit_functional)

Removed the deprecated Pipe extension from solana_kit_functional. Pipe is re-exported from solana_kit_transaction_messages and the solana_kit umbrella. Switch imports accordingly:

// Before
import 'package:solana_kit_functional/solana_kit_functional.dart';
// After
import 'package:solana_kit_transaction_messages/solana_kit_transaction_messages.dart';

solana_kit no longer depends on solana_kit_functional. The solana_kit_functional package is now an empty placeholder pending full retirement.

Deprecated subscriptions compatibility APIs

The deprecated AbortSignal/AbortController and DataPublisher/WritableDataPublisher/createDataPublisher compatibility APIs were the core transport substrate of the subscriptions stack, not a thin compatibility layer. They are replaced by stream-native and cancellation-token equivalents.

Cancellation
  • AbortSignal β†’ CancellationToken (from solana_kit_subscribable)
  • AbortController β†’ CancellationTokenSource (from solana_kit_subscribable)
  • controller.signal β†’ source.token
  • controller.abort([reason]) β†’ source.cancel([reason])
  • signal.isAborted β†’ token.isCancelled
  • signal.reason β†’ token.reason
  • signal.future β†’ token.future

Public field/parameter names that held an AbortSignal (e.g. abortSignal, signal) are kept; only their type changed to CancellationToken. CancellationToken and CancellationTokenSource are re-exported from solana_kit_rpc_subscriptions and solana_kit_rpc_subscriptions_channel_websocket so consumers do not need a direct solana_kit_subscribable dependency.

AbortError, isAbortError, getAbortableFuture, and normalClosureCode remain in solana_kit_rpc_subscriptions_channel_websocket (behavior unchanged; their AbortSignal? params are now CancellationToken?).

DataPublisher β†’ NotificationStreams
  • The transport contract changed from Future<DataPublisher> to Future<NotificationStreams>.
  • RpcSubscriptionsChannel now exposes NotificationStreams get streams instead of the on(channelName, subscriber) method.
  • createDataPublisher(), WritableDataPublisher, DataPublisher, and the DataPublisherStreams extension are removed.
  • The *FromDataPublisher helpers are removed: createStreamFromDataPublisher, StreamFromDataPublisherConfig, createAsyncIterableFromDataPublisher, demultiplexDataPublisher, createReactiveStoreFromDataPublisher, createReactiveStreamStoreFromDataPublisher.
  • The stream-native helpers are kept: ChannelStreamController, createStreamFromDataAndErrorStreams, demultiplexStream, createReactiveStoreFromStreams, ReactiveStore, ReactiveStreamStore, createReactiveStreamStore.
Public subscription APIs

PendingRpcSubscriptionsRequest.subscribe() and .reactive() still return Future<Stream<T>> and Future<ReactiveStore<T>> respectively. Internally they now consume NotificationStreams.notifications / .errors instead of DataPublisher channels.

Migration
// Before
final controller = AbortController();
final stream = await pending.subscribe(
  RpcSubscribeOptions(abortSignal: controller.signal),
);
controller.abort();

// After
final source = CancellationTokenSource();
final stream = await pending.subscribe(
  RpcSubscribeOptions(abortSignal: source.token),
);
source.cancel();

Owner: Ifiok Jr. Β· Introduced in: 3901c24 Β· Last updated in: 7d98d00

πŸ“– Documentation #

Centralize package version documentation

Centralize package version metadata in versions.json and render package installation snippets from the shared MDT data source. Published package behavior is unchanged.

Owner: @ifiokjr Β· Review: PR #188

Point package README website badges at package docs

Updated package README website badges to link directly to each package's docs catalog entry and added missing package entries to the documentation website catalog/index.

Owner: @ifiokjr Β· Review: PR #192

0.5.0 - 2026-06-01 #

πŸ’₯ Breaking Change #

Raise minimum Dart SDK to 3.12

Raise the minimum supported Dart SDK constraint to ^3.12.0 across public Dart packages.

This is a breaking change because consumers must use Dart 3.12 or newer. Flutter consumers must use a Flutter SDK that bundles Dart 3.12 or newer.

environment:
  sdk: ^3.12.0

Owner: Ifiok Jr. Β· Introduced in: 32d5d36

πŸš€ Feature #

Refactor subscriptions to stream-native APIs

Refactor subscription internals toward stream-native Dart APIs while keeping the existing DataPublisher and AbortSignal compatibility APIs available as deprecated APIs.

Added stream-native helpers for channel streams, demultiplexing, reactive stores, and data/error stream composition, and migrated internal subscription consumers to use Dart Stream/StreamSubscription flows where possible.

Owner: Ifiok Jr. Β· Introduced in: 6fcc74a Β· Last updated in: 9988103

0.4.0 - 2026-05-30 #

πŸ“ Changed #

Restructure release groups

Move program-specific and domain-specific packages out of the main release group into standalone release schedules with independent versioning. Core SDK packages remain synchronized in the main group.

Owner: Ifiok Jr. Β· Introduced in: fccec7f Β· Last updated in: 93b3cd3

πŸ› Fixed #

Add per-package coverage badges

Add codecov flags and per-package coverage badges to all package READMEs.

Owner: Ifiok Jr. Β· Introduced in: bed1b1f Β· Last updated in: 93b3cd3

Document stream-first subscription preference

Document stream-first preference in solana_kit_subscribable and rpc_subscriptions; DataPublisher remains as a compatibility layer.

Owner: Ifiok Jr. Β· Introduced in: 29e8823 Β· Last updated in: 12316d5

Add typed RPC subscription methods

Add typed convenience methods for common Solana RPC…

Add typed convenience methods for common Solana RPC subscription requests so callers can avoid assembling notification names and params manually.

Owner: Ifiok Jr. Β· Introduced in: 0bb3747 Β· Last updated in: 0ee3d60

Add RPC subscription store helpers

Add pending RPC subscription reactive-store helpers and…

Add pending RPC subscription reactive-store helpers and typed subscription composition coverage for the upstream 6.9 subscription utility surface.

Owner: Ifiok Jr. Β· Introduced in: 9ee2e44 Β· Last updated in: 0ee3d60