@colyseus/schema 5.0.11 → 5.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/build/Metadata.d.ts +20 -12
  2. package/build/annotations.d.ts +23 -10
  3. package/build/codegen/cli.cjs +615 -204
  4. package/build/codegen/cli.cjs.map +1 -1
  5. package/build/codegen/languages/dart.d.ts +20 -0
  6. package/build/codegen/types.d.ts +20 -0
  7. package/build/decoder/Resync.d.ts +3 -3
  8. package/build/encoder/ChangeTree.d.ts +22 -9
  9. package/build/encoder/EncodeDescriptor.d.ts +11 -12
  10. package/build/encoder/StateView.d.ts +26 -2
  11. package/build/encoder/changeTree/inheritedFlags.d.ts +1 -1
  12. package/build/encoder/streaming.d.ts +7 -0
  13. package/build/index.cjs +374 -232
  14. package/build/index.cjs.map +1 -1
  15. package/build/index.d.ts +1 -1
  16. package/build/index.js +374 -232
  17. package/build/index.mjs +373 -231
  18. package/build/index.mjs.map +1 -1
  19. package/build/types/builder.d.ts +31 -22
  20. package/build/types/custom/StreamSchema.d.ts +1 -1
  21. package/build/types/symbols.d.ts +4 -10
  22. package/package.json +1 -1
  23. package/src/Metadata.ts +58 -31
  24. package/src/annotations.ts +56 -32
  25. package/src/codegen/api.ts +2 -1
  26. package/src/codegen/languages/c.ts +21 -3
  27. package/src/codegen/languages/csharp.ts +7 -1
  28. package/src/codegen/languages/dart.ts +274 -0
  29. package/src/codegen/languages/haxe.ts +7 -1
  30. package/src/codegen/languages/lua.ts +16 -4
  31. package/src/codegen/languages/ts.ts +5 -0
  32. package/src/codegen/parser.ts +97 -3
  33. package/src/codegen/types.ts +24 -0
  34. package/src/decoder/Resync.ts +8 -8
  35. package/src/encoder/ChangeRecorder.ts +1 -1
  36. package/src/encoder/ChangeTree.ts +41 -26
  37. package/src/encoder/EncodeDescriptor.ts +17 -38
  38. package/src/encoder/EncodeOperation.ts +3 -1
  39. package/src/encoder/Encoder.ts +97 -21
  40. package/src/encoder/Root.ts +18 -20
  41. package/src/encoder/StateView.ts +102 -12
  42. package/src/encoder/changeTree/inheritedFlags.ts +10 -10
  43. package/src/encoder/changeTree/liveIteration.ts +9 -9
  44. package/src/encoder/streaming.ts +8 -0
  45. package/src/encoding/spec.ts +1 -1
  46. package/src/index.ts +2 -2
  47. package/src/types/builder.ts +35 -31
  48. package/src/types/custom/StreamSchema.ts +1 -1
  49. package/src/types/symbols.ts +4 -11
  50. package/src/bench_bloat.ts +0 -173
  51. package/src/bench_churn.ts +0 -121
  52. package/src/bench_decode.ts +0 -221
  53. package/src/bench_decode_mem.ts +0 -165
  54. package/src/bench_encode.ts +0 -108
  55. package/src/bench_init.ts +0 -150
  56. package/src/bench_static.ts +0 -109
  57. package/src/bench_stream.ts +0 -295
  58. package/src/bench_view_cmp.ts +0 -142
