@mml-io/delta-net-protocol 0.26.1 → 0.27.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/README.md CHANGED
@@ -3,4 +3,51 @@
3
3
 
4
4
  [![npm version](https://img.shields.io/npm/v/@mml-io/delta-net-protocol.svg?style=flat)](https://www.npmjs.com/package/@mml-io/delta-net-protocol)
5
5
 
6
- This package contains a TypeScript definition / message types of the `delta-net-v0.1` protocol used by `@mml-io/delta-net-server` and `@mml-io/delta-net-web`.
6
+ This package contains TypeScript definitions and message types for the DeltaNet protocols (`delta-net-v0.1` and `delta-net-v0.2`) used by `@mml-io/delta-net-server` and `@mml-io/delta-net-web`.
7
+
8
+ ## Protocol Versions
9
+
10
+ ### v0.1
11
+ Per-component compression: each component's data is independently deflate-compressed, resulting in O(N) compression calls per message where N is the number of components.
12
+
13
+ ### v0.2
14
+ Contiguous compression: all component data is concatenated into a single buffer and compressed in one deflate call, reducing framing overhead from O(N) to O(1). The decoded message shapes are identical to v0.1 — the difference is purely in the wire format.
15
+
16
+ ## v0.1 vs v0.2 Benchmarks
17
+
18
+ Wire size advantage grows with component count, where contiguous compression avoids redundant deflate dictionary headers. At low component counts (e.g. 3d-web-experience's 6), the primary benefit is CPU throughput from fewer deflate calls.
19
+
20
+ ### Tick Messages
21
+
22
+ | Scenario | v0.1 | v0.2 | Change |
23
+ |---|--:|--:|--:|
24
+ | 1 comp x 1 user | 18 B | 18 B | 0% |
25
+ | 3 comp x 1,000 users | 4,903 B | 4,766 B | -2.8% |
26
+ | **6 comp x 2,000 users** | **4,311 B** | **4,167 B** | **-3.3%** |
27
+ | 10 comp x 10 users | 218 B | 136 B | -37.6% |
28
+ | 50 comp x 3 users | 705 B | 268 B | -62.0% |
29
+ | 50 comp x 1,000 users | 107,020 B | 96,960 B | -9.4% |
30
+ | 100 comp x 5 users | 1,865 B | 840 B | -55.0% |
31
+ | 100 comp x 1,000 users | 229,073 B | 205,835 B | -10.1% |
32
+
33
+ ### Initial Checkout Messages
34
+
35
+ | Scenario | v0.1 | v0.2 | Change |
36
+ |---|--:|--:|--:|
37
+ | 1 comp x 1 user | 28 B | 28 B | 0% |
38
+ | 3 comp x 1,000 users | 9,379 B | 3,611 B | -61.5% |
39
+ | **6 comp x 2,000 users** | **26,883 B** | **27,663 B** | **+2.9%** |
40
+ | 10 comp x 10 users | 554 B | 376 B | -32.1% |
41
+ | 50 comp x 100 users | 16,516 B | 10,135 B | -38.6% |
42
+ | 50 comp x 1,000 users | 155,575 B | 14,873 B | -90.4% |
43
+ | 50 comp x 5,000 users | 912,988 B | 37,283 B | -95.9% |
44
+ | 100 comp x 1,000 users | 318,904 B | 27,454 B | -91.4% |
45
+
46
+ ### Throughput (6 components x 2,000 users — 3d-web-experience)
47
+
48
+ | Operation | v0.1 | v0.2 | Change |
49
+ |---|--:|--:|--:|
50
+ | Tick encode | 655 msg/s | 665 msg/s | +1% |
51
+ | Tick decode | 2,443 msg/s | 2,597 msg/s | +6% |
52
+ | Checkout encode | 416 msg/s | 494 msg/s | +19% |
53
+ | Checkout decode | 708 msg/s | 758 msg/s | +7% |
@@ -0,0 +1,9 @@
1
+ export type DecodeDebugData = {
2
+ componentsByteLength: number;
3
+ statesByteLength: number;
4
+ };
5
+ export type DecodeServerMessageOptions = {
6
+ ignoreData?: boolean;
7
+ debugData?: DecodeDebugData;
8
+ };
9
+ //# sourceMappingURL=decodeOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decodeOptions.d.ts","sourceRoot":"","sources":["../src/decodeOptions.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B,CAAC"}
@@ -1,7 +1,5 @@
1
1
  import { BufferReader } from "../BufferReader";
2
+ import type { DecodeServerMessageOptions } from "../decodeOptions";
2
3
  import { DeltaNetV01ServerMessage } from "./messages";
3
- export type DecodeServerMessageOptions = {
4
- ignoreData?: boolean;
5
- };
6
4
  export declare function decodeServerMessages(buffer: BufferReader, opts?: DecodeServerMessageOptions): Array<DeltaNetV01ServerMessage>;
7
5
  //# sourceMappingURL=decodeServerMessages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"decodeServerMessages.d.ts","sourceRoot":"","sources":["../../src/delta-net-v0.1/decodeServerMessages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAQL,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAWpB,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,0BAA0B,GAChC,KAAK,CAAC,wBAAwB,CAAC,CA+BjC"}
1
+ {"version":3,"file":"decodeServerMessages.d.ts","sourceRoot":"","sources":["../../src/delta-net-v0.1/decodeServerMessages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAEnE,OAAO,EAQL,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAWpB,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,0BAA0B,GAChC,KAAK,CAAC,wBAAwB,CAAC,CA+BjC"}
@@ -1,6 +1,6 @@
1
1
  import { BufferReader } from "../../../BufferReader";
2
2
  import { BufferWriter } from "../../../BufferWriter";
3
- import { DecodeServerMessageOptions } from "../../decodeServerMessages";
3
+ import type { DecodeServerMessageOptions } from "../../../decodeOptions";
4
4
  /**
5
5
  * Represents a component in the initial checkout message.
6
6
  * Contains both the initial values and the delta values that will be used for subsequent ticks.
@@ -42,10 +42,6 @@ export type DeltaNetV01InitialCheckoutMessage = {
42
42
  * @returns The BufferWriter containing the encoded message
43
43
  */
44
44
  export declare function encodeInitialCheckout(msg: DeltaNetV01InitialCheckoutMessage, writer?: BufferWriter): BufferWriter;
45
- export declare const lastInitialCheckoutDebugData: {
46
- componentsByteLength: number;
47
- statesByteLength: number;
48
- };
49
45
  /**
50
46
  * Decodes an initial checkout message from a binary buffer.
51
47
  * Assumes that the first byte (message type) has already been read.
@@ -1 +1 @@
1
- {"version":3,"file":"initialCheckout.d.ts","sourceRoot":"","sources":["../../../../src/delta-net-v0.1/messages/from-server/initialCheckout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAGxE;;;GAGG;AACH,MAAM,MAAM,mCAAmC,GAAG;IAChD,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,iHAAiH;IACjH,MAAM,EAAE,aAAa,CAAC;IACtB,uCAAuC;IACvC,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,iCAAiC,GAAG;IAC9C,8BAA8B;IAC9B,IAAI,EAAE,iBAAiB,CAAC;IACxB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,UAAU,EAAE,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,mEAAmE;IACnE,MAAM,EAAE,KAAK,CAAC,+BAA+B,CAAC,CAAC;CAChD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,iCAAiC,EACtC,MAAM,GAAE,YAAmC,GAC1C,YAAY,CAmBd;AAED,eAAO,MAAM,4BAA4B,EAAE;IACzC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;CAI1B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,0BAA0B,GAChC,iCAAiC,CA4CnC"}
1
+ {"version":3,"file":"initialCheckout.d.ts","sourceRoot":"","sources":["../../../../src/delta-net-v0.1/messages/from-server/initialCheckout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAIzE;;;GAGG;AACH,MAAM,MAAM,mCAAmC,GAAG;IAChD,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,iHAAiH;IACjH,MAAM,EAAE,aAAa,CAAC;IACtB,uCAAuC;IACvC,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,iCAAiC,GAAG;IAC9C,8BAA8B;IAC9B,IAAI,EAAE,iBAAiB,CAAC;IACxB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,UAAU,EAAE,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,mEAAmE;IACnE,MAAM,EAAE,KAAK,CAAC,+BAA+B,CAAC,CAAC;CAChD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,iCAAiC,EACtC,MAAM,GAAE,YAAmC,GAC1C,YAAY,CAmBd;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,0BAA0B,GAChC,iCAAiC,CAkDnC"}
@@ -1,6 +1,6 @@
1
1
  import { BufferReader } from "../../../BufferReader";
2
2
  import { BufferWriter } from "../../../BufferWriter";
3
- import { DecodeServerMessageOptions } from "../../decodeServerMessages";
3
+ import type { DecodeServerMessageOptions } from "../../../decodeOptions";
4
4
  /**
5
5
  * Represents state updates in a tick message.
6
6
  * States are not updated every tick, so they are specified as indices that have changed and their new values.
@@ -46,10 +46,6 @@ export type DeltaNetV01Tick = {
46
46
  * @returns The BufferWriter containing the encoded message
47
47
  */
48
48
  export declare function encodeTick(msg: DeltaNetV01Tick, writer?: BufferWriter): BufferWriter;
49
- export declare const lastTickDebugData: {
50
- componentsByteLength: number;
51
- statesByteLength: number;
52
- };
53
49
  /**
54
50
  * Decodes a tick message from a binary buffer.
55
51
  * Assumes that the first byte (message type) has already been read.
@@ -1 +1 @@
1
- {"version":3,"file":"tick.d.ts","sourceRoot":"","sources":["../../../../src/delta-net-v0.1/messages/from-server/tick.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAGxE;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,aAAa,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAC5C,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,WAAW,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,oBAAoB,EAAE,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACtD,6BAA6B;IAC7B,MAAM,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;CACxC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,eAAe,EACpB,MAAM,GAAE,YAAmC,GAC1C,YAAY,CA2Cd;AAED,eAAO,MAAM,iBAAiB,EAAE;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;CAI1B,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,0BAA0B,GAChC,eAAe,CAgEjB"}
1
+ {"version":3,"file":"tick.d.ts","sourceRoot":"","sources":["../../../../src/delta-net-v0.1/messages/from-server/tick.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAIzE;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,aAAa,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAC5C,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,WAAW,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,oBAAoB,EAAE,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACtD,6BAA6B;IAC7B,MAAM,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAC;CACxC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,eAAe,EACpB,MAAM,GAAE,YAAmC,GAC1C,YAAY,CA2Cd;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,0BAA0B,GAChC,eAAe,CAkEjB"}
@@ -0,0 +1,8 @@
1
+ export declare const deltaNetProtocolSubProtocol_v0_2 = "delta-net-v0.2";
2
+ /**
3
+ * Maximum total number of elements (componentsLength * indicesCount) allowed
4
+ * in contiguous encode/decode operations. Guards against allocation bombs from
5
+ * malformed or malicious messages.
6
+ */
7
+ export declare const MAX_CONTIGUOUS_ELEMENTS = 10000000;
8
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/delta-net-v0.2/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gCAAgC,mBAAmB,CAAC;AAEjE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,WAAa,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { BufferReader } from "../BufferReader";
2
+ import type { DecodeServerMessageOptions } from "../decodeOptions";
3
+ import type { DeltaNetV01ServerMessage as DeltaNetServerMessage } from "../delta-net-v0.1";
4
+ export declare function decodeServerMessagesV02(buffer: BufferReader, opts?: DecodeServerMessageOptions): Array<DeltaNetServerMessage>;
5
+ //# sourceMappingURL=decodeServerMessages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decodeServerMessages.d.ts","sourceRoot":"","sources":["../../src/delta-net-v0.2/decodeServerMessages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,wBAAwB,IAAI,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAmB3F,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,0BAA0B,GAChC,KAAK,CAAC,qBAAqB,CAAC,CA+B9B"}
@@ -0,0 +1,4 @@
1
+ import { BufferWriter } from "../BufferWriter";
2
+ import type { DeltaNetV01ServerMessage as DeltaNetServerMessage } from "../delta-net-v0.1";
3
+ export declare function encodeServerMessageV02(message: DeltaNetServerMessage, writer?: BufferWriter): BufferWriter;
4
+ //# sourceMappingURL=encodeServerMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encodeServerMessage.d.ts","sourceRoot":"","sources":["../../src/delta-net-v0.2/encodeServerMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,wBAAwB,IAAI,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAY3F,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,qBAAqB,EAC9B,MAAM,CAAC,EAAE,YAAY,GACpB,YAAY,CAmBd"}
@@ -0,0 +1,6 @@
1
+ export * from "./constants";
2
+ export * from "./decodeServerMessages";
3
+ export * from "./encodeServerMessage";
4
+ export { encodeTickV02, decodeTickV02 } from "./messages/from-server/tick";
5
+ export { encodeInitialCheckoutV02, decodeInitialCheckoutV02, } from "./messages/from-server/initialCheckout";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/delta-net-v0.2/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EACL,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,wCAAwC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { BufferReader } from "../../../BufferReader";
2
+ import { BufferWriter } from "../../../BufferWriter";
3
+ import type { DecodeServerMessageOptions } from "../../../decodeOptions";
4
+ import type { DeltaNetV01InitialCheckoutMessage as DeltaNetInitialCheckoutMessage } from "../../../delta-net-v0.1";
5
+ /**
6
+ * Encodes an initial checkout message using v0.2 contiguous compression.
7
+ * All component values and deltas are concatenated into single blocks before compression.
8
+ */
9
+ export declare function encodeInitialCheckoutV02(msg: DeltaNetInitialCheckoutMessage, writer?: BufferWriter): BufferWriter;
10
+ /**
11
+ * Decodes an initial checkout message encoded with v0.2 contiguous compression.
12
+ * Assumes that the first byte (message type) has already been read.
13
+ */
14
+ export declare function decodeInitialCheckoutV02(buffer: BufferReader, opts?: DecodeServerMessageOptions): DeltaNetInitialCheckoutMessage;
15
+ //# sourceMappingURL=initialCheckout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialCheckout.d.ts","sourceRoot":"","sources":["../../../../src/delta-net-v0.2/messages/from-server/initialCheckout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEzE,OAAO,KAAK,EAEV,iCAAiC,IAAI,8BAA8B,EAEpE,MAAM,yBAAyB,CAAC;AAIjC;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,8BAA8B,EACnC,MAAM,GAAE,YAAmC,GAC1C,YAAY,CAyDd;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,0BAA0B,GAChC,8BAA8B,CAyFhC"}
@@ -0,0 +1,16 @@
1
+ import { BufferReader } from "../../../BufferReader";
2
+ import { BufferWriter } from "../../../BufferWriter";
3
+ import type { DecodeServerMessageOptions } from "../../../decodeOptions";
4
+ import type { DeltaNetV01Tick as DeltaNetTick } from "../../../delta-net-v0.1";
5
+ /**
6
+ * Encodes a tick message using v0.2 contiguous compression.
7
+ * All component delta-deltas are concatenated into a single block before compression,
8
+ * reducing deflate framing overhead from O(componentCount) to O(1).
9
+ */
10
+ export declare function encodeTickV02(msg: DeltaNetTick, writer?: BufferWriter): BufferWriter;
11
+ /**
12
+ * Decodes a tick message encoded with v0.2 contiguous compression.
13
+ * Assumes that the first byte (message type) has already been read.
14
+ */
15
+ export declare function decodeTickV02(buffer: BufferReader, opts?: DecodeServerMessageOptions): DeltaNetTick;
16
+ //# sourceMappingURL=tick.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick.d.ts","sourceRoot":"","sources":["../../../../src/delta-net-v0.2/messages/from-server/tick.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEzE,OAAO,KAAK,EAGV,eAAe,IAAI,YAAY,EAChC,MAAM,yBAAyB,CAAC;AAIjC;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,YAAY,EACjB,MAAM,GAAE,YAAmC,GAC1C,YAAY,CA+Dd;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,YAAY,EACpB,IAAI,CAAC,EAAE,0BAA0B,GAChC,YAAY,CAqGd"}
package/build/index.d.ts CHANGED
@@ -1,5 +1,33 @@
1
1
  export * from "./BufferReader";
2
2
  export * from "./BufferWriter";
3
+ export * from "./decodeOptions";
3
4
  export * from "./DeflateCompressor";
4
5
  export * from "./delta-net-v0.1";
6
+ export * from "./delta-net-v0.2";
7
+ /**
8
+ * Version-neutral aliases — today all protocol versions share the same decoded
9
+ * message shapes and error types. Code that is not version-specific should
10
+ * prefer these over the DeltaNetV01* originals.
11
+ */
12
+ export type { DeltaNetV01ServerMessage as DeltaNetServerMessage } from "./delta-net-v0.1";
13
+ export type { DeltaNetV01Tick as DeltaNetTick } from "./delta-net-v0.1";
14
+ export type { DeltaNetV01ComponentTick as DeltaNetComponentTick } from "./delta-net-v0.1";
15
+ export type { DeltaNetV01StateUpdates as DeltaNetStateUpdates } from "./delta-net-v0.1";
16
+ export type { DeltaNetV01InitialCheckoutMessage as DeltaNetInitialCheckoutMessage } from "./delta-net-v0.1";
17
+ export type { DeltaNetV01InitialCheckoutComponent as DeltaNetInitialCheckoutComponent } from "./delta-net-v0.1";
18
+ export type { DeltaNetV01InitialCheckoutState as DeltaNetInitialCheckoutState } from "./delta-net-v0.1";
19
+ export type { DeltaNetV01ErrorMessage as DeltaNetErrorMessage } from "./delta-net-v0.1";
20
+ export type { DeltaNetV01ServerErrorType as DeltaNetServerErrorType } from "./delta-net-v0.1";
21
+ export type { DeltaNetV01UserIndexMessage as DeltaNetUserIndexMessage } from "./delta-net-v0.1";
22
+ export type { DeltaNetV01PingMessage as DeltaNetPingMessage } from "./delta-net-v0.1";
23
+ export type { DeltaNetV01ServerCustomMessage as DeltaNetServerCustomMessage } from "./delta-net-v0.1";
24
+ export type { DeltaNetV01WarningMessage as DeltaNetWarningMessage } from "./delta-net-v0.1";
25
+ export type { DeltaNetV01ClientMessage as DeltaNetClientMessage } from "./delta-net-v0.1";
26
+ export type { DeltaNetV01ConnectUserMessage as DeltaNetConnectUserMessage } from "./delta-net-v0.1";
27
+ export type { DeltaNetV01SetUserComponentsMessage as DeltaNetSetUserComponentsMessage } from "./delta-net-v0.1";
28
+ export type { DeltaNetV01ClientCustomMessage as DeltaNetClientCustomMessage } from "./delta-net-v0.1";
29
+ export type { DeltaNetV01PongMessage as DeltaNetPongMessage } from "./delta-net-v0.1";
30
+ export { DeltaNetV01ServerErrors as DeltaNetServerErrors } from "./delta-net-v0.1";
31
+ /** Supported sub-protocols in preference order (newest first). */
32
+ export declare const deltaNetSupportedSubProtocols: readonly ["delta-net-v0.2", "delta-net-v0.1"];
5
33
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AAKjC;;;;GAIG;AAGH,YAAY,EAAE,wBAAwB,IAAI,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC1F,YAAY,EAAE,eAAe,IAAI,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACxE,YAAY,EAAE,wBAAwB,IAAI,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC1F,YAAY,EAAE,uBAAuB,IAAI,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxF,YAAY,EAAE,iCAAiC,IAAI,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAC5G,YAAY,EAAE,mCAAmC,IAAI,gCAAgC,EAAE,MAAM,kBAAkB,CAAC;AAChH,YAAY,EAAE,+BAA+B,IAAI,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AACxG,YAAY,EAAE,uBAAuB,IAAI,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxF,YAAY,EAAE,0BAA0B,IAAI,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC9F,YAAY,EAAE,2BAA2B,IAAI,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAChG,YAAY,EAAE,sBAAsB,IAAI,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACtF,YAAY,EAAE,8BAA8B,IAAI,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACtG,YAAY,EAAE,yBAAyB,IAAI,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAG5F,YAAY,EAAE,wBAAwB,IAAI,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC1F,YAAY,EAAE,6BAA6B,IAAI,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AACpG,YAAY,EAAE,mCAAmC,IAAI,gCAAgC,EAAE,MAAM,kBAAkB,CAAC;AAChH,YAAY,EAAE,8BAA8B,IAAI,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACtG,YAAY,EAAE,sBAAsB,IAAI,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGtF,OAAO,EAAE,uBAAuB,IAAI,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAEnF,kEAAkE;AAClE,eAAO,MAAM,6BAA6B,+CAGhC,CAAC"}
package/build/index.js CHANGED
@@ -773,10 +773,6 @@ function encodeInitialCheckout(msg, writer = new BufferWriter(64)) {
773
773
  }
774
774
  return writer;
775
775
  }
776
- var lastInitialCheckoutDebugData = {
777
- componentsByteLength: 0,
778
- statesByteLength: 0
779
- };
780
776
  function decodeInitialCheckout(buffer, opts) {
781
777
  let componentsByteLength = 0;
782
778
  let statesByteLength = 0;
@@ -787,12 +783,16 @@ function decodeInitialCheckout(buffer, opts) {
787
783
  for (let i = 0; i < componentsLength; i++) {
788
784
  const componentId = buffer.readUVarint();
789
785
  const valuesBytes = buffer.readUVarintPrefixedBytes();
790
- const values = DeflateCompressor.varIntDecompress(valuesBytes, indicesLength);
791
786
  const deltaBytes = buffer.readUVarintPrefixedBytes();
792
787
  componentsByteLength += valuesBytes.length + deltaBytes.length;
793
788
  if (opts == null ? void 0 : opts.ignoreData) {
794
- components.push({ componentId, deltas: new BigInt64Array(indicesLength), values });
789
+ components.push({
790
+ componentId,
791
+ deltas: new BigInt64Array(indicesLength),
792
+ values: new BigInt64Array(indicesLength)
793
+ });
795
794
  } else {
795
+ const values = DeflateCompressor.varIntDecompress(valuesBytes, indicesLength);
796
796
  const deltas = DeflateCompressor.varIntDecompress(deltaBytes, indicesLength);
797
797
  components.push({ componentId, deltas, values });
798
798
  }
@@ -804,15 +804,17 @@ function decodeInitialCheckout(buffer, opts) {
804
804
  const valuesBytes = buffer.readUVarintPrefixedBytes();
805
805
  statesByteLength += valuesBytes.length;
806
806
  if (opts == null ? void 0 : opts.ignoreData) {
807
- const emptyValues = new Array(indicesLength).fill(new Uint8Array(0));
807
+ const emptyValues = Array.from({ length: indicesLength }, () => new Uint8Array(0));
808
808
  states.push({ stateId, values: emptyValues });
809
809
  } else {
810
810
  const values = DeflateCompressor.varIntBytesDecompress(valuesBytes, indicesLength);
811
811
  states.push({ stateId, values });
812
812
  }
813
813
  }
814
- lastInitialCheckoutDebugData.componentsByteLength = componentsByteLength;
815
- lastInitialCheckoutDebugData.statesByteLength = statesByteLength;
814
+ if (opts == null ? void 0 : opts.debugData) {
815
+ opts.debugData.componentsByteLength += componentsByteLength;
816
+ opts.debugData.statesByteLength += statesByteLength;
817
+ }
816
818
  return {
817
819
  type: "initialCheckout",
818
820
  serverTime,
@@ -889,10 +891,6 @@ function encodeTick(msg, writer = new BufferWriter(64)) {
889
891
  }
890
892
  return writer;
891
893
  }
892
- var lastTickDebugData = {
893
- componentsByteLength: 0,
894
- statesByteLength: 0
895
- };
896
894
  function decodeTick(buffer, opts) {
897
895
  let componentsByteLength = 0;
898
896
  let statesByteLength = 0;
@@ -929,7 +927,7 @@ function decodeTick(buffer, opts) {
929
927
  const compressedValues = buffer.readUVarintPrefixedBytes();
930
928
  statesByteLength += compressedIndices.byteLength;
931
929
  statesByteLength += compressedValues.byteLength;
932
- if (stateCount > 0) {
930
+ if (stateCount > 0 && !(opts == null ? void 0 : opts.ignoreData)) {
933
931
  const indices = DeflateCompressor.varIntDecompress(compressedIndices, stateCount);
934
932
  const values = DeflateCompressor.varIntBytesDecompress(compressedValues, stateCount);
935
933
  for (let j = 0; j < stateCount; j++) {
@@ -940,8 +938,10 @@ function decodeTick(buffer, opts) {
940
938
  }
941
939
  states.push(state);
942
940
  }
943
- lastTickDebugData.componentsByteLength = componentsByteLength;
944
- lastTickDebugData.statesByteLength = statesByteLength;
941
+ if (opts == null ? void 0 : opts.debugData) {
942
+ opts.debugData.componentsByteLength += componentsByteLength;
943
+ opts.debugData.statesByteLength += statesByteLength;
944
+ }
945
945
  return {
946
946
  type: "tick",
947
947
  serverTime,
@@ -1052,6 +1052,336 @@ function encodeServerMessage(message, writer) {
1052
1052
  throw new Error(`Unknown message type: ${message.type}`);
1053
1053
  }
1054
1054
  }
1055
+
1056
+ // src/delta-net-v0.2/constants.ts
1057
+ var deltaNetProtocolSubProtocol_v0_2 = "delta-net-v0.2";
1058
+ var MAX_CONTIGUOUS_ELEMENTS = 1e7;
1059
+
1060
+ // src/delta-net-v0.2/messages/from-server/initialCheckout.ts
1061
+ function encodeInitialCheckoutV02(msg, writer = new BufferWriter(64)) {
1062
+ writer.writeUint8(InitialCheckoutMessageType);
1063
+ writer.writeUVarint(msg.serverTime);
1064
+ writer.writeUVarint(msg.indicesCount);
1065
+ writer.writeUVarint(msg.components.length);
1066
+ for (const { componentId } of msg.components) {
1067
+ writer.writeUVarint(componentId);
1068
+ }
1069
+ if (msg.components.length > 0 && msg.indicesCount > 0) {
1070
+ const totalLength = msg.components.length * msg.indicesCount;
1071
+ if (totalLength > MAX_CONTIGUOUS_ELEMENTS) {
1072
+ throw new Error(
1073
+ `Encoded totalLength exceeds maximum: ${totalLength} elements (${msg.components.length} components * ${msg.indicesCount} indices)`
1074
+ );
1075
+ }
1076
+ const allValues = new BigInt64Array(totalLength);
1077
+ for (let i = 0; i < msg.components.length; i++) {
1078
+ const values = msg.components[i].values;
1079
+ if (values.length < msg.indicesCount) {
1080
+ throw new Error(
1081
+ `Component ${msg.components[i].componentId} values length ${values.length} is less than indicesCount ${msg.indicesCount}`
1082
+ );
1083
+ }
1084
+ allValues.set(values.subarray(0, msg.indicesCount), i * msg.indicesCount);
1085
+ }
1086
+ const [, compressedValues] = DeflateCompressor.varIntCompress(allValues, totalLength);
1087
+ writer.writeUVarintLengthPrefixedBytes(compressedValues);
1088
+ const allDeltas = new BigInt64Array(totalLength);
1089
+ for (let i = 0; i < msg.components.length; i++) {
1090
+ const deltas = msg.components[i].deltas;
1091
+ if (deltas.length < msg.indicesCount) {
1092
+ throw new Error(
1093
+ `Component ${msg.components[i].componentId} deltas length ${deltas.length} is less than indicesCount ${msg.indicesCount}`
1094
+ );
1095
+ }
1096
+ allDeltas.set(deltas.subarray(0, msg.indicesCount), i * msg.indicesCount);
1097
+ }
1098
+ const [, compressedDeltas] = DeflateCompressor.varIntCompress(allDeltas, totalLength);
1099
+ writer.writeUVarintLengthPrefixedBytes(compressedDeltas);
1100
+ }
1101
+ writer.writeUVarint(msg.states.length);
1102
+ for (const { stateId, values } of msg.states) {
1103
+ writer.writeUVarint(stateId);
1104
+ const [, stateBytes] = DeflateCompressor.varIntBytesCompress(values, msg.indicesCount);
1105
+ writer.writeUVarintLengthPrefixedBytes(stateBytes);
1106
+ }
1107
+ return writer;
1108
+ }
1109
+ function decodeInitialCheckoutV02(buffer, opts) {
1110
+ let componentsByteLength = 0;
1111
+ let statesByteLength = 0;
1112
+ const serverTime = buffer.readUVarint();
1113
+ const indicesCount = buffer.readUVarint();
1114
+ const componentsLength = buffer.readUVarint();
1115
+ const componentIds = [];
1116
+ for (let i = 0; i < componentsLength; i++) {
1117
+ componentIds.push(buffer.readUVarint());
1118
+ }
1119
+ const components = [];
1120
+ if (componentsLength > 0 && indicesCount > 0) {
1121
+ const totalLength = componentsLength * indicesCount;
1122
+ if (totalLength > MAX_CONTIGUOUS_ELEMENTS) {
1123
+ throw new Error(
1124
+ `Decoded totalLength exceeds maximum: ${totalLength} elements (${componentsLength} components * ${indicesCount} indices)`
1125
+ );
1126
+ }
1127
+ const compressedValues = buffer.readUVarintPrefixedBytes();
1128
+ componentsByteLength += compressedValues.byteLength;
1129
+ const compressedDeltas = buffer.readUVarintPrefixedBytes();
1130
+ componentsByteLength += compressedDeltas.byteLength;
1131
+ if (opts == null ? void 0 : opts.ignoreData) {
1132
+ for (let i = 0; i < componentsLength; i++) {
1133
+ components.push({
1134
+ componentId: componentIds[i],
1135
+ deltas: new BigInt64Array(indicesCount),
1136
+ values: new BigInt64Array(indicesCount)
1137
+ });
1138
+ }
1139
+ } else {
1140
+ const allValues = DeflateCompressor.varIntDecompress(compressedValues, totalLength);
1141
+ const allDeltas = DeflateCompressor.varIntDecompress(compressedDeltas, totalLength);
1142
+ for (let i = 0; i < componentsLength; i++) {
1143
+ components.push({
1144
+ componentId: componentIds[i],
1145
+ values: allValues.slice(i * indicesCount, (i + 1) * indicesCount),
1146
+ deltas: allDeltas.slice(i * indicesCount, (i + 1) * indicesCount)
1147
+ });
1148
+ }
1149
+ }
1150
+ } else if (componentsLength > 0) {
1151
+ for (let i = 0; i < componentsLength; i++) {
1152
+ components.push({
1153
+ componentId: componentIds[i],
1154
+ values: new BigInt64Array(0),
1155
+ deltas: new BigInt64Array(0)
1156
+ });
1157
+ }
1158
+ }
1159
+ const statesLength = buffer.readUVarint();
1160
+ const states = [];
1161
+ for (let i = 0; i < statesLength; i++) {
1162
+ const stateId = buffer.readUVarint();
1163
+ const valuesBytes = buffer.readUVarintPrefixedBytes();
1164
+ statesByteLength += valuesBytes.byteLength;
1165
+ if (opts == null ? void 0 : opts.ignoreData) {
1166
+ const emptyValues = Array.from({ length: indicesCount }, () => new Uint8Array(0));
1167
+ states.push({ stateId, values: emptyValues });
1168
+ } else {
1169
+ const values = DeflateCompressor.varIntBytesDecompress(valuesBytes, indicesCount);
1170
+ states.push({ stateId, values });
1171
+ }
1172
+ }
1173
+ if (opts == null ? void 0 : opts.debugData) {
1174
+ opts.debugData.componentsByteLength += componentsByteLength;
1175
+ opts.debugData.statesByteLength += statesByteLength;
1176
+ }
1177
+ return {
1178
+ type: "initialCheckout",
1179
+ serverTime,
1180
+ indicesCount,
1181
+ components,
1182
+ states
1183
+ };
1184
+ }
1185
+
1186
+ // src/delta-net-v0.2/messages/from-server/tick.ts
1187
+ function encodeTickV02(msg, writer = new BufferWriter(64)) {
1188
+ writer.writeUint8(TickMessageType);
1189
+ writer.writeUVarint(msg.serverTime);
1190
+ writer.writeUVarint(msg.removedIndices.length);
1191
+ for (const index of msg.removedIndices) {
1192
+ writer.writeUVarint(index);
1193
+ }
1194
+ writer.writeUVarint(msg.indicesCount);
1195
+ writer.writeUVarint(msg.componentDeltaDeltas.length);
1196
+ for (const componentTick of msg.componentDeltaDeltas) {
1197
+ writer.writeUVarint(componentTick.componentId);
1198
+ }
1199
+ if (msg.componentDeltaDeltas.length > 0 && msg.indicesCount > 0) {
1200
+ const totalLength = msg.componentDeltaDeltas.length * msg.indicesCount;
1201
+ if (totalLength > MAX_CONTIGUOUS_ELEMENTS) {
1202
+ throw new Error(
1203
+ `Encoded totalLength exceeds maximum: ${totalLength} elements (${msg.componentDeltaDeltas.length} components * ${msg.indicesCount} indices)`
1204
+ );
1205
+ }
1206
+ const allDeltaDeltas = new BigInt64Array(totalLength);
1207
+ for (let i = 0; i < msg.componentDeltaDeltas.length; i++) {
1208
+ const deltaDeltas = msg.componentDeltaDeltas[i].deltaDeltas;
1209
+ if (deltaDeltas.length < msg.indicesCount) {
1210
+ throw new Error(
1211
+ `Component ${msg.componentDeltaDeltas[i].componentId} deltaDeltas length ${deltaDeltas.length} is less than indicesCount ${msg.indicesCount}`
1212
+ );
1213
+ }
1214
+ allDeltaDeltas.set(deltaDeltas.subarray(0, msg.indicesCount), i * msg.indicesCount);
1215
+ }
1216
+ const [, compressedBytes] = DeflateCompressor.varIntCompress(allDeltaDeltas, totalLength);
1217
+ writer.writeUVarintLengthPrefixedBytes(compressedBytes);
1218
+ }
1219
+ writer.writeUVarint(msg.states.length);
1220
+ for (const state of msg.states) {
1221
+ writer.writeUVarint(state.stateId);
1222
+ writer.writeUVarint(state.updatedStates.length);
1223
+ const indices = new BigInt64Array(state.updatedStates.length);
1224
+ const values = new Array(state.updatedStates.length);
1225
+ for (let i = 0; i < state.updatedStates.length; i++) {
1226
+ const [index, value] = state.updatedStates[i];
1227
+ indices[i] = BigInt(index);
1228
+ values[i] = value;
1229
+ }
1230
+ const [, compressedIndices] = DeflateCompressor.varIntCompress(indices, indices.length);
1231
+ writer.writeUVarintLengthPrefixedBytes(compressedIndices);
1232
+ const [, compressedValues] = DeflateCompressor.varIntBytesCompress(values, values.length);
1233
+ writer.writeUVarintLengthPrefixedBytes(compressedValues);
1234
+ }
1235
+ return writer;
1236
+ }
1237
+ function decodeTickV02(buffer, opts) {
1238
+ let componentsByteLength = 0;
1239
+ let statesByteLength = 0;
1240
+ const serverTime = buffer.readUVarint();
1241
+ const removedIndicesLength = buffer.readUVarint();
1242
+ const removedIndices = [];
1243
+ for (let i = 0; i < removedIndicesLength; i++) {
1244
+ removedIndices.push(buffer.readUVarint());
1245
+ }
1246
+ const indicesCount = buffer.readUVarint();
1247
+ const componentsLength = buffer.readUVarint();
1248
+ const componentIds = [];
1249
+ for (let i = 0; i < componentsLength; i++) {
1250
+ componentIds.push(buffer.readUVarint());
1251
+ }
1252
+ const components = [];
1253
+ if (componentsLength > 0 && indicesCount > 0) {
1254
+ const totalLength = componentsLength * indicesCount;
1255
+ if (totalLength > MAX_CONTIGUOUS_ELEMENTS) {
1256
+ throw new Error(
1257
+ `Decoded totalLength exceeds maximum: ${totalLength} elements (${componentsLength} components * ${indicesCount} indices)`
1258
+ );
1259
+ }
1260
+ const compressedBlock = buffer.readUVarintPrefixedBytes();
1261
+ componentsByteLength += compressedBlock.byteLength;
1262
+ if (opts == null ? void 0 : opts.ignoreData) {
1263
+ for (let i = 0; i < componentsLength; i++) {
1264
+ components.push({
1265
+ componentId: componentIds[i],
1266
+ deltaDeltas: new BigInt64Array(indicesCount)
1267
+ });
1268
+ }
1269
+ } else {
1270
+ const allDeltaDeltas = DeflateCompressor.varIntDecompress(compressedBlock, totalLength);
1271
+ for (let i = 0; i < componentsLength; i++) {
1272
+ components.push({
1273
+ componentId: componentIds[i],
1274
+ deltaDeltas: allDeltaDeltas.slice(i * indicesCount, (i + 1) * indicesCount)
1275
+ });
1276
+ }
1277
+ }
1278
+ } else if (componentsLength > 0) {
1279
+ for (let i = 0; i < componentsLength; i++) {
1280
+ components.push({
1281
+ componentId: componentIds[i],
1282
+ deltaDeltas: new BigInt64Array(0)
1283
+ });
1284
+ }
1285
+ }
1286
+ const statesLength = buffer.readUVarint();
1287
+ const states = [];
1288
+ for (let i = 0; i < statesLength; i++) {
1289
+ const stateId = buffer.readUVarint();
1290
+ const stateCount = buffer.readUVarint();
1291
+ const state = {
1292
+ stateId,
1293
+ updatedStates: []
1294
+ };
1295
+ const compressedIndices = buffer.readUVarintPrefixedBytes();
1296
+ const compressedValues = buffer.readUVarintPrefixedBytes();
1297
+ statesByteLength += compressedIndices.byteLength;
1298
+ statesByteLength += compressedValues.byteLength;
1299
+ if (stateCount > 0 && !(opts == null ? void 0 : opts.ignoreData)) {
1300
+ const indices = DeflateCompressor.varIntDecompress(compressedIndices, stateCount);
1301
+ const values = DeflateCompressor.varIntBytesDecompress(compressedValues, stateCount);
1302
+ for (let j = 0; j < stateCount; j++) {
1303
+ const index = Number(indices[j]);
1304
+ const value = values[j];
1305
+ state.updatedStates.push([index, value]);
1306
+ }
1307
+ }
1308
+ states.push(state);
1309
+ }
1310
+ if (opts == null ? void 0 : opts.debugData) {
1311
+ opts.debugData.componentsByteLength += componentsByteLength;
1312
+ opts.debugData.statesByteLength += statesByteLength;
1313
+ }
1314
+ return {
1315
+ type: "tick",
1316
+ serverTime,
1317
+ removedIndices,
1318
+ indicesCount,
1319
+ componentDeltaDeltas: components,
1320
+ states
1321
+ };
1322
+ }
1323
+
1324
+ // src/delta-net-v0.2/decodeServerMessages.ts
1325
+ function decodeServerMessagesV02(buffer, opts) {
1326
+ const messages = [];
1327
+ while (!buffer.isEnd()) {
1328
+ const messageType = buffer.readUInt8();
1329
+ switch (messageType) {
1330
+ case InitialCheckoutMessageType:
1331
+ messages.push(decodeInitialCheckoutV02(buffer, opts));
1332
+ break;
1333
+ case UserIndexMessageType:
1334
+ messages.push(decodeUserIndex(buffer));
1335
+ break;
1336
+ case TickMessageType:
1337
+ messages.push(decodeTickV02(buffer, opts));
1338
+ break;
1339
+ case ServerCustomMessageType:
1340
+ messages.push(decodeServerCustom(buffer));
1341
+ break;
1342
+ case PingMessageType:
1343
+ messages.push(decodePing(buffer));
1344
+ break;
1345
+ case WarningMessageType:
1346
+ messages.push(decodeWarning(buffer));
1347
+ break;
1348
+ case ErrorMessageType:
1349
+ messages.push(decodeError(buffer));
1350
+ break;
1351
+ default:
1352
+ throw new Error(`Unknown message type: ${messageType}`);
1353
+ }
1354
+ }
1355
+ return messages;
1356
+ }
1357
+
1358
+ // src/delta-net-v0.2/encodeServerMessage.ts
1359
+ function encodeServerMessageV02(message, writer) {
1360
+ switch (message.type) {
1361
+ case "initialCheckout":
1362
+ return encodeInitialCheckoutV02(message, writer);
1363
+ case "tick":
1364
+ return encodeTickV02(message, writer);
1365
+ case "userIndex":
1366
+ return encodeUserIndex(message, writer);
1367
+ case "ping":
1368
+ return encodePing(message, writer);
1369
+ case "serverCustom":
1370
+ return encodeServerCustom(message, writer);
1371
+ case "warning":
1372
+ return encodeWarning(message, writer);
1373
+ case "error":
1374
+ return encodeError(message, writer);
1375
+ default:
1376
+ throw new Error(`Unknown message type: ${message.type}`);
1377
+ }
1378
+ }
1379
+
1380
+ // src/index.ts
1381
+ var deltaNetSupportedSubProtocols = [
1382
+ deltaNetProtocolSubProtocol_v0_2,
1383
+ deltaNetProtocolSubProtocol_v0_1
1384
+ ];
1055
1385
  export {
1056
1386
  BufferReader,
1057
1387
  BufferWriter,
@@ -1059,9 +1389,11 @@ export {
1059
1389
  CompressionLibraryChoice,
1060
1390
  ConnectUserMessageType,
1061
1391
  DeflateCompressor,
1392
+ DeltaNetV01ServerErrors as DeltaNetServerErrors,
1062
1393
  DeltaNetV01ServerErrors,
1063
1394
  ErrorMessageType,
1064
1395
  InitialCheckoutMessageType,
1396
+ MAX_CONTIGUOUS_ELEMENTS,
1065
1397
  PingMessageType,
1066
1398
  PongMessageType,
1067
1399
  ServerCustomMessageType,
@@ -1075,30 +1407,36 @@ export {
1075
1407
  decodeConnectUser,
1076
1408
  decodeError,
1077
1409
  decodeInitialCheckout,
1410
+ decodeInitialCheckoutV02,
1078
1411
  decodePing,
1079
1412
  decodePong,
1080
1413
  decodeServerCustom,
1081
1414
  decodeServerMessages,
1415
+ decodeServerMessagesV02,
1082
1416
  decodeSetUserComponents,
1083
1417
  decodeTick,
1418
+ decodeTickV02,
1084
1419
  decodeUserIndex,
1085
1420
  decodeWarning,
1086
1421
  deltaNetProtocolSubProtocol_v0_1,
1422
+ deltaNetProtocolSubProtocol_v0_2,
1423
+ deltaNetSupportedSubProtocols,
1087
1424
  encodeClientCustom,
1088
1425
  encodeClientMessage,
1089
1426
  encodeConnectUser,
1090
1427
  encodeError,
1091
1428
  encodeInitialCheckout,
1429
+ encodeInitialCheckoutV02,
1092
1430
  encodePing,
1093
1431
  encodePong,
1094
1432
  encodeServerCustom,
1095
1433
  encodeServerMessage,
1434
+ encodeServerMessageV02,
1096
1435
  encodeSetUserComponents,
1097
1436
  encodeTick,
1437
+ encodeTickV02,
1098
1438
  encodeUserIndex,
1099
1439
  encodeWarning,
1100
- lastInitialCheckoutDebugData,
1101
- lastTickDebugData,
1102
1440
  zigzagEncode
1103
1441
  };
1104
1442
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/BufferReader.ts", "../src/BufferWriter.ts", "../src/DeflateCompressor.ts", "../src/delta-net-v0.1/constants.ts", "../src/delta-net-v0.1/messageTypes.ts", "../src/delta-net-v0.1/messages/from-client/clientCustom.ts", "../src/delta-net-v0.1/messages/from-client/connectUser.ts", "../src/delta-net-v0.1/messages/from-client/pong.ts", "../src/delta-net-v0.1/messages/from-client/setUserComponents.ts", "../src/delta-net-v0.1/decodeClientMessages.ts", "../src/delta-net-v0.1/messages/from-server/error.ts", "../src/delta-net-v0.1/messages/from-server/initialCheckout.ts", "../src/delta-net-v0.1/messages/from-server/ping.ts", "../src/delta-net-v0.1/messages/from-server/serverCustom.ts", "../src/delta-net-v0.1/messages/from-server/tick.ts", "../src/delta-net-v0.1/messages/from-server/userIndex.ts", "../src/delta-net-v0.1/messages/from-server/warning.ts", "../src/delta-net-v0.1/decodeServerMessages.ts", "../src/delta-net-v0.1/encodeClientMessage.ts", "../src/delta-net-v0.1/encodeServerMessage.ts"],
4
- "sourcesContent": ["const textDecoder = new TextDecoder();\n\n/**\n * A class for reading binary data from a Uint8Array buffer.\n * Supports various data types including varints, strings, and boolean arrays.\n * All numeric values are read using varint encoding for efficiency.\n */\nexport class BufferReader {\n private buffer: Uint8Array;\n private offset: number;\n\n /**\n * Creates a new BufferReader instance.\n * @param buffer - The Uint8Array to read from\n */\n constructor(buffer: Uint8Array) {\n this.buffer = buffer;\n this.offset = 0;\n }\n\n /**\n * Reads a single unsigned 8-bit integer from the buffer.\n * @returns The read value\n */\n public readUInt8(): number {\n return this.buffer[this.offset++];\n }\n\n /**\n * Reads a boolean value from the buffer.\n * @returns true if the read byte is 1, false otherwise\n */\n public readBoolean(): boolean {\n return this.readUInt8() === 1;\n }\n\n /**\n * Reads a specified number of bytes from the buffer.\n * @param length - The number of bytes to read\n * @returns A new Uint8Array containing the read bytes\n */\n public readBytes(length: number): Uint8Array {\n const bytes = this.buffer.subarray(this.offset, this.offset + length);\n this.offset += length;\n return bytes;\n }\n\n /**\n * Reads a length-prefixed byte array from the buffer.\n * The length is encoded as a varint.\n * @returns A new Uint8Array containing the read bytes\n */\n public readUVarintPrefixedBytes(): Uint8Array {\n const length = this.readUVarint();\n return this.readBytes(length);\n }\n\n /**\n * Reads a varint-encoded integer from the buffer.\n * Varints are variable-length integers that use the high bit of each byte to indicate if more bytes follow.\n * @param signed - Whether to interpret the value as a signed integer\n * @returns The decoded integer value\n * @throws Error if the varint encoding is invalid\n */\n public readUVarint(signed = false): number {\n let lo = 0;\n let hi = 0;\n let i = 0;\n for (; i < 4; ++i) {\n lo = (lo | ((this.buffer[this.offset] & 127) << (i * 7))) >>> 0;\n if (this.buffer[this.offset++] < 128) {\n return signed ? loAndHiAsSigned(lo, hi) : loAndHiAsUnsigned(lo, hi);\n }\n }\n lo = (lo | ((this.buffer[this.offset] & 127) << 28)) >>> 0;\n hi = (hi | ((this.buffer[this.offset] & 127) >> 4)) >>> 0;\n if (this.buffer[this.offset++] < 128) {\n return signed ? loAndHiAsSigned(lo, hi) : loAndHiAsUnsigned(lo, hi);\n }\n i = 0;\n for (; i < 5; ++i) {\n hi = (hi | ((this.buffer[this.offset] & 127) << (i * 7 + 3))) >>> 0;\n if (this.buffer[this.offset++] < 128) {\n return signed ? loAndHiAsSigned(lo, hi) : loAndHiAsUnsigned(lo, hi);\n }\n }\n\n throw Error(\"invalid varint encoding\");\n }\n\n /**\n * Reads a string from the buffer with a specified byte length.\n * Optimized for ASCII strings, falls back to TextDecoder for non-ASCII.\n * @param byteLength - The number of bytes to read\n * @returns The decoded string\n */\n private readStringBytes(byteLength: number): string {\n let string = \"\";\n let hasNonAscii = false;\n for (let i = 0; i < byteLength; i++) {\n const charValue = this.buffer[this.offset + i];\n if (charValue < 0x80) {\n string += String.fromCharCode(charValue);\n } else {\n hasNonAscii = true;\n break;\n }\n }\n if (!hasNonAscii) {\n this.offset += byteLength;\n return string;\n }\n\n // Slow path - decode the string using TextDecoder\n const result = textDecoder.decode(this.buffer.subarray(this.offset, this.offset + byteLength));\n this.offset += byteLength;\n return result;\n }\n\n /**\n * Reads a length-prefixed string from the buffer.\n * The length is encoded as an unsigned varint.\n * @returns The decoded string\n */\n public readUVarintPrefixedString(): string {\n const readLength = this.readUVarint();\n return this.readStringBytes(readLength);\n }\n\n /**\n * Reads a length-prefixed string from the buffer.\n * The length is encoded as a signed varint.\n * @returns A tuple containing the decoded string and a boolean indicating if the length was negative\n */\n public readVarintPrefixedString(): [string, boolean] {\n const length = this.readVarint();\n const negativeLength = length < 0;\n const readLength = negativeLength ? -length : length;\n const result = this.readStringBytes(readLength);\n return [result, negativeLength];\n }\n\n /**\n * Reads a signed varint-encoded integer from the buffer.\n * @returns The decoded signed integer value\n */\n public readVarint(): number {\n return this.readUVarint(true);\n }\n\n /**\n * Reads a varint-encoded bigint from the buffer.\n * Varints are variable-length integers that use the high bit of each byte to indicate if more bytes follow.\n * @param signed - Whether to interpret the value as a signed integer\n * @returns The decoded bigint value\n * @throws Error if the varint encoding is invalid\n */\n public readUVarintBigInt(signed = false): bigint {\n let result = 0n;\n let shift = 0n;\n let byte: number;\n let bytesRead = 0;\n\n do {\n if (bytesRead >= 10) {\n throw Error(\"invalid varint encoding\");\n }\n byte = this.buffer[this.offset++];\n result |= BigInt(byte & 0x7f) << shift;\n shift += 7n;\n bytesRead++;\n } while (byte >= 0x80);\n\n if (signed) {\n // Convert from zigzag encoding\n return result & 1n ? -(result + 1n) / 2n : result / 2n;\n }\n\n return result;\n }\n\n /**\n * Reads a signed varint-encoded integer from the buffer.\n * @returns The decoded signed integer value\n */\n public readBigIntVarint(): bigint {\n return this.readUVarintBigInt(true);\n }\n\n /**\n * Reads an array of boolean values from the buffer.\n * The booleans are packed into bytes (8 booleans per byte).\n * @returns An array of boolean values\n */\n public readLengthPrefixedBoolArray(): boolean[] {\n // The length is the number of bools/bits to allow the reader to determine a non-multiple of 8 length and to allocate\n const length = this.readUVarint();\n // The booleans are packed into a single byte\n const numBytes = Math.ceil(length / 8);\n const result = new Array<boolean>(length);\n for (let i = 0; i < length; i++) {\n const byteIndex = Math.floor(i / 8);\n const bitPosition = i % 8;\n result[i] = !!(this.buffer[this.offset + byteIndex] & (1 << bitPosition));\n }\n this.offset += numBytes;\n return result;\n }\n\n /**\n * Checks if the reader has reached the end of the buffer.\n * @returns true if all bytes have been read, false otherwise\n */\n public isEnd() {\n return this.offset >= this.buffer.length;\n }\n}\n\n/**\n * Converts a low and high 32-bit integer pair to a signed 64-bit integer.\n * @param lo - The low 32 bits\n * @param hi - The high 32 bits\n * @returns The signed 64-bit integer value\n */\nfunction loAndHiAsSigned(lo: number, hi: number) {\n const value = lo + hi * 4294967296;\n if (value & 1) {\n return -(value + 1) / 2;\n }\n return value / 2;\n}\n\n/**\n * Converts a low and high 32-bit integer pair to an unsigned 64-bit integer.\n * @param lo - The low 32 bits\n * @param hi - The high 32 bits\n * @returns The unsigned 64-bit integer value\n */\nfunction loAndHiAsUnsigned(lo: number, hi: number) {\n return lo + hi * 4294967296;\n}\n", "const textEncoder = new TextEncoder();\n\n/**\n * A class for writing binary data to a Uint8Array buffer.\n * Supports various data types including varints, strings, and boolean arrays.\n * All numeric values are written using varint encoding for efficiency.\n * The buffer automatically expands as needed.\n */\nexport class BufferWriter {\n private buffer: Uint8Array;\n private offset: number;\n\n /**\n * Creates a new BufferWriter instance.\n * @param initialLength - The initial size of the buffer in bytes\n */\n constructor(initialLength: number) {\n this.buffer = new Uint8Array(initialLength);\n this.offset = 0;\n }\n\n /**\n * Writes an unsigned 8-bit integer to the buffer.\n * @param value - The value to write (will be truncated to 8 bits)\n */\n public writeUint8(value: number): void {\n this.ensureCapacity(1);\n this.buffer[this.offset] = value & 0xff;\n this.offset += 1;\n }\n\n /**\n * Writes a boolean value to the buffer.\n * @param bool - The boolean value to write (true = 1, false = 0)\n */\n public writeBoolean(bool: boolean) {\n this.writeUint8(bool ? 1 : 0);\n }\n\n /**\n * Writes an array of bytes to the buffer without a length prefix.\n * @param bytes - The bytes to write\n */\n public writeUnprefixedBytes(bytes: Uint8Array): void {\n this.ensureCapacity(bytes.byteLength);\n this.buffer.set(bytes, this.offset);\n this.offset += bytes.byteLength;\n }\n\n /**\n * Writes a length-prefixed array of bytes to the buffer.\n * The length is encoded as an unsigned varint.\n * @param bytes - The bytes to write\n */\n public writeUVarintLengthPrefixedBytes(bytes: Uint8Array): void {\n if (!(bytes instanceof Uint8Array)) {\n throw new Error(\"bytes must be a Uint8Array\");\n }\n this.writeUVarint(bytes.byteLength);\n this.writeUnprefixedBytes(bytes);\n }\n\n /**\n * Gets the written bytes as a Uint8Array.\n * @returns A new Uint8Array containing only the written bytes\n */\n public getBuffer(): Uint8Array {\n return this.buffer.subarray(0, this.offset);\n }\n\n /**\n * Gets the number of bytes written so far.\n * @returns The current write offset\n */\n public getWrittenLength(): number {\n return this.offset;\n }\n\n /**\n * Ensures the buffer has enough capacity for the required space.\n * @param neededSpace - The number of additional bytes needed\n */\n private ensureCapacity(neededSpace: number): void {\n while (this.offset + neededSpace > this.buffer.length) {\n this.expandBuffer();\n }\n }\n\n /**\n * Expands the buffer by doubling its current length.\n */\n private expandBuffer(): void {\n const newBuffer = new Uint8Array(this.buffer.length * 2);\n newBuffer.set(this.buffer);\n this.buffer = newBuffer;\n }\n\n /**\n * Writes an unsigned varint to the buffer.\n * Varints are variable-length integers that use the high bit of each byte to indicate if more bytes follow.\n * @param x - The value to write\n */\n public writeUVarint(x: number) {\n if (x <= 268435455) {\n // Simple case that can be handled without hi and lo\n this.ensureCapacity(4);\n while (x >= 0x80) {\n this.buffer[this.offset] = (x & 0x7f) | 0x80; // Extract least significant 7 bits and set continuation bit\n this.offset++;\n x >>>= 7; // Use unsigned shift here\n }\n this.buffer[this.offset] = x & 0x7f; // No need for 0xff here since we're limiting it to 7 bits\n this.offset++;\n return;\n }\n this.ensureCapacity(10);\n\n let lo = 0;\n let hi = 0;\n if (x !== 0) {\n lo = x >>> 0;\n hi = ((x - lo) / 4294967296) >>> 0;\n }\n\n while (hi) {\n this.buffer[this.offset++] = (lo & 127) | 128;\n lo = ((lo >>> 7) | (hi << 25)) >>> 0;\n hi >>>= 7;\n }\n while (lo > 127) {\n this.buffer[this.offset++] = (lo & 127) | 128;\n lo = lo >>> 7;\n }\n this.buffer[this.offset++] = lo;\n }\n\n /**\n * Writes an unsigned varint to the buffer.\n * Varints are variable-length integers that use the high bit of each byte to indicate if more bytes follow.\n * @param x - The value to write\n */\n public writeUVarintBigInt(x: bigint) {\n this.ensureCapacity(10);\n\n while (x >= 0x80n) {\n this.buffer[this.offset] = Number(x & 0x7fn) | 0x80;\n this.offset++;\n x >>= 7n;\n }\n this.buffer[this.offset] = Number(x & 0x7fn);\n this.offset++;\n }\n\n /**\n * Writes a signed varint to the buffer using zigzag encoding.\n * @param x - The signed value to write\n */\n public writeVarint(x: number) {\n if (x >= 0) {\n this.writeUVarint(x * 2);\n } else {\n this.writeUVarint(-x * 2 - 1);\n }\n }\n\n /**\n * Writes a signed varint to the buffer using zigzag encoding.\n * @param x - The signed value to write\n */\n public writeBigIntVarint(x: bigint) {\n if (x >= 0n) {\n this.writeUVarintBigInt(x * 2n);\n } else {\n this.writeUVarintBigInt(-x * 2n - 1n);\n }\n }\n\n /**\n * Writes an array of boolean values to the buffer.\n * The booleans are packed into bytes (8 booleans per byte).\n * @param data - The array of boolean values to write\n */\n public writeLengthPrefixedBoolArray(data: boolean[]) {\n // The length is the number of bools/bits to allow the reader to determine a non-multiple of 8 length and to allocate\n this.writeUVarint(data.length);\n // Pack the booleans into a single byte\n const numBytes = Math.ceil(data.length / 8);\n this.ensureCapacity(numBytes + 4);\n\n // Pack booleans into bits\n for (let i = 0; i < data.length; i++) {\n if (data[i]) {\n // Set the bit at position i\n const byteIndex = Math.floor(i / 8);\n const bitPosition = i % 8;\n this.buffer[this.offset + byteIndex] |= 1 << bitPosition;\n }\n }\n this.offset += numBytes;\n }\n\n /**\n * Writes a length-prefixed string to the buffer.\n * Optimized for ASCII strings, falls back to TextEncoder for non-ASCII.\n * @param value - The string to write\n * @param varint - Whether to use signed varint for length (default: false)\n * @param negativeLength - Whether the length should be negative (only used if varint is true)\n */\n public writeLengthPrefixedString(value: string, varint = false, negativeLength = false) {\n /*\n Try fast case first - no non-ascii characters and byte length is string length.\n\n Even if this case fails (non-ascii character found) the data will always be\n shorter so it can be overwritten\n */\n const originalOffset = this.offset; // store this in case we need to overwrite from here\n // Just write the length of the string (not the known encoded length)\n if (varint) {\n this.writeVarint(negativeLength ? -value.length : value.length);\n } else {\n this.writeUVarint(value.length);\n }\n this.ensureCapacity(value.length); // Ensure we have enough space for the string\n let nonAscii = false;\n for (let i = 0; i < value.length; i++) {\n const charCode = value.charCodeAt(i);\n if (charCode > 0x7f) {\n nonAscii = true;\n break;\n }\n this.buffer[this.offset++] = charCode;\n }\n\n if (!nonAscii) {\n return;\n }\n\n /*\n If we have non-ascii characters, we need to encode the string respecting\n utf-8 and overwrite the buffer from the original offset\n */\n this.offset = originalOffset; // overwrite the length\n let encodedLength = value.length; // This will be overwritten once we know the actual length\n this.ensureCapacity(encodedLength); // This will be at least the required length, but it gives the chance of initially creating a large enough buffer\n while (true) {\n this.offset = originalOffset;\n if (varint) {\n this.writeVarint(negativeLength ? -encodedLength : encodedLength);\n } else {\n this.writeUVarint(encodedLength);\n }\n const offsetAfterVarint = this.offset;\n const varintLength = offsetAfterVarint - originalOffset;\n\n const writeBuffer = new Uint8Array(this.buffer.buffer, this.offset);\n const { read, written } = textEncoder.encodeInto(value, writeBuffer);\n if (read !== value.length) {\n // Need more space and try again\n this.expandBuffer();\n continue;\n }\n if (written !== encodedLength) {\n encodedLength = written;\n // We need to overwrite the varint with the correct length\n this.offset = originalOffset;\n if (varint) {\n this.writeVarint(negativeLength ? -encodedLength : encodedLength);\n } else {\n this.writeUVarint(encodedLength);\n }\n const newOffsetAfterVarint = this.offset;\n const actualVarintLength = newOffsetAfterVarint - originalOffset;\n if (actualVarintLength !== varintLength) {\n // The varint length changed and it has overwritten the string\n // We need to write the string again\n continue;\n } else {\n // The varint length is the same so the string is intact\n }\n }\n // String written successfully - update the offset\n this.offset += written;\n return;\n }\n }\n}\n\n/**\n * Encodes a signed integer using zigzag encoding.\n * Zigzag encoding maps signed integers to unsigned integers in a way that preserves ordering.\n * @param value - The signed value to encode\n * @returns The zigzag-encoded value\n */\nexport function zigzagEncode(value: number): number {\n // Positive numbers: 2*n\n // Negative numbers: 2*|n|-1\n return value >= 0 ? value * 2 : -value * 2 - 1;\n}\n", "import { deflate, inflate } from \"pako\";\n\nlet nodeZlibFunctions: {\n deflateSync: (data: Uint8Array) => Uint8Array;\n inflateSync: (data: Uint8Array) => Uint8Array;\n} | null = null;\ntry {\n const isNode =\n typeof process !== \"undefined\" && process.versions && typeof process.versions.node === \"string\";\n\n if (isNode) {\n (async () => {\n try {\n const nodeZlib = await import(\"node:zlib\");\n nodeZlibFunctions = {\n deflateSync: (data: Uint8Array) => {\n const result = nodeZlib.deflateSync(data);\n return new Uint8Array(result);\n },\n inflateSync: (data: Uint8Array) => {\n const result = nodeZlib.inflateSync(data);\n return new Uint8Array(result);\n },\n };\n } catch (e) {\n console.log(\"nodeZlib not available - sync\", e);\n }\n })();\n }\n} catch (e) {\n console.log(\"nodeZlib not available - sync\", e);\n}\n\nexport enum CompressionLibraryChoice {\n PAKO = \"PAKO\",\n NODE_ZLIB = \"NODE_ZLIB\",\n NO_PREFERENCE = \"NO_PREFERENCE\",\n NONE = \"NONE\",\n}\n\nimport { BufferReader } from \"./BufferReader\";\nimport { BufferWriter } from \"./BufferWriter\";\n\nfunction getCompressFunction(compressionLibrary: CompressionLibraryChoice) {\n switch (compressionLibrary) {\n case CompressionLibraryChoice.PAKO:\n return deflate;\n case CompressionLibraryChoice.NODE_ZLIB:\n if (nodeZlibFunctions) {\n return nodeZlibFunctions.deflateSync;\n } else {\n throw new Error(\"node:zlib not available\");\n }\n case CompressionLibraryChoice.NO_PREFERENCE:\n if (nodeZlibFunctions) {\n return nodeZlibFunctions.deflateSync;\n } else {\n return deflate;\n }\n case CompressionLibraryChoice.NONE:\n return (data: Uint8Array) => {\n return new Uint8Array(data);\n };\n }\n}\n\nfunction getDecompressFunction(compressionLibrary: CompressionLibraryChoice) {\n switch (compressionLibrary) {\n case CompressionLibraryChoice.PAKO:\n return inflate;\n case CompressionLibraryChoice.NODE_ZLIB:\n if (nodeZlibFunctions) {\n return nodeZlibFunctions.inflateSync;\n } else {\n throw new Error(\"node:zlib not available\");\n }\n case CompressionLibraryChoice.NO_PREFERENCE:\n if (nodeZlibFunctions) {\n return nodeZlibFunctions.inflateSync;\n } else {\n return inflate;\n }\n case CompressionLibraryChoice.NONE:\n return (data: Uint8Array) => {\n return new Uint8Array(data);\n };\n }\n}\n\nexport class DeflateCompressor {\n public static compress(\n data: Uint8Array,\n compressionLibrary: CompressionLibraryChoice = CompressionLibraryChoice.NO_PREFERENCE,\n ): Uint8Array {\n return getCompressFunction(compressionLibrary)(data);\n }\n\n public static decompress(\n compressed: Uint8Array,\n compressionLibrary: CompressionLibraryChoice = CompressionLibraryChoice.NO_PREFERENCE,\n ): Uint8Array {\n return getDecompressFunction(compressionLibrary)(compressed);\n }\n\n public static varIntCompress(\n data: BigInt64Array,\n length: number,\n compressionLibrary: CompressionLibraryChoice = CompressionLibraryChoice.NO_PREFERENCE,\n ): [Uint8Array, Uint8Array] {\n if (length > data.length) {\n throw new Error(\"length is greater than the data length\");\n }\n const writer = new BufferWriter(length);\n for (let i = 0; i < length; i++) {\n writer.writeBigIntVarint(data[i]);\n }\n const uint8Array = writer.getBuffer();\n return [uint8Array, DeflateCompressor.compress(uint8Array, compressionLibrary)];\n }\n\n public static varIntDecompress(\n compressed: Uint8Array,\n length: number,\n compressionLibrary: CompressionLibraryChoice = CompressionLibraryChoice.NO_PREFERENCE,\n ): BigInt64Array {\n const data = DeflateCompressor.decompress(compressed, compressionLibrary);\n const buffer = new BigInt64Array(length);\n const reader = new BufferReader(data);\n for (let i = 0; i < length; i++) {\n buffer[i] = reader.readBigIntVarint();\n }\n return buffer;\n }\n\n public static varIntBytesCompress(\n data: Array<Uint8Array | null>,\n length: number,\n compressionLibrary: CompressionLibraryChoice = CompressionLibraryChoice.NO_PREFERENCE,\n ): [Uint8Array, Uint8Array] {\n if (length > data.length) {\n throw new Error(\"length is greater than the data length\");\n }\n const writer = new BufferWriter(length);\n for (let i = 0; i < length; i++) {\n const value = data[i];\n if (value === null || value === undefined) {\n writer.writeUVarintLengthPrefixedBytes(new Uint8Array(0));\n } else {\n writer.writeUVarintLengthPrefixedBytes(value);\n }\n }\n const uint8Array = writer.getBuffer();\n return [uint8Array, DeflateCompressor.compress(uint8Array, compressionLibrary)];\n }\n\n public static varIntBytesDecompress(\n compressed: Uint8Array,\n length: number,\n compressionLibrary: CompressionLibraryChoice = CompressionLibraryChoice.NO_PREFERENCE,\n ): Array<Uint8Array> {\n const data = DeflateCompressor.decompress(compressed, compressionLibrary);\n const buffer = new Array<Uint8Array>(length);\n const reader = new BufferReader(data);\n for (let i = 0; i < length; i++) {\n buffer[i] = reader.readUVarintPrefixedBytes();\n }\n return buffer;\n }\n}\n", "export const deltaNetProtocolSubProtocol_v0_1 = \"delta-net-v0.1\";\n", "// Server -> Client\nexport const InitialCheckoutMessageType = 1;\nexport const ServerCustomMessageType = 2;\nexport const UserIndexMessageType = 3;\nexport const TickMessageType = 4;\nexport const PingMessageType = 5;\nexport const WarningMessageType = 6;\nexport const ErrorMessageType = 7;\n\n// Client -> Server\nexport const ConnectUserMessageType = 64;\nexport const ClientCustomMessageType = 65;\nexport const SetUserComponentsMessageType = 66;\nexport const SetUserStateMessageType = 67;\nexport const PongMessageType = 68;\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { ClientCustomMessageType } from \"../../messageTypes\";\n\nexport type DeltaNetV01ClientCustomMessage = {\n type: \"clientCustom\";\n customType: number;\n contents: string;\n};\n\nexport function encodeClientCustom(\n msg: DeltaNetV01ClientCustomMessage,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(ClientCustomMessageType);\n writer.writeUVarint(msg.customType);\n writer.writeLengthPrefixedString(msg.contents);\n return writer;\n}\n\n// Assumes that the first byte has already been read (the message type)\nexport function decodeClientCustom(buffer: BufferReader): DeltaNetV01ClientCustomMessage {\n const customType = buffer.readUVarint();\n const contents = buffer.readUVarintPrefixedString();\n return {\n type: \"clientCustom\",\n customType,\n contents,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { ConnectUserMessageType } from \"../../messageTypes\";\n\n/**\n * Initial connection request message from client to server.\n * Contains authentication token and initial state of the connecting user.\n */\nexport type DeltaNetV01ConnectUserMessage = {\n /** Message type identifier */\n type: \"connectUser\";\n /** Authentication token for the user */\n token: string;\n /** Whether the client is an observer-only client */\n observer: boolean;\n /** Array of [componentId, value] pairs for the user's initial component values */\n components: Array<[number, bigint]>;\n /** Array of [stateId, value] pairs for the user's initial state values */\n states: Array<[number, Uint8Array]>;\n};\n\n/**\n * Encodes a connect user message into a binary buffer.\n * @param connectUserMessage - The message to encode\n * @param writer - The BufferWriter to write to\n */\nexport function encodeConnectUser(\n connectUserMessage: DeltaNetV01ConnectUserMessage,\n writer: BufferWriter,\n) {\n writer.writeUint8(ConnectUserMessageType);\n writer.writeLengthPrefixedString(connectUserMessage.token);\n writer.writeBoolean(connectUserMessage.observer ?? false);\n writer.writeUVarint(connectUserMessage.components.length);\n for (const [componentId, componentValue] of connectUserMessage.components) {\n writer.writeUVarint(componentId);\n writer.writeBigIntVarint(componentValue);\n }\n writer.writeUVarint(connectUserMessage.states.length);\n for (const [stateId, stateValue] of connectUserMessage.states) {\n writer.writeUVarint(stateId);\n writer.writeUVarintLengthPrefixedBytes(stateValue);\n }\n}\n\n/**\n * Decodes a connect user message from a binary buffer.\n * Assumes that the first byte (message type) has already been read.\n * @param buffer - The BufferReader containing the message data\n * @returns The decoded connect user message\n */\nexport function decodeConnectUser(buffer: BufferReader): DeltaNetV01ConnectUserMessage {\n const token = buffer.readUVarintPrefixedString();\n const observer = buffer.readBoolean();\n const componentsLength = buffer.readUVarint();\n const components: Array<[number, bigint]> = [];\n for (let i = 0; i < componentsLength; i++) {\n const componentId = buffer.readUVarint();\n const componentValue = buffer.readBigIntVarint();\n components.push([componentId, componentValue]);\n }\n const statesLength = buffer.readUVarint();\n const states: Array<[number, Uint8Array]> = [];\n for (let i = 0; i < statesLength; i++) {\n const stateId = buffer.readUVarint();\n const stateValue = buffer.readUVarintPrefixedBytes();\n states.push([stateId, stateValue]);\n }\n return {\n type: \"connectUser\",\n token,\n observer,\n components,\n states,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { PongMessageType } from \"../../messageTypes\";\n\nexport type DeltaNetV01PongMessage = {\n type: \"pong\";\n pong: number;\n};\n\nexport function encodePong(pongMessage: DeltaNetV01PongMessage, writer: BufferWriter) {\n writer.writeUint8(PongMessageType);\n writer.writeUVarint(pongMessage.pong);\n}\n\n// Assumes that the first byte has already been read (the message type)\nexport function decodePong(buffer: BufferReader): DeltaNetV01PongMessage {\n const pong = buffer.readUVarint();\n return {\n type: \"pong\",\n pong,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { SetUserComponentsMessageType } from \"../../messageTypes\";\n\n/**\n * Message sent by client to update component and state values.\n * Used to send user input and state changes to the server.\n */\nexport type DeltaNetV01SetUserComponentsMessage = {\n /** Message type identifier */\n type: \"setUserComponents\";\n /** Array of [componentId, value] pairs for updated component values */\n components: Array<[number, bigint]>;\n /** Array of [stateId, value] pairs for updated state values */\n states: Array<[number, Uint8Array]>;\n};\n\n/**\n * Encodes a set user components message into a binary buffer.\n * @param message - The message to encode\n * @param writer - The BufferWriter to write to\n */\nexport function encodeSetUserComponents(\n message: DeltaNetV01SetUserComponentsMessage,\n writer: BufferWriter,\n) {\n writer.writeUint8(SetUserComponentsMessageType);\n writer.writeUVarint(message.components.length);\n for (const [componentId, componentValue] of message.components) {\n writer.writeUVarint(componentId);\n writer.writeBigIntVarint(componentValue);\n }\n writer.writeUVarint(message.states.length);\n for (const [stateId, stateValue] of message.states) {\n writer.writeUVarint(stateId);\n writer.writeUVarintLengthPrefixedBytes(stateValue);\n }\n}\n\n/**\n * Decodes a set user components message from a binary buffer.\n * Assumes that the first byte (message type) has already been read.\n * @param buffer - The BufferReader containing the message data\n * @returns The decoded set user components message\n */\nexport function decodeSetUserComponents(buffer: BufferReader): DeltaNetV01SetUserComponentsMessage {\n const componentsLength = buffer.readUVarint();\n const components: Array<[number, bigint]> = [];\n for (let i = 0; i < componentsLength; i++) {\n const componentId = buffer.readUVarint();\n const componentValue = buffer.readBigIntVarint();\n components.push([componentId, componentValue]);\n }\n const statesLength = buffer.readUVarint();\n const states: Array<[number, Uint8Array]> = [];\n for (let i = 0; i < statesLength; i++) {\n const stateId = buffer.readUVarint();\n const stateValue = buffer.readUVarintPrefixedBytes();\n states.push([stateId, stateValue]);\n }\n return {\n type: \"setUserComponents\",\n components,\n states,\n };\n}\n", "import { BufferReader } from \"../BufferReader\";\n\nimport { DeltaNetV01ClientMessage } from \"./messages\";\nimport { decodeClientCustom } from \"./messages/from-client/clientCustom\";\nimport { decodeConnectUser } from \"./messages/from-client/connectUser\";\nimport { decodePong } from \"./messages/from-client/pong\";\nimport { decodeSetUserComponents } from \"./messages/from-client/setUserComponents\";\nimport {\n ConnectUserMessageType,\n PongMessageType,\n SetUserComponentsMessageType,\n ClientCustomMessageType,\n} from \"./messageTypes\";\n\nexport function decodeClientMessages(buffer: BufferReader): Array<DeltaNetV01ClientMessage> {\n const messages: DeltaNetV01ClientMessage[] = [];\n while (!buffer.isEnd()) {\n const messageType = buffer.readUInt8();\n switch (messageType) {\n case ConnectUserMessageType:\n messages.push(decodeConnectUser(buffer));\n break;\n case SetUserComponentsMessageType:\n messages.push(decodeSetUserComponents(buffer));\n break;\n case PongMessageType:\n messages.push(decodePong(buffer));\n break;\n case ClientCustomMessageType:\n messages.push(decodeClientCustom(buffer));\n break;\n default:\n throw new Error(`Unknown message type: ${messageType}`);\n }\n }\n return messages;\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { ErrorMessageType } from \"../../messageTypes\";\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace DeltaNetV01ServerErrors {\n export const USER_ALREADY_AUTHENTICATED_ERROR_TYPE = \"USER_ALREADY_AUTHENTICATED\";\n export const USER_NOT_AUTHENTICATED_ERROR_TYPE = \"USER_NOT_AUTHENTICATED\";\n export const AUTHENTICATION_IN_PROGRESS_ERROR_TYPE = \"AUTHENTICATION_IN_PROGRESS\";\n export const OBSERVER_CANNOT_SEND_STATE_UPDATES_ERROR_TYPE = \"OBSERVER_CANNOT_SEND_STATE_UPDATES\";\n export const UNSUPPORTED_WEBSOCKET_SUBPROTOCOL_ERROR_TYPE = \"UNSUPPORTED_WEBSOCKET_SUBPROTOCOL\";\n export const USER_NETWORKING_UNKNOWN_ERROR_TYPE = \"USER_NETWORKING_UNKNOWN_ERROR\";\n export const USER_AUTHENTICATION_FAILED_ERROR_TYPE = \"USER_AUTHENTICATION_FAILED\";\n export const USER_NETWORKING_CONNECTION_LIMIT_REACHED_ERROR_TYPE = \"CONNECTION_LIMIT_REACHED\";\n export const USER_NETWORKING_SERVER_SHUTDOWN_ERROR_TYPE = \"SERVER_SHUTDOWN\";\n}\n\nexport type DeltaNetV01ServerErrorType =\n | typeof DeltaNetV01ServerErrors.USER_ALREADY_AUTHENTICATED_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.USER_NOT_AUTHENTICATED_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.AUTHENTICATION_IN_PROGRESS_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.OBSERVER_CANNOT_SEND_STATE_UPDATES_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.UNSUPPORTED_WEBSOCKET_SUBPROTOCOL_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.USER_NETWORKING_UNKNOWN_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.USER_AUTHENTICATION_FAILED_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.USER_NETWORKING_CONNECTION_LIMIT_REACHED_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.USER_NETWORKING_SERVER_SHUTDOWN_ERROR_TYPE;\n\nexport type DeltaNetV01ErrorMessage = {\n type: \"error\";\n errorType: DeltaNetV01ServerErrorType | string;\n message: string;\n retryable: boolean; // Whether the client should retry the operation - if false the client should not attempt to reconnect/retry\n};\n\nexport function encodeError(\n msg: DeltaNetV01ErrorMessage,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(ErrorMessageType);\n writer.writeLengthPrefixedString(msg.errorType);\n writer.writeLengthPrefixedString(msg.message);\n writer.writeBoolean(msg.retryable);\n return writer;\n}\n\n// Assumes that the first byte has already been read (the message type)\nexport function decodeError(buffer: BufferReader): DeltaNetV01ErrorMessage {\n const errorType = buffer.readUVarintPrefixedString() as DeltaNetV01ServerErrorType;\n const message = buffer.readUVarintPrefixedString();\n const retryable = buffer.readBoolean();\n return {\n type: \"error\",\n errorType,\n message,\n retryable,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { DeflateCompressor } from \"../../../DeflateCompressor\";\nimport { DecodeServerMessageOptions } from \"../../decodeServerMessages\";\nimport { InitialCheckoutMessageType } from \"../../messageTypes\";\n\n/**\n * Represents a component in the initial checkout message.\n * Contains both the initial values and the delta values that will be used for subsequent ticks.\n */\nexport type DeltaNetV01InitialCheckoutComponent = {\n /** Unique identifier for the component */\n componentId: number;\n /** The delta values from the tick this initial checkout is from which will be referred to in subsequent ticks */\n deltas: BigInt64Array;\n /** The initial values for all users */\n values: BigInt64Array;\n};\n\nexport type DeltaNetV01InitialCheckoutState = {\n /** Unique identifier for the state */\n stateId: number;\n /** The initial values for all users */\n values: Array<Uint8Array>;\n};\n\n/**\n * Initial checkout message sent when a client first connects.\n * Contains the complete initial state of the game, including all components and states.\n */\nexport type DeltaNetV01InitialCheckoutMessage = {\n /** Message type identifier */\n type: \"initialCheckout\";\n /** Current server time */\n serverTime: number;\n /** Number of user indices in the system */\n indicesCount: number;\n /** Array of components with their initial values and deltas */\n components: Array<DeltaNetV01InitialCheckoutComponent>;\n /** Array of state values, each containing [stateId, stateValue] */\n states: Array<DeltaNetV01InitialCheckoutState>;\n};\n\n/**\n * Encodes an initial checkout message into a binary buffer.\n * @param msg - The message to encode\n * @param writer - Optional BufferWriter instance to use (creates a new one if not provided)\n * @returns The BufferWriter containing the encoded message\n */\nexport function encodeInitialCheckout(\n msg: DeltaNetV01InitialCheckoutMessage,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(InitialCheckoutMessageType);\n writer.writeUVarint(msg.serverTime);\n writer.writeUVarint(msg.indicesCount);\n writer.writeUVarint(msg.components.length);\n for (const { componentId, deltas, values } of msg.components) {\n writer.writeUVarint(componentId);\n const [, valuesBytes] = DeflateCompressor.varIntCompress(values, msg.indicesCount);\n writer.writeUVarintLengthPrefixedBytes(valuesBytes);\n const [, deltaBytes] = DeflateCompressor.varIntCompress(deltas, msg.indicesCount);\n writer.writeUVarintLengthPrefixedBytes(deltaBytes);\n }\n writer.writeUVarint(msg.states.length);\n for (const { stateId, values } of msg.states) {\n writer.writeUVarint(stateId);\n const [, stateBytes] = DeflateCompressor.varIntBytesCompress(values, msg.indicesCount);\n writer.writeUVarintLengthPrefixedBytes(stateBytes);\n }\n return writer;\n}\n\nexport const lastInitialCheckoutDebugData: {\n componentsByteLength: number;\n statesByteLength: number;\n} = {\n componentsByteLength: 0,\n statesByteLength: 0,\n};\n\n/**\n * Decodes an initial checkout message from a binary buffer.\n * Assumes that the first byte (message type) has already been read.\n * @param buffer - The BufferReader containing the message data\n * @param opts - Optional options for decoding, such as ignoring data\n * @returns The decoded initial checkout message\n */\nexport function decodeInitialCheckout(\n buffer: BufferReader,\n opts?: DecodeServerMessageOptions,\n): DeltaNetV01InitialCheckoutMessage {\n let componentsByteLength = 0;\n let statesByteLength = 0;\n\n const serverTime = buffer.readUVarint();\n const indicesLength = buffer.readUVarint();\n const componentsLength = buffer.readUVarint();\n const components: Array<DeltaNetV01InitialCheckoutComponent> = [];\n for (let i = 0; i < componentsLength; i++) {\n const componentId = buffer.readUVarint();\n const valuesBytes = buffer.readUVarintPrefixedBytes();\n const values = DeflateCompressor.varIntDecompress(valuesBytes, indicesLength);\n const deltaBytes = buffer.readUVarintPrefixedBytes();\n componentsByteLength += valuesBytes.length + deltaBytes.length;\n if (opts?.ignoreData) {\n components.push({ componentId, deltas: new BigInt64Array(indicesLength), values });\n } else {\n const deltas = DeflateCompressor.varIntDecompress(deltaBytes, indicesLength);\n components.push({ componentId, deltas, values });\n }\n }\n const statesLength = buffer.readUVarint();\n const states: Array<DeltaNetV01InitialCheckoutState> = [];\n for (let i = 0; i < statesLength; i++) {\n const stateId = buffer.readUVarint();\n const valuesBytes = buffer.readUVarintPrefixedBytes();\n statesByteLength += valuesBytes.length;\n if (opts?.ignoreData) {\n const emptyValues = new Array<Uint8Array>(indicesLength).fill(new Uint8Array(0));\n states.push({ stateId, values: emptyValues });\n } else {\n const values = DeflateCompressor.varIntBytesDecompress(valuesBytes, indicesLength);\n states.push({ stateId, values });\n }\n }\n lastInitialCheckoutDebugData.componentsByteLength = componentsByteLength;\n lastInitialCheckoutDebugData.statesByteLength = statesByteLength;\n return {\n type: \"initialCheckout\",\n serverTime,\n indicesCount: indicesLength,\n components,\n states,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { PingMessageType } from \"../../messageTypes\";\n\nexport type DeltaNetV01PingMessage = {\n type: \"ping\";\n ping: number;\n};\n\nexport function encodePing(\n pingMessage: DeltaNetV01PingMessage,\n writer: BufferWriter = new BufferWriter(8),\n): BufferWriter {\n writer.writeUint8(PingMessageType);\n writer.writeUVarint(pingMessage.ping);\n return writer;\n}\n\n// Assumes that the first byte has already been read (the message type)\nexport function decodePing(buffer: BufferReader): DeltaNetV01PingMessage {\n const ping = buffer.readUVarint();\n return {\n type: \"ping\",\n ping,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { ServerCustomMessageType } from \"../../messageTypes\";\n\nexport type DeltaNetV01ServerCustomMessage = {\n type: \"serverCustom\";\n customType: number;\n contents: string;\n};\n\nexport function encodeServerCustom(\n msg: DeltaNetV01ServerCustomMessage,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(ServerCustomMessageType);\n writer.writeUVarint(msg.customType);\n writer.writeLengthPrefixedString(msg.contents);\n return writer;\n}\n\n// Assumes that the first byte has already been read (the message type)\nexport function decodeServerCustom(buffer: BufferReader): DeltaNetV01ServerCustomMessage {\n const customType = buffer.readUVarint();\n const contents = buffer.readUVarintPrefixedString();\n return {\n type: \"serverCustom\",\n customType,\n contents,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { DeflateCompressor } from \"../../../DeflateCompressor\";\nimport { DecodeServerMessageOptions } from \"../../decodeServerMessages\";\nimport { TickMessageType } from \"../../messageTypes\";\n\n/**\n * Represents state updates in a tick message.\n * States are not updated every tick, so they are specified as indices that have changed and their new values.\n */\nexport type DeltaNetV01StateUpdates = {\n /** Unique identifier for the state */\n stateId: number;\n /** Array of [index, value] pairs for updated states */\n updatedStates: Array<[number, Uint8Array]>; //index to state\n};\n\n/**\n * Represents component updates in a tick message.\n * Uses second-order delta compression (deltas of deltas) for efficient updates.\n */\nexport type DeltaNetV01ComponentTick = {\n /** Unique identifier for the component */\n componentId: number;\n /** The second-order delta values (deltas of deltas) from the previous tick */\n deltaDeltas: BigInt64Array;\n};\n\n/**\n * Regular state update message sent at configurable intervals (typically 5-20Hz).\n * Contains updates to components and states, as well as information about user indices.\n */\nexport type DeltaNetV01Tick = {\n /** Message type identifier */\n type: \"tick\";\n /** Current server time */\n serverTime: number;\n /** Indices of users that have been removed since the last tick */\n removedIndices: Array<number>;\n /** Current number of user indices in the system */\n indicesCount: number;\n /** Array of component updates using second-order delta compression */\n componentDeltaDeltas: Array<DeltaNetV01ComponentTick>;\n /** Array of state updates */\n states: Array<DeltaNetV01StateUpdates>;\n};\n\n/**\n * Encodes a tick message into a binary buffer.\n * @param msg - The message to encode\n * @param writer - Optional BufferWriter instance to use (creates a new one if not provided)\n * @returns The BufferWriter containing the encoded message\n */\nexport function encodeTick(\n msg: DeltaNetV01Tick,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(TickMessageType);\n\n writer.writeUVarint(msg.serverTime);\n\n writer.writeUVarint(msg.removedIndices.length);\n for (const index of msg.removedIndices) {\n writer.writeUVarint(index);\n }\n writer.writeUVarint(msg.indicesCount);\n writer.writeUVarint(msg.componentDeltaDeltas.length);\n for (const componentTick of msg.componentDeltaDeltas) {\n writer.writeUVarint(componentTick.componentId);\n const [, deltaDeltasBytes] = DeflateCompressor.varIntCompress(\n componentTick.deltaDeltas,\n msg.indicesCount,\n );\n writer.writeUVarintLengthPrefixedBytes(deltaDeltasBytes);\n }\n writer.writeUVarint(msg.states.length);\n for (const state of msg.states) {\n writer.writeUVarint(state.stateId);\n writer.writeUVarint(state.updatedStates.length);\n\n // Separate indices and values for compression\n const indices = new BigInt64Array(state.updatedStates.length);\n const values = new Array<Uint8Array>(state.updatedStates.length);\n\n for (let i = 0; i < state.updatedStates.length; i++) {\n const [index, value] = state.updatedStates[i];\n indices[i] = BigInt(index);\n values[i] = value;\n }\n\n // Compress and write indices\n const [, compressedIndices] = DeflateCompressor.varIntCompress(indices, indices.length);\n writer.writeUVarintLengthPrefixedBytes(compressedIndices);\n\n // Compress and write values\n const [, compressedValues] = DeflateCompressor.varIntBytesCompress(values, values.length);\n writer.writeUVarintLengthPrefixedBytes(compressedValues);\n }\n return writer;\n}\n\nexport const lastTickDebugData: {\n componentsByteLength: number;\n statesByteLength: number;\n} = {\n componentsByteLength: 0,\n statesByteLength: 0,\n};\n\n/**\n * Decodes a tick message from a binary buffer.\n * Assumes that the first byte (message type) has already been read.\n * @param buffer - The BufferReader containing the message data\n * @param opts - Optional options for decoding, such as ignoring data\n * @returns The decoded tick message\n */\nexport function decodeTick(\n buffer: BufferReader,\n opts?: DecodeServerMessageOptions,\n): DeltaNetV01Tick {\n let componentsByteLength = 0;\n let statesByteLength = 0;\n\n const serverTime = buffer.readUVarint();\n const removedIndicesLength = buffer.readUVarint();\n const removedIndices: Array<number> = [];\n for (let i = 0; i < removedIndicesLength; i++) {\n removedIndices.push(buffer.readUVarint());\n }\n const indicesCount = buffer.readUVarint();\n const componentsLength = buffer.readUVarint();\n const components: Array<DeltaNetV01ComponentTick> = [];\n for (let i = 0; i < componentsLength; i++) {\n const componentId = buffer.readUVarint();\n const deltaDeltaBytes = buffer.readUVarintPrefixedBytes();\n componentsByteLength += deltaDeltaBytes.byteLength;\n if (opts?.ignoreData) {\n components.push({ componentId, deltaDeltas: new BigInt64Array(indicesCount) });\n } else {\n const deltaDeltas = DeflateCompressor.varIntDecompress(deltaDeltaBytes, indicesCount);\n components.push({ componentId, deltaDeltas });\n }\n }\n const statesLength = buffer.readUVarint();\n const states: Array<DeltaNetV01StateUpdates> = [];\n for (let i = 0; i < statesLength; i++) {\n const stateId = buffer.readUVarint();\n const stateCount = buffer.readUVarint();\n const state: DeltaNetV01StateUpdates = {\n stateId,\n updatedStates: [],\n };\n\n const compressedIndices = buffer.readUVarintPrefixedBytes();\n const compressedValues = buffer.readUVarintPrefixedBytes();\n statesByteLength += compressedIndices.byteLength;\n statesByteLength += compressedValues.byteLength;\n\n if (stateCount > 0) {\n // Read and decompress indices\n const indices = DeflateCompressor.varIntDecompress(compressedIndices, stateCount);\n const values = DeflateCompressor.varIntBytesDecompress(compressedValues, stateCount);\n\n // Recombine indices and values\n for (let j = 0; j < stateCount; j++) {\n const index = Number(indices[j]);\n const value = values[j];\n state.updatedStates.push([index, value]);\n }\n }\n\n states.push(state);\n }\n lastTickDebugData.componentsByteLength = componentsByteLength;\n lastTickDebugData.statesByteLength = statesByteLength;\n return {\n type: \"tick\",\n serverTime,\n removedIndices,\n indicesCount,\n componentDeltaDeltas: components,\n states,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { UserIndexMessageType } from \"../../messageTypes\";\n\nexport type DeltaNetV01UserIndexMessage = {\n type: \"userIndex\";\n index: number;\n};\n\nexport function encodeUserIndex(\n msg: DeltaNetV01UserIndexMessage,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(UserIndexMessageType);\n writer.writeUVarint(msg.index);\n return writer;\n}\n\n// Assumes that the first byte has already been read (the message type)\nexport function decodeUserIndex(buffer: BufferReader): DeltaNetV01UserIndexMessage {\n const index = buffer.readUVarint();\n return {\n type: \"userIndex\",\n index,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { WarningMessageType } from \"../../messageTypes\";\n\nexport type DeltaNetV01WarningMessage = {\n type: \"warning\";\n message: string;\n};\n\nexport function encodeWarning(\n msg: DeltaNetV01WarningMessage,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(WarningMessageType);\n writer.writeLengthPrefixedString(msg.message);\n return writer;\n}\n\n// Assumes that the first byte has already been read (the message type)\nexport function decodeWarning(buffer: BufferReader): DeltaNetV01WarningMessage {\n const message = buffer.readUVarintPrefixedString();\n return {\n type: \"warning\",\n message,\n };\n}\n", "import { BufferReader } from \"../BufferReader\";\n\nimport {\n decodeError,\n decodeInitialCheckout,\n decodePing,\n decodeServerCustom,\n decodeTick,\n decodeUserIndex,\n decodeWarning,\n DeltaNetV01ServerMessage,\n} from \"./messages\";\nimport {\n ErrorMessageType,\n InitialCheckoutMessageType,\n PingMessageType,\n ServerCustomMessageType,\n TickMessageType,\n UserIndexMessageType,\n WarningMessageType,\n} from \"./messageTypes\";\n\nexport type DecodeServerMessageOptions = {\n ignoreData?: boolean; // Used when the client doesn't want to process data, e.g., in bot mode\n};\n\nexport function decodeServerMessages(\n buffer: BufferReader,\n opts?: DecodeServerMessageOptions,\n): Array<DeltaNetV01ServerMessage> {\n const messages: DeltaNetV01ServerMessage[] = [];\n while (!buffer.isEnd()) {\n const messageType = buffer.readUInt8();\n switch (messageType) {\n case InitialCheckoutMessageType:\n messages.push(decodeInitialCheckout(buffer, opts));\n break;\n case UserIndexMessageType:\n messages.push(decodeUserIndex(buffer));\n break;\n case TickMessageType:\n messages.push(decodeTick(buffer, opts));\n break;\n case ServerCustomMessageType:\n messages.push(decodeServerCustom(buffer));\n break;\n case PingMessageType:\n messages.push(decodePing(buffer));\n break;\n case WarningMessageType:\n messages.push(decodeWarning(buffer));\n break;\n case ErrorMessageType:\n messages.push(decodeError(buffer));\n break;\n default:\n throw new Error(`Unknown message type: ${messageType}`);\n }\n }\n return messages;\n}\n", "import { BufferWriter } from \"../BufferWriter\";\n\nimport {\n DeltaNetV01ClientMessage,\n encodeConnectUser,\n encodePong,\n encodeSetUserComponents,\n encodeClientCustom,\n} from \"./messages\";\n\nexport function encodeClientMessage(message: DeltaNetV01ClientMessage, writer: BufferWriter) {\n const type = message.type;\n switch (type) {\n case \"connectUser\":\n return encodeConnectUser(message, writer);\n case \"setUserComponents\":\n return encodeSetUserComponents(message, writer);\n case \"pong\":\n return encodePong(message, writer);\n case \"clientCustom\":\n return encodeClientCustom(message, writer);\n default:\n throw new Error(`Unknown message type: ${type}`);\n }\n}\n", "import { BufferWriter } from \"../BufferWriter\";\n\nimport {\n DeltaNetV01ServerMessage,\n encodeInitialCheckout,\n encodeServerCustom,\n encodeUserIndex,\n} from \"./messages\";\nimport { encodeError } from \"./messages/from-server/error\";\nimport { encodePing } from \"./messages/from-server/ping\";\nimport { encodeTick } from \"./messages/from-server/tick\";\nimport { encodeWarning } from \"./messages/from-server/warning\";\n\nexport function encodeServerMessage(\n message: DeltaNetV01ServerMessage,\n writer?: BufferWriter,\n): BufferWriter {\n switch (message.type) {\n case \"initialCheckout\":\n return encodeInitialCheckout(message, writer);\n case \"tick\":\n return encodeTick(message, writer);\n case \"userIndex\":\n return encodeUserIndex(message, writer);\n case \"ping\":\n return encodePing(message, writer);\n case \"serverCustom\":\n return encodeServerCustom(message, writer);\n case \"warning\":\n return encodeWarning(message, writer);\n case \"error\":\n return encodeError(message, writer);\n default:\n throw new Error(`Unknown message type: ${(message as any).type}`);\n }\n}\n"],
5
- "mappings": "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",
3
+ "sources": ["../src/BufferReader.ts", "../src/BufferWriter.ts", "../src/DeflateCompressor.ts", "../src/delta-net-v0.1/constants.ts", "../src/delta-net-v0.1/messageTypes.ts", "../src/delta-net-v0.1/messages/from-client/clientCustom.ts", "../src/delta-net-v0.1/messages/from-client/connectUser.ts", "../src/delta-net-v0.1/messages/from-client/pong.ts", "../src/delta-net-v0.1/messages/from-client/setUserComponents.ts", "../src/delta-net-v0.1/decodeClientMessages.ts", "../src/delta-net-v0.1/messages/from-server/error.ts", "../src/delta-net-v0.1/messages/from-server/initialCheckout.ts", "../src/delta-net-v0.1/messages/from-server/ping.ts", "../src/delta-net-v0.1/messages/from-server/serverCustom.ts", "../src/delta-net-v0.1/messages/from-server/tick.ts", "../src/delta-net-v0.1/messages/from-server/userIndex.ts", "../src/delta-net-v0.1/messages/from-server/warning.ts", "../src/delta-net-v0.1/decodeServerMessages.ts", "../src/delta-net-v0.1/encodeClientMessage.ts", "../src/delta-net-v0.1/encodeServerMessage.ts", "../src/delta-net-v0.2/constants.ts", "../src/delta-net-v0.2/messages/from-server/initialCheckout.ts", "../src/delta-net-v0.2/messages/from-server/tick.ts", "../src/delta-net-v0.2/decodeServerMessages.ts", "../src/delta-net-v0.2/encodeServerMessage.ts", "../src/index.ts"],
4
+ "sourcesContent": ["const textDecoder = new TextDecoder();\n\n/**\n * A class for reading binary data from a Uint8Array buffer.\n * Supports various data types including varints, strings, and boolean arrays.\n * All numeric values are read using varint encoding for efficiency.\n */\nexport class BufferReader {\n private buffer: Uint8Array;\n private offset: number;\n\n /**\n * Creates a new BufferReader instance.\n * @param buffer - The Uint8Array to read from\n */\n constructor(buffer: Uint8Array) {\n this.buffer = buffer;\n this.offset = 0;\n }\n\n /**\n * Reads a single unsigned 8-bit integer from the buffer.\n * @returns The read value\n */\n public readUInt8(): number {\n return this.buffer[this.offset++];\n }\n\n /**\n * Reads a boolean value from the buffer.\n * @returns true if the read byte is 1, false otherwise\n */\n public readBoolean(): boolean {\n return this.readUInt8() === 1;\n }\n\n /**\n * Reads a specified number of bytes from the buffer.\n * @param length - The number of bytes to read\n * @returns A new Uint8Array containing the read bytes\n */\n public readBytes(length: number): Uint8Array {\n const bytes = this.buffer.subarray(this.offset, this.offset + length);\n this.offset += length;\n return bytes;\n }\n\n /**\n * Reads a length-prefixed byte array from the buffer.\n * The length is encoded as a varint.\n * @returns A new Uint8Array containing the read bytes\n */\n public readUVarintPrefixedBytes(): Uint8Array {\n const length = this.readUVarint();\n return this.readBytes(length);\n }\n\n /**\n * Reads a varint-encoded integer from the buffer.\n * Varints are variable-length integers that use the high bit of each byte to indicate if more bytes follow.\n * @param signed - Whether to interpret the value as a signed integer\n * @returns The decoded integer value\n * @throws Error if the varint encoding is invalid\n */\n public readUVarint(signed = false): number {\n let lo = 0;\n let hi = 0;\n let i = 0;\n for (; i < 4; ++i) {\n lo = (lo | ((this.buffer[this.offset] & 127) << (i * 7))) >>> 0;\n if (this.buffer[this.offset++] < 128) {\n return signed ? loAndHiAsSigned(lo, hi) : loAndHiAsUnsigned(lo, hi);\n }\n }\n lo = (lo | ((this.buffer[this.offset] & 127) << 28)) >>> 0;\n hi = (hi | ((this.buffer[this.offset] & 127) >> 4)) >>> 0;\n if (this.buffer[this.offset++] < 128) {\n return signed ? loAndHiAsSigned(lo, hi) : loAndHiAsUnsigned(lo, hi);\n }\n i = 0;\n for (; i < 5; ++i) {\n hi = (hi | ((this.buffer[this.offset] & 127) << (i * 7 + 3))) >>> 0;\n if (this.buffer[this.offset++] < 128) {\n return signed ? loAndHiAsSigned(lo, hi) : loAndHiAsUnsigned(lo, hi);\n }\n }\n\n throw Error(\"invalid varint encoding\");\n }\n\n /**\n * Reads a string from the buffer with a specified byte length.\n * Optimized for ASCII strings, falls back to TextDecoder for non-ASCII.\n * @param byteLength - The number of bytes to read\n * @returns The decoded string\n */\n private readStringBytes(byteLength: number): string {\n let string = \"\";\n let hasNonAscii = false;\n for (let i = 0; i < byteLength; i++) {\n const charValue = this.buffer[this.offset + i];\n if (charValue < 0x80) {\n string += String.fromCharCode(charValue);\n } else {\n hasNonAscii = true;\n break;\n }\n }\n if (!hasNonAscii) {\n this.offset += byteLength;\n return string;\n }\n\n // Slow path - decode the string using TextDecoder\n const result = textDecoder.decode(this.buffer.subarray(this.offset, this.offset + byteLength));\n this.offset += byteLength;\n return result;\n }\n\n /**\n * Reads a length-prefixed string from the buffer.\n * The length is encoded as an unsigned varint.\n * @returns The decoded string\n */\n public readUVarintPrefixedString(): string {\n const readLength = this.readUVarint();\n return this.readStringBytes(readLength);\n }\n\n /**\n * Reads a length-prefixed string from the buffer.\n * The length is encoded as a signed varint.\n * @returns A tuple containing the decoded string and a boolean indicating if the length was negative\n */\n public readVarintPrefixedString(): [string, boolean] {\n const length = this.readVarint();\n const negativeLength = length < 0;\n const readLength = negativeLength ? -length : length;\n const result = this.readStringBytes(readLength);\n return [result, negativeLength];\n }\n\n /**\n * Reads a signed varint-encoded integer from the buffer.\n * @returns The decoded signed integer value\n */\n public readVarint(): number {\n return this.readUVarint(true);\n }\n\n /**\n * Reads a varint-encoded bigint from the buffer.\n * Varints are variable-length integers that use the high bit of each byte to indicate if more bytes follow.\n * @param signed - Whether to interpret the value as a signed integer\n * @returns The decoded bigint value\n * @throws Error if the varint encoding is invalid\n */\n public readUVarintBigInt(signed = false): bigint {\n let result = 0n;\n let shift = 0n;\n let byte: number;\n let bytesRead = 0;\n\n do {\n if (bytesRead >= 10) {\n throw Error(\"invalid varint encoding\");\n }\n byte = this.buffer[this.offset++];\n result |= BigInt(byte & 0x7f) << shift;\n shift += 7n;\n bytesRead++;\n } while (byte >= 0x80);\n\n if (signed) {\n // Convert from zigzag encoding\n return result & 1n ? -(result + 1n) / 2n : result / 2n;\n }\n\n return result;\n }\n\n /**\n * Reads a signed varint-encoded integer from the buffer.\n * @returns The decoded signed integer value\n */\n public readBigIntVarint(): bigint {\n return this.readUVarintBigInt(true);\n }\n\n /**\n * Reads an array of boolean values from the buffer.\n * The booleans are packed into bytes (8 booleans per byte).\n * @returns An array of boolean values\n */\n public readLengthPrefixedBoolArray(): boolean[] {\n // The length is the number of bools/bits to allow the reader to determine a non-multiple of 8 length and to allocate\n const length = this.readUVarint();\n // The booleans are packed into a single byte\n const numBytes = Math.ceil(length / 8);\n const result = new Array<boolean>(length);\n for (let i = 0; i < length; i++) {\n const byteIndex = Math.floor(i / 8);\n const bitPosition = i % 8;\n result[i] = !!(this.buffer[this.offset + byteIndex] & (1 << bitPosition));\n }\n this.offset += numBytes;\n return result;\n }\n\n /**\n * Checks if the reader has reached the end of the buffer.\n * @returns true if all bytes have been read, false otherwise\n */\n public isEnd() {\n return this.offset >= this.buffer.length;\n }\n}\n\n/**\n * Converts a low and high 32-bit integer pair to a signed 64-bit integer.\n * @param lo - The low 32 bits\n * @param hi - The high 32 bits\n * @returns The signed 64-bit integer value\n */\nfunction loAndHiAsSigned(lo: number, hi: number) {\n const value = lo + hi * 4294967296;\n if (value & 1) {\n return -(value + 1) / 2;\n }\n return value / 2;\n}\n\n/**\n * Converts a low and high 32-bit integer pair to an unsigned 64-bit integer.\n * @param lo - The low 32 bits\n * @param hi - The high 32 bits\n * @returns The unsigned 64-bit integer value\n */\nfunction loAndHiAsUnsigned(lo: number, hi: number) {\n return lo + hi * 4294967296;\n}\n", "const textEncoder = new TextEncoder();\n\n/**\n * A class for writing binary data to a Uint8Array buffer.\n * Supports various data types including varints, strings, and boolean arrays.\n * All numeric values are written using varint encoding for efficiency.\n * The buffer automatically expands as needed.\n */\nexport class BufferWriter {\n private buffer: Uint8Array;\n private offset: number;\n\n /**\n * Creates a new BufferWriter instance.\n * @param initialLength - The initial size of the buffer in bytes\n */\n constructor(initialLength: number) {\n this.buffer = new Uint8Array(initialLength);\n this.offset = 0;\n }\n\n /**\n * Writes an unsigned 8-bit integer to the buffer.\n * @param value - The value to write (will be truncated to 8 bits)\n */\n public writeUint8(value: number): void {\n this.ensureCapacity(1);\n this.buffer[this.offset] = value & 0xff;\n this.offset += 1;\n }\n\n /**\n * Writes a boolean value to the buffer.\n * @param bool - The boolean value to write (true = 1, false = 0)\n */\n public writeBoolean(bool: boolean) {\n this.writeUint8(bool ? 1 : 0);\n }\n\n /**\n * Writes an array of bytes to the buffer without a length prefix.\n * @param bytes - The bytes to write\n */\n public writeUnprefixedBytes(bytes: Uint8Array): void {\n this.ensureCapacity(bytes.byteLength);\n this.buffer.set(bytes, this.offset);\n this.offset += bytes.byteLength;\n }\n\n /**\n * Writes a length-prefixed array of bytes to the buffer.\n * The length is encoded as an unsigned varint.\n * @param bytes - The bytes to write\n */\n public writeUVarintLengthPrefixedBytes(bytes: Uint8Array): void {\n if (!(bytes instanceof Uint8Array)) {\n throw new Error(\"bytes must be a Uint8Array\");\n }\n this.writeUVarint(bytes.byteLength);\n this.writeUnprefixedBytes(bytes);\n }\n\n /**\n * Gets the written bytes as a Uint8Array.\n * @returns A new Uint8Array containing only the written bytes\n */\n public getBuffer(): Uint8Array {\n return this.buffer.subarray(0, this.offset);\n }\n\n /**\n * Gets the number of bytes written so far.\n * @returns The current write offset\n */\n public getWrittenLength(): number {\n return this.offset;\n }\n\n /**\n * Ensures the buffer has enough capacity for the required space.\n * @param neededSpace - The number of additional bytes needed\n */\n private ensureCapacity(neededSpace: number): void {\n while (this.offset + neededSpace > this.buffer.length) {\n this.expandBuffer();\n }\n }\n\n /**\n * Expands the buffer by doubling its current length.\n */\n private expandBuffer(): void {\n const newBuffer = new Uint8Array(this.buffer.length * 2);\n newBuffer.set(this.buffer);\n this.buffer = newBuffer;\n }\n\n /**\n * Writes an unsigned varint to the buffer.\n * Varints are variable-length integers that use the high bit of each byte to indicate if more bytes follow.\n * @param x - The value to write\n */\n public writeUVarint(x: number) {\n if (x <= 268435455) {\n // Simple case that can be handled without hi and lo\n this.ensureCapacity(4);\n while (x >= 0x80) {\n this.buffer[this.offset] = (x & 0x7f) | 0x80; // Extract least significant 7 bits and set continuation bit\n this.offset++;\n x >>>= 7; // Use unsigned shift here\n }\n this.buffer[this.offset] = x & 0x7f; // No need for 0xff here since we're limiting it to 7 bits\n this.offset++;\n return;\n }\n this.ensureCapacity(10);\n\n let lo = 0;\n let hi = 0;\n if (x !== 0) {\n lo = x >>> 0;\n hi = ((x - lo) / 4294967296) >>> 0;\n }\n\n while (hi) {\n this.buffer[this.offset++] = (lo & 127) | 128;\n lo = ((lo >>> 7) | (hi << 25)) >>> 0;\n hi >>>= 7;\n }\n while (lo > 127) {\n this.buffer[this.offset++] = (lo & 127) | 128;\n lo = lo >>> 7;\n }\n this.buffer[this.offset++] = lo;\n }\n\n /**\n * Writes an unsigned varint to the buffer.\n * Varints are variable-length integers that use the high bit of each byte to indicate if more bytes follow.\n * @param x - The value to write\n */\n public writeUVarintBigInt(x: bigint) {\n this.ensureCapacity(10);\n\n while (x >= 0x80n) {\n this.buffer[this.offset] = Number(x & 0x7fn) | 0x80;\n this.offset++;\n x >>= 7n;\n }\n this.buffer[this.offset] = Number(x & 0x7fn);\n this.offset++;\n }\n\n /**\n * Writes a signed varint to the buffer using zigzag encoding.\n * @param x - The signed value to write\n */\n public writeVarint(x: number) {\n if (x >= 0) {\n this.writeUVarint(x * 2);\n } else {\n this.writeUVarint(-x * 2 - 1);\n }\n }\n\n /**\n * Writes a signed varint to the buffer using zigzag encoding.\n * @param x - The signed value to write\n */\n public writeBigIntVarint(x: bigint) {\n if (x >= 0n) {\n this.writeUVarintBigInt(x * 2n);\n } else {\n this.writeUVarintBigInt(-x * 2n - 1n);\n }\n }\n\n /**\n * Writes an array of boolean values to the buffer.\n * The booleans are packed into bytes (8 booleans per byte).\n * @param data - The array of boolean values to write\n */\n public writeLengthPrefixedBoolArray(data: boolean[]) {\n // The length is the number of bools/bits to allow the reader to determine a non-multiple of 8 length and to allocate\n this.writeUVarint(data.length);\n // Pack the booleans into a single byte\n const numBytes = Math.ceil(data.length / 8);\n this.ensureCapacity(numBytes + 4);\n\n // Pack booleans into bits\n for (let i = 0; i < data.length; i++) {\n if (data[i]) {\n // Set the bit at position i\n const byteIndex = Math.floor(i / 8);\n const bitPosition = i % 8;\n this.buffer[this.offset + byteIndex] |= 1 << bitPosition;\n }\n }\n this.offset += numBytes;\n }\n\n /**\n * Writes a length-prefixed string to the buffer.\n * Optimized for ASCII strings, falls back to TextEncoder for non-ASCII.\n * @param value - The string to write\n * @param varint - Whether to use signed varint for length (default: false)\n * @param negativeLength - Whether the length should be negative (only used if varint is true)\n */\n public writeLengthPrefixedString(value: string, varint = false, negativeLength = false) {\n /*\n Try fast case first - no non-ascii characters and byte length is string length.\n\n Even if this case fails (non-ascii character found) the data will always be\n shorter so it can be overwritten\n */\n const originalOffset = this.offset; // store this in case we need to overwrite from here\n // Just write the length of the string (not the known encoded length)\n if (varint) {\n this.writeVarint(negativeLength ? -value.length : value.length);\n } else {\n this.writeUVarint(value.length);\n }\n this.ensureCapacity(value.length); // Ensure we have enough space for the string\n let nonAscii = false;\n for (let i = 0; i < value.length; i++) {\n const charCode = value.charCodeAt(i);\n if (charCode > 0x7f) {\n nonAscii = true;\n break;\n }\n this.buffer[this.offset++] = charCode;\n }\n\n if (!nonAscii) {\n return;\n }\n\n /*\n If we have non-ascii characters, we need to encode the string respecting\n utf-8 and overwrite the buffer from the original offset\n */\n this.offset = originalOffset; // overwrite the length\n let encodedLength = value.length; // This will be overwritten once we know the actual length\n this.ensureCapacity(encodedLength); // This will be at least the required length, but it gives the chance of initially creating a large enough buffer\n while (true) {\n this.offset = originalOffset;\n if (varint) {\n this.writeVarint(negativeLength ? -encodedLength : encodedLength);\n } else {\n this.writeUVarint(encodedLength);\n }\n const offsetAfterVarint = this.offset;\n const varintLength = offsetAfterVarint - originalOffset;\n\n const writeBuffer = new Uint8Array(this.buffer.buffer, this.offset);\n const { read, written } = textEncoder.encodeInto(value, writeBuffer);\n if (read !== value.length) {\n // Need more space and try again\n this.expandBuffer();\n continue;\n }\n if (written !== encodedLength) {\n encodedLength = written;\n // We need to overwrite the varint with the correct length\n this.offset = originalOffset;\n if (varint) {\n this.writeVarint(negativeLength ? -encodedLength : encodedLength);\n } else {\n this.writeUVarint(encodedLength);\n }\n const newOffsetAfterVarint = this.offset;\n const actualVarintLength = newOffsetAfterVarint - originalOffset;\n if (actualVarintLength !== varintLength) {\n // The varint length changed and it has overwritten the string\n // We need to write the string again\n continue;\n } else {\n // The varint length is the same so the string is intact\n }\n }\n // String written successfully - update the offset\n this.offset += written;\n return;\n }\n }\n}\n\n/**\n * Encodes a signed integer using zigzag encoding.\n * Zigzag encoding maps signed integers to unsigned integers in a way that preserves ordering.\n * @param value - The signed value to encode\n * @returns The zigzag-encoded value\n */\nexport function zigzagEncode(value: number): number {\n // Positive numbers: 2*n\n // Negative numbers: 2*|n|-1\n return value >= 0 ? value * 2 : -value * 2 - 1;\n}\n", "import { deflate, inflate } from \"pako\";\n\nlet nodeZlibFunctions: {\n deflateSync: (data: Uint8Array) => Uint8Array;\n inflateSync: (data: Uint8Array) => Uint8Array;\n} | null = null;\ntry {\n const isNode =\n typeof process !== \"undefined\" && process.versions && typeof process.versions.node === \"string\";\n\n if (isNode) {\n (async () => {\n try {\n const nodeZlib = await import(\"node:zlib\");\n nodeZlibFunctions = {\n deflateSync: (data: Uint8Array) => {\n const result = nodeZlib.deflateSync(data);\n return new Uint8Array(result);\n },\n inflateSync: (data: Uint8Array) => {\n const result = nodeZlib.inflateSync(data);\n return new Uint8Array(result);\n },\n };\n } catch (e) {\n console.log(\"nodeZlib not available - sync\", e);\n }\n })();\n }\n} catch (e) {\n console.log(\"nodeZlib not available - sync\", e);\n}\n\nexport enum CompressionLibraryChoice {\n PAKO = \"PAKO\",\n NODE_ZLIB = \"NODE_ZLIB\",\n NO_PREFERENCE = \"NO_PREFERENCE\",\n NONE = \"NONE\",\n}\n\nimport { BufferReader } from \"./BufferReader\";\nimport { BufferWriter } from \"./BufferWriter\";\n\nfunction getCompressFunction(compressionLibrary: CompressionLibraryChoice) {\n switch (compressionLibrary) {\n case CompressionLibraryChoice.PAKO:\n return deflate;\n case CompressionLibraryChoice.NODE_ZLIB:\n if (nodeZlibFunctions) {\n return nodeZlibFunctions.deflateSync;\n } else {\n throw new Error(\"node:zlib not available\");\n }\n case CompressionLibraryChoice.NO_PREFERENCE:\n if (nodeZlibFunctions) {\n return nodeZlibFunctions.deflateSync;\n } else {\n return deflate;\n }\n case CompressionLibraryChoice.NONE:\n return (data: Uint8Array) => {\n return new Uint8Array(data);\n };\n }\n}\n\nfunction getDecompressFunction(compressionLibrary: CompressionLibraryChoice) {\n switch (compressionLibrary) {\n case CompressionLibraryChoice.PAKO:\n return inflate;\n case CompressionLibraryChoice.NODE_ZLIB:\n if (nodeZlibFunctions) {\n return nodeZlibFunctions.inflateSync;\n } else {\n throw new Error(\"node:zlib not available\");\n }\n case CompressionLibraryChoice.NO_PREFERENCE:\n if (nodeZlibFunctions) {\n return nodeZlibFunctions.inflateSync;\n } else {\n return inflate;\n }\n case CompressionLibraryChoice.NONE:\n return (data: Uint8Array) => {\n return new Uint8Array(data);\n };\n }\n}\n\nexport class DeflateCompressor {\n public static compress(\n data: Uint8Array,\n compressionLibrary: CompressionLibraryChoice = CompressionLibraryChoice.NO_PREFERENCE,\n ): Uint8Array {\n return getCompressFunction(compressionLibrary)(data);\n }\n\n public static decompress(\n compressed: Uint8Array,\n compressionLibrary: CompressionLibraryChoice = CompressionLibraryChoice.NO_PREFERENCE,\n ): Uint8Array {\n return getDecompressFunction(compressionLibrary)(compressed);\n }\n\n public static varIntCompress(\n data: BigInt64Array,\n length: number,\n compressionLibrary: CompressionLibraryChoice = CompressionLibraryChoice.NO_PREFERENCE,\n ): [Uint8Array, Uint8Array] {\n if (length > data.length) {\n throw new Error(\"length is greater than the data length\");\n }\n const writer = new BufferWriter(length);\n for (let i = 0; i < length; i++) {\n writer.writeBigIntVarint(data[i]);\n }\n const uint8Array = writer.getBuffer();\n return [uint8Array, DeflateCompressor.compress(uint8Array, compressionLibrary)];\n }\n\n public static varIntDecompress(\n compressed: Uint8Array,\n length: number,\n compressionLibrary: CompressionLibraryChoice = CompressionLibraryChoice.NO_PREFERENCE,\n ): BigInt64Array {\n const data = DeflateCompressor.decompress(compressed, compressionLibrary);\n const buffer = new BigInt64Array(length);\n const reader = new BufferReader(data);\n for (let i = 0; i < length; i++) {\n buffer[i] = reader.readBigIntVarint();\n }\n return buffer;\n }\n\n public static varIntBytesCompress(\n data: Array<Uint8Array | null>,\n length: number,\n compressionLibrary: CompressionLibraryChoice = CompressionLibraryChoice.NO_PREFERENCE,\n ): [Uint8Array, Uint8Array] {\n if (length > data.length) {\n throw new Error(\"length is greater than the data length\");\n }\n const writer = new BufferWriter(length);\n for (let i = 0; i < length; i++) {\n const value = data[i];\n if (value === null || value === undefined) {\n writer.writeUVarintLengthPrefixedBytes(new Uint8Array(0));\n } else {\n writer.writeUVarintLengthPrefixedBytes(value);\n }\n }\n const uint8Array = writer.getBuffer();\n return [uint8Array, DeflateCompressor.compress(uint8Array, compressionLibrary)];\n }\n\n public static varIntBytesDecompress(\n compressed: Uint8Array,\n length: number,\n compressionLibrary: CompressionLibraryChoice = CompressionLibraryChoice.NO_PREFERENCE,\n ): Array<Uint8Array> {\n const data = DeflateCompressor.decompress(compressed, compressionLibrary);\n const buffer = new Array<Uint8Array>(length);\n const reader = new BufferReader(data);\n for (let i = 0; i < length; i++) {\n buffer[i] = reader.readUVarintPrefixedBytes();\n }\n return buffer;\n }\n}\n", "export const deltaNetProtocolSubProtocol_v0_1 = \"delta-net-v0.1\";\n", "// Server -> Client\nexport const InitialCheckoutMessageType = 1;\nexport const ServerCustomMessageType = 2;\nexport const UserIndexMessageType = 3;\nexport const TickMessageType = 4;\nexport const PingMessageType = 5;\nexport const WarningMessageType = 6;\nexport const ErrorMessageType = 7;\n\n// Client -> Server\nexport const ConnectUserMessageType = 64;\nexport const ClientCustomMessageType = 65;\nexport const SetUserComponentsMessageType = 66;\nexport const SetUserStateMessageType = 67;\nexport const PongMessageType = 68;\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { ClientCustomMessageType } from \"../../messageTypes\";\n\nexport type DeltaNetV01ClientCustomMessage = {\n type: \"clientCustom\";\n customType: number;\n contents: string;\n};\n\nexport function encodeClientCustom(\n msg: DeltaNetV01ClientCustomMessage,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(ClientCustomMessageType);\n writer.writeUVarint(msg.customType);\n writer.writeLengthPrefixedString(msg.contents);\n return writer;\n}\n\n// Assumes that the first byte has already been read (the message type)\nexport function decodeClientCustom(buffer: BufferReader): DeltaNetV01ClientCustomMessage {\n const customType = buffer.readUVarint();\n const contents = buffer.readUVarintPrefixedString();\n return {\n type: \"clientCustom\",\n customType,\n contents,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { ConnectUserMessageType } from \"../../messageTypes\";\n\n/**\n * Initial connection request message from client to server.\n * Contains authentication token and initial state of the connecting user.\n */\nexport type DeltaNetV01ConnectUserMessage = {\n /** Message type identifier */\n type: \"connectUser\";\n /** Authentication token for the user */\n token: string;\n /** Whether the client is an observer-only client */\n observer: boolean;\n /** Array of [componentId, value] pairs for the user's initial component values */\n components: Array<[number, bigint]>;\n /** Array of [stateId, value] pairs for the user's initial state values */\n states: Array<[number, Uint8Array]>;\n};\n\n/**\n * Encodes a connect user message into a binary buffer.\n * @param connectUserMessage - The message to encode\n * @param writer - The BufferWriter to write to\n */\nexport function encodeConnectUser(\n connectUserMessage: DeltaNetV01ConnectUserMessage,\n writer: BufferWriter,\n) {\n writer.writeUint8(ConnectUserMessageType);\n writer.writeLengthPrefixedString(connectUserMessage.token);\n writer.writeBoolean(connectUserMessage.observer ?? false);\n writer.writeUVarint(connectUserMessage.components.length);\n for (const [componentId, componentValue] of connectUserMessage.components) {\n writer.writeUVarint(componentId);\n writer.writeBigIntVarint(componentValue);\n }\n writer.writeUVarint(connectUserMessage.states.length);\n for (const [stateId, stateValue] of connectUserMessage.states) {\n writer.writeUVarint(stateId);\n writer.writeUVarintLengthPrefixedBytes(stateValue);\n }\n}\n\n/**\n * Decodes a connect user message from a binary buffer.\n * Assumes that the first byte (message type) has already been read.\n * @param buffer - The BufferReader containing the message data\n * @returns The decoded connect user message\n */\nexport function decodeConnectUser(buffer: BufferReader): DeltaNetV01ConnectUserMessage {\n const token = buffer.readUVarintPrefixedString();\n const observer = buffer.readBoolean();\n const componentsLength = buffer.readUVarint();\n const components: Array<[number, bigint]> = [];\n for (let i = 0; i < componentsLength; i++) {\n const componentId = buffer.readUVarint();\n const componentValue = buffer.readBigIntVarint();\n components.push([componentId, componentValue]);\n }\n const statesLength = buffer.readUVarint();\n const states: Array<[number, Uint8Array]> = [];\n for (let i = 0; i < statesLength; i++) {\n const stateId = buffer.readUVarint();\n const stateValue = buffer.readUVarintPrefixedBytes();\n states.push([stateId, stateValue]);\n }\n return {\n type: \"connectUser\",\n token,\n observer,\n components,\n states,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { PongMessageType } from \"../../messageTypes\";\n\nexport type DeltaNetV01PongMessage = {\n type: \"pong\";\n pong: number;\n};\n\nexport function encodePong(pongMessage: DeltaNetV01PongMessage, writer: BufferWriter) {\n writer.writeUint8(PongMessageType);\n writer.writeUVarint(pongMessage.pong);\n}\n\n// Assumes that the first byte has already been read (the message type)\nexport function decodePong(buffer: BufferReader): DeltaNetV01PongMessage {\n const pong = buffer.readUVarint();\n return {\n type: \"pong\",\n pong,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { SetUserComponentsMessageType } from \"../../messageTypes\";\n\n/**\n * Message sent by client to update component and state values.\n * Used to send user input and state changes to the server.\n */\nexport type DeltaNetV01SetUserComponentsMessage = {\n /** Message type identifier */\n type: \"setUserComponents\";\n /** Array of [componentId, value] pairs for updated component values */\n components: Array<[number, bigint]>;\n /** Array of [stateId, value] pairs for updated state values */\n states: Array<[number, Uint8Array]>;\n};\n\n/**\n * Encodes a set user components message into a binary buffer.\n * @param message - The message to encode\n * @param writer - The BufferWriter to write to\n */\nexport function encodeSetUserComponents(\n message: DeltaNetV01SetUserComponentsMessage,\n writer: BufferWriter,\n) {\n writer.writeUint8(SetUserComponentsMessageType);\n writer.writeUVarint(message.components.length);\n for (const [componentId, componentValue] of message.components) {\n writer.writeUVarint(componentId);\n writer.writeBigIntVarint(componentValue);\n }\n writer.writeUVarint(message.states.length);\n for (const [stateId, stateValue] of message.states) {\n writer.writeUVarint(stateId);\n writer.writeUVarintLengthPrefixedBytes(stateValue);\n }\n}\n\n/**\n * Decodes a set user components message from a binary buffer.\n * Assumes that the first byte (message type) has already been read.\n * @param buffer - The BufferReader containing the message data\n * @returns The decoded set user components message\n */\nexport function decodeSetUserComponents(buffer: BufferReader): DeltaNetV01SetUserComponentsMessage {\n const componentsLength = buffer.readUVarint();\n const components: Array<[number, bigint]> = [];\n for (let i = 0; i < componentsLength; i++) {\n const componentId = buffer.readUVarint();\n const componentValue = buffer.readBigIntVarint();\n components.push([componentId, componentValue]);\n }\n const statesLength = buffer.readUVarint();\n const states: Array<[number, Uint8Array]> = [];\n for (let i = 0; i < statesLength; i++) {\n const stateId = buffer.readUVarint();\n const stateValue = buffer.readUVarintPrefixedBytes();\n states.push([stateId, stateValue]);\n }\n return {\n type: \"setUserComponents\",\n components,\n states,\n };\n}\n", "import { BufferReader } from \"../BufferReader\";\n\nimport { DeltaNetV01ClientMessage } from \"./messages\";\nimport { decodeClientCustom } from \"./messages/from-client/clientCustom\";\nimport { decodeConnectUser } from \"./messages/from-client/connectUser\";\nimport { decodePong } from \"./messages/from-client/pong\";\nimport { decodeSetUserComponents } from \"./messages/from-client/setUserComponents\";\nimport {\n ConnectUserMessageType,\n PongMessageType,\n SetUserComponentsMessageType,\n ClientCustomMessageType,\n} from \"./messageTypes\";\n\nexport function decodeClientMessages(buffer: BufferReader): Array<DeltaNetV01ClientMessage> {\n const messages: DeltaNetV01ClientMessage[] = [];\n while (!buffer.isEnd()) {\n const messageType = buffer.readUInt8();\n switch (messageType) {\n case ConnectUserMessageType:\n messages.push(decodeConnectUser(buffer));\n break;\n case SetUserComponentsMessageType:\n messages.push(decodeSetUserComponents(buffer));\n break;\n case PongMessageType:\n messages.push(decodePong(buffer));\n break;\n case ClientCustomMessageType:\n messages.push(decodeClientCustom(buffer));\n break;\n default:\n throw new Error(`Unknown message type: ${messageType}`);\n }\n }\n return messages;\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { ErrorMessageType } from \"../../messageTypes\";\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace DeltaNetV01ServerErrors {\n export const USER_ALREADY_AUTHENTICATED_ERROR_TYPE = \"USER_ALREADY_AUTHENTICATED\";\n export const USER_NOT_AUTHENTICATED_ERROR_TYPE = \"USER_NOT_AUTHENTICATED\";\n export const AUTHENTICATION_IN_PROGRESS_ERROR_TYPE = \"AUTHENTICATION_IN_PROGRESS\";\n export const OBSERVER_CANNOT_SEND_STATE_UPDATES_ERROR_TYPE = \"OBSERVER_CANNOT_SEND_STATE_UPDATES\";\n export const UNSUPPORTED_WEBSOCKET_SUBPROTOCOL_ERROR_TYPE = \"UNSUPPORTED_WEBSOCKET_SUBPROTOCOL\";\n export const USER_NETWORKING_UNKNOWN_ERROR_TYPE = \"USER_NETWORKING_UNKNOWN_ERROR\";\n export const USER_AUTHENTICATION_FAILED_ERROR_TYPE = \"USER_AUTHENTICATION_FAILED\";\n export const USER_NETWORKING_CONNECTION_LIMIT_REACHED_ERROR_TYPE = \"CONNECTION_LIMIT_REACHED\";\n export const USER_NETWORKING_SERVER_SHUTDOWN_ERROR_TYPE = \"SERVER_SHUTDOWN\";\n}\n\nexport type DeltaNetV01ServerErrorType =\n | typeof DeltaNetV01ServerErrors.USER_ALREADY_AUTHENTICATED_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.USER_NOT_AUTHENTICATED_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.AUTHENTICATION_IN_PROGRESS_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.OBSERVER_CANNOT_SEND_STATE_UPDATES_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.UNSUPPORTED_WEBSOCKET_SUBPROTOCOL_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.USER_NETWORKING_UNKNOWN_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.USER_AUTHENTICATION_FAILED_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.USER_NETWORKING_CONNECTION_LIMIT_REACHED_ERROR_TYPE\n | typeof DeltaNetV01ServerErrors.USER_NETWORKING_SERVER_SHUTDOWN_ERROR_TYPE;\n\nexport type DeltaNetV01ErrorMessage = {\n type: \"error\";\n errorType: DeltaNetV01ServerErrorType | string;\n message: string;\n retryable: boolean; // Whether the client should retry the operation - if false the client should not attempt to reconnect/retry\n};\n\nexport function encodeError(\n msg: DeltaNetV01ErrorMessage,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(ErrorMessageType);\n writer.writeLengthPrefixedString(msg.errorType);\n writer.writeLengthPrefixedString(msg.message);\n writer.writeBoolean(msg.retryable);\n return writer;\n}\n\n// Assumes that the first byte has already been read (the message type)\nexport function decodeError(buffer: BufferReader): DeltaNetV01ErrorMessage {\n const errorType = buffer.readUVarintPrefixedString() as DeltaNetV01ServerErrorType;\n const message = buffer.readUVarintPrefixedString();\n const retryable = buffer.readBoolean();\n return {\n type: \"error\",\n errorType,\n message,\n retryable,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport type { DecodeServerMessageOptions } from \"../../../decodeOptions\";\nimport { DeflateCompressor } from \"../../../DeflateCompressor\";\nimport { InitialCheckoutMessageType } from \"../../messageTypes\";\n\n/**\n * Represents a component in the initial checkout message.\n * Contains both the initial values and the delta values that will be used for subsequent ticks.\n */\nexport type DeltaNetV01InitialCheckoutComponent = {\n /** Unique identifier for the component */\n componentId: number;\n /** The delta values from the tick this initial checkout is from which will be referred to in subsequent ticks */\n deltas: BigInt64Array;\n /** The initial values for all users */\n values: BigInt64Array;\n};\n\nexport type DeltaNetV01InitialCheckoutState = {\n /** Unique identifier for the state */\n stateId: number;\n /** The initial values for all users */\n values: Array<Uint8Array>;\n};\n\n/**\n * Initial checkout message sent when a client first connects.\n * Contains the complete initial state of the game, including all components and states.\n */\nexport type DeltaNetV01InitialCheckoutMessage = {\n /** Message type identifier */\n type: \"initialCheckout\";\n /** Current server time */\n serverTime: number;\n /** Number of user indices in the system */\n indicesCount: number;\n /** Array of components with their initial values and deltas */\n components: Array<DeltaNetV01InitialCheckoutComponent>;\n /** Array of state values, each containing [stateId, stateValue] */\n states: Array<DeltaNetV01InitialCheckoutState>;\n};\n\n/**\n * Encodes an initial checkout message into a binary buffer.\n * @param msg - The message to encode\n * @param writer - Optional BufferWriter instance to use (creates a new one if not provided)\n * @returns The BufferWriter containing the encoded message\n */\nexport function encodeInitialCheckout(\n msg: DeltaNetV01InitialCheckoutMessage,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(InitialCheckoutMessageType);\n writer.writeUVarint(msg.serverTime);\n writer.writeUVarint(msg.indicesCount);\n writer.writeUVarint(msg.components.length);\n for (const { componentId, deltas, values } of msg.components) {\n writer.writeUVarint(componentId);\n const [, valuesBytes] = DeflateCompressor.varIntCompress(values, msg.indicesCount);\n writer.writeUVarintLengthPrefixedBytes(valuesBytes);\n const [, deltaBytes] = DeflateCompressor.varIntCompress(deltas, msg.indicesCount);\n writer.writeUVarintLengthPrefixedBytes(deltaBytes);\n }\n writer.writeUVarint(msg.states.length);\n for (const { stateId, values } of msg.states) {\n writer.writeUVarint(stateId);\n const [, stateBytes] = DeflateCompressor.varIntBytesCompress(values, msg.indicesCount);\n writer.writeUVarintLengthPrefixedBytes(stateBytes);\n }\n return writer;\n}\n\n/**\n * Decodes an initial checkout message from a binary buffer.\n * Assumes that the first byte (message type) has already been read.\n * @param buffer - The BufferReader containing the message data\n * @param opts - Optional options for decoding, such as ignoring data\n * @returns The decoded initial checkout message\n */\nexport function decodeInitialCheckout(\n buffer: BufferReader,\n opts?: DecodeServerMessageOptions,\n): DeltaNetV01InitialCheckoutMessage {\n let componentsByteLength = 0;\n let statesByteLength = 0;\n\n const serverTime = buffer.readUVarint();\n const indicesLength = buffer.readUVarint();\n const componentsLength = buffer.readUVarint();\n const components: Array<DeltaNetV01InitialCheckoutComponent> = [];\n for (let i = 0; i < componentsLength; i++) {\n const componentId = buffer.readUVarint();\n const valuesBytes = buffer.readUVarintPrefixedBytes();\n const deltaBytes = buffer.readUVarintPrefixedBytes();\n componentsByteLength += valuesBytes.length + deltaBytes.length;\n if (opts?.ignoreData) {\n components.push({\n componentId,\n deltas: new BigInt64Array(indicesLength),\n values: new BigInt64Array(indicesLength),\n });\n } else {\n const values = DeflateCompressor.varIntDecompress(valuesBytes, indicesLength);\n const deltas = DeflateCompressor.varIntDecompress(deltaBytes, indicesLength);\n components.push({ componentId, deltas, values });\n }\n }\n const statesLength = buffer.readUVarint();\n const states: Array<DeltaNetV01InitialCheckoutState> = [];\n for (let i = 0; i < statesLength; i++) {\n const stateId = buffer.readUVarint();\n const valuesBytes = buffer.readUVarintPrefixedBytes();\n statesByteLength += valuesBytes.length;\n if (opts?.ignoreData) {\n const emptyValues = Array.from({ length: indicesLength }, () => new Uint8Array(0));\n states.push({ stateId, values: emptyValues });\n } else {\n const values = DeflateCompressor.varIntBytesDecompress(valuesBytes, indicesLength);\n states.push({ stateId, values });\n }\n }\n if (opts?.debugData) {\n opts.debugData.componentsByteLength += componentsByteLength;\n opts.debugData.statesByteLength += statesByteLength;\n }\n return {\n type: \"initialCheckout\",\n serverTime,\n indicesCount: indicesLength,\n components,\n states,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { PingMessageType } from \"../../messageTypes\";\n\nexport type DeltaNetV01PingMessage = {\n type: \"ping\";\n ping: number;\n};\n\nexport function encodePing(\n pingMessage: DeltaNetV01PingMessage,\n writer: BufferWriter = new BufferWriter(8),\n): BufferWriter {\n writer.writeUint8(PingMessageType);\n writer.writeUVarint(pingMessage.ping);\n return writer;\n}\n\n// Assumes that the first byte has already been read (the message type)\nexport function decodePing(buffer: BufferReader): DeltaNetV01PingMessage {\n const ping = buffer.readUVarint();\n return {\n type: \"ping\",\n ping,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { ServerCustomMessageType } from \"../../messageTypes\";\n\nexport type DeltaNetV01ServerCustomMessage = {\n type: \"serverCustom\";\n customType: number;\n contents: string;\n};\n\nexport function encodeServerCustom(\n msg: DeltaNetV01ServerCustomMessage,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(ServerCustomMessageType);\n writer.writeUVarint(msg.customType);\n writer.writeLengthPrefixedString(msg.contents);\n return writer;\n}\n\n// Assumes that the first byte has already been read (the message type)\nexport function decodeServerCustom(buffer: BufferReader): DeltaNetV01ServerCustomMessage {\n const customType = buffer.readUVarint();\n const contents = buffer.readUVarintPrefixedString();\n return {\n type: \"serverCustom\",\n customType,\n contents,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport type { DecodeServerMessageOptions } from \"../../../decodeOptions\";\nimport { DeflateCompressor } from \"../../../DeflateCompressor\";\nimport { TickMessageType } from \"../../messageTypes\";\n\n/**\n * Represents state updates in a tick message.\n * States are not updated every tick, so they are specified as indices that have changed and their new values.\n */\nexport type DeltaNetV01StateUpdates = {\n /** Unique identifier for the state */\n stateId: number;\n /** Array of [index, value] pairs for updated states */\n updatedStates: Array<[number, Uint8Array]>; //index to state\n};\n\n/**\n * Represents component updates in a tick message.\n * Uses second-order delta compression (deltas of deltas) for efficient updates.\n */\nexport type DeltaNetV01ComponentTick = {\n /** Unique identifier for the component */\n componentId: number;\n /** The second-order delta values (deltas of deltas) from the previous tick */\n deltaDeltas: BigInt64Array;\n};\n\n/**\n * Regular state update message sent at configurable intervals (typically 5-20Hz).\n * Contains updates to components and states, as well as information about user indices.\n */\nexport type DeltaNetV01Tick = {\n /** Message type identifier */\n type: \"tick\";\n /** Current server time */\n serverTime: number;\n /** Indices of users that have been removed since the last tick */\n removedIndices: Array<number>;\n /** Current number of user indices in the system */\n indicesCount: number;\n /** Array of component updates using second-order delta compression */\n componentDeltaDeltas: Array<DeltaNetV01ComponentTick>;\n /** Array of state updates */\n states: Array<DeltaNetV01StateUpdates>;\n};\n\n/**\n * Encodes a tick message into a binary buffer.\n * @param msg - The message to encode\n * @param writer - Optional BufferWriter instance to use (creates a new one if not provided)\n * @returns The BufferWriter containing the encoded message\n */\nexport function encodeTick(\n msg: DeltaNetV01Tick,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(TickMessageType);\n\n writer.writeUVarint(msg.serverTime);\n\n writer.writeUVarint(msg.removedIndices.length);\n for (const index of msg.removedIndices) {\n writer.writeUVarint(index);\n }\n writer.writeUVarint(msg.indicesCount);\n writer.writeUVarint(msg.componentDeltaDeltas.length);\n for (const componentTick of msg.componentDeltaDeltas) {\n writer.writeUVarint(componentTick.componentId);\n const [, deltaDeltasBytes] = DeflateCompressor.varIntCompress(\n componentTick.deltaDeltas,\n msg.indicesCount,\n );\n writer.writeUVarintLengthPrefixedBytes(deltaDeltasBytes);\n }\n writer.writeUVarint(msg.states.length);\n for (const state of msg.states) {\n writer.writeUVarint(state.stateId);\n writer.writeUVarint(state.updatedStates.length);\n\n // Separate indices and values for compression\n const indices = new BigInt64Array(state.updatedStates.length);\n const values = new Array<Uint8Array>(state.updatedStates.length);\n\n for (let i = 0; i < state.updatedStates.length; i++) {\n const [index, value] = state.updatedStates[i];\n indices[i] = BigInt(index);\n values[i] = value;\n }\n\n // Compress and write indices\n const [, compressedIndices] = DeflateCompressor.varIntCompress(indices, indices.length);\n writer.writeUVarintLengthPrefixedBytes(compressedIndices);\n\n // Compress and write values\n const [, compressedValues] = DeflateCompressor.varIntBytesCompress(values, values.length);\n writer.writeUVarintLengthPrefixedBytes(compressedValues);\n }\n return writer;\n}\n\n/**\n * Decodes a tick message from a binary buffer.\n * Assumes that the first byte (message type) has already been read.\n * @param buffer - The BufferReader containing the message data\n * @param opts - Optional options for decoding, such as ignoring data\n * @returns The decoded tick message\n */\nexport function decodeTick(\n buffer: BufferReader,\n opts?: DecodeServerMessageOptions,\n): DeltaNetV01Tick {\n let componentsByteLength = 0;\n let statesByteLength = 0;\n\n const serverTime = buffer.readUVarint();\n const removedIndicesLength = buffer.readUVarint();\n const removedIndices: Array<number> = [];\n for (let i = 0; i < removedIndicesLength; i++) {\n removedIndices.push(buffer.readUVarint());\n }\n const indicesCount = buffer.readUVarint();\n const componentsLength = buffer.readUVarint();\n const components: Array<DeltaNetV01ComponentTick> = [];\n for (let i = 0; i < componentsLength; i++) {\n const componentId = buffer.readUVarint();\n const deltaDeltaBytes = buffer.readUVarintPrefixedBytes();\n componentsByteLength += deltaDeltaBytes.byteLength;\n if (opts?.ignoreData) {\n components.push({ componentId, deltaDeltas: new BigInt64Array(indicesCount) });\n } else {\n const deltaDeltas = DeflateCompressor.varIntDecompress(deltaDeltaBytes, indicesCount);\n components.push({ componentId, deltaDeltas });\n }\n }\n const statesLength = buffer.readUVarint();\n const states: Array<DeltaNetV01StateUpdates> = [];\n for (let i = 0; i < statesLength; i++) {\n const stateId = buffer.readUVarint();\n const stateCount = buffer.readUVarint();\n const state: DeltaNetV01StateUpdates = {\n stateId,\n updatedStates: [],\n };\n\n const compressedIndices = buffer.readUVarintPrefixedBytes();\n const compressedValues = buffer.readUVarintPrefixedBytes();\n statesByteLength += compressedIndices.byteLength;\n statesByteLength += compressedValues.byteLength;\n\n if (stateCount > 0 && !opts?.ignoreData) {\n // Read and decompress indices\n const indices = DeflateCompressor.varIntDecompress(compressedIndices, stateCount);\n const values = DeflateCompressor.varIntBytesDecompress(compressedValues, stateCount);\n\n // Recombine indices and values\n for (let j = 0; j < stateCount; j++) {\n const index = Number(indices[j]);\n const value = values[j];\n state.updatedStates.push([index, value]);\n }\n }\n\n states.push(state);\n }\n if (opts?.debugData) {\n opts.debugData.componentsByteLength += componentsByteLength;\n opts.debugData.statesByteLength += statesByteLength;\n }\n return {\n type: \"tick\",\n serverTime,\n removedIndices,\n indicesCount,\n componentDeltaDeltas: components,\n states,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { UserIndexMessageType } from \"../../messageTypes\";\n\nexport type DeltaNetV01UserIndexMessage = {\n type: \"userIndex\";\n index: number;\n};\n\nexport function encodeUserIndex(\n msg: DeltaNetV01UserIndexMessage,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(UserIndexMessageType);\n writer.writeUVarint(msg.index);\n return writer;\n}\n\n// Assumes that the first byte has already been read (the message type)\nexport function decodeUserIndex(buffer: BufferReader): DeltaNetV01UserIndexMessage {\n const index = buffer.readUVarint();\n return {\n type: \"userIndex\",\n index,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport { WarningMessageType } from \"../../messageTypes\";\n\nexport type DeltaNetV01WarningMessage = {\n type: \"warning\";\n message: string;\n};\n\nexport function encodeWarning(\n msg: DeltaNetV01WarningMessage,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(WarningMessageType);\n writer.writeLengthPrefixedString(msg.message);\n return writer;\n}\n\n// Assumes that the first byte has already been read (the message type)\nexport function decodeWarning(buffer: BufferReader): DeltaNetV01WarningMessage {\n const message = buffer.readUVarintPrefixedString();\n return {\n type: \"warning\",\n message,\n };\n}\n", "import { BufferReader } from \"../BufferReader\";\nimport type { DecodeServerMessageOptions } from \"../decodeOptions\";\n\nimport {\n decodeError,\n decodeInitialCheckout,\n decodePing,\n decodeServerCustom,\n decodeTick,\n decodeUserIndex,\n decodeWarning,\n DeltaNetV01ServerMessage,\n} from \"./messages\";\nimport {\n ErrorMessageType,\n InitialCheckoutMessageType,\n PingMessageType,\n ServerCustomMessageType,\n TickMessageType,\n UserIndexMessageType,\n WarningMessageType,\n} from \"./messageTypes\";\n\nexport function decodeServerMessages(\n buffer: BufferReader,\n opts?: DecodeServerMessageOptions,\n): Array<DeltaNetV01ServerMessage> {\n const messages: DeltaNetV01ServerMessage[] = [];\n while (!buffer.isEnd()) {\n const messageType = buffer.readUInt8();\n switch (messageType) {\n case InitialCheckoutMessageType:\n messages.push(decodeInitialCheckout(buffer, opts));\n break;\n case UserIndexMessageType:\n messages.push(decodeUserIndex(buffer));\n break;\n case TickMessageType:\n messages.push(decodeTick(buffer, opts));\n break;\n case ServerCustomMessageType:\n messages.push(decodeServerCustom(buffer));\n break;\n case PingMessageType:\n messages.push(decodePing(buffer));\n break;\n case WarningMessageType:\n messages.push(decodeWarning(buffer));\n break;\n case ErrorMessageType:\n messages.push(decodeError(buffer));\n break;\n default:\n throw new Error(`Unknown message type: ${messageType}`);\n }\n }\n return messages;\n}\n", "import { BufferWriter } from \"../BufferWriter\";\n\nimport {\n DeltaNetV01ClientMessage,\n encodeConnectUser,\n encodePong,\n encodeSetUserComponents,\n encodeClientCustom,\n} from \"./messages\";\n\nexport function encodeClientMessage(message: DeltaNetV01ClientMessage, writer: BufferWriter) {\n const type = message.type;\n switch (type) {\n case \"connectUser\":\n return encodeConnectUser(message, writer);\n case \"setUserComponents\":\n return encodeSetUserComponents(message, writer);\n case \"pong\":\n return encodePong(message, writer);\n case \"clientCustom\":\n return encodeClientCustom(message, writer);\n default:\n throw new Error(`Unknown message type: ${type}`);\n }\n}\n", "import { BufferWriter } from \"../BufferWriter\";\n\nimport {\n DeltaNetV01ServerMessage,\n encodeInitialCheckout,\n encodeServerCustom,\n encodeUserIndex,\n} from \"./messages\";\nimport { encodeError } from \"./messages/from-server/error\";\nimport { encodePing } from \"./messages/from-server/ping\";\nimport { encodeTick } from \"./messages/from-server/tick\";\nimport { encodeWarning } from \"./messages/from-server/warning\";\n\nexport function encodeServerMessage(\n message: DeltaNetV01ServerMessage,\n writer?: BufferWriter,\n): BufferWriter {\n switch (message.type) {\n case \"initialCheckout\":\n return encodeInitialCheckout(message, writer);\n case \"tick\":\n return encodeTick(message, writer);\n case \"userIndex\":\n return encodeUserIndex(message, writer);\n case \"ping\":\n return encodePing(message, writer);\n case \"serverCustom\":\n return encodeServerCustom(message, writer);\n case \"warning\":\n return encodeWarning(message, writer);\n case \"error\":\n return encodeError(message, writer);\n default:\n throw new Error(`Unknown message type: ${(message as any).type}`);\n }\n}\n", "export const deltaNetProtocolSubProtocol_v0_2 = \"delta-net-v0.2\";\n\n/**\n * Maximum total number of elements (componentsLength * indicesCount) allowed\n * in contiguous encode/decode operations. Guards against allocation bombs from\n * malformed or malicious messages.\n */\nexport const MAX_CONTIGUOUS_ELEMENTS = 10_000_000;\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport type { DecodeServerMessageOptions } from \"../../../decodeOptions\";\nimport { DeflateCompressor } from \"../../../DeflateCompressor\";\nimport type {\n DeltaNetV01InitialCheckoutComponent as DeltaNetInitialCheckoutComponent,\n DeltaNetV01InitialCheckoutMessage as DeltaNetInitialCheckoutMessage,\n DeltaNetV01InitialCheckoutState as DeltaNetInitialCheckoutState,\n} from \"../../../delta-net-v0.1\";\nimport { InitialCheckoutMessageType } from \"../../../delta-net-v0.1\";\nimport { MAX_CONTIGUOUS_ELEMENTS } from \"../../constants\";\n\n/**\n * Encodes an initial checkout message using v0.2 contiguous compression.\n * All component values and deltas are concatenated into single blocks before compression.\n */\nexport function encodeInitialCheckoutV02(\n msg: DeltaNetInitialCheckoutMessage,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(InitialCheckoutMessageType);\n writer.writeUVarint(msg.serverTime);\n writer.writeUVarint(msg.indicesCount);\n\n // Write component count and all component IDs upfront\n writer.writeUVarint(msg.components.length);\n for (const { componentId } of msg.components) {\n writer.writeUVarint(componentId);\n }\n\n // Concatenate all values into a single contiguous array, then all deltas\n if (msg.components.length > 0 && msg.indicesCount > 0) {\n const totalLength = msg.components.length * msg.indicesCount;\n if (totalLength > MAX_CONTIGUOUS_ELEMENTS) {\n throw new Error(\n `Encoded totalLength exceeds maximum: ${totalLength} elements (${msg.components.length} components * ${msg.indicesCount} indices)`,\n );\n }\n\n // Concatenate all values\n const allValues = new BigInt64Array(totalLength);\n for (let i = 0; i < msg.components.length; i++) {\n const values = msg.components[i].values;\n if (values.length < msg.indicesCount) {\n throw new Error(\n `Component ${msg.components[i].componentId} values length ${values.length} is less than indicesCount ${msg.indicesCount}`,\n );\n }\n allValues.set(values.subarray(0, msg.indicesCount), i * msg.indicesCount);\n }\n const [, compressedValues] = DeflateCompressor.varIntCompress(allValues, totalLength);\n writer.writeUVarintLengthPrefixedBytes(compressedValues);\n\n // Concatenate all deltas\n const allDeltas = new BigInt64Array(totalLength);\n for (let i = 0; i < msg.components.length; i++) {\n const deltas = msg.components[i].deltas;\n if (deltas.length < msg.indicesCount) {\n throw new Error(\n `Component ${msg.components[i].componentId} deltas length ${deltas.length} is less than indicesCount ${msg.indicesCount}`,\n );\n }\n allDeltas.set(deltas.subarray(0, msg.indicesCount), i * msg.indicesCount);\n }\n const [, compressedDeltas] = DeflateCompressor.varIntCompress(allDeltas, totalLength);\n writer.writeUVarintLengthPrefixedBytes(compressedDeltas);\n }\n\n // States encoding is unchanged from v0.1\n writer.writeUVarint(msg.states.length);\n for (const { stateId, values } of msg.states) {\n writer.writeUVarint(stateId);\n const [, stateBytes] = DeflateCompressor.varIntBytesCompress(values, msg.indicesCount);\n writer.writeUVarintLengthPrefixedBytes(stateBytes);\n }\n return writer;\n}\n\n/**\n * Decodes an initial checkout message encoded with v0.2 contiguous compression.\n * Assumes that the first byte (message type) has already been read.\n */\nexport function decodeInitialCheckoutV02(\n buffer: BufferReader,\n opts?: DecodeServerMessageOptions,\n): DeltaNetInitialCheckoutMessage {\n let componentsByteLength = 0;\n let statesByteLength = 0;\n\n const serverTime = buffer.readUVarint();\n const indicesCount = buffer.readUVarint();\n\n // Read component count and all component IDs upfront\n const componentsLength = buffer.readUVarint();\n const componentIds: Array<number> = [];\n for (let i = 0; i < componentsLength; i++) {\n componentIds.push(buffer.readUVarint());\n }\n\n const components: Array<DeltaNetInitialCheckoutComponent> = [];\n if (componentsLength > 0 && indicesCount > 0) {\n const totalLength = componentsLength * indicesCount;\n\n if (totalLength > MAX_CONTIGUOUS_ELEMENTS) {\n throw new Error(\n `Decoded totalLength exceeds maximum: ${totalLength} elements (${componentsLength} components * ${indicesCount} indices)`,\n );\n }\n\n // Read and decompress values block\n const compressedValues = buffer.readUVarintPrefixedBytes();\n componentsByteLength += compressedValues.byteLength;\n\n // Read and decompress deltas block\n const compressedDeltas = buffer.readUVarintPrefixedBytes();\n componentsByteLength += compressedDeltas.byteLength;\n\n if (opts?.ignoreData) {\n for (let i = 0; i < componentsLength; i++) {\n components.push({\n componentId: componentIds[i],\n deltas: new BigInt64Array(indicesCount),\n values: new BigInt64Array(indicesCount),\n });\n }\n } else {\n const allValues = DeflateCompressor.varIntDecompress(compressedValues, totalLength);\n const allDeltas = DeflateCompressor.varIntDecompress(compressedDeltas, totalLength);\n for (let i = 0; i < componentsLength; i++) {\n components.push({\n componentId: componentIds[i],\n values: allValues.slice(i * indicesCount, (i + 1) * indicesCount),\n deltas: allDeltas.slice(i * indicesCount, (i + 1) * indicesCount),\n });\n }\n }\n } else if (componentsLength > 0) {\n // indicesCount is 0, so no compressed data was written \u2014 emit empty arrays\n for (let i = 0; i < componentsLength; i++) {\n components.push({\n componentId: componentIds[i],\n values: new BigInt64Array(0),\n deltas: new BigInt64Array(0),\n });\n }\n }\n\n // States decoding is unchanged from v0.1\n const statesLength = buffer.readUVarint();\n const states: Array<DeltaNetInitialCheckoutState> = [];\n for (let i = 0; i < statesLength; i++) {\n const stateId = buffer.readUVarint();\n const valuesBytes = buffer.readUVarintPrefixedBytes();\n statesByteLength += valuesBytes.byteLength;\n if (opts?.ignoreData) {\n const emptyValues = Array.from({ length: indicesCount }, () => new Uint8Array(0));\n states.push({ stateId, values: emptyValues });\n } else {\n const values = DeflateCompressor.varIntBytesDecompress(valuesBytes, indicesCount);\n states.push({ stateId, values });\n }\n }\n\n if (opts?.debugData) {\n opts.debugData.componentsByteLength += componentsByteLength;\n opts.debugData.statesByteLength += statesByteLength;\n }\n return {\n type: \"initialCheckout\",\n serverTime,\n indicesCount,\n components,\n states,\n };\n}\n", "import { BufferReader } from \"../../../BufferReader\";\nimport { BufferWriter } from \"../../../BufferWriter\";\nimport type { DecodeServerMessageOptions } from \"../../../decodeOptions\";\nimport { DeflateCompressor } from \"../../../DeflateCompressor\";\nimport type {\n DeltaNetV01ComponentTick as DeltaNetComponentTick,\n DeltaNetV01StateUpdates as DeltaNetStateUpdates,\n DeltaNetV01Tick as DeltaNetTick,\n} from \"../../../delta-net-v0.1\";\nimport { TickMessageType } from \"../../../delta-net-v0.1\";\nimport { MAX_CONTIGUOUS_ELEMENTS } from \"../../constants\";\n\n/**\n * Encodes a tick message using v0.2 contiguous compression.\n * All component delta-deltas are concatenated into a single block before compression,\n * reducing deflate framing overhead from O(componentCount) to O(1).\n */\nexport function encodeTickV02(\n msg: DeltaNetTick,\n writer: BufferWriter = new BufferWriter(64),\n): BufferWriter {\n writer.writeUint8(TickMessageType);\n\n writer.writeUVarint(msg.serverTime);\n\n writer.writeUVarint(msg.removedIndices.length);\n for (const index of msg.removedIndices) {\n writer.writeUVarint(index);\n }\n writer.writeUVarint(msg.indicesCount);\n\n // Write component count and all component IDs upfront\n writer.writeUVarint(msg.componentDeltaDeltas.length);\n for (const componentTick of msg.componentDeltaDeltas) {\n writer.writeUVarint(componentTick.componentId);\n }\n\n // Concatenate all delta-deltas into a single contiguous array\n if (msg.componentDeltaDeltas.length > 0 && msg.indicesCount > 0) {\n const totalLength = msg.componentDeltaDeltas.length * msg.indicesCount;\n if (totalLength > MAX_CONTIGUOUS_ELEMENTS) {\n throw new Error(\n `Encoded totalLength exceeds maximum: ${totalLength} elements (${msg.componentDeltaDeltas.length} components * ${msg.indicesCount} indices)`,\n );\n }\n const allDeltaDeltas = new BigInt64Array(totalLength);\n for (let i = 0; i < msg.componentDeltaDeltas.length; i++) {\n const deltaDeltas = msg.componentDeltaDeltas[i].deltaDeltas;\n if (deltaDeltas.length < msg.indicesCount) {\n throw new Error(\n `Component ${msg.componentDeltaDeltas[i].componentId} deltaDeltas length ${deltaDeltas.length} is less than indicesCount ${msg.indicesCount}`,\n );\n }\n allDeltaDeltas.set(deltaDeltas.subarray(0, msg.indicesCount), i * msg.indicesCount);\n }\n\n // Single compression call for all component data\n const [, compressedBytes] = DeflateCompressor.varIntCompress(allDeltaDeltas, totalLength);\n writer.writeUVarintLengthPrefixedBytes(compressedBytes);\n }\n\n // States encoding is unchanged from v0.1\n writer.writeUVarint(msg.states.length);\n for (const state of msg.states) {\n writer.writeUVarint(state.stateId);\n writer.writeUVarint(state.updatedStates.length);\n\n const indices = new BigInt64Array(state.updatedStates.length);\n const values = new Array<Uint8Array>(state.updatedStates.length);\n\n for (let i = 0; i < state.updatedStates.length; i++) {\n const [index, value] = state.updatedStates[i];\n indices[i] = BigInt(index);\n values[i] = value;\n }\n\n const [, compressedIndices] = DeflateCompressor.varIntCompress(indices, indices.length);\n writer.writeUVarintLengthPrefixedBytes(compressedIndices);\n\n const [, compressedValues] = DeflateCompressor.varIntBytesCompress(values, values.length);\n writer.writeUVarintLengthPrefixedBytes(compressedValues);\n }\n return writer;\n}\n\n/**\n * Decodes a tick message encoded with v0.2 contiguous compression.\n * Assumes that the first byte (message type) has already been read.\n */\nexport function decodeTickV02(\n buffer: BufferReader,\n opts?: DecodeServerMessageOptions,\n): DeltaNetTick {\n let componentsByteLength = 0;\n let statesByteLength = 0;\n\n const serverTime = buffer.readUVarint();\n const removedIndicesLength = buffer.readUVarint();\n const removedIndices: Array<number> = [];\n for (let i = 0; i < removedIndicesLength; i++) {\n removedIndices.push(buffer.readUVarint());\n }\n const indicesCount = buffer.readUVarint();\n\n // Read component count and all component IDs upfront\n const componentsLength = buffer.readUVarint();\n const componentIds: Array<number> = [];\n for (let i = 0; i < componentsLength; i++) {\n componentIds.push(buffer.readUVarint());\n }\n\n // Read and decompress the single contiguous block\n const components: Array<DeltaNetComponentTick> = [];\n if (componentsLength > 0 && indicesCount > 0) {\n const totalLength = componentsLength * indicesCount;\n if (totalLength > MAX_CONTIGUOUS_ELEMENTS) {\n throw new Error(\n `Decoded totalLength exceeds maximum: ${totalLength} elements (${componentsLength} components * ${indicesCount} indices)`,\n );\n }\n\n const compressedBlock = buffer.readUVarintPrefixedBytes();\n componentsByteLength += compressedBlock.byteLength;\n if (opts?.ignoreData) {\n for (let i = 0; i < componentsLength; i++) {\n components.push({\n componentId: componentIds[i],\n deltaDeltas: new BigInt64Array(indicesCount),\n });\n }\n } else {\n const allDeltaDeltas = DeflateCompressor.varIntDecompress(compressedBlock, totalLength);\n\n // Slice into per-component arrays\n for (let i = 0; i < componentsLength; i++) {\n components.push({\n componentId: componentIds[i],\n deltaDeltas: allDeltaDeltas.slice(i * indicesCount, (i + 1) * indicesCount),\n });\n }\n }\n } else if (componentsLength > 0) {\n // indicesCount is 0, so no compressed data was written \u2014 emit empty arrays\n for (let i = 0; i < componentsLength; i++) {\n components.push({\n componentId: componentIds[i],\n deltaDeltas: new BigInt64Array(0),\n });\n }\n }\n\n // States decoding is unchanged from v0.1\n const statesLength = buffer.readUVarint();\n const states: Array<DeltaNetStateUpdates> = [];\n for (let i = 0; i < statesLength; i++) {\n const stateId = buffer.readUVarint();\n const stateCount = buffer.readUVarint();\n const state: DeltaNetStateUpdates = {\n stateId,\n updatedStates: [],\n };\n\n const compressedIndices = buffer.readUVarintPrefixedBytes();\n const compressedValues = buffer.readUVarintPrefixedBytes();\n statesByteLength += compressedIndices.byteLength;\n statesByteLength += compressedValues.byteLength;\n\n if (stateCount > 0 && !opts?.ignoreData) {\n const indices = DeflateCompressor.varIntDecompress(compressedIndices, stateCount);\n const values = DeflateCompressor.varIntBytesDecompress(compressedValues, stateCount);\n\n for (let j = 0; j < stateCount; j++) {\n const index = Number(indices[j]);\n const value = values[j];\n state.updatedStates.push([index, value]);\n }\n }\n\n states.push(state);\n }\n\n if (opts?.debugData) {\n opts.debugData.componentsByteLength += componentsByteLength;\n opts.debugData.statesByteLength += statesByteLength;\n }\n return {\n type: \"tick\",\n serverTime,\n removedIndices,\n indicesCount,\n componentDeltaDeltas: components,\n states,\n };\n}\n", "import { BufferReader } from \"../BufferReader\";\nimport type { DecodeServerMessageOptions } from \"../decodeOptions\";\nimport type { DeltaNetV01ServerMessage as DeltaNetServerMessage } from \"../delta-net-v0.1\";\nimport {\n decodeError,\n decodePing,\n decodeServerCustom,\n decodeUserIndex,\n decodeWarning,\n ErrorMessageType,\n InitialCheckoutMessageType,\n PingMessageType,\n ServerCustomMessageType,\n TickMessageType,\n UserIndexMessageType,\n WarningMessageType,\n} from \"../delta-net-v0.1\";\n\nimport { decodeInitialCheckoutV02 } from \"./messages/from-server/initialCheckout\";\nimport { decodeTickV02 } from \"./messages/from-server/tick\";\n\nexport function decodeServerMessagesV02(\n buffer: BufferReader,\n opts?: DecodeServerMessageOptions,\n): Array<DeltaNetServerMessage> {\n const messages: DeltaNetServerMessage[] = [];\n while (!buffer.isEnd()) {\n const messageType = buffer.readUInt8();\n switch (messageType) {\n case InitialCheckoutMessageType:\n messages.push(decodeInitialCheckoutV02(buffer, opts));\n break;\n case UserIndexMessageType:\n messages.push(decodeUserIndex(buffer));\n break;\n case TickMessageType:\n messages.push(decodeTickV02(buffer, opts));\n break;\n case ServerCustomMessageType:\n messages.push(decodeServerCustom(buffer));\n break;\n case PingMessageType:\n messages.push(decodePing(buffer));\n break;\n case WarningMessageType:\n messages.push(decodeWarning(buffer));\n break;\n case ErrorMessageType:\n messages.push(decodeError(buffer));\n break;\n default:\n throw new Error(`Unknown message type: ${messageType}`);\n }\n }\n return messages;\n}\n", "import { BufferWriter } from \"../BufferWriter\";\nimport type { DeltaNetV01ServerMessage as DeltaNetServerMessage } from \"../delta-net-v0.1\";\nimport {\n encodeError,\n encodePing,\n encodeServerCustom,\n encodeUserIndex,\n encodeWarning,\n} from \"../delta-net-v0.1\";\n\nimport { encodeInitialCheckoutV02 } from \"./messages/from-server/initialCheckout\";\nimport { encodeTickV02 } from \"./messages/from-server/tick\";\n\nexport function encodeServerMessageV02(\n message: DeltaNetServerMessage,\n writer?: BufferWriter,\n): BufferWriter {\n switch (message.type) {\n case \"initialCheckout\":\n return encodeInitialCheckoutV02(message, writer);\n case \"tick\":\n return encodeTickV02(message, writer);\n case \"userIndex\":\n return encodeUserIndex(message, writer);\n case \"ping\":\n return encodePing(message, writer);\n case \"serverCustom\":\n return encodeServerCustom(message, writer);\n case \"warning\":\n return encodeWarning(message, writer);\n case \"error\":\n return encodeError(message, writer);\n default:\n throw new Error(`Unknown message type: ${(message as any).type}`);\n }\n}\n", "export * from \"./BufferReader\";\nexport * from \"./BufferWriter\";\nexport * from \"./decodeOptions\";\nexport * from \"./DeflateCompressor\";\nexport * from \"./delta-net-v0.1\";\nexport * from \"./delta-net-v0.2\";\n\nimport { deltaNetProtocolSubProtocol_v0_1 } from \"./delta-net-v0.1\";\nimport { deltaNetProtocolSubProtocol_v0_2 } from \"./delta-net-v0.2\";\n\n/**\n * Version-neutral aliases \u2014 today all protocol versions share the same decoded\n * message shapes and error types. Code that is not version-specific should\n * prefer these over the DeltaNetV01* originals.\n */\n\n// Server \u2192 client message types\nexport type { DeltaNetV01ServerMessage as DeltaNetServerMessage } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01Tick as DeltaNetTick } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01ComponentTick as DeltaNetComponentTick } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01StateUpdates as DeltaNetStateUpdates } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01InitialCheckoutMessage as DeltaNetInitialCheckoutMessage } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01InitialCheckoutComponent as DeltaNetInitialCheckoutComponent } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01InitialCheckoutState as DeltaNetInitialCheckoutState } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01ErrorMessage as DeltaNetErrorMessage } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01ServerErrorType as DeltaNetServerErrorType } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01UserIndexMessage as DeltaNetUserIndexMessage } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01PingMessage as DeltaNetPingMessage } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01ServerCustomMessage as DeltaNetServerCustomMessage } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01WarningMessage as DeltaNetWarningMessage } from \"./delta-net-v0.1\";\n\n// Client \u2192 server message types\nexport type { DeltaNetV01ClientMessage as DeltaNetClientMessage } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01ConnectUserMessage as DeltaNetConnectUserMessage } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01SetUserComponentsMessage as DeltaNetSetUserComponentsMessage } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01ClientCustomMessage as DeltaNetClientCustomMessage } from \"./delta-net-v0.1\";\nexport type { DeltaNetV01PongMessage as DeltaNetPongMessage } from \"./delta-net-v0.1\";\n\n// Error constants\nexport { DeltaNetV01ServerErrors as DeltaNetServerErrors } from \"./delta-net-v0.1\";\n\n/** Supported sub-protocols in preference order (newest first). */\nexport const deltaNetSupportedSubProtocols = [\n deltaNetProtocolSubProtocol_v0_2,\n deltaNetProtocolSubProtocol_v0_1,\n] as const;\n"],
5
+ "mappings": "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",
6
6
  "names": ["CompressionLibraryChoice", "DeltaNetV01ServerErrors"]
7
7
  }
package/package.json CHANGED
@@ -1,9 +1,14 @@
1
1
  {
2
2
  "name": "@mml-io/delta-net-protocol",
3
- "version": "0.26.1",
3
+ "version": "0.27.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/mml-io/3d-web-experience.git",
10
+ "directory": "packages/deltanet/delta-net-protocol"
11
+ },
7
12
  "main": "./build/index.js",
8
13
  "types": "./build/index.d.ts",
9
14
  "type": "module",
@@ -25,5 +30,5 @@
25
30
  "@types/pako": "2.0.3",
26
31
  "jest-junit": "16.0.0"
27
32
  },
28
- "gitHead": "641ba30671cf66b7a4c288cd68328366076ecf8c"
33
+ "gitHead": "4038d512f99c0700d77337a0daa6f49b281dce87"
29
34
  }