@api.global/typedsocket 5.1.2 → 6.0.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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@api.global/typedsocket',
6
- version: '5.1.2',
6
+ version: '6.0.0',
7
7
  description: 'A library for creating typed WebSocket connections, supporting bi-directional communication with type safety.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx5QkFBeUI7SUFDL0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLCtHQUErRztDQUM3SCxDQUFBIn0=
@@ -1 +1,8 @@
1
1
  export * from './typedsocket.classes.typedsocket.js';
2
+ export { NATIVE_BYTE_PROTOCOL, NATIVE_BYTE_PROTOCOL_MAJOR, NATIVE_BYTE_MAX_FRAME_BYTES, NATIVE_BYTE_MAX_DATA_PAYLOAD_BYTES, NATIVE_BYTE_MAX_STREAM_BYTES, NATIVE_BYTE_DEFAULT_INITIAL_WINDOW_BYTES, NATIVE_BYTE_MAX_WINDOW_BYTES, NATIVE_BYTE_MAX_QUEUED_PAYLOAD_BYTES_PER_STREAM, NATIVE_BYTE_MAX_QUEUED_PAYLOAD_BYTES_PER_CONNECTION, NATIVE_BYTE_MAX_RECEIVE_QUEUE_CHUNKS, NATIVE_BYTE_MAX_STREAMS_PER_CONNECTION, NATIVE_BYTE_MAX_PENDING_DATA_OPERATIONS_PER_CONNECTION, NATIVE_BYTE_MAX_RAW_QUEUE_FRAMES, NATIVE_BYTE_MAX_RAW_QUEUE_BYTES, NATIVE_BYTE_GRANT_OPEN_TIMEOUT_MS, NATIVE_BYTE_PROGRESS_TIMEOUT_MS, NATIVE_BYTE_TOMBSTONE_RETENTION_MS, NATIVE_BYTE_MAX_TOMBSTONES, NATIVE_BYTE_MAX_PRINCIPAL_ID_BYTES, NATIVE_BYTE_MAX_AUTHORITY_REVISION_BYTES, NATIVE_BYTE_REVALIDATION_TIMEOUT_MS, NATIVE_BYTE_MAX_REVALIDATIONS_PER_PEER, NATIVE_BYTE_MAX_REVALIDATIONS_PER_PRINCIPAL, NATIVE_BYTE_MAX_REVALIDATIONS_PER_SERVER, NATIVE_BYTE_MAX_CONNECTIONS_PER_SERVER, NATIVE_BYTE_MAX_STREAMS_PER_SERVER, NATIVE_BYTE_MAX_RETAINED_BYTES_PER_SERVER, } from './nativebytes.constants.js';
3
+ export type { TNativeByteCapabilityMode, TNativeByteRole, TNativeByteAuthorityOperation, INativeByteDescriptorTransport, INativeByteDescriptor, INativeByteReceipt, INativeByteAuthorizationBinding, INativeByteAuthorizationContext, INativeByteAuthorizationAdapter, INativeByteCreateVirtualStreamOptions, INativeByteAuthorityRevisions, TNativeByteConnectionBinding, INativeByteRevalidationContext, TNativeByteRevalidate, INativeByteCreateReceiveGrantOptions, INativeByteOpenSenderOptions, INativeByteReceiveGrant, INativeByteReceiverLike, INativeByteSenderLike, INativeByteCapabilityStatus, INativeByteStats, INativeByteRuntime, } from './nativebytes.types.js';
4
+ export * from './nativebytes.errors.js';
5
+ export { NativeByteManager, NativeByteReceiver, NativeByteSender, } from './nativebytes.manager.js';
6
+ export type { INativeByteManagerOptions } from './nativebytes.manager.js';
7
+ export { TYPEDSOCKET_MAX_TAG_NAME_BYTES, TYPEDSOCKET_MAX_TAG_PAYLOAD_BYTES, TYPEDSOCKET_MAX_CLIENT_TAGS_PER_PEER, TYPEDSOCKET_MAX_CLIENT_TAG_RETAINED_BYTES_PER_PEER, TYPEDSOCKET_MAX_RETAINED_TAG_MUTATIONS_PER_PEER, TYPEDSOCKET_MAX_RETAINED_TAG_MUTATIONS_PER_RULE, TYPEDSOCKET_MAX_RETAINED_TAG_MUTATIONS_PER_SERVER, TYPEDSOCKET_MAX_TAG_AUTHORIZATION_TIMEOUT_MS, TYPEDSOCKET_MAX_SERVER_TAG_NAMES_PER_PEER, TYPEDSOCKET_MAX_SERVER_TAG_RETAINED_BYTES_PER_PEER, TypedSocketClientTagDeniedError, } from './typedsocket.tags.js';
8
+ export type { TTypedSocketTagOwner, TTypedSocketTagMutationOperation, TTypedSocketTagDenialCode, ITypedSocketTagConnectionAuthority, ITypedSocketClientTagExistingState, ITypedSocketClientTagValidationContext, ITypedSocketClientTagRule, ITypedSocketClientTagPolicy, ITypedSocketTagMutationSuccess, ITypedSocketTagMutationDenial, TTypedSocketTagMutationResponse, } from './typedsocket.tags.js';
package/dist_ts/index.js CHANGED
@@ -1,2 +1,6 @@
1
1
  export * from './typedsocket.classes.typedsocket.js';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNDQUFzQyxDQUFDIn0=
