@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.
- 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/classes.typedsocket.js +1733 -0
- 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.classes.typedsocket.js +0 -1874
- 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
|
@@ -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 './constants.nativebytes.js';
|
|
2
|
+
import { NativeByteProtocolError } from './classes.nativebyteerror.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5uYXRpdmVieXRlY29kZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9oZWxwZXJzLm5hdGl2ZWJ5dGVjb2RlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLCtCQUErQixFQUMvQiw2QkFBNkIsRUFDN0IsZ0NBQWdDLEVBQ2hDLDRCQUE0QixFQUM1Qix1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLGtDQUFrQyxFQUNsQyxrQ0FBa0MsRUFDbEMsMkJBQTJCLEVBQzNCLGtDQUFrQyxFQUNsQyw0QkFBNEIsRUFDNUIsNEJBQTRCLEVBQzVCLGlDQUFpQyxFQUNqQyxtQ0FBbUMsRUFDbkMsb0NBQW9DLEdBQ3JDLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFZdkUsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUN0QyxNQUFNLGdCQUFnQixHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sZUFBZSxHQUFHLGdFQUFnRSxDQUFDO0FBQ3pGLE1BQU0saUJBQWlCLEdBQUcsZ0JBQWdCLENBQUM7QUFDM0MsTUFBTSxhQUFhLEdBQUcsdUJBQXVCLENBQUM7QUFDOUMsTUFBTSxrQkFBa0IsR0FBRyw0REFBNEQsQ0FBQztBQUV4RixTQUFTLFVBQVUsQ0FBQyxRQUFvQixFQUFFLE9BQWU7SUFDdkQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUFDLE9BQU8sUUFBUSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLHVCQUF1QixDQUFDLEdBQUcsT0FBTywyQkFBMkIsRUFBRTtZQUN2RSxLQUFLLEVBQUUsUUFBUTtTQUNoQixDQUFDLENB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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The WebSocket JS API only permits close codes 1000 and 3000-4999 from
|
|
3
|
+
* close(); protocol-range invariant codes are mirrored into the application
|
|
4
|
+
* range (1009 -> 4009) so client-initiated closes cannot throw. Server-side
|
|
5
|
+
* peer closes keep the protocol codes, and diagnostics always report the
|
|
6
|
+
* semantic protocol code.
|
|
7
|
+
*/
|
|
8
|
+
export declare function toClientWebSocketCloseCode(codeArg: number): number;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The WebSocket JS API only permits close codes 1000 and 3000-4999 from
|
|
3
|
+
* close(); protocol-range invariant codes are mirrored into the application
|
|
4
|
+
* range (1009 -> 4009) so client-initiated closes cannot throw. Server-side
|
|
5
|
+
* peer closes keep the protocol codes, and diagnostics always report the
|
|
6
|
+
* semantic protocol code.
|
|
7
|
+
*/
|
|
8
|
+
export function toClientWebSocketCloseCode(codeArg) {
|
|
9
|
+
return codeArg === 1000 || (codeArg >= 3000 && codeArg <= 4999)
|
|
10
|
+
? codeArg
|
|
11
|
+
: 3000 + codeArg;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy53ZWJzb2NrZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9oZWxwZXJzLndlYnNvY2tldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsT0FBZTtJQUN4RCxPQUFPLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUM7UUFDN0QsQ0FBQyxDQUFDLE9BQU87UUFDVCxDQUFDLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztBQUNyQixDQUFDIn0=
|
package/dist_ts/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
export * from './
|
|
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.
|
|
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.
|
|
4
|
-
export * from './
|
|
5
|
-
export { NativeByteManager, NativeByteReceiver, NativeByteSender, } from './
|
|
6
|
-
export type { INativeByteManagerOptions } from './
|
|
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 './
|
|
8
|
-
export type {
|
|
1
|
+
export * from './classes.typedsocket.js';
|
|
2
|
+
export { NATIVE_BYTE_PROTOCOL, NATIVE_BYTE_PROTOCOL_MAJOR, NATIVE_BYTE_MAX_FRAME_BYTES, NATIVE_BYTE_MAX_CONTENT_TYPE_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 './constants.nativebytes.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 './interfaces.nativebytes.js';
|
|
4
|
+
export * from './classes.nativebyteerror.js';
|
|
5
|
+
export { NativeByteManager, NativeByteReceiver, NativeByteSender, } from './classes.nativebytemanager.js';
|
|
6
|
+
export type { INativeByteManagerOptions } from './classes.nativebytemanager.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, TYPEDSOCKET_TAG_DENIAL_CODES, TypedSocketClientTagDeniedError, } from './classes.typedsockettagpolicymanager.js';
|
|
8
|
+
export type { TTypedSocketDiagnosticSide, TTypedSocketDiagnosticEvent, TNativeByteDiagnosticEvent, ITypedSocketConnectionClosedDiagnostic, ITypedSocketPeerRejectedDiagnostic, ITypedSocketReconnectScheduledDiagnostic, ITypedSocketReconnectExhaustedDiagnostic, ITypedSocketTagMutationDeniedDiagnostic, ITypedSocketImplicitTargetingDiagnostic, } from './interfaces.diagnostics.js';
|
|
9
|
+
export type { TTypedSocketTagOwner, TTypedSocketTagMutationOperation, TTypedSocketTagDenialCode, ITypedSocketTagConnectionAuthority, ITypedSocketClientTagExistingState, ITypedSocketClientTagValidationContext, ITypedSocketClientTagRule, ITypedSocketClientTagPolicy, ITypedSocketTagMutationSuccess, ITypedSocketTagMutationDenial, TTypedSocketTagMutationResponse, } from './classes.typedsockettagpolicymanager.js';
|
package/dist_ts/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export * from './
|
|
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.
|
|
3
|
-
export * from './
|
|
4
|
-
export { NativeByteManager, NativeByteReceiver, NativeByteSender, } from './
|
|
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 './
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export * from './classes.typedsocket.js';
|
|
2
|
+
export { NATIVE_BYTE_PROTOCOL, NATIVE_BYTE_PROTOCOL_MAJOR, NATIVE_BYTE_MAX_FRAME_BYTES, NATIVE_BYTE_MAX_CONTENT_TYPE_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 './constants.nativebytes.js';
|
|
3
|
+
export * from './classes.nativebyteerror.js';
|
|
4
|
+
export { NativeByteManager, NativeByteReceiver, NativeByteSender, } from './classes.nativebytemanager.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, TYPEDSOCKET_TAG_DENIAL_CODES, TypedSocketClientTagDeniedError, } from './classes.typedsockettagpolicymanager.js';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsMEJBQTBCLEVBQzFCLDJCQUEyQixFQUMzQixrQ0FBa0MsRUFDbEMsa0NBQWtDLEVBQ2xDLDRCQUE0QixFQUM1Qix3Q0FBd0MsRUFDeEMsNEJBQTRCLEVBQzVCLCtDQUErQyxFQUMvQyxtREFBbUQsRUFDbkQsb0NBQW9DLEVBQ3BDLHNDQUFzQyxFQUN0QyxzREFBc0QsRUFDdEQsZ0NBQWdDLEVBQ2hDLCtCQUErQixFQUMvQixpQ0FBaUMsRUFDakMsK0JBQStCLEVBQy9CLGtDQUFrQyxFQUNsQywwQkFBMEIsRUFDMUIsa0NBQWtDLEVBQ2xDLHdDQUF3QyxFQUN4QyxtQ0FBbUMsRUFDbkMsc0NBQXNDLEVBQ3RDLDJDQUEyQyxFQUMzQyx3Q0FBd0MsRUFDeEMsc0NBQXNDLEVBQ3RDLGtDQUFrQyxFQUNsQyx5Q0FBeUMsR0FDMUMsTUFBTSw0QkFBNEIsQ0FBQztBQXlCcEMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixnQkFBZ0IsR0FDakIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4QyxPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLGlDQUFpQyxFQUNqQyxvQ0FBb0MsRUFDcEMsa0RBQWtELEVBQ2xELCtDQUErQyxFQUMvQywrQ0FBK0MsRUFDL0MsaURBQWlELEVBQ2pELDRDQUE0QyxFQUM1Qyx5Q0FBeUMsRUFDekMsa0RBQWtELEVBQ2xELDRCQUE0QixFQUM1QiwrQkFBK0IsR0FDaEMsTUFBTSwwQ0FBMEMsQ0FBQyJ9
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { TTypedSocketTagDenialCode } from './classes.typedsockettagpolicymanager.js';
|
|
2
|
+
export type TTypedSocketDiagnosticSide = 'client' | 'server';
|
|
3
|
+
/**
|
|
4
|
+
* A transport connection was closed by this package because a bounded
|
|
5
|
+
* invariant was violated. `reason` is always a static package-defined string;
|
|
6
|
+
* `errorCode` carries the bounded NativeByteError code on 1011 failures.
|
|
7
|
+
*/
|
|
8
|
+
export interface ITypedSocketConnectionClosedDiagnostic {
|
|
9
|
+
readonly kind: 'connectionClosed';
|
|
10
|
+
readonly side: TTypedSocketDiagnosticSide;
|
|
11
|
+
readonly scope: 'text' | 'nativeByte';
|
|
12
|
+
readonly closeCode: number;
|
|
13
|
+
readonly reason: string;
|
|
14
|
+
readonly errorCode?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A server peer was rejected before any native-byte connection state existed
|
|
18
|
+
* for it (admission capacity, or a post-negotiation capability race).
|
|
19
|
+
*/
|
|
20
|
+
export interface ITypedSocketPeerRejectedDiagnostic {
|
|
21
|
+
readonly kind: 'peerRejected';
|
|
22
|
+
readonly side: 'server';
|
|
23
|
+
readonly closeCode: number;
|
|
24
|
+
readonly reason: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A client reconnect attempt was scheduled. `endpoint` is redacted to
|
|
28
|
+
* protocol and host; paths, queries, and credentials never appear.
|
|
29
|
+
*/
|
|
30
|
+
export interface ITypedSocketReconnectScheduledDiagnostic {
|
|
31
|
+
readonly kind: 'reconnectScheduled';
|
|
32
|
+
readonly side: 'client';
|
|
33
|
+
readonly attempt: number;
|
|
34
|
+
readonly maxRetries: number;
|
|
35
|
+
readonly delayMs: number;
|
|
36
|
+
readonly endpoint: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Automatic reconnection gave up while the socket was neither stopped nor
|
|
40
|
+
* aborted. Emitted at most once per exhausted reconnect sequence; the flag
|
|
41
|
+
* resets when a later connection succeeds.
|
|
42
|
+
*/
|
|
43
|
+
export interface ITypedSocketReconnectExhaustedDiagnostic {
|
|
44
|
+
readonly kind: 'reconnectExhausted';
|
|
45
|
+
readonly side: 'client';
|
|
46
|
+
readonly attempts: number;
|
|
47
|
+
readonly endpoint: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* A client tag mutation was denied. On servers this reports denials issued to
|
|
51
|
+
* remote clients; on clients it reports denials received or raised locally.
|
|
52
|
+
* `name` is included only when it is a valid bounded tag name, otherwise ''.
|
|
53
|
+
*/
|
|
54
|
+
export interface ITypedSocketTagMutationDeniedDiagnostic {
|
|
55
|
+
readonly kind: 'tagMutationDenied';
|
|
56
|
+
readonly side: TTypedSocketDiagnosticSide;
|
|
57
|
+
readonly operation: 'set' | 'remove';
|
|
58
|
+
readonly name: string;
|
|
59
|
+
readonly code: TTypedSocketTagDenialCode;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* A server-side TypedRequest resolved its target implicitly because exactly
|
|
63
|
+
* one connection was attached. Deprecated behavior slated for removal in the
|
|
64
|
+
* next major; emitted at most once per TypedRequest object.
|
|
65
|
+
*/
|
|
66
|
+
export interface ITypedSocketImplicitTargetingDiagnostic {
|
|
67
|
+
readonly kind: 'implicitTargetingUsed';
|
|
68
|
+
readonly side: 'server';
|
|
69
|
+
readonly method: string;
|
|
70
|
+
}
|
|
71
|
+
export type TTypedSocketDiagnosticEvent = ITypedSocketConnectionClosedDiagnostic | ITypedSocketPeerRejectedDiagnostic | ITypedSocketReconnectScheduledDiagnostic | ITypedSocketReconnectExhaustedDiagnostic | ITypedSocketTagMutationDeniedDiagnostic | ITypedSocketImplicitTargetingDiagnostic;
|
|
72
|
+
/** The subset of diagnostic events a NativeByteManager can emit. */
|
|
73
|
+
export type TNativeByteDiagnosticEvent = ITypedSocketConnectionClosedDiagnostic | ITypedSocketPeerRejectedDiagnostic;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type * as plugins from './
|
|
2
|
-
import type { NATIVE_BYTE_FRAME_TYPES, NATIVE_BYTE_PROTOCOL } from './nativebytes.
|
|
1
|
+
import type * as plugins from './plugins.js';
|
|
2
|
+
import type { NATIVE_BYTE_FRAME_TYPES, NATIVE_BYTE_PROTOCOL } from './constants.nativebytes.js';
|
|
3
3
|
export type TNativeByteCapabilityMode = 'disabled' | 'optional' | 'required';
|
|
4
4
|
export type TNativeByteRole = 'producer' | 'consumer';
|
|
5
5
|
export type TNativeByteAuthorityOperation = 'open' | 'data' | 'fin' | 'confirm' | 'reject';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// @apiglobal scope
|
|
2
|
+
import * as typedrequest from '@api.global/typedrequest';
|
|
3
|
+
import * as typedrequestInterfaces from '@api.global/typedrequest-interfaces';
|
|
4
|
+
export { typedrequest, typedrequestInterfaces };
|
|
5
|
+
// @pushrocks scope
|
|
6
|
+
import * as smartdelay from '@push.rocks/smartdelay';
|
|
7
|
+
import * as smarthash from '@push.rocks/smarthash/web';
|
|
8
|
+
import * as smartjson from '@push.rocks/smartjson';
|
|
9
|
+
import * as smartpromise from '@push.rocks/smartpromise';
|
|
10
|
+
import * as smartrx from '@push.rocks/smartrx';
|
|
11
|
+
import * as smartstring from '@push.rocks/smartstring';
|
|
12
|
+
import * as smarturl from '@push.rocks/smarturl';
|
|
13
|
+
export { smartdelay, smarthash, smartjson, smartpromise, smartrx, smartstring, smarturl };
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUJBQW1CO0FBQ25CLE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLHNCQUFzQixNQUFNLHFDQUFxQyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztBQUVoRCxtQkFBbUI7QUFDbkIsT0FBTyxLQUFLLFVBQVUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssU0FBUyxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxTQUFTLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssT0FBTyxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLENBQUMifQ==
|
package/package.json
CHANGED
package/readme.hints.md
CHANGED
|
@@ -30,8 +30,33 @@ is selected for the physical peer at upgrade time.
|
|
|
30
30
|
`context.createTypedRequest()` for authenticated restoration RPCs; it inherits
|
|
31
31
|
the restoration deadline and abort signal and becomes invalid afterward.
|
|
32
32
|
|
|
33
|
+
### Diagnostics and Close Codes
|
|
34
|
+
|
|
35
|
+
`diagnosticsSubject` (and `onDiagnostic` on a standalone `NativeByteManager`)
|
|
36
|
+
publishes structured invariant-close, peer-rejection, reconnect, tag-denial,
|
|
37
|
+
and implicit-targeting events. Emission must never disturb transport paths:
|
|
38
|
+
every sink call is try/catch-wrapped.
|
|
39
|
+
|
|
40
|
+
The WebSocket JS `close()` API only permits codes 1000 and 3000-4999. All
|
|
41
|
+
client-initiated invariant closes therefore go through
|
|
42
|
+
`toClientWebSocketCloseCode()` (1009 -> 4009). Calling `close(1008)` on a real
|
|
43
|
+
client WebSocket throws `InvalidAccessError` — under Node/undici that escapes
|
|
44
|
+
`onmessage` as an uncaught exception and kills the process, and inside
|
|
45
|
+
`NativeByteManager`'s try/catch it silently left the socket open. Server-side
|
|
46
|
+
`peer.close()` keeps protocol codes; diagnostics always report the semantic
|
|
47
|
+
protocol code.
|
|
48
|
+
|
|
49
|
+
### Source Layout
|
|
50
|
+
|
|
51
|
+
Files are named after their main class: `classes.typedsocket.ts`,
|
|
52
|
+
`classes.typedsockettagpolicymanager.ts`, `classes.clienttagreconciler.ts`
|
|
53
|
+
(client desired/acknowledged tag state machine behind a transport adapter),
|
|
54
|
+
`classes.nativebytemanager.ts`, `classes.nativebyteerror.ts`, plus
|
|
55
|
+
`helpers.*`, `interfaces.*`, `constants.*`, and `plugins.ts`.
|
|
56
|
+
|
|
33
57
|
### Release Artifact
|
|
34
58
|
|
|
35
59
|
Only compiled `dist_ts` JavaScript/declarations, package metadata, documentation,
|
|
36
60
|
and the license are published. `pnpm run verify:package` performs the deterministic
|
|
37
|
-
two-pack entry, hash, metadata, and smoke-import gate
|
|
61
|
+
two-pack entry, hash, metadata, and smoke-import gate (exact artifact count is
|
|
62
|
+
asserted in `verify.package.ts` — update it when adding source files).
|