@api.global/typedsocket 6.0.0 → 6.1.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 (35) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/classes.clienttagreconciler.d.ts +51 -0
  3. package/dist_ts/classes.clienttagreconciler.js +290 -0
  4. package/dist_ts/classes.nativebyteerror.js +26 -0
  5. package/dist_ts/{nativebytes.manager.d.ts → classes.nativebytemanager.d.ts} +8 -3
  6. package/dist_ts/classes.nativebytemanager.js +2343 -0
  7. package/dist_ts/{typedsocket.classes.typedsocket.d.ts → classes.typedsocket.d.ts} +21 -21
  8. package/dist_ts/classes.typedsocket.js +1733 -0
  9. package/dist_ts/{typedsocket.tags.d.ts → classes.typedsockettagpolicymanager.d.ts} +9 -2
  10. package/dist_ts/classes.typedsockettagpolicymanager.js +549 -0
  11. package/dist_ts/{nativebytes.constants.js → constants.nativebytes.js} +1 -1
  12. package/dist_ts/{nativebytes.codec.d.ts → helpers.nativebytecodec.d.ts} +1 -1
  13. package/dist_ts/helpers.nativebytecodec.js +328 -0
  14. package/dist_ts/helpers.websocket.d.ts +8 -0
  15. package/dist_ts/helpers.websocket.js +13 -0
  16. package/dist_ts/index.d.ts +9 -8
  17. package/dist_ts/index.js +6 -6
  18. package/dist_ts/interfaces.diagnostics.d.ts +73 -0
  19. package/dist_ts/interfaces.diagnostics.js +2 -0
  20. package/dist_ts/{nativebytes.types.d.ts → interfaces.nativebytes.d.ts} +2 -2
  21. package/dist_ts/interfaces.nativebytes.js +2 -0
  22. package/dist_ts/plugins.js +14 -0
  23. package/package.json +1 -1
  24. package/readme.hints.md +26 -1
  25. package/readme.md +120 -55
  26. package/dist_ts/nativebytes.codec.js +0 -328
  27. package/dist_ts/nativebytes.errors.js +0 -26
  28. package/dist_ts/nativebytes.manager.js +0 -2308
  29. package/dist_ts/nativebytes.types.js +0 -2
  30. package/dist_ts/typedsocket.classes.typedsocket.js +0 -1874
  31. package/dist_ts/typedsocket.plugins.js +0 -14
  32. package/dist_ts/typedsocket.tags.js +0 -521
  33. /package/dist_ts/{nativebytes.errors.d.ts → classes.nativebyteerror.d.ts} +0 -0
  34. /package/dist_ts/{nativebytes.constants.d.ts → constants.nativebytes.d.ts} +0 -0
  35. /package/dist_ts/{typedsocket.plugins.d.ts → plugins.d.ts} +0 -0
package/readme.md CHANGED
@@ -162,10 +162,13 @@ rejected during composition and on later router mutations; `stop()` releases
162
162
  the owned fallback edges. `fromSmartServe()` remains available as a JSON-only
163
163
  attachment helper that delegates to `createServer()` and `attachSmartServe()`.
164
164
 
165
- Connection lookup and implicit single-peer targeting span every peer on the
166
- attached SmartServe transport, regardless of the surface router that accepted
167
- the peer. Multi-surface servers should tag or filter peers by surface and pass
168
- an explicit target to `createTypedRequest()`.
165
+ Connection lookup via `findTargetConnection()`/`findAllTargetConnections()`
166
+ spans every peer attached to this server's routing surfaces. Deprecated
167
+ implicit single-peer targeting is narrower: multi-router servers throw
168
+ `'TypedSocket multi-router servers require an explicit targetConnection'`
169
+ before any lookup, and single-router servers only consider peers bound to that
170
+ router's surface. Multi-surface servers should tag or filter peers by surface
171
+ and pass an explicit target to `createTypedRequest()`.
169
172
 
170
173
  ### Native Byte Streams
171
174
 
@@ -383,7 +386,8 @@ descriptors are protocol-integration APIs. Normal application DTOs should carry
383
386
  the `VirtualStream` facade shown above, not a descriptor. Transport integrations
384
387
  that cannot use the facade must still provide a non-negative safe-integer
385
388
  `byteLength`, exact `sha256:<64 lowercase hex>`, and a normalized media-type
386
- `contentType` of at most 255 UTF-8 bytes. They must also provide all three
389
+ `contentType` of at most 255 UTF-8 bytes (`NATIVE_BYTE_MAX_CONTENT_TYPE_BYTES`).
390
+ They must also provide all three
387
391
  nonempty authority revisions and mandatory `revalidate(context)`.
388
392
 
389
393
  The application must drain the stream, commit it durably, and only then call
@@ -409,25 +413,25 @@ opt-in. Byte DTOs must use the exact native facade returned by
409
413
 
410
414
  #### Native Limits
411
415
 