2
+ export { NATIVE_BYTE_PROTOCOL, NATIVE_BYTE_PROTOCOL_MAJOR, NATIVE_BYTE_MAX_FRAME_BYTES, NATIVE_BYTE_MAX_DATA_PAYLOAD_BYTES, NATIVE_BYTE_MAX_STREAM_BYTES, NATIVE_BYTE_DEFAULT_INITIAL_WINDOW_BYTES, NATIVE_BYTE_MAX_WINDOW_BYTES, NATIVE_BYTE_MAX_QUEUED_PAYLOAD_BYTES_PER_STREAM, NATIVE_BYTE_MAX_QUEUED_PAYLOAD_BYTES_PER_CONNECTION, NATIVE_BYTE_MAX_RECEIVE_QUEUE_CHUNKS, NATIVE_BYTE_MAX_STREAMS_PER_CONNECTION, NATIVE_BYTE_MAX_PENDING_DATA_OPERATIONS_PER_CONNECTION, NATIVE_BYTE_MAX_RAW_QUEUE_FRAMES, NATIVE_BYTE_MAX_RAW_QUEUE_BYTES, NATIVE_BYTE_GRANT_OPEN_TIMEOUT_MS, NATIVE_BYTE_PROGRESS_TIMEOUT_MS, NATIVE_BYTE_TOMBSTONE_RETENTION_MS, NATIVE_BYTE_MAX_TOMBSTONES, NATIVE_BYTE_MAX_PRINCIPAL_ID_BYTES, NATIVE_BYTE_MAX_AUTHORITY_REVISION_BYTES, NATIVE_BYTE_REVALIDATION_TIMEOUT_MS, NATIVE_BYTE_MAX_REVALIDATIONS_PER_PEER, NATIVE_BYTE_MAX_REVALIDATIONS_PER_PRINCIPAL, NATIVE_BYTE_MAX_REVALIDATIONS_PER_SERVER, NATIVE_BYTE_MAX_CONNECTIONS_PER_SERVER, NATIVE_BYTE_MAX_STREAMS_PER_SERVER, NATIVE_BYTE_MAX_RETAINED_BYTES_PER_SERVER, } from './nativebytes.constants.js';
3
+ export * from './nativebytes.errors.js';
4
+ export { NativeByteManager, NativeByteReceiver, NativeByteSender, } from './nativebytes.manager.js';
5
+ export { TYPEDSOCKET_MAX_TAG_NAME_BYTES, TYPEDSOCKET_MAX_TAG_PAYLOAD_BYTES, TYPEDSOCKET_MAX_CLIENT_TAGS_PER_PEER, TYPEDSOCKET_MAX_CLIENT_TAG_RETAINED_BYTES_PER_PEER, TYPEDSOCKET_MAX_RETAINED_TAG_MUTATIONS_PER_PEER, TYPEDSOCKET_MAX_RETAINED_TAG_MUTATIONS_PER_RULE, TYPEDSOCKET_MAX_RETAINED_TAG_MUTATIONS_PER_SERVER, TYPEDSOCKET_MAX_TAG_AUTHORIZATION_TIMEOUT_MS, TYPEDSOCKET_MAX_SERVER_TAG_NAMES_PER_PEER, TYPEDSOCKET_MAX_SERVER_TAG_RETAINED_BYTES_PER_PEER, TypedSocketClientTagDeniedError, } from './typedsocket.tags.js';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsMEJBQTBCLEVBQzFCLDJCQUEyQixFQUMzQixrQ0FBa0MsRUFDbEMsNEJBQTRCLEVBQzVCLHdDQUF3QyxFQUN4Qyw0QkFBNEIsRUFDNUIsK0NBQStDLEVBQy9DLG1EQUFtRCxFQUNuRCxvQ0FBb0MsRUFDcEMsc0NBQXNDLEVBQ3RDLHNEQUFzRCxFQUN0RCxnQ0FBZ0MsRUFDaEMsK0JBQStCLEVBQy9CLGlDQUFpQyxFQUNqQywrQkFBK0IsRUFDL0Isa0NBQWtDLEVBQ2xDLDBCQUEwQixFQUMxQixrQ0FBa0MsRUFDbEMsd0NBQXdDLEVBQ3hDLG1DQUFtQyxFQUNuQyxzQ0FBc0MsRUFDdEMsMkNBQTJDLEVBQzNDLHdDQUF3QyxFQUN4QyxzQ0FBc0MsRUFDdEMsa0NBQWtDLEVBQ2xDLHlDQUF5QyxHQUMxQyxNQUFNLDRCQUE0QixDQUFDO0FBeUJwQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLGdCQUFnQixHQUNqQixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsaUNBQWlDLEVBQ2pDLG9DQUFvQyxFQUNwQyxrREFBa0QsRUFDbEQsK0NBQStDLEVBQy9DLCtDQUErQyxFQUMvQyxpREFBaUQsRUFDakQsNENBQTRDLEVBQzVDLHlDQUF5QyxFQUN6QyxrREFBa0QsRUFDbEQsK0JBQStCLEdBQ2hDLE1BQU0sdUJBQXVCLENBQUMifQ==
@@ -0,0 +1,8 @@
1
+ import type { TNativeByteFrame } from './nativebytes.types.js';
2
+ export declare function assertNativeByteLength(valueArg: unknown, nameArg?: string): number;
3
+ export declare function normalizeNativeByteSha256(valueArg: unknown): string;
4
+ export declare function normalizeNativeByteContentType(valueArg: unknown): string;
5
+ export declare function normalizeNativeByteStreamId(valueArg: unknown): string;
6
+ export declare function normalizeNativeByteCapability(valueArg: unknown): string;
7
+ export declare function encodeNativeByteFrame(frameArg: TNativeByteFrame): Uint8Array<ArrayBuffer>;
8
+ export declare function decodeNativeByteFrame(bytesArg: Uint8Array): TNativeByteFrame;
@@ -0,0 +1,328 @@
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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
@@ -0,0 +1,59 @@
1
+ export declare const NATIVE_BYTE_PROTOCOL: "native-byte-v1";
2
+ export declare const NATIVE_BYTE_PROTOCOL_MAJOR: 6;
3
+ export declare const NATIVE_BYTE_FRAME_MAGIC: "TSB1";
4
+ export declare const NATIVE_BYTE_FRAME_TYPES: {
5
+ readonly OPEN: 1;
6
+ readonly OPEN_ACK: 2;
7
+ readonly DATA: 3;
8
+ readonly ACK: 4;
9
+ readonly FIN: 5;
10
+ readonly FIN_ACK: 6;
11
+ readonly RESET: 7;
12
+ };
13
+ export declare const NATIVE_BYTE_RESET_CODES: {
14
+ readonly PROTOCOL_ERROR: 1;
15
+ readonly CAPABILITY_REJECTED: 2;
16
+ readonly RESOURCE_LIMIT: 3;
17
+ readonly TIMEOUT: 4;
18
+ readonly ABORTED: 5;
19
+ readonly INTEGRITY_ERROR: 6;
20
+ readonly AUTHORITY_REVOKED: 7;
21
+ readonly INTERNAL_ERROR: 8;
22
+ };
23
+ export declare const NATIVE_BYTE_COMMON_HEADER_BYTES = 32;
24
+ export declare const NATIVE_BYTE_OPEN_FIXED_HEADER_BYTES = 116;
25
+ export declare const NATIVE_BYTE_OPEN_ACK_HEADER_BYTES = 48;
26
+ export declare const NATIVE_BYTE_DATA_HEADER_BYTES = 48;
27
+ export declare const NATIVE_BYTE_ACK_HEADER_BYTES = 48;
28
+ export declare const NATIVE_BYTE_FIN_HEADER_BYTES = 72;
29
+ export declare const NATIVE_BYTE_FIN_ACK_HEADER_BYTES = 72;
30
+ export declare const NATIVE_BYTE_RESET_FIXED_HEADER_BYTES = 40;
31
+ export declare const NATIVE_BYTE_MAX_FRAME_BYTES: number;
32
+ export declare const NATIVE_BYTE_MAX_DATA_PAYLOAD_BYTES: number;
33
+ export declare const NATIVE_BYTE_MAX_STREAM_BYTES: number;
34
+ export declare const NATIVE_BYTE_MAX_CONTENT_TYPE_BYTES = 255;
35
+ export declare const NATIVE_BYTE_MAX_RESET_REASON_BYTES = 256;
36
+ export declare const NATIVE_BYTE_DEFAULT_INITIAL_WINDOW_BYTES: number;
37
+ export declare const NATIVE_BYTE_MAX_WINDOW_BYTES: number;
38
+ export declare const NATIVE_BYTE_MAX_QUEUED_PAYLOAD_BYTES_PER_STREAM: number;
39
+ export declare const NATIVE_BYTE_MAX_QUEUED_PAYLOAD_BYTES_PER_CONNECTION: number;
40
+ export declare const NATIVE_BYTE_MAX_RECEIVE_QUEUE_CHUNKS = 4096;
41
+ export declare const NATIVE_BYTE_MAX_STREAMS_PER_CONNECTION = 32;
42
+ export declare const NATIVE_BYTE_MAX_PENDING_DATA_OPERATIONS_PER_CONNECTION = 64;
43
+ export declare const NATIVE_BYTE_MAX_RAW_QUEUE_FRAMES = 64;
44
+ export declare const NATIVE_BYTE_MAX_RAW_QUEUE_BYTES: number;
45
+ export declare const NATIVE_BYTE_GRANT_OPEN_TIMEOUT_MS = 10000;
46
+ export declare const NATIVE_BYTE_PROGRESS_TIMEOUT_MS = 30000;
47
+ export declare const NATIVE_BYTE_TOMBSTONE_RETENTION_MS = 60000;
48
+ export declare const NATIVE_BYTE_MAX_TOMBSTONES = 64;
49
+ export declare const NATIVE_BYTE_MAX_PRINCIPAL_ID_BYTES = 256;
50
+ export declare const NATIVE_BYTE_MAX_AUTHORITY_REVISION_BYTES = 256;
51
+ export declare const NATIVE_BYTE_REVALIDATION_TIMEOUT_MS = 5000;
52
+ export declare const NATIVE_BYTE_MAX_REVALIDATIONS_PER_PEER = 4;
53
+ export declare const NATIVE_BYTE_MAX_REVALIDATIONS_PER_PRINCIPAL = 16;
54
+ export declare const NATIVE_BYTE_MAX_REVALIDATIONS_PER_SERVER = 128;
55
+ export declare const NATIVE_BYTE_MAX_CONNECTIONS_PER_SERVER = 1024;
56
+ export declare const NATIVE_BYTE_MAX_STREAMS_PER_SERVER = 1024;
57
+ export declare const NATIVE_BYTE_MAX_RETAINED_BYTES_PER_SERVER: number;
58
+ export type TNativeByteFrameType = (typeof NATIVE_BYTE_FRAME_TYPES)[keyof typeof NATIVE_BYTE_FRAME_TYPES];
59
+ export type TNativeByteResetCode = (typeof NATIVE_BYTE_RESET_CODES)[keyof typeof NATIVE_BYTE_RESET_CODES];
@@ -0,0 +1,58 @@
1
+ export const NATIVE_BYTE_PROTOCOL = 'native-byte-v1';
2
+ export const NATIVE_BYTE_PROTOCOL_MAJOR = 6;
3
+ export const NATIVE_BYTE_FRAME_MAGIC = 'TSB1';
4
+ export const NATIVE_BYTE_FRAME_TYPES = {
5
+ OPEN: 1,
6
+ OPEN_ACK: 2,
7
+ DATA: 3,
8
+ ACK: 4,
9
+ FIN: 5,
10
+ FIN_ACK: 6,
11
+ RESET: 7,
12
+ };
13
+ export const NATIVE_BYTE_RESET_CODES = {
14
+ PROTOCOL_ERROR: 1,
15
+ CAPABILITY_REJECTED: 2,
16
+ RESOURCE_LIMIT: 3,
17
+ TIMEOUT: 4,
18
+ ABORTED: 5,
19
+ INTEGRITY_ERROR: 6,
20
+ AUTHORITY_REVOKED: 7,
21
+ INTERNAL_ERROR: 8,
22
+ };
23
+ export const NATIVE_BYTE_COMMON_HEADER_BYTES = 32;
24
+ export const NATIVE_BYTE_OPEN_FIXED_HEADER_BYTES = 116;
25
+ export const NATIVE_BYTE_OPEN_ACK_HEADER_BYTES = 48;
26
+ export const NATIVE_BYTE_DATA_HEADER_BYTES = 48;
27
+ export const NATIVE_BYTE_ACK_HEADER_BYTES = 48;
28
+ export const NATIVE_BYTE_FIN_HEADER_BYTES = 72;
29
+ export const NATIVE_BYTE_FIN_ACK_HEADER_BYTES = 72;
30
+ export const NATIVE_BYTE_RESET_FIXED_HEADER_BYTES = 40;
31
+ export const NATIVE_BYTE_MAX_FRAME_BYTES = 32 * 1024;
32
+ export const NATIVE_BYTE_MAX_DATA_PAYLOAD_BYTES = NATIVE_BYTE_MAX_FRAME_BYTES - NATIVE_BYTE_DATA_HEADER_BYTES;
33
+ export const NATIVE_BYTE_MAX_STREAM_BYTES = NATIVE_BYTE_MAX_DATA_PAYLOAD_BYTES * 0x1_0000_0000;
34
+ export const NATIVE_BYTE_MAX_CONTENT_TYPE_BYTES = 255;
35
+ export const NATIVE_BYTE_MAX_RESET_REASON_BYTES = 256;
36
+ export const NATIVE_BYTE_DEFAULT_INITIAL_WINDOW_BYTES = 256 * 1024;
37
+ export const NATIVE_BYTE_MAX_WINDOW_BYTES = 1024 * 1024;
38
+ export const NATIVE_BYTE_MAX_QUEUED_PAYLOAD_BYTES_PER_STREAM = 1024 * 1024;
39
+ export const NATIVE_BYTE_MAX_QUEUED_PAYLOAD_BYTES_PER_CONNECTION = 8 * 1024 * 1024;
40
+ export const NATIVE_BYTE_MAX_RECEIVE_QUEUE_CHUNKS = 4096;
41
+ export const NATIVE_BYTE_MAX_STREAMS_PER_CONNECTION = 32;
42
+ export const NATIVE_BYTE_MAX_PENDING_DATA_OPERATIONS_PER_CONNECTION = 64;
43
+ export const NATIVE_BYTE_MAX_RAW_QUEUE_FRAMES = 64;
44
+ export const NATIVE_BYTE_MAX_RAW_QUEUE_BYTES = 2 * 1024 * 1024;
45
+ export const NATIVE_BYTE_GRANT_OPEN_TIMEOUT_MS = 10_000;
46
+ export const NATIVE_BYTE_PROGRESS_TIMEOUT_MS = 30_000;
47
+ export const NATIVE_BYTE_TOMBSTONE_RETENTION_MS = 60_000;
48
+ export const NATIVE_BYTE_MAX_TOMBSTONES = 64;
49
+ export const NATIVE_BYTE_MAX_PRINCIPAL_ID_BYTES = 256;
50
+ export const NATIVE_BYTE_MAX_AUTHORITY_REVISION_BYTES = 256;
51
+ export const NATIVE_BYTE_REVALIDATION_TIMEOUT_MS = 5_000;
52
+ export const NATIVE_BYTE_MAX_REVALIDATIONS_PER_PEER = 4;
53
+ export const NATIVE_BYTE_MAX_REVALIDATIONS_PER_PRINCIPAL = 16;
54
+ export const NATIVE_BYTE_MAX_REVALIDATIONS_PER_SERVER = 128;
55
+ export const NATIVE_BYTE_MAX_CONNECTIONS_PER_SERVER = 1_024;
56
+ export const NATIVE_BYTE_MAX_STREAMS_PER_SERVER = 1_024;
57
+ export const NATIVE_BYTE_MAX_RETAINED_BYTES_PER_SERVER = 64 * 1024 * 1024;
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlYnl0ZXMuY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvbmF0aXZlYnl0ZXMuY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGdCQUF5QixDQUFDO0FBQzlELE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLENBQVUsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxNQUFlLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUc7SUFDckMsSUFBSSxFQUFFLENBQUM7SUFDUCxRQUFRLEVBQUUsQ0FBQztJQUNYLElBQUksRUFBRSxDQUFDO0lBQ1AsR0FBRyxFQUFFLENBQUM7SUFDTixHQUFHLEVBQUUsQ0FBQztJQUNOLE9BQU8sRUFBRSxDQUFDO0lBQ1YsS0FBSyxFQUFFLENBQUM7Q0FDQSxDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUc7SUFDckMsY0FBYyxFQUFFLENBQUM7SUFDakIsbUJBQW1CLEVBQUUsQ0FBQztJQUN0QixjQUFjLEVBQUUsQ0FBQztJQUNqQixPQUFPLEVBQUUsQ0FBQztJQUNWLE9BQU8sRUFBRSxDQUFDO0lBQ1YsZUFBZSxFQUFFLENBQUM7SUFDbEIsaUJBQWlCLEVBQUUsQ0FBQztJQUNwQixjQUFjLEVBQUUsQ0FBQztDQUNULENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLENBQUM7QUFDbEQsTUFBTSxDQUFDLE1BQU0sbUNBQW1DLEdBQUcsR0FBRyxDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLEVBQUUsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxFQUFFLENBQUM7QUFDaEQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsRUFBRSxDQUFDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLEVBQUUsQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxFQUFFLENBQUM7QUFDbkQsTUFBTSxDQUFDLE1BQU0sb0NBQW9DLEdBQUcsRUFBRSxDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDckQsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQzdDLDJCQUEyQixHQUFHLDZCQUE2QixDQUFDO0FBQzlELE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUN2QyxrQ0FBa0MsR0FBRyxhQUFhLENBQUM7QUFDckQsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQUcsR0FBRyxDQUFDO0FBQ3RELE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLEdBQUcsQ0FBQztBQUV0RCxNQUFNLENBQUMsTUFBTSx3Q0FBd0MsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDeEQsTUFBTSxDQUFDLE1BQU0sK0NBQStDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMzRSxNQUFNLENBQUMsTUFBTSxtREFBbUQsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNuRixNQUFNLENBQUMsTUFBTSxvQ0FBb0MsR0FBRyxJQUFJLENBQUM7QUFDekQsTUFBTSxDQUFDLE1BQU0sc0NBQXNDLEdBQUcsRUFBRSxDQUFDO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLHNEQUFzRCxHQUFHLEVBQUUsQ0FBQztBQUN6RSxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxFQUFFLENBQUM7QUFDbkQsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDL0QsTUFBTSxDQUFDLE1BQU0saUNBQWlDLEdBQUcsTUFBTSxDQUFDO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLE1BQU0sQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxNQUFNLENBQUM7QUFDekQsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsRUFBRSxDQUFDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLEdBQUcsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSx3Q0FBd0MsR0FBRyxHQUFHLENBQUM7QUFDNUQsTUFBTSxDQUFDLE1BQU0sbUNBQW1DLEdBQUcsS0FBSyxDQUFDO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLHNDQUFzQyxHQUFHLENBQUMsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSwyQ0FBMkMsR0FBRyxFQUFFLENBQUM7QUFDOUQsTUFBTSxDQUFDLE1BQU0sd0NBQXdDLEdBQUcsR0FBRyxDQUFDO0FBQzVELE1BQU0sQ0FBQyxNQUFNLHNDQUFzQyxHQUFHLEtBQUssQ0FBQztBQUM1RCxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxLQUFLLENBQUM7QUFDeEQsTUFBTSxDQUFDLE1BQU0seUNBQXlDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMifQ==
@@ -0,0 +1,13 @@
1
+ export declare class NativeByteError extends Error {
2
+ readonly code: string;
3
+ constructor(messageArg: string, code: string, optionsArg?: ErrorOptions);
4
+ }
5
+ export declare class NativeByteProtocolError extends NativeByteError {
6
+ constructor(messageArg: string, optionsArg?: ErrorOptions);
7
+ }
8
+ export declare class NativeByteCapabilityError extends NativeByteError {
9
+ constructor(messageArg?: string, optionsArg?: ErrorOptions);
10
+ }
11
+ export declare class NativeByteStreamClosedError extends NativeByteError {
12
+ constructor(messageArg?: string, optionsArg?: ErrorOptions);
13
+ }
@@ -0,0 +1,26 @@
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=