wse-server 2.2.0__tar.gz → 2.2.1__tar.gz

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 (29) hide show
  1. {wse_server-2.2.0 → wse_server-2.2.1}/PKG-INFO +10 -6
  2. {wse_server-2.2.0 → wse_server-2.2.1}/README.md +9 -5
  3. {wse_server-2.2.0 → wse_server-2.2.1}/pyproject.toml +1 -1
  4. {wse_server-2.2.0 → wse_server-2.2.1}/rust/Cargo.lock +249 -3
  5. {wse_server-2.2.0 → wse_server-2.2.1}/rust/Cargo.toml +2 -1
  6. wse_server-2.2.1/rust/src/jwt.rs +1225 -0
  7. {wse_server-2.2.0 → wse_server-2.2.1}/rust/src/wse/server.rs +111 -17
  8. {wse_server-2.2.0 → wse_server-2.2.1}/wse_server/__init__.py +1 -1
  9. {wse_server-2.2.0 → wse_server-2.2.1}/wse_server/_wse_accel.pyi +37 -3
  10. wse_server-2.2.0/rust/src/jwt.rs +0 -653
  11. {wse_server-2.2.0 → wse_server-2.2.1}/LICENSE +0 -0
  12. {wse_server-2.2.0 → wse_server-2.2.1}/rust/.cargo/config.toml +0 -0
  13. {wse_server-2.2.0 → wse_server-2.2.1}/rust/src/lib.rs +0 -0
  14. {wse_server-2.2.0 → wse_server-2.2.1}/rust/src/wse/cluster.rs +0 -0
  15. {wse_server-2.2.0 → wse_server-2.2.1}/rust/src/wse/compression.rs +0 -0
  16. {wse_server-2.2.0 → wse_server-2.2.1}/rust/src/wse/filters.rs +0 -0
  17. {wse_server-2.2.0 → wse_server-2.2.1}/rust/src/wse/mod.rs +0 -0
  18. {wse_server-2.2.0 → wse_server-2.2.1}/rust/src/wse/presence.rs +0 -0
  19. {wse_server-2.2.0 → wse_server-2.2.1}/rust/src/wse/queue.rs +0 -0
  20. {wse_server-2.2.0 → wse_server-2.2.1}/rust/src/wse/rate_limiter.rs +0 -0
  21. {wse_server-2.2.0 → wse_server-2.2.1}/rust/src/wse/recovery.rs +0 -0
  22. {wse_server-2.2.0 → wse_server-2.2.1}/rust/src/wse/reliability.rs +0 -0
  23. {wse_server-2.2.0 → wse_server-2.2.1}/rust/src/wse/security.rs +0 -0
  24. {wse_server-2.2.0 → wse_server-2.2.1}/rust/src/wse/sequencer.rs +0 -0
  25. {wse_server-2.2.0 → wse_server-2.2.1}/rust/src/wse/transformer.rs +0 -0
  26. {wse_server-2.2.0 → wse_server-2.2.1}/wse_server/core/__init__.py +0 -0
  27. {wse_server-2.2.0 → wse_server-2.2.1}/wse_server/core/filters.py +0 -0
  28. {wse_server-2.2.0 → wse_server-2.2.1}/wse_server/core/types.py +0 -0
  29. {wse_server-2.2.0 → wse_server-2.2.1}/wse_server/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wse-server
3
- Version: 2.2.0
3
+ Version: 2.2.1
4
4
  Classifier: Development Status :: 5 - Production/Stable
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -55,7 +55,7 @@ High-performance WebSocket server built in Rust with native clustering, E2E encr
55
55
  | Feature | Details |
56
56
  |---------|---------|
57
57
  | **Rust core** | tokio async runtime, tungstenite WebSocket transport, dedicated thread pool, zero GIL on the data path |
58
- | **JWT authentication** | Rust-native HS256 validation during handshake (0.01ms), cookie + Authorization header extraction |
58
+ | **JWT authentication** | HS256, RS256, ES256 algorithms via jsonwebtoken crate. Validated during handshake (0.01ms), cookie + Authorization header extraction, key rotation, kid validation |
59
59
  | **Protocol negotiation** | `client_hello`/`server_hello` handshake with feature discovery, capability advertisement, version agreement |
60
60
  | **Topic subscriptions** | Per-connection topic subscriptions with automatic cleanup on disconnect |
61
61
  | **Pre-framed broadcast** | WebSocket frame built once, shared via Arc across all connections, single allocation per broadcast |
