@series-inc/rundot-syncplay 5.23.0-beta.7

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 (264) hide show
  1. package/README.md +610 -0
  2. package/dist/animation.d.ts +119 -0
  3. package/dist/animation.js +488 -0
  4. package/dist/asset-cooking.d.ts +82 -0
  5. package/dist/asset-cooking.js +364 -0
  6. package/dist/authority-room.d.ts +217 -0
  7. package/dist/authority-room.js +701 -0
  8. package/dist/bot-documents.d.ts +115 -0
  9. package/dist/bot-documents.js +549 -0
  10. package/dist/bot-primitives.d.ts +152 -0
  11. package/dist/bot-primitives.js +472 -0
  12. package/dist/browser.d.ts +57 -0
  13. package/dist/browser.js +53 -0
  14. package/dist/canonical.d.ts +12 -0
  15. package/dist/canonical.js +288 -0
  16. package/dist/certification.d.ts +455 -0
  17. package/dist/certification.js +1855 -0
  18. package/dist/chaos-certification.d.ts +56 -0
  19. package/dist/chaos-certification.js +1397 -0
  20. package/dist/cjs/animation.js +495 -0
  21. package/dist/cjs/asset-cooking.js +372 -0
  22. package/dist/cjs/authority-room.js +704 -0
  23. package/dist/cjs/bot-documents.js +556 -0
  24. package/dist/cjs/bot-primitives.js +482 -0
  25. package/dist/cjs/browser.js +96 -0
  26. package/dist/cjs/canonical.js +299 -0
  27. package/dist/cjs/certification.js +1860 -0
  28. package/dist/cjs/chaos-certification.js +1402 -0
  29. package/dist/cjs/collections.js +36 -0
  30. package/dist/cjs/collision.js +96 -0
  31. package/dist/cjs/commands.js +987 -0
  32. package/dist/cjs/config-bundle.js +491 -0
  33. package/dist/cjs/creator.js +30 -0
  34. package/dist/cjs/deterministic-primitives.js +134 -0
  35. package/dist/cjs/deterministic-session.js +1410 -0
  36. package/dist/cjs/ecs-lite.js +155 -0
  37. package/dist/cjs/effects-adapter.js +97 -0
  38. package/dist/cjs/engine-complete.js +2297 -0
  39. package/dist/cjs/engine-core-proof.js +70 -0
  40. package/dist/cjs/engine-parity-matrix.js +874 -0
  41. package/dist/cjs/engine-parity.js +3183 -0
  42. package/dist/cjs/engine-runtime.js +3141 -0
  43. package/dist/cjs/errors.js +22 -0
  44. package/dist/cjs/events.js +247 -0
  45. package/dist/cjs/examples/counter-duel.js +157 -0
  46. package/dist/cjs/examples/fixed-arena.js +368 -0
  47. package/dist/cjs/index.js +229 -0
  48. package/dist/cjs/input-authority.js +150 -0
  49. package/dist/cjs/input-button.js +256 -0
  50. package/dist/cjs/input-timeline.js +418 -0
  51. package/dist/cjs/instant-replay.js +66 -0
  52. package/dist/cjs/lag-compensation3d.js +837 -0
  53. package/dist/cjs/local-authority-server-runner.js +1121 -0
  54. package/dist/cjs/local-authority-wire.js +1497 -0
  55. package/dist/cjs/local-authority.js +817 -0
  56. package/dist/cjs/local-ws-adapter.js +150 -0
  57. package/dist/cjs/match-log.js +61 -0
  58. package/dist/cjs/math.js +157 -0
  59. package/dist/cjs/mock-network-adapter.js +26 -0
  60. package/dist/cjs/movement.js +703 -0
  61. package/dist/cjs/movement3d.js +1246 -0
  62. package/dist/cjs/multiclient-authority.js +308 -0
  63. package/dist/cjs/multiplayer-service.js +434 -0
  64. package/dist/cjs/navigation.js +347 -0
  65. package/dist/cjs/navmesh.js +1437 -0
  66. package/dist/cjs/networked-client.js +691 -0
  67. package/dist/cjs/networked-input-authority.js +443 -0
  68. package/dist/cjs/node.js +47 -0
  69. package/dist/cjs/number-lab.js +78 -0
  70. package/dist/cjs/offline-session.js +370 -0
  71. package/dist/cjs/package.json +1 -0
  72. package/dist/cjs/pause-resume.js +43 -0
  73. package/dist/cjs/physics-cert.js +426 -0
  74. package/dist/cjs/physics2d.js +751 -0
  75. package/dist/cjs/physics3d.js +1996 -0
  76. package/dist/cjs/prediction-culling.js +203 -0
  77. package/dist/cjs/protocol-lab.js +1299 -0
  78. package/dist/cjs/r3f-render-adapter.js +209 -0
  79. package/dist/cjs/random.js +59 -0
  80. package/dist/cjs/replay-bundle.js +1598 -0
  81. package/dist/cjs/replay-inspect.js +236 -0
  82. package/dist/cjs/replay-scoring.js +68 -0
  83. package/dist/cjs/replay.js +356 -0
  84. package/dist/cjs/reports.js +181 -0
  85. package/dist/cjs/rollback-history.js +251 -0
  86. package/dist/cjs/runtime-guards.js +111 -0
  87. package/dist/cjs/sample-lab.js +145 -0
  88. package/dist/cjs/sample-scenes.js +752 -0
  89. package/dist/cjs/schema-artifacts.js +359 -0
  90. package/dist/cjs/schema-codegen.js +544 -0
  91. package/dist/cjs/schema-dsl-binary.js +655 -0
  92. package/dist/cjs/schema.js +319 -0
  93. package/dist/cjs/sdk-offline.js +99 -0
  94. package/dist/cjs/session-promotion.js +74 -0
  95. package/dist/cjs/session-snapshot.js +265 -0
  96. package/dist/cjs/session-wire.js +216 -0
  97. package/dist/cjs/signals.js +103 -0
  98. package/dist/cjs/sparse-set.js +169 -0
  99. package/dist/cjs/synctest.js +136 -0
  100. package/dist/cjs/system-lifecycle.js +286 -0
  101. package/dist/cjs/timers.js +61 -0
  102. package/dist/cjs/tools/static-checker.js +1468 -0
  103. package/dist/cjs/types.js +2 -0
  104. package/dist/cjs/venus-mp-budget.js +125 -0
  105. package/dist/cjs/ws-frame.js +255 -0
  106. package/dist/cli.d.ts +2 -0
  107. package/dist/cli.js +11379 -0
  108. package/dist/collections.d.ts +9 -0
  109. package/dist/collections.js +30 -0
  110. package/dist/collision.d.ts +25 -0
  111. package/dist/collision.js +85 -0
  112. package/dist/commands.d.ts +137 -0
  113. package/dist/commands.js +977 -0
  114. package/dist/config-bundle.d.ts +89 -0
  115. package/dist/config-bundle.js +483 -0
  116. package/dist/creator.d.ts +20 -0
  117. package/dist/creator.js +11 -0
  118. package/dist/deterministic-primitives.d.ts +59 -0
  119. package/dist/deterministic-primitives.js +126 -0
  120. package/dist/deterministic-session.d.ts +197 -0
  121. package/dist/deterministic-session.js +1401 -0
  122. package/dist/ecs-lite.d.ts +26 -0
  123. package/dist/ecs-lite.js +152 -0
  124. package/dist/effects-adapter.d.ts +21 -0
  125. package/dist/effects-adapter.js +94 -0
  126. package/dist/engine-complete.d.ts +45 -0
  127. package/dist/engine-complete.js +2292 -0
  128. package/dist/engine-core-proof.d.ts +26 -0
  129. package/dist/engine-core-proof.js +66 -0
  130. package/dist/engine-parity-matrix.d.ts +300 -0
  131. package/dist/engine-parity-matrix.js +869 -0
  132. package/dist/engine-parity.d.ts +74 -0
  133. package/dist/engine-parity.js +3178 -0
  134. package/dist/engine-runtime.d.ts +351 -0
  135. package/dist/engine-runtime.js +3123 -0
  136. package/dist/errors.d.ts +11 -0
  137. package/dist/errors.js +17 -0
  138. package/dist/events.d.ts +45 -0
  139. package/dist/events.js +242 -0
  140. package/dist/examples/counter-duel.d.ts +43 -0
  141. package/dist/examples/counter-duel.js +150 -0
  142. package/dist/examples/fixed-arena.d.ts +110 -0
  143. package/dist/examples/fixed-arena.js +356 -0
  144. package/dist/index.d.ts +101 -0
  145. package/dist/index.js +66 -0
  146. package/dist/input-authority.d.ts +82 -0
  147. package/dist/input-authority.js +147 -0
  148. package/dist/input-button.d.ts +36 -0
  149. package/dist/input-button.js +249 -0
  150. package/dist/input-timeline.d.ts +65 -0
  151. package/dist/input-timeline.js +412 -0
  152. package/dist/instant-replay.d.ts +59 -0
  153. package/dist/instant-replay.js +62 -0
  154. package/dist/lag-compensation3d.d.ts +146 -0
  155. package/dist/lag-compensation3d.js +827 -0
  156. package/dist/local-authority-server-runner.d.ts +79 -0
  157. package/dist/local-authority-server-runner.js +1118 -0
  158. package/dist/local-authority-wire.d.ts +142 -0
  159. package/dist/local-authority-wire.js +1477 -0
  160. package/dist/local-authority.d.ts +160 -0
  161. package/dist/local-authority.js +810 -0
  162. package/dist/local-ws-adapter.d.ts +14 -0
  163. package/dist/local-ws-adapter.js +146 -0
  164. package/dist/match-log.d.ts +74 -0
  165. package/dist/match-log.js +57 -0
  166. package/dist/math.d.ts +41 -0
  167. package/dist/math.js +154 -0
  168. package/dist/mock-network-adapter.d.ts +13 -0
  169. package/dist/mock-network-adapter.js +23 -0
  170. package/dist/movement.d.ts +155 -0
  171. package/dist/movement.js +694 -0
  172. package/dist/movement3d.d.ts +195 -0
  173. package/dist/movement3d.js +1238 -0
  174. package/dist/multiclient-authority.d.ts +30 -0
  175. package/dist/multiclient-authority.js +305 -0
  176. package/dist/multiplayer-service.d.ts +153 -0
  177. package/dist/multiplayer-service.js +429 -0
  178. package/dist/navigation.d.ts +91 -0
  179. package/dist/navigation.js +338 -0
  180. package/dist/navmesh.d.ts +236 -0
  181. package/dist/navmesh.js +1423 -0
  182. package/dist/networked-client.d.ts +124 -0
  183. package/dist/networked-client.js +688 -0
  184. package/dist/networked-input-authority.d.ts +51 -0
  185. package/dist/networked-input-authority.js +439 -0
  186. package/dist/node.d.ts +22 -0
  187. package/dist/node.js +19 -0
  188. package/dist/number-lab.d.ts +15 -0
  189. package/dist/number-lab.js +75 -0
  190. package/dist/offline-session.d.ts +2 -0
  191. package/dist/offline-session.js +367 -0
  192. package/dist/pause-resume.d.ts +48 -0
  193. package/dist/pause-resume.js +40 -0
  194. package/dist/physics-cert.d.ts +40 -0
  195. package/dist/physics-cert.js +389 -0
  196. package/dist/physics2d.d.ts +142 -0
  197. package/dist/physics2d.js +741 -0
  198. package/dist/physics3d.d.ts +285 -0
  199. package/dist/physics3d.js +1979 -0
  200. package/dist/prediction-culling.d.ts +34 -0
  201. package/dist/prediction-culling.js +200 -0
  202. package/dist/protocol-lab.d.ts +115 -0
  203. package/dist/protocol-lab.js +1295 -0
  204. package/dist/r3f-render-adapter.d.ts +61 -0
  205. package/dist/r3f-render-adapter.js +203 -0
  206. package/dist/random.d.ts +13 -0
  207. package/dist/random.js +55 -0
  208. package/dist/replay-bundle.d.ts +150 -0
  209. package/dist/replay-bundle.js +1586 -0
  210. package/dist/replay-inspect.d.ts +60 -0
  211. package/dist/replay-inspect.js +228 -0
  212. package/dist/replay-scoring.d.ts +28 -0
  213. package/dist/replay-scoring.js +65 -0
  214. package/dist/replay.d.ts +17 -0
  215. package/dist/replay.js +351 -0
  216. package/dist/reports.d.ts +176 -0
  217. package/dist/reports.js +174 -0
  218. package/dist/rollback-history.d.ts +46 -0
  219. package/dist/rollback-history.js +247 -0
  220. package/dist/runtime-guards.d.ts +1 -0
  221. package/dist/runtime-guards.js +108 -0
  222. package/dist/sample-lab.d.ts +32 -0
  223. package/dist/sample-lab.js +134 -0
  224. package/dist/sample-scenes.d.ts +86 -0
  225. package/dist/sample-scenes.js +745 -0
  226. package/dist/schema-artifacts.d.ts +49 -0
  227. package/dist/schema-artifacts.js +356 -0
  228. package/dist/schema-codegen.d.ts +21 -0
  229. package/dist/schema-codegen.js +538 -0
  230. package/dist/schema-dsl-binary.d.ts +75 -0
  231. package/dist/schema-dsl-binary.js +648 -0
  232. package/dist/schema.d.ts +87 -0
  233. package/dist/schema.js +315 -0
  234. package/dist/sdk-offline.d.ts +34 -0
  235. package/dist/sdk-offline.js +96 -0
  236. package/dist/session-promotion.d.ts +26 -0
  237. package/dist/session-promotion.js +70 -0
  238. package/dist/session-snapshot.d.ts +95 -0
  239. package/dist/session-snapshot.js +255 -0
  240. package/dist/session-wire.d.ts +89 -0
  241. package/dist/session-wire.js +211 -0
  242. package/dist/signals.d.ts +31 -0
  243. package/dist/signals.js +99 -0
  244. package/dist/sparse-set.d.ts +34 -0
  245. package/dist/sparse-set.js +165 -0
  246. package/dist/synctest.d.ts +31 -0
  247. package/dist/synctest.js +133 -0
  248. package/dist/system-lifecycle.d.ts +72 -0
  249. package/dist/system-lifecycle.js +281 -0
  250. package/dist/timers.d.ts +17 -0
  251. package/dist/timers.js +53 -0
  252. package/dist/tools/index.d.ts +4 -0
  253. package/dist/tools/index.js +4 -0
  254. package/dist/tools/static-checker.d.ts +31 -0
  255. package/dist/tools/static-checker.js +1462 -0
  256. package/dist/tools/vite-plugin.d.ts +69 -0
  257. package/dist/tools/vite-plugin.js +203 -0
  258. package/dist/types.d.ts +148 -0
  259. package/dist/types.js +1 -0
  260. package/dist/venus-mp-budget.d.ts +29 -0
  261. package/dist/venus-mp-budget.js +122 -0
  262. package/dist/ws-frame.d.ts +49 -0
  263. package/dist/ws-frame.js +247 -0
  264. package/package.json +169 -0