412
- | Limit | Value |
413
- |---|---:|
414
- | Complete binary message | 32 KiB |
415
- | DATA payload per message | 32,720 bytes |
416
- | Maximum stream length | 140,531,329,925,120 bytes (127.8125 TiB) |
417
- | Default receive window | 256 KiB |
418
- | Maximum receive window / queued payload per stream | 1 MiB |
419
- | Queued payload per connection | 8 MiB |
420
- | Queued receive chunks per stream | 4,096 |
421
- | Grants plus active streams per connection | 32 |
422
- | Pending admitted DATA operations per connection | 64 |
423
- | Raw inbound queue | 64 frames / 2 MiB |
424
- | Grant and OPEN timeout | 10 seconds |
425
- | Progress, ACK, frame settlement, FIN_ACK, durable confirmation | 30 seconds |
426
- | Closed-stream tombstones | 64, oldest-first, 60 seconds |
427
- | Principal and each authority revision | 256 UTF-8 bytes |
428
- | Retained revalidation callbacks | 4 per peer / 16 per principal / 128 per server |
429
- | Server connections / streams | 1,024 / 1,024 |
430
- | Server retained bytes / receive reservations | 64 MiB / 64 MiB |
416
+ | Limit | Exported constant | Value |
417
+ |---|---|---:|
418
+ | Complete binary message | `NATIVE_BYTE_MAX_FRAME_BYTES` | 32 KiB |
419
+ | DATA payload per message | `NATIVE_BYTE_MAX_DATA_PAYLOAD_BYTES` | 32,720 bytes |
420
+ | Maximum stream length | `NATIVE_BYTE_MAX_STREAM_BYTES` | 140,531,329,925,120 bytes (127.8125 TiB) |
421
+ | Default receive window | `NATIVE_BYTE_DEFAULT_INITIAL_WINDOW_BYTES` | 256 KiB |
422
+ | Maximum receive window / queued payload per stream | `NATIVE_BYTE_MAX_WINDOW_BYTES` / `NATIVE_BYTE_MAX_QUEUED_PAYLOAD_BYTES_PER_STREAM` | 1 MiB |
423
+ | Queued payload per connection | `NATIVE_BYTE_MAX_QUEUED_PAYLOAD_BYTES_PER_CONNECTION` | 8 MiB |
424
+ | Queued receive chunks per stream | `NATIVE_BYTE_MAX_RECEIVE_QUEUE_CHUNKS` | 4,096 |
425
+ | Grants plus active streams per connection | `NATIVE_BYTE_MAX_STREAMS_PER_CONNECTION` | 32 |
426
+ | Pending admitted DATA operations per connection | `NATIVE_BYTE_MAX_PENDING_DATA_OPERATIONS_PER_CONNECTION` | 64 |
427
+ | Raw inbound queue | `NATIVE_BYTE_MAX_RAW_QUEUE_FRAMES` / `NATIVE_BYTE_MAX_RAW_QUEUE_BYTES` | 64 frames / 2 MiB |
428
+ | Grant and OPEN timeout | `NATIVE_BYTE_GRANT_OPEN_TIMEOUT_MS` | 10 seconds |
429
+ | Progress, ACK, frame settlement, FIN_ACK, durable confirmation | `NATIVE_BYTE_PROGRESS_TIMEOUT_MS` | 30 seconds |
430
+ | Closed-stream tombstones | `NATIVE_BYTE_MAX_TOMBSTONES` / `NATIVE_BYTE_TOMBSTONE_RETENTION_MS` | 64, oldest-first, 60 seconds |
431
+ | Principal and each authority revision | `NATIVE_BYTE_MAX_PRINCIPAL_ID_BYTES` / `NATIVE_BYTE_MAX_AUTHORITY_REVISION_BYTES` | 256 UTF-8 bytes |
432
+ | Retained revalidation callbacks | `NATIVE_BYTE_MAX_REVALIDATIONS_PER_PEER` / `_PER_PRINCIPAL` / `_PER_SERVER` | 4 per peer / 16 per principal / 128 per server |
433
+ | Server connections / streams | `NATIVE_BYTE_MAX_CONNECTIONS_PER_SERVER` / `NATIVE_BYTE_MAX_STREAMS_PER_SERVER` | 1,024 / 1,024 |
434
+ | Server retained bytes / receive reservations | `NATIVE_BYTE_MAX_RETAINED_BYTES_PER_SERVER` | 64 MiB / 64 MiB |
431
435
 
432
436
  SmartServe owner sends prioritize control frames over DATA and pull one binary
433
437
  frame per requested turn. Browser clients likewise send one binary frame per
@@ -503,23 +507,31 @@ const client = await TypedSocket.createClient(clientRouter, serverUrl, {
503
507
  });
504
508
  ```
505
509
 
506
- | Client limit | Package ceiling |
507
- |---|---:|
508
- | Complete text frame | 1 MiB |
509
- | Queued text frames / bytes | 64 / 4 MiB |
510
- | Concurrent handlers / retained callbacks | 16 / 64 |
511
- | Pending client requests | 1,024 |
512
- | Outbound WebSocket buffered bytes | 4 MiB |
513
- | Method name / correlation ID | 256 UTF-8 bytes each |
514
- | Request timeout | 5 minutes |
515
- | Connection restoration timeout | 10 seconds |
516
- | Reconnect attempts | 100 |
517
- | Initial / maximum reconnect backoff | 60 seconds |
510
+ | Client limit | Exported constant | Package ceiling |
511
+ |---|---|---:|
512
+ | Complete text frame | `TYPEDSOCKET_MAX_TEXT_FRAME_BYTES` | 1 MiB |
513
+ | Queued text frames / bytes | `TYPEDSOCKET_MAX_QUEUED_TEXT_FRAMES` / `TYPEDSOCKET_MAX_QUEUED_TEXT_BYTES` | 64 / 4 MiB |
514
+ | Concurrent handlers / retained callbacks | `TYPEDSOCKET_MAX_CONCURRENT_CLIENT_HANDLERS` / `TYPEDSOCKET_MAX_RETAINED_CLIENT_CALLBACKS` | 16 / 64 |
515
+ | Pending client requests | `TYPEDSOCKET_MAX_PENDING_CLIENT_REQUESTS` | 1,024 |
516
+ | Outbound WebSocket buffered bytes | `TYPEDSOCKET_MAX_OUTBOUND_BUFFERED_BYTES` | 4 MiB |
517
+ | Method name / correlation ID | `TYPEDSOCKET_MAX_METHOD_NAME_BYTES` / `TYPEDSOCKET_MAX_CORRELATION_ID_BYTES` | 256 UTF-8 bytes each |
518
+ | Request timeout | `TYPEDSOCKET_MAX_REQUEST_TIMEOUT_MS` | 5 minutes |
519
+ | Connection restoration timeout | `TYPEDSOCKET_MAX_CONNECTION_RESTORE_TIMEOUT_MS` | 10 seconds |
520
+ | Reconnect attempts | `TYPEDSOCKET_MAX_RECONNECT_RETRIES` | 100 |
521
+ | Initial / maximum reconnect backoff | `TYPEDSOCKET_MAX_RECONNECT_BACKOFF_MS` | 60 seconds |
518
522
 
519
523
  `maxRetries` is a non-negative safe integer no greater than 100.
520
524
  `initialBackoffMs` and `maxBackoffMs` are positive safe integers no greater
521
525
  than 60,000, and the initial value cannot exceed the maximum.
522
526
 
527
+ Every ceiling in this document is exported as a named constant from the package
528
+ root, so consumers can compare against the canonical value instead of
529
+ hardcoding numbers. The limits philosophy is uniform and deliberate:
530
+ configuration may lower a ceiling, but nothing may raise one — there is no
531
+ unsafe override option. When a legitimate use case outgrows a ceiling, the
532
+ constant is raised in a reviewed package release, not by per-deployment
533
+ configuration.
534
+
523
535
  #### Abortable Startup
524
536
 
525
537
  Pass an `AbortSignal` when startup or reconnect attempts must be cancellable. Aborting stops the in-flight WebSocket and prevents queued reconnect attempts from continuing.
@@ -573,23 +585,26 @@ console.log(response.message); // "Hello, World! 👋"
573
585
 
574
586
  #### Server to Client
575
587
 
576
- The server can also initiate requests to connected clients:
588
+ The server can also initiate requests to connected clients. Always pass the
589
+ target connection explicitly:
577
590
 
578
591
  ```typescript
