Skip to content

Releases: Tap30/ripple-ts

@tapsioss/ripple-node@1.0.1

17 Feb 10:16
351a409

Choose a tag to compare

Patch Changes

  • 6efec3d Thanks @mimshins! - Fix race condition in init() when called multiple times after dispose(). Previously, if restore() took longer to complete, concurrent init() calls could reset the mutex while it was actively being used, potentially corrupting the initialization process.

@tapsioss/ripple-browser@1.0.1

17 Feb 10:16
351a409

Choose a tag to compare

Patch Changes

  • 6efec3d Thanks @mimshins! - Fix race condition in init() when called multiple times after dispose(). Previously, if restore() took longer to complete, concurrent init() calls could reset the mutex while it was actively being used, potentially corrupting the initialization process.

@tapsioss/ripple-node@1.0.0

16 Feb 15:34
2733911

Choose a tag to compare

Major Changes

  • aa268ea Thanks @mimshins! - BREAKING CHANGE: Add validation to prevent invalid Dispatcher configuration

    The Dispatcher constructor now throws an error if maxBufferSize < maxBatchSize. This configuration was previously allowed but would cause events to be dropped unnecessarily since the batch size could never be reached.

    If you're using this configuration, update it to ensure maxBufferSize >= maxBatchSize:

    const dispatcher = new Dispatcher({
      maxBatchSize: 100,
    - maxBufferSize: 50,  // Invalid - will throw error
    + maxBufferSize: 100, // Valid - buffer can hold at least one full batch
    });
  • 6c90393 Thanks @mimshins! - BREAKING CHANGE: Rename ConsoleLoggerAdopter to ConsoleLoggerAdapter to fix typo

    If you're using the logger directly, update your imports:

    - import { ConsoleLoggerAdopter } from '@tapsioss/ripple-browser';
    + import { ConsoleLoggerAdapter } from '@tapsioss/ripple-browser';
    
    - const logger = new ConsoleLoggerAdopter(LogLevel.DEBUG);
    + const logger = new ConsoleLoggerAdapter(LogLevel.DEBUG);
  • 459f336 Thanks @mimshins! - Remove SessionStorageAdapter, CookieStorageAdapter from browser package and FileStorageAdapter from node package. These adapters are no longer exported or available. For browser, use LocalStorageAdapter or IndexedDBAdapter instead. For node, use NoOpStorageAdapter or implement a custom storage adapter.

Minor Changes

  • 5610631 Thanks @mimshins! - Add close() method to StorageAdapter interface for resource cleanup. The close() method is now called automatically during client disposal to properly release storage resources. IndexedDBAdapter implements close() to close database connections, while other adapters provide empty implementations as they don't require cleanup.

Patch Changes

  • dcda392 Thanks @mimshins! - Add disposal state tracking to prevent operations after client disposal. The client now tracks disposal state with a _disposed flag that prevents track() calls from re-initializing a disposed client. Explicit init() call is required to re-enable a disposed client.

  • 684f87a Thanks @mimshins! - Fix race condition in client initialization when track() is called before init()

  • 705a71c Thanks @mimshins! - Add validation for negative configuration values. The client constructor now throws errors when flushInterval, maxBatchSize, or maxBufferSize are zero or negative, or when maxRetries is negative.

  • 95ec7b2 Thanks @mimshins! - Fix memory leak in Dispatcher by preventing timer scheduling after disposal

  • 13a732e Thanks @mimshins! - Fix mutex disposal to properly reject new acquisitions and support reinitialization. The mutex now throws MutexDisposedError when attempting to acquire a disposed mutex, preventing silent failures. Added reset() method to allow mutex reuse after disposal, enabling proper client and dispatcher reinitialization workflows.

  • 827706f Thanks @mimshins! - Fix unsafe mutex release that could cause hanging promises during disposal. The mutex now properly resolves all queued tasks before clearing, preventing deadlocks when the dispatcher is disposed.

@tapsioss/ripple-browser@1.0.0

16 Feb 15:34
2733911

Choose a tag to compare

