wse-client 2.3.1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +15 -10
  2. package/dist/constants.d.ts +1 -1
  3. package/dist/constants.d.ts.map +1 -1
  4. package/dist/constants.js +1 -1
  5. package/dist/constants.js.map +1 -1
  6. package/dist/examples/ChatHandlers.d.ts.map +1 -1
  7. package/dist/examples/ChatHandlers.js.map +1 -1
  8. package/dist/examples/IoTHandlers.d.ts.map +1 -1
  9. package/dist/examples/IoTHandlers.js.map +1 -1
  10. package/dist/handlers/EventHandlers.d.ts.map +1 -1
  11. package/dist/handlers/EventHandlers.js.map +1 -1
  12. package/dist/handlers/index.d.ts.map +1 -1
  13. package/dist/handlers/index.js.map +1 -1
  14. package/dist/hooks/useWSE.d.ts +6 -0
  15. package/dist/hooks/useWSE.d.ts.map +1 -1
  16. package/dist/hooks/useWSE.js +64 -30
  17. package/dist/hooks/useWSE.js.map +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/protocols/compression.d.ts.map +1 -1
  23. package/dist/protocols/compression.js.map +1 -1
  24. package/dist/protocols/transformer.d.ts.map +1 -1
  25. package/dist/protocols/transformer.js.map +1 -1
  26. package/dist/services/AdaptiveQualityManager.d.ts.map +1 -1
  27. package/dist/services/AdaptiveQualityManager.js.map +1 -1
  28. package/dist/services/ConnectionManager.d.ts +7 -0
  29. package/dist/services/ConnectionManager.d.ts.map +1 -1
  30. package/dist/services/ConnectionManager.js +56 -20
  31. package/dist/services/ConnectionManager.js.map +1 -1
  32. package/dist/services/ConnectionPool.d.ts +0 -1
  33. package/dist/services/ConnectionPool.d.ts.map +1 -1
  34. package/dist/services/ConnectionPool.js +0 -2
  35. package/dist/services/ConnectionPool.js.map +1 -1
  36. package/dist/services/EventSequencer.d.ts +18 -9
  37. package/dist/services/EventSequencer.d.ts.map +1 -1
  38. package/dist/services/EventSequencer.js +38 -57
  39. package/dist/services/EventSequencer.js.map +1 -1
  40. package/dist/services/MessageProcessor.d.ts +3 -0
  41. package/dist/services/MessageProcessor.d.ts.map +1 -1
  42. package/dist/services/MessageProcessor.js +57 -15
  43. package/dist/services/MessageProcessor.js.map +1 -1
  44. package/dist/services/NetworkMonitor.d.ts +0 -7
  45. package/dist/services/NetworkMonitor.d.ts.map +1 -1
  46. package/dist/services/NetworkMonitor.js +33 -40
  47. package/dist/services/NetworkMonitor.js.map +1 -1
  48. package/dist/services/OfflineQueue.d.ts.map +1 -1
  49. package/dist/services/OfflineQueue.js.map +1 -1
  50. package/dist/services/RateLimiter.d.ts.map +1 -1
  51. package/dist/services/RateLimiter.js.map +1 -1
  52. package/dist/stores/useMessageQueueStore.d.ts.map +1 -1
  53. package/dist/stores/useMessageQueueStore.js.map +1 -1
  54. package/dist/stores/useWSEStore.d.ts.map +1 -1
  55. package/dist/stores/useWSEStore.js.map +1 -1
  56. package/dist/types.d.ts +3 -3
  57. package/dist/types.d.ts.map +1 -1
  58. package/dist/types.js.map +1 -1
  59. package/dist/utils/circuitBreaker.d.ts.map +1 -1
  60. package/dist/utils/circuitBreaker.js.map +1 -1
  61. package/dist/utils/logger.d.ts.map +1 -1
  62. package/dist/utils/logger.js.map +1 -1
  63. package/dist/utils/security.d.ts +10 -2
  64. package/dist/utils/security.d.ts.map +1 -1
  65. package/dist/utils/security.js +38 -7
  66. package/dist/utils/security.js.map +1 -1
  67. package/package.json +3 -3
package/README.md CHANGED
@@ -39,7 +39,7 @@ High-performance WebSocket server built in Rust with native clustering, E2E encr
39
39
  |---------|---------|
40
40
  | **Key exchange** | ECDH P-256 (per-connection keypair, automatic during handshake) |
41
41
  | **Encryption** | AES-GCM-256 with unique 12-byte IV per message |
42
- | **Key derivation** | HKDF-SHA256 (salt: `wse-encryption`, info: `aes-gcm-key`) |
42
+ | **Key derivation** | HKDF-SHA256 (no salt, info: `wse-encryption/aes-gcm-key`) |
43
43
  | **Wire format** | `E:` prefix + 12-byte IV + AES-GCM ciphertext + 16-byte auth tag |
44
44
  | **Key rotation** | Configurable rotation interval (default 1 hour), automatic renegotiation |
45
45
  | **Replay prevention** | Nonce cache (10K entries, 5-minute TTL) on the client side |
@@ -81,6 +81,7 @@ High-performance WebSocket server built in Rust with native clustering, E2E encr
81
81
  | **Memory management** | Global budget (default 256 MB), TTL eviction, LRU eviction when over budget |
82
82
  | **Zero-copy storage** | Recovery entries share `Bytes` (Arc) with the broadcast path |