579
- // When only one client is connected, it's automatically selected
580
- const request = server.createTypedRequest<IGreetingRequest>('greet');
581
- const response = await request.fire({
582
- name: 'Client',
583
- });
584
-
585
- // For multiple clients, specify the target connection
586
592
  const connection = await server.findTargetConnection(async (conn) => {
587
593
  // Your filter logic here
588
594
  return true;
589
595
  });
590
596
  const targetedRequest = server.createTypedRequest<IGreetingRequest>('greet', connection);
597
+ const response = await targetedRequest.fire({ name: 'Client' });
591
598
  ```
592
599
 
600
+ > **Deprecated:** omitting the target on a server-side `createTypedRequest()`
601
+ > auto-selects the connection only while exactly one client is attached, and
602
+ > throws as soon as a second client connects. It also silently disables
603
+ > native-byte transport for that request, because no peer was known when the
604
+ > request object was created. Each implicit resolution emits an
605
+ > `implicitTargetingUsed` diagnostic (once per request object); the implicit
606
+ > path will be removed in the next major version.
607
+
593
608
  #### Request Deadlines and Cancellation
594
609
 
595
610
  TypedSocket forwards both configured request cancellation and per-`fire()` deadlines to its client
@@ -618,8 +633,11 @@ const response = await responsePromise;
618
633
  ```
619
634
 
620
635
  Server-initiated requests retain at most 64 pending requests per peer and 1,024
621
- per TypedSocket server. Asynchronous `addInterest()` registration retains at
622
- most 8 operations per peer and 64 per server. Cancellation removes the pending
636
+ per TypedSocket server (`TYPEDSOCKET_MAX_PENDING_SERVER_REQUESTS_PER_PEER`,
637
+ `TYPEDSOCKET_MAX_PENDING_SERVER_REQUESTS`). Asynchronous `addInterest()`
638
+ registration retains at most 8 operations per peer and 64 per server
639
+ (`TYPEDSOCKET_MAX_RETAINED_SERVER_INTERESTS_PER_PEER`,
640
+ `TYPEDSOCKET_MAX_RETAINED_SERVER_INTERESTS`). Cancellation removes the pending
623
641
  request immediately, while a non-settling registration remains charged until
624
642
  its underlying promise actually settles.
625
643
 
@@ -685,6 +703,14 @@ for (const conn of progressConnections) {
685
703
  }
686
704
  ```
687
705
 
706
+ Connection wrappers deliberately expose the underlying transport peer as
707
+ `connection.peer` — this is the supported escape hatch for admission-time
708
+ metadata in selection predicates, for example reading
709
+ `connection.peer.context.headers` or server-owned `connection.peer.context.state`
710
+ inside `findAllTargetConnections()`. Reading through `peer` is fine; mutating
711
+ `peer.tags` or TypedSocket's prefixed `peer.data` entries is not — ownership of
712
+ those is reconciled by the protected server tag methods.
713
+
688
714
  Authentication, roles, service registration, and other authoritative metadata must be assigned by
689
715
  the server after application-level verification:
690
716
 
@@ -699,16 +725,17 @@ server.removeServerTag(connection, 'authenticatedUser');
699
725
  Do not mutate `peer.tags` or TypedSocket's prefixed `peer.data` entries directly. The protected
700
726
  server methods reconcile ownership with in-flight client proposals.
701
727
 
702
- Fixed limits cannot be raised by policy:
728
+ Fixed limits cannot be raised by policy (each is exported by name from the
729
+ package root):
703
730
 
704
- - Tag name: 128 UTF-8 bytes.
705
- - SmartJSON payload envelope: 4,096 bytes.
706
- - Client-originated retained tags: 16 per peer.
707
- - Client-originated cumulative name and payload storage: 16,384 bytes per peer.
708
- - Client-side retained mutation work: 8 per exact name and 64 per client.
709
- - Retained mutation/authorization work: 8 per peer, 32 per exact rule, and 256 per TypedSocket server.
710
- - Protected server tag state: 64 names and 65,536 cumulative name/payload bytes per peer.
711
- - Authorization callback deadline: at most 5 seconds; policy may only lower it.
731
+ - Tag name: 128 UTF-8 bytes (`TYPEDSOCKET_MAX_TAG_NAME_BYTES`).
732
+ - SmartJSON payload envelope: 4,096 bytes (`TYPEDSOCKET_MAX_TAG_PAYLOAD_BYTES`).
733
+ - Client-originated retained tags: 16 per peer (`TYPEDSOCKET_MAX_CLIENT_TAGS_PER_PEER`).
734
+ - Client-originated cumulative name and payload storage: 16,384 bytes per peer (`TYPEDSOCKET_MAX_CLIENT_TAG_RETAINED_BYTES_PER_PEER`).
735
+ - Client-side retained mutation work: 8 per exact name and 64 per client (`TYPEDSOCKET_MAX_RETAINED_CLIENT_TAG_MUTATIONS_PER_NAME`, `TYPEDSOCKET_MAX_RETAINED_CLIENT_TAG_MUTATIONS`).
736
+ - Retained mutation/authorization work: 8 per peer, 32 per exact rule, and 256 per TypedSocket server (`TYPEDSOCKET_MAX_RETAINED_TAG_MUTATIONS_PER_PEER`, `_PER_RULE`, `_PER_SERVER`).
737
+ - Protected server tag state: 64 names and 65,536 cumulative name/payload bytes per peer (`TYPEDSOCKET_MAX_SERVER_TAG_NAMES_PER_PEER`, `TYPEDSOCKET_MAX_SERVER_TAG_RETAINED_BYTES_PER_PEER`).
738
+ - Authorization callback deadline: at most 5 seconds; policy may only lower it (`TYPEDSOCKET_MAX_TAG_AUTHORIZATION_TIMEOUT_MS`).
712
739
 
713
740
  Same-name mutations execute FIFO. Timed-out callbacks receive an aborted signal and remain charged
714
741
  against authorization budgets until they actually settle. Disconnect and server stop abort active
@@ -733,6 +760,43 @@ client.statusSubject.subscribe((status) => {
733
760
  });
734
761
  ```