Major Changes

  • aa268ea Thanks @mimshins! - BREAKING CHANGE: Add validation to prevent invalid Dispatcher configuration

    The Dispatcher constructor now throws an error if maxBufferSize < maxBatchSize. This configuration was previously allowed but would cause events to be dropped unnecessarily since the batch size could never be reached.

    If you're using this configuration, update it to ensure maxBufferSize >= maxBatchSize:

    const dispatcher = new Dispatcher({
      maxBatchSize: 100,
    - maxBufferSize: 50,  // Invalid - will throw error
    + maxBufferSize: 100, // Valid - buffer can hold at least one full batch
    });
  • 6c90393 Thanks @mimshins! - BREAKING CHANGE: Rename ConsoleLoggerAdopter to ConsoleLoggerAdapter to fix typo

    If you're using the logger directly, update your imports:

    - import { ConsoleLoggerAdopter } from '@tapsioss/ripple-browser';
    + import { ConsoleLoggerAdapter } from '@tapsioss/ripple-browser';
    
    - const logger = new ConsoleLoggerAdopter(LogLevel.DEBUG);
    + const logger = new ConsoleLoggerAdapter(LogLevel.DEBUG);
  • 459f336 Thanks @mimshins! - Remove SessionStorageAdapter, CookieStorageAdapter from browser package and FileStorageAdapter from node package. These adapters are no longer exported or available. For browser, use LocalStorageAdapter or IndexedDBAdapter instead. For node, use NoOpStorageAdapter or implement a custom storage adapter.

Minor Changes

  • 5610631 Thanks @mimshins! - Add close() method to StorageAdapter interface for resource cleanup. The close() method is now called automatically during client disposal to properly release storage resources. IndexedDBAdapter implements close() to close database connections, while other adapters provide empty implementations as they don't require cleanup.

Patch Changes

  • dcda392 Thanks @mimshins! - Add disposal state tracking to prevent operations after client disposal. The client now tracks disposal state with a _disposed flag that prevents track() calls from re-initializing a disposed client. Explicit init() call is required to re-enable a disposed client.

  • 684f87a Thanks @mimshins! - Fix race condition in client initialization when track() is called before init()

  • 705a71c Thanks @mimshins! - Add validation for negative configuration values. The client constructor now throws errors when flushInterval, maxBatchSize, or maxBufferSize are zero or negative, or when maxRetries is negative.

  • 95ec7b2 Thanks @mimshins! - Fix memory leak in Dispatcher by preventing timer scheduling after disposal

  • 13a732e Thanks @mimshins! - Fix mutex disposal to properly reject new acquisitions and support reinitialization. The mutex now throws MutexDisposedError when attempting to acquire a disposed mutex, preventing silent failures. Added reset() method to allow mutex reuse after disposal, enabling proper client and dispatcher reinitialization workflows.

  • e51dcd9 Thanks @mimshins! - Fix inconsistent error handling in storage adapters. Changed from Promise.reject() to throw for consistent async/await error handling in LocalStorageAdapter, SessionStorageAdapter, and CookieStorageAdapter.

  • 827706f Thanks @mimshins! - Fix unsafe mutex release that could cause hanging promises during disposal. The mutex now properly resolves all queued tasks before clearing, preventing deadlocks when the dispatcher is disposed.

@tapsioss/ripple-node@0.9.0

10 Feb 14:51
659bc0c

Choose a tag to compare

Minor Changes

  • #28 9eca791 Thanks @mimshins! - Improved initialization behavior with automatic pre-init operation queuing

    Previously, calling track() before init() would throw an error. Now, track operations are automatically queued and processed after initialization completes.

    What changed:

    • track() no longer throws an error when called before init()
    • Operations are queued using a mutex and executed after init() completes
    • init() can be called multiple times safely (subsequent calls are no-ops)

    Migration:
    No code changes required. Existing code continues to work. You can now safely call track() before init() if needed, and the SDK will handle queuing automatically.

    Benefits:

    • Better developer experience - no need to ensure strict initialization order
    • Prevents race conditions
    • Thread-safe operation queuing

@tapsioss/ripple-browser@0.9.0

10 Feb 14:51
659bc0c

Choose a tag to compare

Minor Changes

  • #28 9eca791 Thanks @mimshins! - Improved initialization behavior with automatic pre-init operation queuing

    Previously, calling track() before init() would throw an error. Now, track operations are automatically queued and processed after initialization completes.

    What changed:

    • track() no longer throws an error when called before init()
    • Operations are queued using a mutex and executed after init() completes
    • init() can be called multiple times safely (subsequent calls are no-ops)

    Migration:
    No code changes required. Existing code continues to work. You can now safely call track() before init() if needed, and the SDK will handle queuing automatically.

    Benefits:

    • Better developer experience - no need to ensure strict initialization order
    • Prevents race conditions
    • Thread-safe operation queuing
  • #26 34806bb Thanks @mimshins! - Feat: Add no-operation storage adapter that discards all events.

@tapsioss/ripple-node@0.8.0

09 Feb 12:12
f773c3d

Choose a tag to compare