@@ -140,7 +140,7 @@ High-performance WebSocket server built in Rust with native clustering, E2E encr
140
140
 
141
141
  | Feature | Details |
142
142
  |---------|---------|
143
- | **Origin validation** | `ALLOWED_ORIGINS` env var, rejects unlisted origins with close code 4403 |
143
+ | **Origin validation** | Configure in reverse proxy (nginx/Caddy) to prevent CSWSH |
144
144
  | **Cookie auth** | `access_token` HTTP-only cookie with `Secure + SameSite=Lax` (OWASP recommended for browsers) |
145
145
  | **Frame protection** | 1 MB max frame size, serde_json parsing (no eval), escaped user IDs in server_ready |
146
146
  | **Cluster frame protection** | zstd decompression output capped at 1 MB (MAX_FRAME_SIZE), protocol version validation |
@@ -204,9 +204,14 @@ token = rust_jwt_encode(
204
204
  | `host` | required | Bind address |
205
205
  | `port` | required | Bind port |
206
206
  | `max_connections` | 1000 | Maximum concurrent WebSocket connections |
207
- | `jwt_secret` | None | HS256 secret for JWT validation (bytes, min 32 bytes). `None` disables authentication |
207
+ | `jwt_secret` | None | JWT key for validation. HS256: shared secret (bytes, min 32). RS256/ES256: PEM public key. `None` disables auth |
208
208
  | `jwt_issuer` | None | Expected `iss` claim. Skipped if `None` |
209
209
  | `jwt_audience` | None | Expected `aud` claim. Skipped if `None` |
210
+ | `jwt_cookie_name` | "access_token" | Cookie name for JWT token extraction |
211
+ | `jwt_previous_secret` | None | Previous key for zero-downtime rotation. HS256: previous secret. RS256/ES256: previous public key PEM |
212
+ | `jwt_key_id` | None | Expected `kid` header claim. Rejects tokens with mismatched key ID |
213
+ | `jwt_algorithm` | None | JWT algorithm: `"HS256"` (default), `"RS256"`, or `"ES256"` |
214
+ | `jwt_private_key` | None | PEM private key for RS256/ES256 token encoding. Not needed for HS256 |
210
215
  | `max_inbound_queue_size` | 131072 | Drain mode bounded queue capacity |
211
216
  | `recovery_enabled` | False | Enable per-topic message recovery buffers |
212
217
  | `recovery_buffer_size` | 128 | Ring buffer slots per topic (rounded to power-of-2) |
@@ -217,7 +222,6 @@ token = rust_jwt_encode(
217
222
  | `presence_max_data_size` | 4096 | Max bytes for a user's presence metadata |
218
223
  | `presence_max_members` | 0 | Max tracked members per topic (0 = unlimited) |
219
224
  | `max_outbound_queue_bytes` | 16777216 | Per-connection outbound buffer limit (bytes, default 16 MB). Messages dropped when exceeded |
220
- | `jwt_cookie_name` | "access_token" | Cookie name for JWT token extraction |
221
225
  | `rate_limit_capacity` | 100000.0 | Token bucket capacity per connection |
222
226
  | `rate_limit_refill` | 10000.0 | Token bucket refill rate per second |
223
227
  | `max_message_size` | 1048576 | Maximum WebSocket frame size in bytes (default 1 MB) |
@@ -423,7 +427,7 @@ Token delivery:
423
427
  - **Backend clients**: `Authorization: Bearer <token>` header and/or `access_token` cookie
424
428
  - **API clients**: `Authorization: Bearer <token>` header
425
429
 
426
- Required claims: `sub` (user ID), `exp` (expiration), `iat` (issued at). Optional: `iss`, `aud` (validated if configured).
430
+ Required claims: `sub` (user ID), `exp` (expiration). Recommended: `iat` (issued at). Optional: `iss`, `aud` (validated if configured).
427
431
 
428
432
  ### End-to-End Encryption
429
433
 
@@ -14,7 +14,7 @@ High-performance WebSocket server built in Rust with native clustering, E2E encr
14
14
  | Feature | Details |
15
15
  |---------|---------|
16
16
  | **Rust core** | tokio async runtime, tungstenite WebSocket transport, dedicated thread pool, zero GIL on the data path |
17
- | **JWT authentication** | Rust-native HS256 validation during handshake (0.01ms), cookie + Authorization header extraction |
17
+ | **JWT authentication** | HS256, RS256, ES256 algorithms via jsonwebtoken crate. Validated during handshake (0.01ms), cookie + Authorization header extraction, key rotation, kid validation |
18
18
  | **Protocol negotiation** | `client_hello`/`server_hello` handshake with feature discovery, capability advertisement, version agreement |
19
19
  | **Topic subscriptions** | Per-connection topic subscriptions with automatic cleanup on disconnect |
20
20
  | **Pre-framed broadcast** | WebSocket frame built once, shared via Arc across all connections, single allocation per broadcast |
@@ -99,7 +99,7 @@ High-performance WebSocket server built in Rust with native clustering, E2E encr
99
99
 
100
100
  | Feature | Details |
101
101
  |---------|---------|
102
- | **Origin validation** | `ALLOWED_ORIGINS` env var, rejects unlisted origins with close code 4403 |
102
+ | **Origin validation** | Configure in reverse proxy (nginx/Caddy) to prevent CSWSH |
103
103
  | **Cookie auth** | `access_token` HTTP-only cookie with `Secure + SameSite=Lax` (OWASP recommended for browsers) |
104
104
  | **Frame protection** | 1 MB max frame size, serde_json parsing (no eval), escaped user IDs in server_ready |
105
105
  | **Cluster frame protection** | zstd decompression output capped at 1 MB (MAX_FRAME_SIZE), protocol version validation |
@@ -163,9 +163,14 @@ token = rust_jwt_encode(
163
163
  | `host` | required | Bind address |
164
164
  | `port` | required | Bind port |
165
165
  | `max_connections` | 1000 | Maximum concurrent WebSocket connections |
166
- | `jwt_secret` | None | HS256 secret for JWT validation (bytes, min 32 bytes). `None` disables authentication |
166
+ | `jwt_secret` | None | JWT key for validation. HS256: shared secret (bytes, min 32). RS256/ES256: PEM public key. `None` disables auth |
167
167
  | `jwt_issuer` | None | Expected `iss` claim. Skipped if `None` |
168
168
  | `jwt_audience` | None | Expected `aud` claim. Skipped if `None` |
169
+ | `jwt_cookie_name` | "access_token" | Cookie name for JWT token extraction |
170
+ | `jwt_previous_secret` | None | Previous key for zero-downtime rotation. HS256: previous secret. RS256/ES256: previous public key PEM |
171
+ | `jwt_key_id` | None | Expected `kid` header claim. Rejects tokens with mismatched key ID |
172
+ | `jwt_algorithm` | None | JWT algorithm: `"HS256"` (default), `"RS256"`, or `"ES256"` |
173
+ | `jwt_private_key` | None | PEM private key for RS256/ES256 token encoding. Not needed for HS256 |
169
174
  | `max_inbound_queue_size` | 131072 | Drain mode bounded queue capacity |
170
175
  | `recovery_enabled` | False | Enable per-topic message recovery buffers |
171
176
  | `recovery_buffer_size` | 128 | Ring buffer slots per topic (rounded to power-of-2) |
@@ -176,7 +181,6 @@ token = rust_jwt_encode(
176
181
  | `presence_max_data_size` | 4096 | Max bytes for a user's presence metadata |
177
182
  | `presence_max_members` | 0 | Max tracked members per topic (0 = unlimited) |
178
183
  | `max_outbound_queue_bytes` | 16777216 | Per-connection outbound buffer limit (bytes, default 16 MB). Messages dropped when exceeded |
179
- | `jwt_cookie_name` | "access_token" | Cookie name for JWT token extraction |
180
184
  | `rate_limit_capacity` | 100000.0 | Token bucket capacity per connection |
181
185
  | `rate_limit_refill` | 10000.0 | Token bucket refill rate per second |
182
186
  | `max_message_size` | 1048576 | Maximum WebSocket frame size in bytes (default 1 MB) |
@@ -382,7 +386,7 @@ Token delivery:
382
386
  - **Backend clients**: `Authorization: Bearer <token>` header and/or `access_token` cookie
383
387
  - **API clients**: `Authorization: Bearer <token>` header
384
388
 
385
- Required claims: `sub` (user ID), `exp` (expiration), `iat` (issued at). Optional: `iss`, `aud` (validated if configured).
389
+ Required claims: `sub` (user ID), `exp` (expiration). Recommended: `iat` (issued at). Optional: `iss`, `aud` (validated if configured).
386
390
 
387
391
  ### End-to-End Encryption
388
392
 
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "wse-server"
7
- version = "2.2.0"
7
+ version = "2.2.1"
8
8
  description = "Rust-powered WebSocket engine for Python. Up to 5M fan-out del/s. Zero-GIL JWT."
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -272,6 +272,33 @@ dependencies = [
272
272
  "cipher",
273
273
  ]
274
274
 
275
+ [[package]]
276
+ name = "curve25519-dalek"
277
+ version = "4.1.3"
278
+ source = "registry+https://github.com/rust-lang/crates.io-index"
279
+ checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be"
280
+ dependencies = [
281
+ "cfg-if",
282
+ "cpufeatures",
283
+ "curve25519-dalek-derive",
284
+ "digest",
285
+ "fiat-crypto",
286
+ "rustc_version",
287
+ "subtle",
288
+ "zeroize",
289
+ ]
290
+
291
+ [[package]]
292
+ name = "curve25519-dalek-derive"
293
+ version = "0.1.1"
294
+ source = "registry+https://github.com/rust-lang/crates.io-index"
295
+ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
296
+ dependencies = [
297
+ "proc-macro2",
298
+ "quote",
299
+ "syn",
300
+ ]
301
+
275
302
  [[package]]
276
303
  name = "dashmap"
277
304
  version = "6.1.0"
@@ -344,6 +371,30 @@ dependencies = [
344
371
  "spki",
345
372
  ]
346
373
 
374
+ [[package]]
375
+ name = "ed25519"
376
+ version = "2.2.3"
377
+ source = "registry+https://github.com/rust-lang/crates.io-index"
378
+ checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"
379
+ dependencies = [
380
+ "pkcs8",
381
+ "signature",
382
+ ]
383
+
384
+ [[package]]
385
+ name = "ed25519-dalek"
386
+ version = "2.2.0"
387
+ source = "registry+https://github.com/rust-lang/crates.io-index"
388
+ checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9"
389
+ dependencies = [
390
+ "curve25519-dalek",
391
+ "ed25519",
392
+ "serde",
393
+ "sha2",
394
+ "subtle",
395
+ "zeroize",
396
+ ]
397
+
347
398
  [[package]]
348
399
  name = "elliptic-curve"
349
400
  version = "0.13.8"
@@ -384,6 +435,12 @@ dependencies = [
384
435
  "subtle",
385
436
  ]
386
437
 
438
+ [[package]]
439
+ name = "fiat-crypto"
440
+ version = "0.2.9"
441
+ source = "registry+https://github.com/rust-lang/crates.io-index"
442
+ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d"
443
+
387
444
  [[package]]
388
445
  name = "find-msvc-tools"
389
446
  version = "0.1.9"
@@ -667,6 +724,38 @@ dependencies = [
667
724
  "wasm-bindgen",
668
725
  ]
669
726
 
727
+ [[package]]
728
+ name = "jsonwebtoken"
729
+ version = "10.3.0"
730
+ source = "registry+https://github.com/rust-lang/crates.io-index"
731
+ checksum = "0529410abe238729a60b108898784df8984c87f6054c9c4fcacc47e4803c1ce1"
732
+ dependencies = [
733
+ "base64",
734
+ "ed25519-dalek",
735
+ "getrandom 0.2.17",
736
+ "hmac",
737
+ "js-sys",
738
+ "p256",
739
+ "p384",
740
+ "pem",
741
+ "rand 0.8.5",
742
+ "rsa",
743
+ "serde",
744
+ "serde_json",
745
+ "sha2",
746
+ "signature",
747
+ "simple_asn1",
748
+ ]
749
+
750
+ [[package]]
751
+ name = "lazy_static"
752
+ version = "1.5.0"
753
+ source = "registry+https://github.com/rust-lang/crates.io-index"
754
+ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
755
+ dependencies = [
756
+ "spin",
757
+ ]
758
+
670
759
  [[package]]
671
760
  name = "leb128fmt"
672
761
  version = "0.1.0"
@@ -679,6 +768,12 @@ version = "0.2.182"
679
768
  source = "registry+https://github.com/rust-lang/crates.io-index"
680
769
  checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112"
681
770
 
771
+ [[package]]
772
+ name = "libm"
773
+ version = "0.2.16"
774
+ source = "registry+https://github.com/rust-lang/crates.io-index"
775
+ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
776
+
682
777
  [[package]]
683
778
  name = "libmimalloc-sys"
684
779
  version = "0.1.44"
@@ -740,12 +835,58 @@ dependencies = [
740
835
  "windows-sys 0.61.2",
741
836
  ]
742
837
 
838
+ [[package]]
839
+ name = "num-bigint"
840
+ version = "0.4.6"
841
+ source = "registry+https://github.com/rust-lang/crates.io-index"
842
+ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
843
+ dependencies = [
844
+ "num-integer",
845
+ "num-traits",
846
+ ]
847
+
848
+ [[package]]
849
+ name = "num-bigint-dig"
850
+ version = "0.8.6"
851
+ source = "registry+https://github.com/rust-lang/crates.io-index"
852
+ checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7"
853
+ dependencies = [
854
+ "lazy_static",
855
+ "libm",
856
+ "num-integer",
857
+ "num-iter",
858
+ "num-traits",
859
+ "rand 0.8.5",
860
+ "smallvec",
861
+ "zeroize",
862
+ ]
863
+
743
864
  [[package]]
744
865
  name = "num-conv"
745
866
  version = "0.2.0"
746
867
  source = "registry+https://github.com/rust-lang/crates.io-index"
747
868
  checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050"
748
869
 
870
+ [[package]]
871
+ name = "num-integer"
872
+ version = "0.1.46"
873
+ source = "registry+https://github.com/rust-lang/crates.io-index"
874
+ checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
875
+ dependencies = [
876
+ "num-traits",
877
+ ]
878
+
879
+ [[package]]
880
+ name = "num-iter"
881
+ version = "0.1.45"
882
+ source = "registry+https://github.com/rust-lang/crates.io-index"
883
+ checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
884
+ dependencies = [
885
+ "autocfg",
886
+ "num-integer",
887
+ "num-traits",
888
+ ]
889
+
749
890
  [[package]]
750
891
  name = "num-traits"
751
892
  version = "0.2.19"
@@ -753,6 +894,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
753
894
  checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
754
895
  dependencies = [
755
896
  "autocfg",
897
+ "libm",
756
898
  ]
757
899
 
758
900
  [[package]]
@@ -779,6 +921,18 @@ dependencies = [
779
921
  "sha2",
780
922
  ]
781
923
 
924
+ [[package]]
925
+ name = "p384"
926
+ version = "0.13.1"
927
+ source = "registry+https://github.com/rust-lang/crates.io-index"
928
+ checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6"
929
+ dependencies = [
930
+ "ecdsa",
931
+ "elliptic-curve",
932
+ "primeorder",
933
+ "sha2",
934
+ ]
935
+
782
936
  [[package]]
783
937
  name = "parking_lot"
784
938
  version = "0.12.5"
@@ -827,6 +981,17 @@ version = "0.2.17"
827
981
  source = "registry+https://github.com/rust-lang/crates.io-index"
828
982
  checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
829
983
 
984
+ [[package]]
985
+ name = "pkcs1"
986
+ version = "0.7.5"
987
+ source = "registry+https://github.com/rust-lang/crates.io-index"
988
+ checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"
989
+ dependencies = [
990
+ "der",
991
+ "pkcs8",
992
+ "spki",
993
+ ]
994
+
830
995
  [[package]]
831
996
  name = "pkcs8"
832
997
  version = "0.10.2"
@@ -983,16 +1148,37 @@ version = "6.0.0"
983
1148
  source = "registry+https://github.com/rust-lang/crates.io-index"
984
1149
  checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
985
1150
 
1151
+ [[package]]
1152
+ name = "rand"
1153
+ version = "0.8.5"
1154
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1155
+ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
1156
+ dependencies = [
1157
+ "libc",
1158
+ "rand_chacha 0.3.1",
1159
+ "rand_core 0.6.4",
1160
+ ]
1161
+
986
1162
  [[package]]
987
1163
  name = "rand"
988
1164
  version = "0.9.2"
989
1165
  source = "registry+https://github.com/rust-lang/crates.io-index"
990
1166
  checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
991
1167
  dependencies = [
992
- "rand_chacha",
1168
+ "rand_chacha 0.9.0",
993
1169
  "rand_core 0.9.5",
994
1170
  ]
995
1171
 
1172
+ [[package]]
1173
+ name = "rand_chacha"
1174
+ version = "0.3.1"
1175
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1176
+ checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
1177
+ dependencies = [
1178
+ "ppv-lite86",
1179
+ "rand_core 0.6.4",
1180
+ ]
1181
+
996
1182
  [[package]]
997
1183
  name = "rand_chacha"
998
1184
  version = "0.9.0"
@@ -1124,6 +1310,35 @@ dependencies = [
1124
1310
  "rmp",
1125
1311
  ]
1126
1312
 
1313
+ [[package]]
1314
+ name = "rsa"
1315
+ version = "0.9.10"
1316
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1317
+ checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d"
1318
+ dependencies = [
1319
+ "const-oid",
1320
+ "digest",
1321
+ "num-bigint-dig",
1322
+ "num-integer",
1323
+ "num-traits",
1324
+ "pkcs1",
1325
+ "pkcs8",
1326
+ "rand_core 0.6.4",
1327
+ "signature",
1328
+ "spki",
1329
+ "subtle",
1330
+ "zeroize",
1331
+ ]
1332
+
1333
+ [[package]]
1334
+ name = "rustc_version"
1335
+ version = "0.4.1"
1336
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1337
+ checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
1338
+ dependencies = [
1339
+ "semver",
1340
+ ]
1341
+
1127
1342
  [[package]]
1128
1343
  name = "rustls"
1129
1344
  version = "0.23.37"
@@ -1290,6 +1505,18 @@ version = "0.3.8"
1290
1505
  source = "registry+https://github.com/rust-lang/crates.io-index"
1291
1506
  checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2"
1292
1507
 
1508
+ [[package]]
1509
+ name = "simple_asn1"
1510
+ version = "0.6.4"
1511
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1512
+ checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d"
1513
+ dependencies = [
1514
+ "num-bigint",
1515
+ "num-traits",
1516
+ "thiserror",
1517
+ "time",
1518
+ ]
1519
+
1293
1520
  [[package]]
1294
1521
  name = "slab"
1295
1522
  version = "0.4.12"
@@ -1312,6 +1539,12 @@ dependencies = [
1312
1539
  "windows-sys 0.61.2",
1313
1540
  ]
1314
1541
 
1542
+ [[package]]
1543
+ name = "spin"
1544
+ version = "0.9.8"
1545
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1546
+ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
1547
+
1315
1548
  [[package]]
1316
1549
  name = "spki"
1317
1550
  version = "0.7.3"
@@ -1372,10 +1605,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1372
1605
  checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c"
1373
1606
  dependencies = [
1374
1607
  "deranged",
1608
+ "itoa",
1375
1609
  "num-conv",
1376
1610
  "powerfmt",
1377
1611
  "serde_core",
1378
1612
  "time-core",
1613
+ "time-macros",
1379
1614
  ]
1380
1615
 
1381
1616
  [[package]]
@@ -1384,6 +1619,16 @@ version = "0.1.8"
1384
1619
  source = "registry+https://github.com/rust-lang/crates.io-index"
1385
1620
  checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca"
1386
1621
 
1622
+ [[package]]
1623
+ name = "time-macros"
1624
+ version = "0.2.27"
1625
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1626
+ checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215"
1627
+ dependencies = [
1628
+ "num-conv",
1629
+ "time-core",
1630
+ ]
1631
+
1387
1632
  [[package]]
1388
1633
  name = "tokio"
1389
1634
  version = "1.50.0"
@@ -1457,7 +1702,7 @@ dependencies = [
1457
1702
  "http",
1458
1703
  "httparse",
1459
1704
  "log",
1460
- "rand",
1705
+ "rand 0.9.2",
1461
1706
  "sha1",
1462
1707
  "thiserror",
1463
1708
  "utf-8",
@@ -1854,7 +2099,7 @@ dependencies = [
1854
2099
 
1855
2100
  [[package]]
1856
2101
  name = "wse-accel"
1857
- version = "2.2.0"
2102
+ version = "2.2.1"
1858
2103
  dependencies = [
1859
2104
  "aes-gcm",
1860
2105
  "ahash",
@@ -1868,6 +2113,7 @@ dependencies = [
1868
2113
  "hex",
1869
2114
  "hkdf",
1870
2115
  "hmac",
2116
+ "jsonwebtoken",
1871
2117
  "mimalloc",
1872
2118
  "p256",
1873
2119
  "parking_lot",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "wse-accel"
3
- version = "2.2.0"
3
+ version = "2.2.1"
4
4
  edition = "2024"
5
5
 
6
6
  [lib]
@@ -21,6 +21,7 @@ ahash = "0.8.12"
21
21
  dashmap = "6"
22
22
  aes-gcm = "0.10"
23
23
  p256 = { version = "0.13", features = ["ecdh", "jwk"] }
24
+ jsonwebtoken = { version = "10", features = ["rust_crypto"] }
24
25
  hkdf = "0.12"
25
26
  uuid = { version = "1.22.0", features = ["v7"] }
26
27
  base64 = "0.22"