735
762
 
763
+ ### Diagnostics
764
+
765
+ Both sides publish structured diagnostics on `diagnosticsSubject` — the *why*
766
+ channel next to `statusSubject` (state transitions) and `nativeBytes.getStats()`
767
+ (counters). Events carry package-defined static strings, bounded identifiers
768
+ (tag names, method names), and bounded codes only; payloads, URLs beyond
769
+ protocol//host, and free-form error messages never appear. Client-received
770
+ denial codes are validated against `TYPEDSOCKET_TAG_DENIAL_CODES` before they
771
+ reach the channel; anything unknown collapses to `MALFORMED_TAG_RESPONSE`.
772
+
773
+ ```typescript
774
+ import type { TTypedSocketDiagnosticEvent } from '@api.global/typedsocket';
775
+
776
+ client.diagnosticsSubject.subscribe((event: TTypedSocketDiagnosticEvent) => {
777
+ switch (event.kind) {
778
+ case 'connectionClosed': // an invariant close: scope, closeCode, reason
779
+ case 'peerRejected': // server-only: peer rejected before state existed
780
+ case 'reconnectScheduled': // attempt, maxRetries, delayMs, endpoint
781
+ case 'reconnectExhausted': // at most once per exhausted sequence
782
+ case 'tagMutationDenied': // operation, tag name, denial code, side
783
+ case 'implicitTargetingUsed': // server-only: deprecated implicit targeting fired
784
+ console.log(event);
785
+ }
786
+ });
787
+ ```
788
+
789
+ `diagnosticsSubject` never completes, mirroring `statusSubject`; subscribers
790
+ own their unsubscription. A `NativeByteManager` used standalone accepts the
791
+ same sink via the `onDiagnostic` option, typed to the narrower
792
+ `TNativeByteDiagnosticEvent` subset.
793
+
794
+ Close codes in `connectionClosed` events are always the semantic protocol
795
+ codes (1002, 1003, 1008, 1009, 1011, 1013). On the wire, client-initiated invariant
796
+ closes mirror them into the application range the WebSocket `close()` API
797
+ permits — 1009 becomes 4009 (`toClientWebSocketCloseCode()`); server-initiated
798
+ closes keep the protocol codes.
799
+
736
800
  ### Cleanup
737
801
 
738
802
  Properly close connections when done:
@@ -768,6 +832,7 @@ await smartServe.stop();
768
832
  | `nativeBytes` | Advanced native-byte grant, sender, capability, and statistics API for transport integrations. |
769
833
  | `webSocketTransportOwner` | Stable SmartServe 4 raw-frame owner selected during SmartServe construction. |
770
834
  | `statusSubject` | RxJS Subject for client connection status events. Server instances do not publish lifecycle transitions here. |
835
+ | `diagnosticsSubject` | RxJS Subject of structured `TTypedSocketDiagnosticEvent` values: invariant closes, peer rejections, reconnect scheduling/exhaustion, tag denials, and deprecated implicit targeting. Never completes. |
771
836
 
772
837
  #### Instance Methods
773
838
 
