@colyseus/schema 5.0.11 → 5.0.13

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 (62) 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 +25 -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/changeTree/parentChain.d.ts +9 -0
  13. package/build/encoder/streaming.d.ts +7 -0
  14. package/build/index.cjs +449 -233
  15. package/build/index.cjs.map +1 -1
  16. package/build/index.d.ts +1 -1
  17. package/build/index.js +449 -233
  18. package/build/index.mjs +448 -232
  19. package/build/index.mjs.map +1 -1
  20. package/build/types/builder.d.ts +31 -22
  21. package/build/types/custom/ArraySchema.d.ts +17 -0
  22. package/build/types/custom/StreamSchema.d.ts +1 -1
  23. package/build/types/symbols.d.ts +4 -10
  24. package/package.json +1 -1
  25. package/src/Metadata.ts +58 -31
  26. package/src/annotations.ts +56 -32
  27. package/src/codegen/api.ts +2 -1
  28. package/src/codegen/languages/c.ts +21 -3
  29. package/src/codegen/languages/csharp.ts +7 -1
  30. package/src/codegen/languages/dart.ts +274 -0
  31. package/src/codegen/languages/haxe.ts +7 -1
  32. package/src/codegen/languages/lua.ts +16 -4
  33. package/src/codegen/languages/ts.ts +5 -0
  34. package/src/codegen/parser.ts +97 -3
  35. package/src/codegen/types.ts +24 -0
  36. package/src/decoder/Resync.ts +8 -8
  37. package/src/encoder/ChangeRecorder.ts +1 -1
  38. package/src/encoder/ChangeTree.ts +46 -26
  39. package/src/encoder/EncodeDescriptor.ts +17 -38
  40. package/src/encoder/EncodeOperation.ts +3 -1
  41. package/src/encoder/Encoder.ts +97 -21
  42. package/src/encoder/Root.ts +18 -20
  43. package/src/encoder/StateView.ts +102 -12
  44. package/src/encoder/changeTree/inheritedFlags.ts +10 -10
  45. package/src/encoder/changeTree/liveIteration.ts +9 -9
  46. package/src/encoder/changeTree/parentChain.ts +29 -0
  47. package/src/encoder/streaming.ts +8 -0
  48. package/src/encoding/spec.ts +1 -1
  49. package/src/index.ts +2 -2
  50. package/src/types/builder.ts +35 -31
  51. package/src/types/custom/ArraySchema.ts +40 -1
  52. package/src/types/custom/StreamSchema.ts +1 -1
  53. package/src/types/symbols.ts +4 -11
  54. package/src/bench_bloat.ts +0 -173
  55. package/src/bench_churn.ts +0 -121
  56. package/src/bench_decode.ts +0 -221
  57. package/src/bench_decode_mem.ts +0 -165
  58. package/src/bench_encode.ts +0 -108
  59. package/src/bench_init.ts +0 -150
  60. package/src/bench_static.ts +0 -109
  61. package/src/bench_stream.ts +0 -295
  62. 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
- }