83
83
  | **Recovery on reconnect** | `subscribe_with_recovery()` replays missed messages automatically |
84
+ | **Per-message stamp** | When recovery is enabled, every topic broadcast carries `tp`/`e`/`o` (topic, epoch, offset) so clients dedup idempotently and detect gaps from the messages themselves |
84
85
 
85
86
  ### Client SDKs (Python + TypeScript/React)
86
87
 
@@ -91,8 +92,8 @@ High-performance WebSocket server built in Rust with native clustering, E2E encr
91
92
  | **Circuit breaker** | CLOSED/OPEN/HALF_OPEN state machine, prevents connection storms |
92
93
  | **Rate limiting** | Client-side token bucket, coordinates with server feedback |
93
94
  | **E2E encryption** | Wire-compatible AES-GCM-256 + ECDH P-256 (both clients speak the same protocol) |
94
- | **Event sequencing** | Duplicate detection (sliding window) + out-of-order buffering |
95
- | **Network monitor** | Real-time latency, jitter, packet loss measurement, quality scoring |
95
+ | **Event sequencing** | Duplicate detection (sliding window) + per-topic `(epoch, offset)` idempotent dedup with automatic gap recovery |
96
+ | **Network monitor** | Real-time latency, jitter, and connection-quality scoring (Python client also estimates packet loss) |
96
97
  | **Priority queues** | 5 levels from CRITICAL to BACKGROUND |
97
98
  | **Offline queue** | IndexedDB persistence (TypeScript), replayed on reconnect |
98
99
  | **Compression** | Automatic zlib for messages above threshold |
@@ -105,8 +106,11 @@ High-performance WebSocket server built in Rust with native clustering, E2E encr
105
106
  |---------|---------|
106
107
  | **Origin validation** | Configure in reverse proxy (nginx/Caddy) to prevent CSWSH |
107
108
  | **Cookie auth** | `access_token` HTTP-only cookie with `Secure + SameSite=Lax` (OWASP recommended for browsers) |
108
- | **Frame protection** | 1 MB max frame size, serde_json parsing (no eval), escaped user IDs in server_ready |
109
+ | **Frame protection** | 1 MB max frame size, serde_json parsing (no eval), escaped user IDs in server_ready; inbound msgpack rejected beyond 64 nesting levels |
109
110
  | **Cluster frame protection** | zstd decompression output capped at 1 MB (MAX_FRAME_SIZE), protocol version validation |
111
+ | **Slowloris protection** | At most 512 concurrent pre-handshake connections; sockets that never complete the WS upgrade are bounded and dropped |
112
+ | **Bounded callback dispatch** | Callback mode caps in-flight `on_message` callbacks at 256 per connection; excess inbound work is shed and counted as rate-limited |
113
+ | **Fail-closed recovery ACL** | Recovery replay applies the connection's topic ACL — unauthorized topics are never replayed or position-probed |
110
114
 
111
115
  ---
112
116
 