@@ -1,328 +0,0 @@
1
- import { NATIVE_BYTE_ACK_HEADER_BYTES, NATIVE_BYTE_COMMON_HEADER_BYTES, NATIVE_BYTE_DATA_HEADER_BYTES, NATIVE_BYTE_FIN_ACK_HEADER_BYTES, NATIVE_BYTE_FIN_HEADER_BYTES, NATIVE_BYTE_FRAME_MAGIC, NATIVE_BYTE_FRAME_TYPES, NATIVE_BYTE_MAX_CONTENT_TYPE_BYTES, NATIVE_BYTE_MAX_DATA_PAYLOAD_BYTES, NATIVE_BYTE_MAX_FRAME_BYTES, NATIVE_BYTE_MAX_RESET_REASON_BYTES, NATIVE_BYTE_MAX_STREAM_BYTES, NATIVE_BYTE_MAX_WINDOW_BYTES, NATIVE_BYTE_OPEN_ACK_HEADER_BYTES, NATIVE_BYTE_OPEN_FIXED_HEADER_BYTES, NATIVE_BYTE_RESET_FIXED_HEADER_BYTES, } from './nativebytes.constants.js';
2
- import { NativeByteProtocolError } from './nativebytes.errors.js';
3
- const textEncoder = new TextEncoder();
4
- const fatalTextDecoder = new TextDecoder('utf-8', { fatal: true });
5
- const streamIdPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
6
- const capabilityPattern = /^[0-9a-f]{64}$/;
7
- const sha256Pattern = /^sha256:[0-9a-f]{64}$/;
8
- const contentTypePattern = /^[a-z0-9!#$&^_.+-]+\/[a-z0-9!#$&^_.+-]+(?:;[\x20-\x7e]+)?$/;
9
- function decodeUtf8(bytesArg, nameArg) {
10
- try {
11
- return fatalTextDecoder.decode(bytesArg);
12
- }
13
- catch (errorArg) {
14
- throw new NativeByteProtocolError(`${nameArg} must contain valid UTF-8`, {
15
- cause: errorArg,
16
- });
17
- }
18
- }
19
- function assertNativeByteWindow(valueArg, nameArg) {
20
- if (!Number.isSafeInteger(valueArg)
21
- || valueArg <= 0
22
- || valueArg > NATIVE_BYTE_MAX_WINDOW_BYTES) {
23
- throw new NativeByteProtocolError(`${nameArg} must be an integer from 1 through ${NATIVE_BYTE_MAX_WINDOW_BYTES}`);
24
- }
25
- return valueArg;
26
- }
27
- export function assertNativeByteLength(valueArg, nameArg = 'byteLength') {
28
- if (typeof valueArg !== 'number'
29
- || !Number.isSafeInteger(valueArg)
30
- || valueArg < 0
31
- || valueArg > NATIVE_BYTE_MAX_STREAM_BYTES) {
32
- throw new NativeByteProtocolError(`${nameArg} must be an integer from 0 through ${NATIVE_BYTE_MAX_STREAM_BYTES}`);
33
- }
34
- return valueArg;
35
- }
36
- export function normalizeNativeByteSha256(valueArg) {
37
- if (typeof valueArg !== 'string' || !sha256Pattern.test(valueArg)) {
38
- throw new NativeByteProtocolError('sha256 must use sha256:<64 lowercase hex>');
39
- }
40
- return valueArg;
41
- }
42
- export function normalizeNativeByteContentType(valueArg) {
43
- if (typeof valueArg !== 'string'
44
- || valueArg.length === 0
45
- || valueArg !== valueArg.trim()
46
- || !contentTypePattern.test(valueArg)) {
47
- throw new NativeByteProtocolError('contentType must be a normalized nonempty media type');
48
- }
49
- const bytes = textEncoder.encode(valueArg);
50
- if (bytes.byteLength > NATIVE_BYTE_MAX_CONTENT_TYPE_BYTES) {
51
- throw new NativeByteProtocolError(`contentType must not exceed ${NATIVE_BYTE_MAX_CONTENT_TYPE_BYTES} UTF-8 bytes`);
52
- }
53
- return valueArg;
54
- }
55
- export function normalizeNativeByteStreamId(valueArg) {
56
- if (typeof valueArg !== 'string' || !streamIdPattern.test(valueArg)) {
57
- throw new NativeByteProtocolError('streamId must be a canonical lowercase 128-bit UUID');
58
- }
59
- return valueArg;
60
- }
61
- export function normalizeNativeByteCapability(valueArg) {
62
- if (typeof valueArg !== 'string' || !capabilityPattern.test(valueArg)) {
63
- throw new NativeByteProtocolError('capability must be 256 bits of lowercase hexadecimal');
64
- }
65
- return valueArg;
66
- }
67
- function bytesToHex(bytesArg) {
68
- let result = '';
69
- for (const value of bytesArg)
70
- result += value.toString(16).padStart(2, '0');
71
- return result;
72
- }
73
- function hexToBytes(valueArg) {
74
- const result = new Uint8Array(valueArg.length / 2);
75
- for (let index = 0; index < result.length; index++) {
76
- result[index] = Number.parseInt(valueArg.slice(index * 2, index * 2 + 2), 16);
77
- }
78
- return result;
79
- }
80
- function streamIdToBytes(streamIdArg) {
81
- return hexToBytes(normalizeNativeByteStreamId(streamIdArg).replaceAll('-', ''));
82
- }
83
- function bytesToStreamId(bytesArg) {
84
- const hex = bytesToHex(bytesArg);
85
- return normalizeNativeByteStreamId(`${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`);
86
- }
87
- function writeSafeU64(viewArg, offsetArg, valueArg, nameArg) {
88
- assertNativeByteLength(valueArg, nameArg);
89
- viewArg.setBigUint64(offsetArg, BigInt(valueArg), false);
90
- }
91
- function readSafeU64(viewArg, offsetArg, nameArg) {
92
- const value = viewArg.getBigUint64(offsetArg, false);
93
- if (value > BigInt(Number.MAX_SAFE_INTEGER)) {
94
- throw new NativeByteProtocolError(`${nameArg} exceeds JavaScript safe integer range`);
95
- }
96
- return assertNativeByteLength(Number(value), nameArg);
97
- }
98
- function createHeader(typeArg, streamIdArg, headerLengthArg, payloadLengthArg) {
99
- const totalLength = headerLengthArg + payloadLengthArg;
100
- if (totalLength > NATIVE_BYTE_MAX_FRAME_BYTES) {
101
- throw new NativeByteProtocolError(`native-byte-v1 frame exceeds ${NATIVE_BYTE_MAX_FRAME_BYTES} bytes`);
102
- }
103
- const bytes = new Uint8Array(totalLength);
104
- bytes.set(textEncoder.encode(NATIVE_BYTE_FRAME_MAGIC), 0);
105
- const view = new DataView(bytes.buffer);
106
- view.setUint8(4, typeArg);
107
- view.setUint8(5, 0);
108
- view.setUint16(6, headerLengthArg, false);
109
- bytes.set(streamIdToBytes(streamIdArg), 8);
110
- view.setUint32(24, payloadLengthArg, false);
111
- view.setUint32(28, 0, false);
112
- return { bytes, view };
113
- }
114
- function digestToBytes(digestArg) {
115
- return hexToBytes(normalizeNativeByteSha256(digestArg).slice('sha256:'.length));
116
- }
117
- function bytesToDigest(bytesArg) {
118
- return normalizeNativeByteSha256(`sha256:${bytesToHex(bytesArg)}`);
119
- }
120
- export function encodeNativeByteFrame(frameArg) {
121
- switch (frameArg.type) {
122
- case NATIVE_BYTE_FRAME_TYPES.OPEN: {
123
- const contentType = normalizeNativeByteContentType(frameArg.contentType);
124
- const contentTypeBytes = textEncoder.encode(contentType);
125
- const headerLength = NATIVE_BYTE_OPEN_FIXED_HEADER_BYTES + contentTypeBytes.byteLength;
126
- const { bytes, view } = createHeader(frameArg.type, frameArg.streamId, headerLength, 0);
127
- bytes.set(hexToBytes(normalizeNativeByteCapability(frameArg.capability)), 32);
128
- writeSafeU64(view, 64, frameArg.byteLength, 'byteLength');
129
- writeSafeU64(view, 72, assertNativeByteWindow(frameArg.initialWindowBytes, 'initialWindowBytes'), 'initialWindowBytes');
130
- bytes.set(digestToBytes(frameArg.sha256), 80);
131
- view.setUint16(112, contentTypeBytes.byteLength, false);
132
- view.setUint16(114, 0, false);
133
- bytes.set(contentTypeBytes, NATIVE_BYTE_OPEN_FIXED_HEADER_BYTES);
134
- return bytes;
135
- }
136
- case NATIVE_BYTE_FRAME_TYPES.OPEN_ACK: {
137
- const { bytes, view } = createHeader(frameArg.type, frameArg.streamId, NATIVE_BYTE_OPEN_ACK_HEADER_BYTES, 0);
138
- writeSafeU64(view, 32, frameArg.receiveLimitOffset, 'receiveLimitOffset');
139
- writeSafeU64(view, 40, 0, 'reserved');
140
- return bytes;
141
- }
142
- case NATIVE_BYTE_FRAME_TYPES.DATA: {
143
- if (!(frameArg.payload instanceof Uint8Array) || frameArg.payload.byteLength === 0) {
144
- throw new NativeByteProtocolError('DATA payload must be a nonempty Uint8Array');
145
- }
146
- if (frameArg.payload.byteLength > NATIVE_BYTE_MAX_DATA_PAYLOAD_BYTES) {
147
- throw new NativeByteProtocolError(`DATA payload exceeds ${NATIVE_BYTE_MAX_DATA_PAYLOAD_BYTES} bytes`);
148
- }
149
- if (!Number.isSafeInteger(frameArg.sequence) || frameArg.sequence < 0 || frameArg.sequence > 0xffffffff) {
150
- throw new NativeByteProtocolError('DATA sequence must be an unsigned 32-bit integer');
151
- }
152
- const { bytes, view } = createHeader(frameArg.type, frameArg.streamId, NATIVE_BYTE_DATA_HEADER_BYTES, frameArg.payload.byteLength);
153
- view.setUint32(32, frameArg.sequence, false);
154
- view.setUint32(36, 0, false);
155
- writeSafeU64(view, 40, frameArg.offset, 'offset');
156
- bytes.set(frameArg.payload, NATIVE_BYTE_DATA_HEADER_BYTES);
157
- return bytes;
158
- }
159
- case NATIVE_BYTE_FRAME_TYPES.ACK: {
160
- const { bytes, view } = createHeader(frameArg.type, frameArg.streamId, NATIVE_BYTE_ACK_HEADER_BYTES, 0);
161
- writeSafeU64(view, 32, frameArg.acknowledgedOffset, 'acknowledgedOffset');
162
- writeSafeU64(view, 40, frameArg.receiveLimitOffset, 'receiveLimitOffset');
163
- return bytes;
164
- }
165
- case NATIVE_BYTE_FRAME_TYPES.FIN:
166
- case NATIVE_BYTE_FRAME_TYPES.FIN_ACK: {
167
- const headerLength = frameArg.type === NATIVE_BYTE_FRAME_TYPES.FIN
168
- ? NATIVE_BYTE_FIN_HEADER_BYTES
169
- : NATIVE_BYTE_FIN_ACK_HEADER_BYTES;
170
- const { bytes, view } = createHeader(frameArg.type, frameArg.streamId, headerLength, 0);
171
- writeSafeU64(view, 32, frameArg.byteLength, 'byteLength');
172
- bytes.set(digestToBytes(frameArg.sha256), 40);
173
- return bytes;
174
- }
175
- case NATIVE_BYTE_FRAME_TYPES.RESET: {
176
- if (!Number.isSafeInteger(frameArg.code) || frameArg.code <= 0 || frameArg.code > 0xffff) {
177
- throw new NativeByteProtocolError('RESET code must be a nonzero unsigned 16-bit integer');
178
- }
179
- if (typeof frameArg.reason !== 'string') {
180
- throw new NativeByteProtocolError('RESET reason must be a string');
181
- }
182
- const reasonBytes = textEncoder.encode(frameArg.reason);
183
- if (reasonBytes.byteLength > NATIVE_BYTE_MAX_RESET_REASON_BYTES) {
184
- throw new NativeByteProtocolError(`RESET reason exceeds ${NATIVE_BYTE_MAX_RESET_REASON_BYTES} UTF-8 bytes`);
185
- }
186
- const headerLength = NATIVE_BYTE_RESET_FIXED_HEADER_BYTES + reasonBytes.byteLength;
187
- const { bytes, view } = createHeader(frameArg.type, frameArg.streamId, headerLength, 0);
188
- view.setUint16(32, frameArg.code, false);
189
- view.setUint16(34, reasonBytes.byteLength, false);
190
- view.setUint32(36, 0, false);
191
- bytes.set(reasonBytes, NATIVE_BYTE_RESET_FIXED_HEADER_BYTES);
192
- return bytes;
193
- }
194
- }
195
- }
196
- function assertExactHeaderAndPayload(headerLengthArg, expectedHeaderLengthArg, payloadLengthArg, expectedPayloadLengthArg) {
197
- if (headerLengthArg !== expectedHeaderLengthArg || payloadLengthArg !== expectedPayloadLengthArg) {
198
- throw new NativeByteProtocolError('frame has an invalid header or payload length');
199
- }
200
- }
201
- export function decodeNativeByteFrame(bytesArg) {
202
- if (!(bytesArg instanceof Uint8Array)) {
203
- throw new NativeByteProtocolError('frame must be a Uint8Array');
204
- }
205
- if (bytesArg.byteLength < NATIVE_BYTE_COMMON_HEADER_BYTES || bytesArg.byteLength > NATIVE_BYTE_MAX_FRAME_BYTES) {
206
- throw new NativeByteProtocolError('frame length is outside native-byte-v1 bounds');
207
- }
208
- if (decodeUtf8(bytesArg.subarray(0, 4), 'frame magic') !== NATIVE_BYTE_FRAME_MAGIC) {
209
- throw new NativeByteProtocolError('frame magic is not TSB1');
210
- }
211
- const view = new DataView(bytesArg.buffer, bytesArg.byteOffset, bytesArg.byteLength);
212
- const type = view.getUint8(4);
213
- if (view.getUint8(5) !== 0 || view.getUint32(28, false) !== 0) {
214
- throw new NativeByteProtocolError('frame contains nonzero reserved flags or bytes');
215
- }
216
- const headerLength = view.getUint16(6, false);
217
- const payloadLength = view.getUint32(24, false);
218
- if (headerLength < NATIVE_BYTE_COMMON_HEADER_BYTES
219
- || headerLength > bytesArg.byteLength
220
- || headerLength + payloadLength !== bytesArg.byteLength) {
221
- throw new NativeByteProtocolError('frame length fields do not match the WebSocket message');
222
- }
223
- const streamId = bytesToStreamId(bytesArg.subarray(8, 24));
224
- switch (type) {
225
- case NATIVE_BYTE_FRAME_TYPES.OPEN: {
226
- if (headerLength < NATIVE_BYTE_OPEN_FIXED_HEADER_BYTES || payloadLength !== 0) {
227
- throw new NativeByteProtocolError('OPEN frame has invalid lengths');
228
- }
229
- if (view.getUint16(114, false) !== 0) {
230
- throw new NativeByteProtocolError('OPEN frame contains nonzero reserved bytes');
231
- }
232
- const contentTypeLength = view.getUint16(112, false);
233
- if (contentTypeLength === 0
234
- || contentTypeLength > NATIVE_BYTE_MAX_CONTENT_TYPE_BYTES
235
- || headerLength !== NATIVE_BYTE_OPEN_FIXED_HEADER_BYTES + contentTypeLength) {
236
- throw new NativeByteProtocolError('OPEN contentType length is invalid');
237
- }
238
- const frame = {
239
- type,
240
- streamId,
241
- capability: normalizeNativeByteCapability(bytesToHex(bytesArg.subarray(32, 64))),
242
- byteLength: readSafeU64(view, 64, 'byteLength'),
243
- initialWindowBytes: assertNativeByteWindow(readSafeU64(view, 72, 'initialWindowBytes'), 'initialWindowBytes'),
244
- sha256: bytesToDigest(bytesArg.subarray(80, 112)),
245
- contentType: normalizeNativeByteContentType(decodeUtf8(bytesArg.subarray(NATIVE_BYTE_OPEN_FIXED_HEADER_BYTES, headerLength), 'OPEN contentType')),
246
- };
247
- return frame;
248
- }
249
- case NATIVE_BYTE_FRAME_TYPES.OPEN_ACK: {
250
- assertExactHeaderAndPayload(headerLength, NATIVE_BYTE_OPEN_ACK_HEADER_BYTES, payloadLength, 0);
251
- if (readSafeU64(view, 40, 'reserved') !== 0) {
252
- throw new NativeByteProtocolError('OPEN_ACK contains nonzero reserved bytes');
253
- }
254
- const frame = {
255
- type,
256
- streamId,
257
- receiveLimitOffset: readSafeU64(view, 32, 'receiveLimitOffset'),
258
- };
259
- return frame;
260
- }
261
- case NATIVE_BYTE_FRAME_TYPES.DATA: {
262
- if (headerLength !== NATIVE_BYTE_DATA_HEADER_BYTES
263
- || payloadLength === 0
264
- || payloadLength > NATIVE_BYTE_MAX_DATA_PAYLOAD_BYTES) {
265
- throw new NativeByteProtocolError('DATA frame has invalid lengths');
266
- }
267
- if (view.getUint32(36, false) !== 0) {
268
- throw new NativeByteProtocolError('DATA contains nonzero reserved bytes');
269
- }
270
- const frame = {
271
- type,
272
- streamId,
273
- sequence: view.getUint32(32, false),
274
- offset: readSafeU64(view, 40, 'offset'),
275
- payload: bytesArg.subarray(headerLength),
276
- };
277
- return frame;
278
- }
279
- case NATIVE_BYTE_FRAME_TYPES.ACK: {
280
- assertExactHeaderAndPayload(headerLength, NATIVE_BYTE_ACK_HEADER_BYTES, payloadLength, 0);
281
- const frame = {
282
- type,
283
- streamId,
284
- acknowledgedOffset: readSafeU64(view, 32, 'acknowledgedOffset'),
285
- receiveLimitOffset: readSafeU64(view, 40, 'receiveLimitOffset'),
286
- };
287
- return frame;
288
- }
289
- case NATIVE_BYTE_FRAME_TYPES.FIN:
290
- case NATIVE_BYTE_FRAME_TYPES.FIN_ACK: {
291
- const expectedHeader = type === NATIVE_BYTE_FRAME_TYPES.FIN
292
- ? NATIVE_BYTE_FIN_HEADER_BYTES
293
- : NATIVE_BYTE_FIN_ACK_HEADER_BYTES;
294
- assertExactHeaderAndPayload(headerLength, expectedHeader, payloadLength, 0);
295
- const byteLength = readSafeU64(view, 32, 'byteLength');
296
- const sha256 = bytesToDigest(bytesArg.subarray(40, 72));
297
- if (type === NATIVE_BYTE_FRAME_TYPES.FIN) {
298
- const frame = { type, streamId, byteLength, sha256 };
299
- return frame;
300
- }
301
- const frame = { type, streamId, byteLength, sha256 };
302
- return frame;
303
- }
304
- case NATIVE_BYTE_FRAME_TYPES.RESET: {
305
- if (headerLength < NATIVE_BYTE_RESET_FIXED_HEADER_BYTES || payloadLength !== 0) {
306
- throw new NativeByteProtocolError('RESET frame has invalid lengths');
307
- }
308
- const code = view.getUint16(32, false);
309
- const reasonLength = view.getUint16(34, false);
310
- if (code === 0
311
- || view.getUint32(36, false) !== 0
312
- || reasonLength > NATIVE_BYTE_MAX_RESET_REASON_BYTES
313
- || headerLength !== NATIVE_BYTE_RESET_FIXED_HEADER_BYTES + reasonLength) {
314
- throw new NativeByteProtocolError('RESET frame has invalid code, reserved bytes, or reason length');
315
- }
316
- const frame = {
317
- type,
318
- streamId,
319
- code,
320
- reason: decodeUtf8(bytesArg.subarray(NATIVE_BYTE_RESET_FIXED_HEADER_BYTES, headerLength), 'RESET reason'),
321
- };
322
- return frame;
323
- }
324
- default:
325
- throw new NativeByteProtocolError(`unknown native-byte-v1 frame type ${type}`);
326
- }
327
- }
328
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlYnl0ZXMuY29kZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9uYXRpdmVieXRlcy5jb2RlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLCtCQUErQixFQUMvQiw2QkFBNkIsRUFDN0IsZ0NBQWdDLEVBQ2hDLDRCQUE0QixFQUM1Qix1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLGtDQUFrQyxFQUNsQyxrQ0FBa0MsRUFDbEMsMkJBQTJCLEVBQzNCLGtDQUFrQyxFQUNsQyw0QkFBNEIsRUFDNUIsNEJBQTRCLEVBQzVCLGlDQUFpQyxFQUNqQyxtQ0FBbUMsRUFDbkMsb0NBQW9DLEdBQ3JDLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFZbEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUN0QyxNQUFNLGdCQUFnQixHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sZUFBZSxHQUFHLGdFQUFnRSxDQUFDO0FBQ3pGLE1BQU0saUJBQWlCLEdBQUcsZ0JBQWdCLENBQUM7QUFDM0MsTUFBTSxhQUFhLEdBQUcsdUJBQXVCLENBQUM7QUFDOUMsTUFBTSxrQkFBa0IsR0FBRyw0REFBNEQsQ0FBQztBQUV4RixTQUFTLFVBQVUsQ0FBQyxRQUFvQixFQUFFLE9BQWU7SUFDdkQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUFDLE9BQU8sUUFBUSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLHVCQUF1QixDQUFDLEdBQUcsT0FBTywyQkFBMkIsRUFBRTtZQUN2RSxLQUFLLEVBQUUsUUFBUTtTQUNoQixDQUFDLENBQUM7SUFDTCxDQUFD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
@@ -1,26 +0,0 @@
1
- export class NativeByteError extends Error {
2
- constructor(messageArg, code, optionsArg) {
3
- super(messageArg, optionsArg);
4
- this.code = code;
5
- this.name = 'NativeByteError';
6
- }
7
- }
8
- export class NativeByteProtocolError extends NativeByteError {
9
- constructor(messageArg, optionsArg) {
10
- super(messageArg, 'NATIVE_BYTE_PROTOCOL_ERROR', optionsArg);
11
- this.name = 'NativeByteProtocolError';
12
- }
13
- }
14
- export class NativeByteCapabilityError extends NativeByteError {
15
- constructor(messageArg = 'native-byte-v1 is unavailable', optionsArg) {
16
- super(messageArg, 'NATIVE_BYTE_CAPABILITY_UNAVAILABLE', optionsArg);
17
- this.name = 'NativeByteCapabilityError';
18
- }
19
- }
20
- export class NativeByteStreamClosedError extends NativeByteError {
21
- constructor(messageArg = 'Native byte stream is closed', optionsArg) {
22
- super(messageArg, 'NATIVE_BYTE_STREAM_CLOSED', optionsArg);
23
- this.name = 'NativeByteStreamClosedError';
24
- }
25
- }
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlYnl0ZXMuZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvbmF0aXZlYnl0ZXMuZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxlQUFnQixTQUFRLEtBQUs7SUFDeEMsWUFDRSxVQUFrQixFQUNGLElBQVksRUFDNUIsVUFBeUI7UUFFekIsS0FBSyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUhkLFNBQUksR0FBSixJQUFJLENBQVE7UUFJNUIsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsZUFBZTtJQUMxRCxZQUFZLFVBQWtCLEVBQUUsVUFBeUI7UUFDdkQsS0FBSyxDQUFDLFVBQVUsRUFBRSw0QkFBNEIsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsSUFBSSxHQUFHLHlCQUF5QixDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxlQUFlO0lBQzVELFlBQVksVUFBVSxHQUFHLCtCQUErQixFQUFFLFVBQXlCO1FBQ2pGLEtBQUssQ0FBQyxVQUFVLEVBQUUsb0NBQW9DLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLElBQUksR0FBRywyQkFBMkIsQ0FBQztJQUMxQyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsZUFBZTtJQUM5RCxZQUFZLFVBQVUsR0FBRyw4QkFBOEIsRUFBRSxVQUF5QjtRQUNoRixLQUFLLENBQUMsVUFBVSxFQUFFLDJCQUEyQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxJQUFJLEdBQUcsNkJBQTZCLENBQUM7SUFDNUMsQ0FBQztDQUNGIn0=