@api.global/typedsocket 6.0.0 → 6.2.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.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.clienttagreconciler.d.ts +51 -0
- package/dist_ts/classes.clienttagreconciler.js +290 -0
- package/dist_ts/classes.nativebyteerror.js +26 -0
- package/dist_ts/{nativebytes.manager.d.ts → classes.nativebytemanager.d.ts} +8 -3
- package/dist_ts/classes.nativebytemanager.js +2343 -0
- package/dist_ts/{typedsocket.classes.typedsocket.d.ts → classes.typedsocket.d.ts} +21 -21
- package/dist_ts/{typedsocket.classes.typedsocket.js → classes.typedsocket.js} +123 -260
- package/dist_ts/{typedsocket.tags.d.ts → classes.typedsockettagpolicymanager.d.ts} +9 -2
- package/dist_ts/classes.typedsockettagpolicymanager.js +549 -0
- package/dist_ts/{nativebytes.constants.js → constants.nativebytes.js} +1 -1
- package/dist_ts/{nativebytes.codec.d.ts → helpers.nativebytecodec.d.ts} +1 -1
- package/dist_ts/helpers.nativebytecodec.js +328 -0
- package/dist_ts/helpers.websocket.d.ts +8 -0
- package/dist_ts/helpers.websocket.js +13 -0
- package/dist_ts/index.d.ts +9 -8
- package/dist_ts/index.js +6 -6
- package/dist_ts/interfaces.diagnostics.d.ts +73 -0
- package/dist_ts/interfaces.diagnostics.js +2 -0
- package/dist_ts/{nativebytes.types.d.ts → interfaces.nativebytes.d.ts} +2 -2
- package/dist_ts/interfaces.nativebytes.js +2 -0
- package/dist_ts/plugins.js +14 -0
- package/package.json +1 -1
- package/readme.hints.md +26 -1
- package/readme.md +120 -55
- package/dist_ts/nativebytes.codec.js +0 -328
- package/dist_ts/nativebytes.errors.js +0 -26
- package/dist_ts/nativebytes.manager.js +0 -2308
- package/dist_ts/nativebytes.types.js +0 -2
- package/dist_ts/typedsocket.plugins.js +0 -14
- package/dist_ts/typedsocket.tags.js +0 -521
- /package/dist_ts/{nativebytes.errors.d.ts → classes.nativebyteerror.d.ts} +0 -0
- /package/dist_ts/{nativebytes.constants.d.ts → constants.nativebytes.d.ts} +0 -0
- /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
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
an explicit
|
|
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.
|
|
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
|
|
622
|
-
|
|
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=
|