Minor Changes

  • #24 f54bb12 Thanks @mimshins! - BREAKING CHANGE: Fix critical event duplication bug by moving queue limit logic to dispatcher

    • Fix: Storage adapters no longer merge events, eliminating exponential duplication bug
    • Refactor: maxBufferSize moved from storage adapter configs to client/dispatcher config
    • Refactor: Storage adapters now simply save what they're given (no merge, no limit logic)
    • Feat: Dispatcher applies FIFO eviction before saving to storage
    • Impact: High-throughput offline scenarios now have linear I/O instead of exponential growth
    • Migration: Remove maxBufferSize from storage adapter constructors and add it to client config instead

Patch Changes

  • #24 f54bb12 Thanks @mimshins! - - Fix: Apply maxBufferSize limit during restore from storage to prevent silent event loss

    • Fix: Preserve original error type in IndexedDB adapter for proper QuotaExceededError retry handling
    • Feat: Add runtime validation warning when maxBufferSize < maxBatchSize
    • Test: Add comprehensive storage quota error handling test coverage
  • #24 f54bb12 Thanks @mimshins! - Fix: Add comprehensive error handling for storage operations.

    • Wrap all storage adapter operations (save(), load(), clear()) in try-catch blocks
    • Log storage errors via logger adapter instead of throwing unhandled rejections
    • Handle errors during enqueue, flush, restore, and retry operations
    • Support both Error objects and non-Error values in error logging
    • Prevent application crashes from storage failures (QuotaExceededError, SecurityError, etc.)

@tapsioss/ripple-browser@0.8.0

09 Feb 12:12
f773c3d

Choose a tag to compare

Minor Changes

  • #24 f54bb12 Thanks @mimshins! - BREAKING CHANGE: Fix critical event duplication bug by moving queue limit logic to dispatcher

    • Fix: Storage adapters no longer merge events, eliminating exponential duplication bug
    • Refactor: maxBufferSize moved from storage adapter configs to client/dispatcher config
    • Refactor: Storage adapters now simply save what they're given (no merge, no limit logic)
    • Feat: Dispatcher applies FIFO eviction before saving to storage
    • Impact: High-throughput offline scenarios now have linear I/O instead of exponential growth
    • Migration: Remove maxBufferSize from storage adapter constructors and add it to client config instead
  • #24 f54bb12 Thanks @mimshins! - - Feat: Add static isAvailable() method to all storage adapters for detecting storage availability before instantiation.

    • Fix: Implement atomic read-write transactions in IndexedDBAdapter to prevent race conditions across tabs.
    • Fix: Add connection lifecycle handlers (onclose, onversionchange) to IndexedDBAdapter for automatic reconnection.
    • Fix: Support graceful degradation when storage is unavailable (private browsing, disabled storage, quota exceeded).

Patch Changes

  • #24 f54bb12 Thanks @mimshins! - - Fix: Apply maxBufferSize limit during restore from storage to prevent silent event loss

    • Fix: Preserve original error type in IndexedDB adapter for proper QuotaExceededError retry handling
    • Feat: Add runtime validation warning when maxBufferSize < maxBatchSize
    • Test: Add comprehensive storage quota error handling test coverage
  • #24 f54bb12 Thanks @mimshins! - Fix: update schema version of IndexedDB due to the schema changes.

  • #24 f54bb12 Thanks @mimshins! - Fix: Add comprehensive error handling for storage operations.

    • Wrap all storage adapter operations (save(), load(), clear()) in try-catch blocks
    • Log storage errors via logger adapter instead of throwing unhandled rejections
    • Handle errors during enqueue, flush, restore, and retry operations
    • Support both Error objects and non-Error values in error logging
    • Prevent application crashes from storage failures (QuotaExceededError, SecurityError, etc.)
  • #24 f54bb12 Thanks @mimshins! - Fix: the IndexedDB connection is now opened once and reused for all subsequent operations.

@tapsioss/ripple-node@0.7.0

08 Feb 13:58
4032b54

Choose a tag to compare

Minor Changes

  • #23 7bd9101 Thanks @mimshins! - Refactor!: update HttpResponse interface to remove ok field from it.

@tapsioss/ripple-browser@0.7.0

08 Feb 13:58
4032b54

Choose a tag to compare

Minor Changes

  • #20 333cd0c Thanks @mimshins! - Feat: add persistedQueueLimit property to adapters.

  • #23 7bd9101 Thanks @mimshins! - Refactor!: update HttpResponse interface to remove ok field from it.

  • #22 ca157cb Thanks @mimshins! - Refactor!: update browser runtime prebuilt adapters to accept config object instead of separate params.