@@ -0,0 +1,9 @@
1
+ import type { DeterministicRandom } from './random.js';
2
+ export interface StableIndexedEntry<Value> {
3
+ readonly id: string;
4
+ readonly value: Value;
5
+ }
6
+ export declare function stableSortedKeys(record: Readonly<Record<string, unknown>>): readonly string[];
7
+ export declare function stableEntries<Value>(record: Readonly<Record<string, Value>>): readonly StableIndexedEntry<Value>[];
8
+ export declare function createStableIndexedMap<Value>(entries: readonly StableIndexedEntry<Value>[]): ReadonlyMap<string, Value>;
9
+ export declare function deterministicShuffle<Value>(values: readonly Value[], random: DeterministicRandom): readonly Value[];
@@ -0,0 +1,30 @@
1
+ export function stableSortedKeys(record) {
2
+ return Object.keys(record).sort(compareStrings);
3
+ }
4
+ export function stableEntries(record) {
5
+ return stableSortedKeys(record).map((id) => ({ id, value: record[id] }));
6
+ }
7
+ export function createStableIndexedMap(entries) {
8
+ const sorted = [...entries].sort((left, right) => compareStrings(left.id, right.id));
9
+ const result = new Map();
10
+ for (const entry of sorted) {
11
+ if (result.has(entry.id)) {
12
+ throw new Error(`Duplicate stable id ${entry.id}`);
13
+ }
14
+ result.set(entry.id, entry.value);
15
+ }
16
+ return result;
17
+ }
18
+ function compareStrings(left, right) {
19
+ return left < right ? -1 : left > right ? 1 : 0;
20
+ }
21
+ export function deterministicShuffle(values, random) {
22
+ const result = values.slice();
23
+ for (let index = result.length - 1; index > 0; index -= 1) {
24
+ const swapIndex = random.nextInt(0, index);
25
+ const value = result[index];
26
+ result[index] = result[swapIndex];
27
+ result[swapIndex] = value;
28
+ }
29
+ return result;
30
+ }
@@ -0,0 +1,25 @@
1
+ export type FixedVec2 = {
2
+ readonly x: number;
3
+ readonly y: number;
4
+ };
5
+ export type FixedAabb = {
6
+ readonly minX: number;
7
+ readonly minY: number;
8
+ readonly maxX: number;
9
+ readonly maxY: number;
10
+ };
11
+ export type FixedCircle = {
12
+ readonly center: FixedVec2;
13
+ readonly radius: number;
14
+ };
15
+ export declare function fixedVec2(x: number, y: number): FixedVec2;
16
+ export declare function fixedAabb(center: FixedVec2, halfWidth: number, halfHeight: number): FixedAabb;
17
+ export declare function fixedCircle(center: FixedVec2, radius: number): FixedCircle;
18
+ export declare function aabbIntersects(left: FixedAabb, right: FixedAabb): boolean;
19
+ export declare function aabbContainsPoint(aabb: FixedAabb, point: FixedVec2): boolean;
20
+ export declare function circleIntersects(left: FixedCircle, right: FixedCircle): boolean;
21
+ export declare function circleIntersectsAabb(circle: FixedCircle, aabb: FixedAabb): boolean;
22
+ export declare function translateAabb(aabb: FixedAabb, delta: FixedVec2): FixedAabb;
23
+ export declare function sortAabbsByStableId<T extends {
24
+ readonly id: string;
25
+ }>(items: readonly T[]): readonly T[];
@@ -0,0 +1,85 @@
1
+ export function fixedVec2(x, y) {
2
+ assertInteger(x, 'x');
3
+ assertInteger(y, 'y');
4
+ return { x, y };
5
+ }
6
+ export function fixedAabb(center, halfWidth, halfHeight) {
7
+ assertInteger(halfWidth, 'halfWidth');
8
+ assertInteger(halfHeight, 'halfHeight');
9
+ if (halfWidth < 0 || halfHeight < 0) {
10
+ throw new Error('AABB half extents must be non-negative');
11
+ }
12
+ return {
13
+ minX: center.x - halfWidth,
14
+ minY: center.y - halfHeight,
15
+ maxX: center.x + halfWidth,
16
+ maxY: center.y + halfHeight,
17
+ };
18
+ }
19
+ export function fixedCircle(center, radius) {
20
+ assertInteger(radius, 'radius');
21
+ if (radius < 0) {
22
+ throw new Error('Circle radius must be non-negative');
23
+ }
24
+ return { center, radius };
25
+ }
26
+ export function aabbIntersects(left, right) {
27
+ return left.minX < right.maxX && left.maxX > right.minX && left.minY < right.maxY && left.maxY > right.minY;
28
+ }
29
+ export function aabbContainsPoint(aabb, point) {
30
+ return point.x >= aabb.minX && point.x <= aabb.maxX && point.y >= aabb.minY && point.y <= aabb.maxY;
31
+ }
32
+ export function circleIntersects(left, right) {
33
+ const dx = left.center.x - right.center.x;
34
+ const dy = left.center.y - right.center.y;
35
+ const radius = left.radius + right.radius;
36
+ return dx * dx + dy * dy < radius * radius;
37
+ }
38
+ export function circleIntersectsAabb(circle, aabb) {
39
+ const center = circle.center;
40
+ const closestPoint = closestPointOnAabb(center, aabb);
41
+ const delta = {
42
+ x: center.x - closestPoint.x,
43
+ y: center.y - closestPoint.y,
44
+ };
45
+ return delta.x * delta.x + delta.y * delta.y < circle.radius * circle.radius;
46
+ }
47
+ export function translateAabb(aabb, delta) {
48
+ return {
49
+ minX: aabb.minX + delta.x,
50
+ minY: aabb.minY + delta.y,
51
+ maxX: aabb.maxX + delta.x,
52
+ maxY: aabb.maxY + delta.y,
53
+ };
54
+ }
55
+ export function sortAabbsByStableId(items) {
56
+ return [...items].sort((left, right) => {
57
+ if (left.id < right.id) {
58
+ return -1;
59
+ }
60
+ if (left.id > right.id) {
61
+ return 1;
62
+ }
63
+ return 0;
64
+ });
65
+ }
66
+ function clampToRange(value, min, max) {
67
+ if (value < min) {
68
+ return min;
69
+ }
70
+ if (value > max) {
71
+ return max;
72
+ }
73
+ return value;
74
+ }
75
+ function closestPointOnAabb(point, aabb) {
76
+ return {
77
+ x: clampToRange(point.x, aabb.minX, aabb.maxX),
78
+ y: clampToRange(point.y, aabb.minY, aabb.maxY),
79
+ };
80
+ }
81
+ function assertInteger(value, name) {
82
+ if (!Number.isInteger(value)) {
83
+ throw new Error(`${name} must be an integer fixed-point value`);
84
+ }
85
+ }
@@ -0,0 +1,137 @@
1
+ import { type CanonicalValue } from './canonical.js';
2
+ import type { SchemaFieldKind } from './schema.js';
3
+ export type DeterministicPayloadFieldKind = SchemaFieldKind | `${SchemaFieldKind}[]` | 'object' | 'object[]';
4
+ export interface DeterministicPayloadFieldDescriptor {
5
+ readonly name: string;
6
+ readonly kind: DeterministicPayloadFieldKind;
7
+ readonly min?: number;
8
+ readonly max?: number;
9
+ readonly minItems?: number;
10
+ readonly maxItems?: number;
11
+ readonly optional?: boolean;
12
+ readonly fields?: readonly DeterministicPayloadFieldDescriptor[];
13
+ }
14
+ export interface DeterministicCommandChannelDescriptor {
15
+ readonly id: string;
16
+ readonly maxPayloadBytes: number;
17
+ readonly reliable: boolean;
18
+ readonly allowPrediction: boolean;
19
+ readonly minFrameLead?: number;
20
+ readonly maxFrameLead?: number;
21
+ readonly fields?: readonly DeterministicPayloadFieldDescriptor[];
22
+ }
23
+ export interface DeterministicPlayerCommand {
24
+ readonly id: string;
25
+ readonly slot: number;
26
+ readonly frame: number;
27
+ readonly channelId: string;
28
+ readonly payload: CanonicalValue;
29
+ readonly predicted?: boolean;
30
+ readonly submittedFrame?: number;
31
+ }
32
+ export interface DeterministicRejectedCommand {
33
+ readonly commandId: string;
34
+ readonly reason: 'unauthorized-slot' | 'stale-frame' | 'future-frame' | 'oversized-payload' | 'bad-schema' | 'bad-asset-ref' | 'duplicate-command-id' | 'duplicate-slot-frame-command' | 'unknown-channel' | 'insufficient-frame-lead' | 'prediction-not-allowed';
35
+ }
36
+ export interface DeterministicCommandTimelineSnapshot {
37
+ readonly currentFrame: number;
38
+ readonly accepted: readonly DeterministicPlayerCommand[];
39
+ readonly rejected: readonly DeterministicRejectedCommand[];
40
+ readonly checksum: string;
41
+ }
42
+ export interface DeterministicCommandTimeline {
43
+ readonly accepted: readonly DeterministicPlayerCommand[];
44
+ readonly rejected: readonly DeterministicRejectedCommand[];
45
+ readonly currentFrame: number;
46
+ setCurrentFrame(frame: number): void;
47
+ record(command: DeterministicPlayerCommand): DeterministicRejectedCommand | undefined;
48
+ recordFromSlot(senderSlot: number, command: DeterministicPlayerCommand): DeterministicRejectedCommand | undefined;
49
+ poll(frame: number, slot?: number, channelId?: string): readonly DeterministicPlayerCommand[];
50
+ snapshot(): DeterministicCommandTimelineSnapshot;
51
+ restore(snapshot: DeterministicCommandTimelineSnapshot): void;
52
+ checksum(): string;
53
+ }
54
+ export interface DeterministicCommandTimelineConfig {
55
+ readonly playerCount: number;
56
+ readonly currentFrame: number;
57
+ readonly channels: readonly DeterministicCommandChannelDescriptor[];
58
+ readonly validAssetRefs?: readonly string[];
59
+ readonly validatePayload?: (command: DeterministicPlayerCommand) => boolean;
60
+ }
61
+ export interface DeterministicCommandProtocolMetrics {
62
+ readonly checksum: string;
63
+ readonly delivered: number;
64
+ readonly rejected: number;
65
+ readonly duplicateDrops: number;
66
+ readonly multiCommandSameFrameAccepted: number;
67
+ readonly multiCommandPollOrderStable: boolean;
68
+ readonly acceptedFutureCommands: number;
69
+ readonly replayedFutureCommands: number;
70
+ readonly reliableDelivered: number;
71
+ readonly reliableResent: number;
72
+ readonly unreliableDropped: number;
73
+ readonly reliableOrderingStable: boolean;
74
+ readonly firstDeliveredFrame: number;
75
+ readonly lastDeliveredFrame: number;
76
+ readonly delayP50Frames: number;
77
+ readonly delayP95Frames: number;
78
+ readonly rollbackDepthP95: number;
79
+ readonly schemaRejected: number;
80
+ readonly schemaDeclaredPayloadsCovered: boolean;
81
+ readonly schemaCollectionPayloadsCovered: boolean;
82
+ readonly convergence: boolean;
83
+ }
84
+ export interface DeterministicReliableCommandDefaultsMetrics {
85
+ readonly checksum: string;
86
+ readonly players: number;
87
+ readonly frames: number;
88
+ readonly accepted: number;
89
+ readonly reliableDelivered: number;
90
+ readonly reliableResent: number;
91
+ readonly unreliableDropped: number;
92
+ readonly duplicateRejected: number;
93
+ readonly staleRejected: number;
94
+ readonly futureRejected: number;
95
+ readonly pollOrderStable: boolean;
96
+ readonly replayConverged: boolean;
97
+ readonly originalOrderHash: string;
98
+ readonly replayOrderHash: string;
99
+ }
100
+ export interface DeterministicCommandTimelineMigrationMetrics {
101
+ readonly result: 'pass' | 'fail';
102
+ readonly players: number;
103
+ readonly acceptedBeforeMigration: number;
104
+ readonly acceptedAfterMigration: number;
105
+ readonly snapshotChecksum: string;
106
+ readonly restoredChecksum: string;
107
+ readonly finalChecksum: string;
108
+ readonly pollOrderStable: boolean;
109
+ readonly acceptedCommandIdsRestored: boolean;
110
+ readonly currentFrameRestored: boolean;
111
+ readonly duplicateAfterRestoreRejected: boolean;
112
+ readonly staleAfterRestoreRejected: boolean;
113
+ readonly futureAfterRestoreRejected: boolean;
114
+ readonly unauthorizedAfterRestoreRejected: boolean;
115
+ readonly oversizedAfterRestoreRejected: boolean;
116
+ readonly badSchemaAfterRestoreRejected: boolean;
117
+ readonly badAssetRefAfterRestoreRejected: boolean;
118
+ readonly newCommandAcceptedAfterRestore: boolean;
119
+ readonly rejectionCounts: Readonly<Record<string, number>>;
120
+ readonly checksum: string;
121
+ }
122
+ export interface DeterministicCommandTimelineMigrationResultInput {
123
+ readonly invariantChecks: readonly boolean[];
124
+ readonly snapshotChecksum: string;
125
+ readonly restoredChecksum: string;
126
+ readonly acceptedBeforeMigration: number;
127
+ readonly acceptedAfterMigration: number;
128
+ readonly expectedAcceptedBeforeMigration: number;
129
+ }
130
+ export declare function createDeterministicCommandTimeline(config: DeterministicCommandTimelineConfig): DeterministicCommandTimeline;
131
+ export declare function runDeterministicCommandTimelineMigrationFixture(players: number): DeterministicCommandTimelineMigrationMetrics;
132
+ export declare function evaluateDeterministicCommandTimelineMigrationResult(input: DeterministicCommandTimelineMigrationResultInput): 'pass' | 'fail';
133
+ export declare function createDeterministicCommandTimelineSnapshot(snapshot: Omit<DeterministicCommandTimelineSnapshot, 'checksum'>): DeterministicCommandTimelineSnapshot;
134
+ export declare function runDeterministicCommandProtocolFixture(players: number, frames: number, seed: number): DeterministicCommandProtocolMetrics;
135
+ export declare function runDeterministicReliableCommandDefaultsFixture(players: number, frames: number, seed: number): DeterministicReliableCommandDefaultsMetrics;
136
+ export declare function deterministicPayloadMatchesFields(payload: CanonicalValue, fields: readonly DeterministicPayloadFieldDescriptor[]): boolean;
137
+ export declare function assertDeterministicPayloadFields(label: string, payload: CanonicalValue, fields: readonly DeterministicPayloadFieldDescriptor[]): void;