@@ -1,142 +0,0 @@
1
- /**
2
- * bench_view_cmp.ts — StateView-path counterpart to bench_bloat.ts.
3
- *
4
- * Same entity layout (1000 players × Position × 5 scores) but with N
5
- * StateViews subscribing to a @view-tagged secret field on each player.
6
- * Measures per-tick encode throughput under view-filtered fanout.
7
- *
8
- * Run: npx tsx --tsconfig tsconfig.test.json --expose-gc src/bench_view_cmp.ts
9
- */
10
- import { Encoder, Schema, type, view, MapSchema, ArraySchema, StateView } from "./index";
11
-
12
- class Position extends Schema {
13
- @type("number") x: number = 0;
14
- @type("number") y: number = 0;
15
- }
16
-
17
- class Player extends Schema {
18
- @type("string") name: string = "";
19
- @type(Position) position = new Position();
20
- @type(["number"]) scores = new ArraySchema<number>();
21
- @view() @type("uint32") secret: number = 0;
22
- }
23
-
24
- class State extends Schema {
25
- @type({ map: Player }) players = new MapSchema<Player>();
26
- }
27
-
28
- const N_PLAYERS = 1000;
29
- const N_CLIENTS = 10;
30
-
31
- // ─── Setup ─────────────────────────────────────────────────────────────
32
-
33
- globalThis.gc?.();
34
- const heapBefore = process.memoryUsage().heapUsed;
35
-
36
- const state = new State();
37
- const encoder = new Encoder(state);
38
- Encoder.BUFFER_SIZE = 256 * 1024;
39
-
40
- for (let i = 0; i < N_PLAYERS; i++) {
41
- const p = new Player();
42
- p.name = `P${i}`;
43
- p.position.x = i;
44
- p.position.y = i;
45
- for (let j = 0; j < 5; j++) p.scores.push(j);
46
- p.secret = i;
47
- state.players.set(`p${i}`, p);
48
- }
49
-
50
- globalThis.gc?.();
51
- const heapAfter = process.memoryUsage().heapUsed;
52
- console.log(`Heap (${N_PLAYERS} players): ${((heapAfter - heapBefore) / 1024 / 1024).toFixed(2)} MB`);
53
-
54
- // Subscribe N clients, each to every player.
55
- const views: StateView[] = [];
56
- for (let c = 0; c < N_CLIENTS; c++) {
57
- const v = new StateView();
58
- for (let i = 0; i < N_PLAYERS; i++) {
59
- v.add(state.players.get(`p${i}`)!);
60
- }
61
- views.push(v);
62
- }
63
-
64
- // Bootstrap full encode.
65
- encoder.encodeAll();
66
- for (const v of views) {
67
- const it = { offset: 0 };
68
- encoder.encodeAll(it);
69
- encoder.encodeAllView(v, it.offset, it);
70
- }
71
- encoder.discardChanges();
72
-
73
- // ─── 1. 10-mutation ticks ──────────────────────────────────────────────
74
-
75
- {
76
- const iterations = 2000;
77
- const start = performance.now();
78
- for (let i = 0; i < iterations; i++) {
79
- for (let j = 0; j < 10; j++) {
80
- const p = state.players.get(`p${j}`)!;
81
- p.position.x++;
82
- p.position.y++;
83
- }
84
- const it = { offset: 0 };
85
- encoder.encode(it);
86
- const sharedOffset = it.offset;
87
- for (const v of views) encoder.encodeView(v, sharedOffset, it);
88
- encoder.discardChanges();
89
- }
90
- const elapsed = performance.now() - start;
91
- console.log(
92
- `${iterations} ticks × (10 mutations, shared + ${N_CLIENTS} views): ` +
93
- `${elapsed.toFixed(1)}ms total (${(elapsed / iterations).toFixed(4)}ms/tick)`,
94
- );
95
- }
96
-
97
- // ─── 2. 100-mutation ticks ─────────────────────────────────────────────
98
-
99
- {
100
- const iterations = 500;
101
- const start = performance.now();
102
- for (let i = 0; i < iterations; i++) {
103
- for (let j = 0; j < 100; j++) {
104
- const p = state.players.get(`p${j}`)!;
105
- p.position.x++;
106
- p.position.y++;
107
- }
108
- const it = { offset: 0 };
109
- encoder.encode(it);
110
- const sharedOffset = it.offset;
111
- for (const v of views) encoder.encodeView(v, sharedOffset, it);
112
- encoder.discardChanges();
113
- }
114
- const elapsed = performance.now() - start;
115
- console.log(
116
- `${iterations} ticks × (100 mutations, shared + ${N_CLIENTS} views): ` +
117
- `${elapsed.toFixed(1)}ms total (${(elapsed / iterations).toFixed(3)}ms/tick)`,
118
- );
119
- }
120
-
121
- // ─── 3. View-tagged field mutations (exercises per-view filtering) ─────
122
-
123
- {
124
- const iterations = 500;
125
- const start = performance.now();
126
- for (let i = 0; i < iterations; i++) {
127
- for (let j = 0; j < 100; j++) {
128
- const p = state.players.get(`p${j}`)!;
129
- p.secret = (p.secret + 1) >>> 0;
130
- }
131
- const it = { offset: 0 };
132
- encoder.encode(it);
133
- const sharedOffset = it.offset;
134
- for (const v of views) encoder.encodeView(v, sharedOffset, it);
135
- encoder.discardChanges();
136
- }
137
- const elapsed = performance.now() - start;
138
- console.log(
139
- `${iterations} ticks × (100 @view-field mutations, shared + ${N_CLIENTS} views): ` +
140
- `${elapsed.toFixed(1)}ms total (${(elapsed / iterations).toFixed(3)}ms/tick)`,
141
- );
142
- }