@@ -185,6 +189,7 @@ token = rust_jwt_encode(
185
189
  | `presence_max_data_size` | 4096 | Max bytes for a user's presence metadata |
186
190
  | `presence_max_members` | 0 | Max tracked members per topic (0 = unlimited) |
187
191
  | `max_outbound_queue_bytes` | 16777216 | Per-connection outbound buffer limit (bytes, default 16 MB). Messages dropped when exceeded |
192
+ | `max_subscriptions_per_connection` | 0 | Max topics per connection (0 = unlimited). Prevents topic explosion DoS |
188
193
  | `rate_limit_capacity` | 100000.0 | Token bucket capacity per connection |
189
194
  | `rate_limit_refill` | 10000.0 | Token bucket refill rate per second |
190
195
  | `max_message_size` | 1048576 | Maximum WebSocket frame size in bytes (default 1 MB) |
@@ -317,10 +322,10 @@ result = server.subscribe_with_recovery(
317
322
  epoch=client_epoch, # From previous session
318
323
  offset=client_offset, # From previous session
319
324
  )
320
- # {"topics": {"prices": {"epoch": 123, "offset": 456, "recovered": True, "count": 12}}}
325
+ # {"topics": {"prices": {"epoch": "0000007b", "offset": 456, "recovered": True, "count": 12}}}
321
326
  ```
322
327
 
323
- The server maintains per-topic ring buffers (power-of-2 capacity, bitmask indexing). Clients store the `epoch` and `offset` from their last received message. On reconnect, the server replays missed messages from the ring buffer. If the gap is too large or the epoch has changed, the client receives a `NotRecovered` status and should re-subscribe from scratch.
328
+ The server maintains per-topic ring buffers (power-of-2 capacity, bitmask indexing). When recovery is enabled, every topic broadcast is stamped with `tp`/`e`/`o` (topic, epoch, offset) fields, so clients track their per-topic position from the messages themselves, drop duplicates idempotently by `(epoch, offset)`, and automatically request recovery when they detect an offset gap. On reconnect, the server replays missed messages from the ring buffer. If the gap is too large or the epoch has changed, the client receives a `NotRecovered` status and should re-subscribe from scratch.
324
329
 
325
330
  Memory is managed with a global budget (default 256 MB), TTL eviction for idle buffers, and LRU eviction when over budget.
326
331
 
@@ -501,7 +506,7 @@ def handle(event):
501
506
  client.run_forever()
502
507
  ```
503
508
 
504
- Key features: 4 reconnect strategies (exponential, linear, fibonacci, adaptive), connection pool with health scoring and 3 load balancing strategies, circuit breaker, token bucket rate limiter, event sequencer with dedup and reorder buffering, network quality monitoring (latency/jitter/packet loss).
509
+ Key features: 4 reconnect strategies (exponential, linear, fibonacci, adaptive), connection pool with health scoring and 3 load balancing strategies, circuit breaker, token bucket rate limiter, event sequencer with id dedup plus per-topic `(epoch, offset)` idempotent dedup and gap recovery, network quality monitoring (latency/jitter/packet loss).
505
510
 
506
511
  See [python-client/](python-client/) for full source and examples.
507
512
 
@@ -529,7 +534,7 @@ function App() {
529
534
 
530
535
  Key features: offline queue with IndexedDB persistence, adaptive quality management, connection pool with health scoring, E2E encryption (Web Crypto API), message batching, 5 priority levels, Zustand store for external state access.
531
536
 
532
- See [client/](client/) for full source and examples.
537
+ See [ts-client/](ts-client/) for full source and examples.
533
538
 
534
539
  ---
535
540
 
@@ -546,7 +551,7 @@ Benchmarked on AMD EPYC 7502P (32 cores / 64 threads, 128 GB RAM), Ubuntu 24.04.
546
551
 
547
552
  Sub-millisecond latency. Median 0.38ms with JWT authentication. Connection handshake: 0.53ms median (Rust JWT path).
548
553
 
549
- Detailed results: [Benchmarks](docs/BENCHMARKS.md) | [Fan-out](docs/BENCHMARKS_FANOUT.md) | [Rust Client](docs/BENCHMARKS_RUST_CLIENT.md) | [Python Client](docs/BENCHMARKS_PYTHON_CLIENT.md) | [TypeScript Client](docs/BENCHMARKS_TS_CLIENT.md)
554
+ Detailed results: [Benchmarks](docs/BENCHMARKS.md) | [Fan-out](docs/BENCHMARKS_FANOUT.md) | [Rust Client](docs/BENCHMARKS_RUST_CLIENT.md) | [Python Client](docs/BENCHMARKS_PYTHON_CLIENT.md) | [TS Client](docs/BENCHMARKS_TS_CLIENT.md)
550
555
 
551
556
  ---
552
557
 
@@ -572,7 +577,7 @@ Working examples in the [`examples/`](examples/) directory:
572
577
  - [Rust Utilities](docs/RUST_UTILITIES.md) - priority queues, rate limiters, sequencing, compression, crypto, JWT
573
578
  - [Security](docs/SECURITY.md) - JWT, encryption, mTLS, rate limiting, circuit breaker
574
579
  - [Deployment](docs/DEPLOYMENT.md) - production setup, Docker, Kubernetes, cluster configuration
575
- - [Migration Guide](docs/MIGRATION.md) - upgrading from v1.x to v2.0
580
+ - [Migration Guide](docs/MIGRATION.md) - upgrading from v1.x to v2.x
576
581
  - [Contributing](CONTRIBUTING.md) - development setup and coding standards
577
582
  - [Changelog](CHANGELOG.md) - version history
578
583
 
@@ -1,5 +1,5 @@
1
1
  export declare const WS_PROTOCOL_VERSION = 1;
2
- export declare const WS_CLIENT_VERSION = "2.3.1";
2
+ export declare const WS_CLIENT_VERSION = "2.4.0";
3
3
  export declare const HEARTBEAT_INTERVAL = 15000;
4
4
  export declare const IDLE_TIMEOUT = 40000;
5
5
  export declare const CONNECTION_TIMEOUT = 10000;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../client/constants.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,iBAAiB,UAAU,CAAC;AAMzC,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,YAAY,QAAQ,CAAC;AAClC,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAC3C,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAMtC,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AACzC,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAMrC,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAC7C,eAAO,MAAM,iCAAiC,IAAI,CAAC;AAMnD,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,eAAO,MAAM,aAAa,MAAM,CAAC;AAMjC,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAMnC,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,eAAO,MAAM,0BAA0B,IAAM,CAAC;AAM9C,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAC1C,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAM1C,eAAO,MAAM,kBAAkB,SAAS,CAAC;AACzC,eAAO,MAAM,wBAAwB,sBAAuC,CAAC;AAC7E,eAAO,MAAM,qBAAqB,kBAAmC,CAAC;AACtE,eAAO,MAAM,mBAAmB,gBAAiC,CAAC;AAClE,eAAO,MAAM,uBAAuB,oBAAqC,CAAC;AAO1E,eAAO,MAAM,cAAc,EAAE,MAAM,EAElC,CAAC;AAMF,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAMX,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAMX,eAAO,MAAM,QAAQ;;;;;;;;;;;CAWX,CAAC;AAQX,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,CAAC;AAMxE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;CAiBd,CAAC;AAMX,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;CAgBzB,CAAC;AAMX;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CA0CvC;AAED,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAOhD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAMxD;AAED,wBAAgB,eAAe,IAAI,IAAI,CAQtC;AAMD,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,KAAG,OAElD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,OAG/C,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,MAAM,WAAW,KAAG,OAGvD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM,WAAW,KAAG,OAGpD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,MAAM,WAAW,KAAG,OAGtD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMF,wBAwCE"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../ts-client/constants.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,iBAAiB,UAAU,CAAC;AAMzC,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,YAAY,QAAQ,CAAC;AAClC,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAC3C,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAMtC,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AACzC,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAMrC,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAC7C,eAAO,MAAM,iCAAiC,IAAI,CAAC;AAMnD,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,eAAO,MAAM,aAAa,MAAM,CAAC;AAMjC,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAMnC,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAC1C,eAAO,MAAM,0BAA0B,IAAM,CAAC;AAM9C,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAC1C,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAM1C,eAAO,MAAM,kBAAkB,SAAS,CAAC;AACzC,eAAO,MAAM,wBAAwB,sBAAuC,CAAC;AAC7E,eAAO,MAAM,qBAAqB,kBAAmC,CAAC;AACtE,eAAO,MAAM,mBAAmB,gBAAiC,CAAC;AAClE,eAAO,MAAM,uBAAuB,oBAAqC,CAAC;AAO1E,eAAO,MAAM,cAAc,EAAE,MAAM,EAElC,CAAC;AAMF,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAMX,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAMX,eAAO,MAAM,QAAQ;;;;;;;;;;;CAWX,CAAC;AAQX,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,CAAC;AAMxE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;CAiBd,CAAC;AAMX,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;CAgBzB,CAAC;AAMX;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CA0CvC;AAED,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAOhD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAMxD;AAED,wBAAgB,eAAe,IAAI,IAAI,CAQtC;AAMD,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,KAAG,OAElD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,OAG/C,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,MAAM,WAAW,KAAG,OAGvD,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM,WAAW,KAAG,OAGpD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,MAAM,WAAW,KAAG,OAGtD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMF,wBAwCE"}
package/dist/constants.js CHANGED
@@ -5,7 +5,7 @@
5
5
  // Protocol Constants
6
6
  // ---------------------------------------------------------------------------
7
7
  export const WS_PROTOCOL_VERSION = 1;
8
- export const WS_CLIENT_VERSION = '2.3.1';
8
+ export const WS_CLIENT_VERSION = '2.4.0';
9
9
  // ---------------------------------------------------------------------------
10
10
  // Connection Constants
11
11
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../client/constants.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+BAA+B;AAC/B,gFAAgF;AAEhF,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAEzC,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,aAAa;AACtD,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,aAAa;AAChD,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,aAAa;AACtD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC,CAAC,aAAa;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,aAAa;AAEpD,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,CAAC,WAAW;AACrD,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC,CAAC,aAAa;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAErC,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAC3C,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC,CAAC,WAAW;AACzD,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,CAAC;AAEnD,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAC3C,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAC3C,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAC;AAC7B,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,eAAe;AAEjD,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,CAAC,MAAM;AACjD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,CAAC,uCAAuC;AAE3E,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACxC,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC,CAAC,oBAAoB;AAC/D,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC,CAAC,UAAU;AAEzD,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAC1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AACzC,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,kBAAkB,eAAe,CAAC;AAC7E,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,kBAAkB,WAAW,CAAC;AACtE,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,kBAAkB,SAAS,CAAC;AAClE,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,kBAAkB,aAAa,CAAC;AAE1E,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,mEAAmE;AACnE,MAAM,CAAC,MAAM,cAAc,GAAa;IACpC,eAAe;CAClB,CAAC;AAEF,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,IAAI;CACT,CAAC;AAEX,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,gBAAgB,EAAE,OAAO,EAAE,MAAM;IACjC,gBAAgB,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;IAC3C,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,EAAE;CACf,CAAC;AAEX,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,QAAQ,GAAG;IACpB,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,KAAK,EAAE,kCAAkC;IACrD,QAAQ,EAAE,IAAI;IACd,cAAc,EAAE,IAAI;IACpB,eAAe,EAAE,IAAI;IACrB,aAAa,EAAE,IAAI;IACnB,eAAe,EAAE,KAAK;IACtB,aAAa,EAAE,IAAI;IACnB,YAAY,EAAE,IAAI;IAClB,OAAO,EAAE,IAAI;CACP,CAAC;AAEX,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,4CAA4C;AAC5C,kEAAkE;AAClE,MAAM,CAAC,MAAM,6BAA6B,GAA2B,EAAE,CAAC;AAExE,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,2BAA2B;IAC3B,cAAc,EAAE,IAAI;IACpB,UAAU,EAAE,IAAI;IAChB,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,IAAI;IACtB,gBAAgB,EAAE,IAAI;IACtB,eAAe,EAAE,IAAI;IACrB,YAAY,EAAE,IAAI;IAElB,uCAAuC;IACvC,WAAW,EAAE,IAAI;IACjB,YAAY,EAAE,IAAI;IAClB,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,IAAI;IACzB,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,IAAI;CACf,CAAC;AAEX,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,sBAAsB,GAAG;IAClC,OAAO,EAAE;QACL,SAAS,EAAE,EAAE;QACb,IAAI,EAAE,GAAG;QACT,IAAI,EAAE,GAAG;KACZ;IACD,MAAM,EAAE;QACJ,SAAS,EAAE,EAAE;QACb,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,GAAG;KACZ;IACD,WAAW,EAAE;QACT,SAAS,EAAE,GAAG;QACd,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;KACV;CACK,CAAC;AAEX,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,YAAY;IACxB,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAE7C,6DAA6D;IAC7D,IAAI,CAAC;QACD,YAAY,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACL,wBAAwB;IAC5B,CAAC;IAED,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,2CAA2C;IAC3C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClC,SAAS,CAAC,IAAI,CAAC,GAAG,QAAQ,MAAM,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,yEAAyE;IACzE,MAAM,mBAAmB,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;QACjD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9B,qDAAqD;YACrD,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;gBAC9C,OAAO,GAAG,QAAQ,MAAM,CAAC;YAC7B,CAAC;YACD,OAAO,QAAQ,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACL,gCAAgC;YAChC,OAAO,QAAQ,CAAC;QACpB,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAEjE,uEAAuE;IACvE,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9E,OAAO,cAAc,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,qBAAqB;IACjC,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,cAAc,CAAC;IAC1B,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAgB;IAC9C,IAAI,CAAC;QACD,YAAY,CAAC,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACL,wBAAwB;IAC5B,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe;IAC3B,IAAI,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;aACpB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;aACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACL,wBAAwB;IAC5B,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAW,EAAE;IACzD,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAW,EAAE;IACtD,OAAO,IAAI,IAAI,6BAA6B;QACxC,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAiB,EAAW,EAAE;IAC9D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO;AACxE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAiB,EAAW,EAAE;IAC3D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO;AACxE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAiB,EAAW,EAAE;IAC7D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO;AACxE,CAAC,CAAC;AAEF,8EAA8E;AAC9E,wCAAwC;AACxC,8EAA8E;AAE9E,eAAe;IACX,mBAAmB;IACnB,iBAAiB;IACjB,kBAAkB;IAClB,YAAY;IACZ,kBAAkB;IAClB,qBAAqB;IACrB,gBAAgB;IAChB,oBAAoB;IACpB,mBAAmB;IACnB,sBAAsB;IACtB,gBAAgB;IAChB,gBAAgB;IAChB,yBAAyB;IACzB,uBAAuB;IACvB,iCAAiC;IACjC,sBAAsB;IACtB,sBAAsB;IACtB,UAAU;IACV,aAAa;IACb,qBAAqB;IACrB,iBAAiB;IACjB,mBAAmB;IACnB,sBAAsB;IACtB,0BAA0B;IAC1B,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,kBAAkB;IAClB,wBAAwB;IACxB,qBAAqB;IACrB,mBAAmB;IACnB,uBAAuB;IACvB,cAAc;IACd,6BAA6B;IAC7B,WAAW;IACX,eAAe;IACf,sBAAsB;IACtB,aAAa;IACb,QAAQ;CACX,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../ts-client/constants.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatHandlers.d.ts","sourceRoot":"","sources":["../../client/examples/ChatHandlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,oBAAoB,SAcnC"}
1
+ {"version":3,"file":"ChatHandlers.d.ts","sourceRoot":"","sources":["../../ts-client/examples/ChatHandlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,oBAAoB,SAcnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatHandlers.js","sourceRoot":"","sources":["../../client/examples/ChatHandlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,UAAU,oBAAoB;IAClC,oCAAoC;IACpC,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,CAA2B,EAAE,EAAE;QACvE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACtC,4BAA4B;IAC9B,CAAC,CAAkB,CAAC,CAAC;IAErB,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAqD,EAAE,EAAE;QACjG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC,CAAkB,CAAC,CAAC;IAErB,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAkD,EAAE,EAAE;QACjG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAkB,CAAC,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"ChatHandlers.js","sourceRoot":"","sources":["../../ts-client/examples/ChatHandlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,UAAU,oBAAoB;IAClC,oCAAoC;IACpC,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,CAA2B,EAAE,EAAE;QACvE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACtC,4BAA4B;IAC9B,CAAC,CAAkB,CAAC,CAAC;IAErB,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAqD,EAAE,EAAE;QACjG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC,CAAkB,CAAC,CAAC;IAErB,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAkD,EAAE,EAAE;QACjG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAkB,CAAC,CAAC;AACvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"IoTHandlers.d.ts","sourceRoot":"","sources":["../../client/examples/IoTHandlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,SAYlC"}
1
+ {"version":3,"file":"IoTHandlers.d.ts","sourceRoot":"","sources":["../../ts-client/examples/IoTHandlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,SAYlC"}
@@ -1 +1 @@
1
- {"version":3,"file":"IoTHandlers.js","sourceRoot":"","sources":["../../client/examples/IoTHandlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,MAAM,UAAU,mBAAmB;IACjC,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAA6B,EAAE,EAAE;QAC3E,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7E,CAAC,CAAkB,CAAC,CAAC;IAErB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAuE,EAAE,EAAE;QAC5G,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC,CAAkB,CAAC,CAAC;IAErB,MAAM,CAAC,gBAAgB,CAAC,eAAe,EAAE,CAAC,CAAC,CAAqD,EAAE,EAAE;QAClG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACnF,CAAC,CAAkB,CAAC,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"IoTHandlers.js","sourceRoot":"","sources":["../../ts-client/examples/IoTHandlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,MAAM,UAAU,mBAAmB;IACjC,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAA6B,EAAE,EAAE;QAC3E,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7E,CAAC,CAAkB,CAAC,CAAC;IAErB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAuE,EAAE,EAAE;QAC5G,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC,CAAkB,CAAC,CAAC;IAErB,MAAM,CAAC,gBAAgB,CAAC,eAAe,EAAE,CAAC,CAAC,CAAqD,EAAE,EAAE;QAClG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACnF,CAAC,CAAkB,CAAC,CAAC;AACvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"EventHandlers.d.ts","sourceRoot":"","sources":["../../client/handlers/EventHandlers.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,qBAAa,aAAa;IACxB;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,gBAAgB,EAAE;QACnC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;QACzE,qBAAqB,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;KACxC,GAAG,IAAI;CAGT;AAED,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"EventHandlers.d.ts","sourceRoot":"","sources":["../../ts-client/handlers/EventHandlers.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,qBAAa,aAAa;IACxB;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,gBAAgB,EAAE;QACnC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;QACzE,qBAAqB,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;KACxC,GAAG,IAAI;CAGT;AAED,eAAe,aAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"EventHandlers.js","sourceRoot":"","sources":["../../client/handlers/EventHandlers.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,4CAA4C;AAC5C,gFAAgF;AAEhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACxB;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,gBAGlB;QACC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IACxC,CAAC;CACF;AAED,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"EventHandlers.js","sourceRoot":"","sources":["../../ts-client/handlers/EventHandlers.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,4CAA4C;AAC5C,gFAAgF;AAEhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;GAIG;AACH,MAAM,OAAO,aAAa;IACxB;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,gBAGlB;QACC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IACxC,CAAC;CACF;AAED,eAAe,aAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../client/handlers/index.ts"],"names":[],"mappings":"AAkBA;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,gBAAgB,EAAE;IACpD,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;IACrE,qBAAqB,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;CACxC,GAAG,IAAI,CAaP"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts-client/handlers/index.ts"],"names":[],"mappings":"AAkBA;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,gBAAgB,EAAE;IACpD,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;IACrE,qBAAqB,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;CACxC,GAAG,IAAI,CAaP"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../client/handlers/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,4CAA4C;AAC5C,gFAAgF;AAChF,EAAE;AACF,mFAAmF;AACnF,mEAAmE;AACnE,EAAE;AACF,sCAAsC;AACtC,EAAE;AACF,6EAA6E;AAC7E,EAAE;AACF,+DAA+D;AAC/D,+DAA+D;AAC/D,oEAAoE;AACpE,MAAM;AAEN,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,gBAGnC;IACC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAElD,kDAAkD;IAClD,8DAA8D;IAC9D,4CAA4C;IAE5C,MAAM,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IAErF,IAAI,gBAAgB,CAAC,qBAAqB,EAAE,CAAC;QAC3C,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,qBAAqB,EAAE,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts-client/handlers/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,4CAA4C;AAC5C,gFAAgF;AAChF,EAAE;AACF,mFAAmF;AACnF,mEAAmE;AACnE,EAAE;AACF,sCAAsC;AACtC,EAAE;AACF,6EAA6E;AAC7E,EAAE;AACF,+DAA+D;AAC/D,+DAA+D;AAC/D,oEAAoE;AACpE,MAAM;AAEN,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,gBAGnC;IACC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAElD,kDAAkD;IAClD,8DAA8D;IAC9D,4CAA4C;IAE5C,MAAM,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IAErF,IAAI,gBAAgB,CAAC,qBAAqB,EAAE,CAAC;QAC3C,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,qBAAqB,EAAE,CAAC;QACpE,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC"}
@@ -37,6 +37,12 @@ export interface UseWSEConfig extends Partial<WSEConfig> {
37
37
  registerHandler: (type: string, handler: (msg: any) => void) => void;
38
38
  getRegisteredHandlers?: () => string[];
39
39
  }) => void;
40
+ /**
41
+ * Throttle interval in ms for non-system events (default: 0 = disabled).
42
+ * When set, events of the same type arriving faster than this interval
43
+ * are silently dropped before reaching handlers.
44
+ */
45
+ eventThrottleMs?: number;
40
46
  }
41
47
  export declare function useWSE(token?: string, initialTopics?: string[], config?: UseWSEConfig): UseWSEReturn;
42
48
  //# sourceMappingURL=useWSE.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useWSE.d.ts","sourceRoot":"","sources":["../../client/hooks/useWSE.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,YAAY,EACZ,SAAS,EAMV,MAAM,UAAU,CAAC;AAqIlB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,wBAAwB,CAAC,EAAE,MAAM,CAAC;KACnC;CACF;AAiED;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,OAAO,CAAC,SAAS,CAAC;IACtD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvC;;;;OAIG;IACH,WAAW,CAAC,EAAE;QACZ,iBAAiB,EAAE,CAAC,OAAO,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;SAAE,KAAK,IAAI,CAAC;QACvE,iBAAiB,EAAE,MAAM,IAAI,CAAC;KAC/B,GAAG,IAAI,CAAC;IAET;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE5B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,gBAAgB,EAAE;QACpC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;QACrE,qBAAqB,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;KACxC,KAAK,IAAI,CAAC;CACZ;AAED,wBAAgB,MAAM,CACpB,KAAK,CAAC,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,EAAE,EACxB,MAAM,CAAC,EAAE,YAAY,GACpB,YAAY,CA0sCd"}
1
+ {"version":3,"file":"useWSE.d.ts","sourceRoot":"","sources":["../../ts-client/hooks/useWSE.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,YAAY,EACZ,SAAS,EAMV,MAAM,UAAU,CAAC;AAoIlB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,wBAAwB,CAAC,EAAE,MAAM,CAAC;KACnC;CACF;AAiED;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,OAAO,CAAC,SAAS,CAAC;IACtD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvC;;;;OAIG;IACH,WAAW,CAAC,EAAE;QACZ,iBAAiB,EAAE,CAAC,OAAO,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;SAAE,KAAK,IAAI,CAAC;QACvE,iBAAiB,EAAE,MAAM,IAAI,CAAC;KAC/B,GAAG,IAAI,CAAC;IAET;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE5B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,gBAAgB,EAAE;QACpC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;QACrE,qBAAqB,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;KACxC,KAAK,IAAI,CAAC;IAEX;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,MAAM,CACpB,KAAK,CAAC,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,EAAE,EACxB,MAAM,CAAC,EAAE,YAAY,GACpB,YAAY,CAmvCd"}
@@ -53,8 +53,7 @@ let globalWSEInstance = null;
53
53
  let isGloballyConnecting = false;
54
54
  let lastConnectionAttemptTime = 0;
55
55
  const MIN_CONNECTION_INTERVAL = 500;
56
- // Circuit breaker check interval
57
- let circuitBreakerCheckInterval = null;
56
+ // Circuit breaker check interval (moved to per-instance ref inside hook)
58
57
  // Event deduplication at the module level
59
58
  const processedEvents = new Map();
60
59
  const EVENT_CACHE_TIME = 60 * 1000;
@@ -191,9 +190,11 @@ export function useWSE(token, initialTopics, config) {
191
190
  const initialSyncSentRef = useRef(false);
192
191
  // Track current token to detect changes
193
192
  const currentTokenRef = useRef(undefined);
193
+ // Per-instance circuit breaker interval (not module-level)
194
+ const circuitBreakerIntervalRef = useRef(null);
194
195
  // Add timestamp tracking for rate limiting
195
196
  const lastEventTimestampRef = useRef(new Map());
196
- const EVENT_THROTTLE_MS = 500;
197
+ const EVENT_THROTTLE_MS = config?.eventThrottleMs ?? 0;
197
198
  // Critical handlers from config (defaults to empty)
198
199
  const criticalHandlers = config?.criticalHandlers || [];
199
200
  // Memoize config with stable reference
@@ -225,11 +226,11 @@ export function useWSE(token, initialTopics, config) {
225
226
  // ---------------------------------------------------------------------------
226
227
  const startCircuitBreakerCheck = useCallback(() => {
227
228
  // Clear any existing interval so updated validToken closure is used
228
- if (circuitBreakerCheckInterval) {
229
- clearInterval(circuitBreakerCheckInterval);
230
- circuitBreakerCheckInterval = null;
229
+ if (circuitBreakerIntervalRef.current) {
230
+ clearInterval(circuitBreakerIntervalRef.current);
231
+ circuitBreakerIntervalRef.current = null;
231
232
  }
232
- circuitBreakerCheckInterval = setInterval(() => {
233
+ circuitBreakerIntervalRef.current = setInterval(() => {
233
234
  store.checkCircuitBreakerTimeout();
234
235
  if (store.canReconnect() && store.connectionState === ConnectionState.ERROR) {
235
236
  const manager = connectionManagerRef.current;
@@ -243,9 +244,9 @@ export function useWSE(token, initialTopics, config) {
243
244
  }, 5000);
244
245
  }, [store, validToken]);
245
246
  const stopCircuitBreakerCheck = useCallback(() => {
246
- if (circuitBreakerCheckInterval) {
247
- clearInterval(circuitBreakerCheckInterval);
248
- circuitBreakerCheckInterval = null;
247
+ if (circuitBreakerIntervalRef.current) {
248
+ clearInterval(circuitBreakerIntervalRef.current);
249
+ circuitBreakerIntervalRef.current = null;
249
250
  }
250
251
  }, []);
251
252
  // ---------------------------------------------------------------------------
@@ -436,8 +437,7 @@ export function useWSE(token, initialTopics, config) {
436
437
  // ---------------------------------------------------------------------------
437
438
  const handleIncomingMessage = useCallback((data) => {
438
439
  const processor = messageProcessorRef.current;
439
- const monitor = networkMonitorRef.current;
440
- if (!processor || !monitor)
440
+ if (!processor)
441
441
  return;
442
442
  try {
443
443
  let parsed;
@@ -483,24 +483,30 @@ export function useWSE(token, initialTopics, config) {
483
483
  return;
484
484
  }
485
485
  }
486
- // Age filtering
487
- if (parsed && parsed.ts) {
486
+ // Age filtering -- skipped for recovery-stamped messages (tp/e/o). A
487
+ // replayed message intentionally keeps its original (old) ts, so age-
488
+ // filtering it would silently break recovery; dedup and ordering for
489
+ // stamped messages is handled downstream by (epoch, offset).
490
+ if (parsed && parsed.ts && !(parsed.tp && parsed.e)) {
488
491
  const eventTime = new Date(parsed.ts).getTime();
489
492
  const now = Date.now();
490
493
  const age = now - eventTime;
491
494
  const eventType = parsed.t;
492
495
  const connectionTime = Date.now() - (window.__wseConnectionStartTime || Date.now());
493
496
  const isNewConnection = connectionTime < 5000;
497
+ // Critical handshake events are never age-filtered
498
+ const isHandshakeEvent = eventType === 'server_ready' || eventType === 'server_hello'
499
+ || eventType === 'error' || eventType === 'subscription_update';
494
500
  if (isNewConnection) {
495
- if (eventType && eventType.includes('snapshot')) {
496
- logger.debug(`Accepting ${eventType} snapshot during new connection`);
501
+ if (isHandshakeEvent || (eventType && eventType.includes('snapshot'))) {
502
+ logger.debug(`Accepting ${eventType} during new connection`);
497
503
  }
498
504
  else if (age > 1000) {
499
505
  logger.debug(`Rejecting old ${eventType} event during new connection (${Math.round(age / 1000)}s old)`);
500
506
  return;
501
507
  }
502
508
  }
503
- else {
509
+ else if (!isHandshakeEvent) {
504
510
  const maxAge = eventType && (eventType.includes('snapshot') ||
505
511
  eventType.includes('health_update') ||
506
512
  eventType.includes('connection_update')) ? 60000 : 5000;
@@ -510,17 +516,14 @@ export function useWSE(token, initialTopics, config) {
510
516
  }
511
517
  }
512
518
  }
513
- // Check event ID for deduplication
519
+ // Track event IDs for diagnostics (actual dedup is in MessageProcessor's
520
+ // EventSequencer -- filtering here would cause the sequencer to miss events)
514
521
  if (parsed && parsed.id) {
515
522
  if (processedEvents.size >= MAX_CACHED_EVENTS) {
516
523
  const oldestKey = processedEvents.keys().next().value;
517
524
  if (oldestKey)
518
525
  processedEvents.delete(oldestKey);
519
526
  }
520
- if (processedEvents.has(parsed.id)) {
521
- logger.debug(`Skipping globally duplicate event: ${parsed.id}`);
522
- return;
523
- }
524
527
  processedEvents.set(parsed.id, Date.now());
525
528
  }
526
529
  // Check event type throttling
@@ -551,14 +554,6 @@ export function useWSE(token, initialTopics, config) {
551
554
  catch (e) {
552
555
  logger.debug('Could not pre-parse message for deduplication:', e);
553
556
  }
554
- // Record metrics
555
- monitor.recordPacketReceived();
556
- if (data instanceof ArrayBuffer) {
557
- monitor.recordBytes(data.byteLength);
558
- }
559
- else {
560
- monitor.recordBytes(data.length);
561
- }
562
557
  // Process the message
563
558
  processor.processIncoming(data).catch(error => {
564
559
  logger.error('Failed to process incoming message:', error);
@@ -680,6 +675,34 @@ export function useWSE(token, initialTopics, config) {
680
675
  window.removeEventListener('subscriptionUpdate', handleSubscriptionUpdate);
681
676
  };
682
677
  }, []);
678
+ // Recover the missed range when MessageProcessor reports a per-topic offset
679
+ // gap (offset jumped ahead). Re-request the topic with recover=true from the
680
+ // last in-order position; the server replays last+1..head, which arrives in
681
+ // order and advances the position past the gap.
682
+ useEffect(() => {
683
+ const handleRecoveryGap = (event) => {
684
+ const topic = event.detail?.topic;
685
+ if (!topic)
686
+ return;
687
+ const subs = useWSEStore.getState().subscriptions;
688
+ if (!subs.serverRecoveryEnabled)
689
+ return;
690
+ const pos = subs.recoveryState[topic];
691
+ if (!pos)
692
+ return;
693
+ sendMessage('subscription_update', {
694
+ action: 'subscribe',
695
+ topics: [topic],
696
+ recover: true,
697
+ recovery: { [topic]: { epoch: pos.epoch, offset: pos.offset } },
698
+ }, { priority: MessagePriority.HIGH });
699
+ logger.info(`Recovery requested after gap on topic: ${topic}`);
700
+ };
701
+ window.addEventListener('wseRecoveryGap', handleRecoveryGap);
702
+ return () => {
703
+ window.removeEventListener('wseRecoveryGap', handleRecoveryGap);
704
+ };
705
+ }, [sendMessage]);
683
706
  // Handle snapshot request events
684
707
  useEffect(() => {
685
708
  const handleSnapshotRequest = (event) => {
@@ -762,6 +785,8 @@ export function useWSE(token, initialTopics, config) {
762
785
  networkMonitorRef.current = globalWSEInstance.networkMonitor;
763
786
  offlineQueueRef.current = globalWSEInstance.offlineQueue;
764
787
  initializedRef.current = true;
788
+ // Restart circuit breaker check (cleared on previous unmount)
789
+ startCircuitBreakerCheck();
765
790
  return;
766
791
  }
767
792
  const now = Date.now();
@@ -874,6 +899,10 @@ export function useWSE(token, initialTopics, config) {
874
899
  connectionManagerRef.current = connectionManager;
875
900
  networkMonitorRef.current = networkMonitor;
876
901
  offlineQueueRef.current = offlineQueue;
902
+ // Feed the monitor real round-trip latency from the single PONG-parsing
903
+ // site so its jitter/quality reflect the live connection (read via the
904
+ // ref so it survives monitor re-creation).
905
+ messageProcessor.setLatencyListener((l) => networkMonitorRef.current?.recordLatency(l));
877
906
  initializedRef.current = true;
878
907
  try {
879
908
  await offlineQueue.initialize();
@@ -983,6 +1012,11 @@ export function useWSE(token, initialTopics, config) {
983
1012
  };
984
1013
  return () => {
985
1014
  logger.info('useWSE effect cleanup triggered');
1015
+ // Always clean up per-instance intervals to prevent leaks
1016
+ if (circuitBreakerIntervalRef.current) {
1017
+ clearInterval(circuitBreakerIntervalRef.current);
1018
+ circuitBreakerIntervalRef.current = null;
1019
+ }
986
1020
  if (globalWSEInstance && globalWSEInstance.token === validToken) {
987
1021
  if (currentTokenRef.current !== validToken) {
988
1022
  logger.info('Token changing, destroying global instance immediately');