@sadhaka/loom-engine 0.12.0 → 0.14.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.
Files changed (82) hide show
  1. package/README.md +113 -1
  2. package/dist/components/peer-sprite.d.ts +25 -0
  3. package/dist/components/peer-sprite.d.ts.map +1 -0
  4. package/dist/components/peer-sprite.js +48 -0
  5. package/dist/components/peer-sprite.js.map +1 -0
  6. package/dist/director/ai/ai-plugin-registry.d.ts +20 -0
  7. package/dist/director/ai/ai-plugin-registry.d.ts.map +1 -0
  8. package/dist/director/ai/ai-plugin-registry.js +232 -0
  9. package/dist/director/ai/ai-plugin-registry.js.map +1 -0
  10. package/dist/director/ai/mock-ai-plugin.d.ts +24 -0
  11. package/dist/director/ai/mock-ai-plugin.d.ts.map +1 -0
  12. package/dist/director/ai/mock-ai-plugin.js +83 -0
  13. package/dist/director/ai/mock-ai-plugin.js.map +1 -0
  14. package/dist/director/ai/plugin-context.d.ts +27 -0
  15. package/dist/director/ai/plugin-context.d.ts.map +1 -0
  16. package/dist/director/ai/plugin-context.js +152 -0
  17. package/dist/director/ai/plugin-context.js.map +1 -0
  18. package/dist/director/ai/plugin.d.ts +57 -0
  19. package/dist/director/ai/plugin.d.ts.map +1 -0
  20. package/dist/director/ai/plugin.js +32 -0
  21. package/dist/director/ai/plugin.js.map +1 -0
  22. package/dist/director/index.d.ts +27 -0
  23. package/dist/director/index.d.ts.map +1 -0
  24. package/dist/director/index.js +26 -0
  25. package/dist/director/index.js.map +1 -0
  26. package/dist/director/zone/mock-zone-bridge.d.ts +22 -0
  27. package/dist/director/zone/mock-zone-bridge.d.ts.map +1 -0
  28. package/dist/director/zone/mock-zone-bridge.js +107 -0
  29. package/dist/director/zone/mock-zone-bridge.js.map +1 -0
  30. package/dist/director/zone/sse-zone-bridge.d.ts +40 -0
  31. package/dist/director/zone/sse-zone-bridge.d.ts.map +1 -0
  32. package/dist/director/zone/sse-zone-bridge.js +164 -0
  33. package/dist/director/zone/sse-zone-bridge.js.map +1 -0
  34. package/dist/director/zone/zone-event-bridge.d.ts +21 -0
  35. package/dist/director/zone/zone-event-bridge.d.ts.map +1 -0
  36. package/dist/director/zone/zone-event-bridge.js +24 -0
  37. package/dist/director/zone/zone-event-bridge.js.map +1 -0
  38. package/dist/director/zone/zone-event-envelope.d.ts +90 -0
  39. package/dist/director/zone/zone-event-envelope.d.ts.map +1 -0
  40. package/dist/director/zone/zone-event-envelope.js +104 -0
  41. package/dist/director/zone/zone-event-envelope.js.map +1 -0
  42. package/dist/director/zone/zone-event-log.d.ts +17 -0
  43. package/dist/director/zone/zone-event-log.d.ts.map +1 -0
  44. package/dist/director/zone/zone-event-log.js +46 -0
  45. package/dist/director/zone/zone-event-log.js.map +1 -0
  46. package/dist/director/zone/zone-event-system.d.ts +14 -0
  47. package/dist/director/zone/zone-event-system.d.ts.map +1 -0
  48. package/dist/director/zone/zone-event-system.js +179 -0
  49. package/dist/director/zone/zone-event-system.js.map +1 -0
  50. package/dist/director/zone/zone-state-resource.d.ts +15 -0
  51. package/dist/director/zone/zone-state-resource.d.ts.map +1 -0
  52. package/dist/director/zone/zone-state-resource.js +60 -0
  53. package/dist/director/zone/zone-state-resource.js.map +1 -0
  54. package/dist/index.d.ts +25 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +14 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/network/mock-multiplayer-bridge.d.ts +34 -0
  59. package/dist/network/mock-multiplayer-bridge.d.ts.map +1 -0
  60. package/dist/network/mock-multiplayer-bridge.js +91 -0
  61. package/dist/network/mock-multiplayer-bridge.js.map +1 -0
  62. package/dist/network/multiplayer-bridge.d.ts +45 -0
  63. package/dist/network/multiplayer-bridge.d.ts.map +1 -0
  64. package/dist/network/multiplayer-bridge.js +34 -0
  65. package/dist/network/multiplayer-bridge.js.map +1 -0
  66. package/dist/network/peer-pool.d.ts +46 -0
  67. package/dist/network/peer-pool.d.ts.map +1 -0
  68. package/dist/network/peer-pool.js +185 -0
  69. package/dist/network/peer-pool.js.map +1 -0
  70. package/dist/network/sse-multiplayer-bridge.d.ts +36 -0
  71. package/dist/network/sse-multiplayer-bridge.d.ts.map +1 -0
  72. package/dist/network/sse-multiplayer-bridge.js +264 -0
  73. package/dist/network/sse-multiplayer-bridge.js.map +1 -0
  74. package/dist/server/index.d.ts +7 -0
  75. package/dist/server/index.d.ts.map +1 -0
  76. package/dist/server/index.js +33 -0
  77. package/dist/server/index.js.map +1 -0
  78. package/dist/systems/peer-presence-system.d.ts +19 -0
  79. package/dist/systems/peer-presence-system.d.ts.map +1 -0
  80. package/dist/systems/peer-presence-system.js +118 -0
  81. package/dist/systems/peer-presence-system.js.map +1 -0
  82. package/package.json +6 -2
@@ -0,0 +1,179 @@
1
+ // ZoneEventSystem - drains the IZoneEventBridge each tick, applies
2
+ // each event to the world's zone-scoped resources, and tracks per-zone
3
+ // recent state for the renderer (LOOM-DIRECTOR-PROTOCOL-V2 §4.3).
4
+ //
5
+ // Runs in PHASE_INPUT, AFTER DirectorSystem (v1) and PeerPresenceSystem
6
+ // (15.x). Order rationale:
7
+ // 1. DirectorSystem runs first so v1 character-scoped events have
8
+ // already mutated VeilBudget + KnotContext for THIS frame.
9
+ // 2. PeerPresenceSystem advances peer interpolation so the local
10
+ // player's current zone is fresh.
11
+ // 3. ZoneEventSystem THEN overlays zone-scoped events on top -
12
+ // knot pulses can stack on top of v1 knot.context, narrator
13
+ // lines can override v1 narrator.line for the same frame, etc.
14
+ //
15
+ // Local-zone filter (spec §4.3): events are applied ONLY for the
16
+ // local character's current zone. Events for other zones are still
17
+ // pushed into the per-zone ZoneEventLog so debug HUDs can see the
18
+ // fanout, but they do not mutate KnotContextResource or
19
+ // DirectorZoneStateResource.
20
+ //
21
+ // Dispatch table per event type:
22
+ //
23
+ // zone.boss.spawn -> ZoneEventLog.activeBossId = ev.data.boss.boss_id
24
+ // narrator_line -> log.lastNarratorLine
25
+ // zone.boss.tick -> log only (renderer reads ev for HP / pos)
26
+ // zone.boss.end -> ZoneEventLog.activeBossId = null
27
+ // zone.narrator -> log.lastNarratorLine + ttl
28
+ // zone.knot -> KnotContextResource.beginFade (parallel to v1)
29
+ // zone.state -> applyZoneStateChanges into
30
+ // DirectorZoneStateResource
31
+ // zone.snapshot -> replaceZoneStateFromSnapshot wholesale +
32
+ // reset activeBossId from snapshot's
33
+ // active_boss + apply knot if non-null
34
+ //
35
+ // Lightweight-by-design: most events are just logged + appended to
36
+ // the per-zone ring buffer that gameplay code can read. Heavy state
37
+ // mutation (combat boss entity spawn / despawn, loot pickup) lives
38
+ // in higher-level systems that read from ZoneEventLog.
39
+ import { RESOURCE_ZONE_EVENT_BRIDGE, } from './zone-event-bridge.js';
40
+ import { RESOURCE_ZONE_EVENT_LOG, getOrCreateZoneEntry, pushZoneEvent, } from './zone-event-log.js';
41
+ import { RESOURCE_DIRECTOR_ZONE_STATE, applyZoneStateChanges, replaceZoneStateFromSnapshot, } from './zone-state-resource.js';
42
+ import { RESOURCE_KNOT_CONTEXT, } from '../director-bridge.js';
43
+ import { RESOURCE_TIME, } from '../../resources.js';
44
+ export class ZoneEventSystem {
45
+ name = 'zone-events';
46
+ currentZone;
47
+ applyKnotToSharedContext;
48
+ constructor(opts = {}) {
49
+ this.currentZone = opts.currentZone ?? null;
50
+ this.applyKnotToSharedContext = opts.applyKnotToSharedContext ?? true;
51
+ }
52
+ update(world, _dt) {
53
+ const bridge = world.resources.get(RESOURCE_ZONE_EVENT_BRIDGE);
54
+ const log = world.resources.get(RESOURCE_ZONE_EVENT_LOG);
55
+ const stateRes = world.resources.get(RESOURCE_DIRECTOR_ZONE_STATE);
56
+ if (!bridge || !log)
57
+ return;
58
+ const knotCtx = this.applyKnotToSharedContext
59
+ ? world.resources.get(RESOURCE_KNOT_CONTEXT)
60
+ : undefined;
61
+ const time = world.resources.get(RESOURCE_TIME);
62
+ const nowMs = (time ? time.elapsed * 1000 : 0)
63
+ + (typeof performance !== 'undefined' ? performance.now() : 0);
64
+ const events = bridge.pollEvents();
65
+ if (events.length === 0)
66
+ return;
67
+ const localZone = safeCurrentZone(this.currentZone);
68
+ for (let i = 0; i < events.length; i++) {
69
+ const ev = events[i];
70
+ if (!ev)
71
+ continue;
72
+ // Always push into the per-zone log (so debug HUDs can see all
73
+ // observed zones) - the local-zone filter only gates state
74
+ // mutation, not logging.
75
+ const entry = getOrCreateZoneEntry(log, ev.zone_id);
76
+ pushZoneEvent(entry, ev);
77
+ const isLocal = localZone === null
78
+ ? true // no filter set: apply everything (single-zone consumer)
79
+ : ev.zone_id === localZone;
80
+ applyEvent(ev, entry, isLocal, knotCtx, stateRes, nowMs);
81
+ }
82
+ }
83
+ }
84
+ function applyEvent(ev, entry, isLocal, knotCtx, stateRes, nowMs) {
85
+ switch (ev.type) {
86
+ case 'zone.boss.spawn': {
87
+ const e = ev;
88
+ const d = e.data;
89
+ // activeBossId is per-zone, so always update the per-zone log
90
+ // entry regardless of local filter.
91
+ entry.activeBossId = d.boss.boss_id;
92
+ if (isLocal && d.narrator_line) {
93
+ entry.lastNarratorLine = d.narrator_line;
94
+ entry.lastNarratorTtlMs = 0;
95
+ }
96
+ break;
97
+ }
98
+ case 'zone.boss.tick': {
99
+ // Log only. Renderer reads the most recent zone.boss.tick from
100
+ // entry.recent for HP / position.
101
+ break;
102
+ }
103
+ case 'zone.boss.end': {
104
+ const e = ev;
105
+ // Clear active boss for this zone if the ended boss matches.
106
+ // (Defensive: a stale zone.boss.end for a different boss should
107
+ // not nuke the current one.)
108
+ if (entry.activeBossId === e.data.boss_id) {
109
+ entry.activeBossId = null;
110
+ }
111
+ break;
112
+ }
113
+ case 'zone.narrator': {
114
+ if (!isLocal)
115
+ break;
116
+ const e = ev;
117
+ entry.lastNarratorLine = e.data.line;
118
+ entry.lastNarratorTtlMs = e.data.ttl_ms;
119
+ break;
120
+ }
121
+ case 'zone.knot': {
122
+ if (!isLocal || !knotCtx)
123
+ break;
124
+ const e = ev;
125
+ const d = e.data;
126
+ knotCtx.knot = d.knot;
127
+ knotCtx.mood = d.mood;
128
+ knotCtx.beginFade(d.palette, d.fade_ms, nowMs);
129
+ break;
130
+ }
131
+ case 'zone.state': {
132
+ if (!stateRes)
133
+ break;
134
+ const e = ev;
135
+ // State changes are applied to ALL zones we observe so a
136
+ // debug HUD that flips back to a foreign zone sees the right
137
+ // state. Per spec §4.3 the LOCAL filter is for "applies the
138
+ // gameplay effect"; the state map is observation-grade.
139
+ applyZoneStateChanges(stateRes, e.zone_id, e.data.changes);
140
+ break;
141
+ }
142
+ case 'zone.snapshot': {
143
+ const e = ev;
144
+ const d = e.data;
145
+ // Snapshot replaces local state wholesale.
146
+ if (stateRes) {
147
+ replaceZoneStateFromSnapshot(stateRes, e.zone_id, d.state);
148
+ }
149
+ // Reset active boss from snapshot.
150
+ entry.activeBossId = d.active_boss ? d.active_boss.boss_id : null;
151
+ // Apply snapshot's knot if present and we are the local zone.
152
+ if (isLocal && knotCtx && d.knot) {
153
+ knotCtx.knot = d.knot.knot;
154
+ knotCtx.mood = d.knot.mood;
155
+ knotCtx.beginFade(d.knot.palette, d.knot.fade_ms, nowMs);
156
+ }
157
+ break;
158
+ }
159
+ default: {
160
+ // Exhaustiveness check - if a new ZoneEventType is added without
161
+ // a case, TS will complain at compile time on `_unreachable`.
162
+ const _unreachable = ev;
163
+ void _unreachable;
164
+ break;
165
+ }
166
+ }
167
+ }
168
+ function safeCurrentZone(fn) {
169
+ if (!fn)
170
+ return null;
171
+ try {
172
+ const z = fn();
173
+ return typeof z === 'string' && z.length > 0 ? z : null;
174
+ }
175
+ catch {
176
+ return null;
177
+ }
178
+ }
179
+ //# sourceMappingURL=zone-event-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zone-event-system.js","sourceRoot":"","sources":["../../../src/director/zone/zone-event-system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface DirectorZoneStateResource {
2
+ byZone: Map<string, Map<string, unknown>>;
3
+ }
4
+ export declare const RESOURCE_DIRECTOR_ZONE_STATE = "director_zone_state";
5
+ export declare function createDirectorZoneStateResource(): DirectorZoneStateResource;
6
+ export declare function getOrCreateZoneStateMap(res: DirectorZoneStateResource, zoneId: string): Map<string, unknown>;
7
+ export declare function applyZoneStateChanges(res: DirectorZoneStateResource, zoneId: string, changes: ReadonlyArray<{
8
+ key: string;
9
+ value: unknown;
10
+ }>): void;
11
+ export declare function replaceZoneStateFromSnapshot(res: DirectorZoneStateResource, zoneId: string, state: ReadonlyArray<{
12
+ key: string;
13
+ value: unknown;
14
+ }>): void;
15
+ //# sourceMappingURL=zone-state-resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zone-state-resource.d.ts","sourceRoot":"","sources":["../../../src/director/zone/zone-state-resource.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,yBAAyB;IAGxC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC3C;AAED,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAElE,wBAAgB,+BAA+B,IAAI,yBAAyB,CAE3E;AAID,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,yBAAyB,EAC9B,MAAM,EAAE,MAAM,GACb,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAMtB;AAKD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,yBAAyB,EAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,GACtD,IAAI,CAQN;AAMD,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,yBAAyB,EAC9B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,GACpD,IAAI,CAQN"}
@@ -0,0 +1,60 @@
1
+ // DirectorZoneStateResource - generic key-value store per zone
2
+ // mutated by zone.state events and replaced wholesale by
3
+ // zone.snapshot (LOOM-DIRECTOR-PROTOCOL-V2 §4.5).
4
+ //
5
+ // Naming note: the existing Phase 8 ZoneStateResource in
6
+ // src/zone/zone-state.ts tracks the LOCAL player's active zone +
7
+ // transition state. This is a distinct concern: the Director-driven
8
+ // per-zone key/value bag (door open, fire lit, knot pulse counter,
9
+ // etc.). To avoid a name collision we expose this as
10
+ // DirectorZoneStateResource at the symbol level. The spec's
11
+ // ZoneStateResource interface name from §4.5 is satisfied by the
12
+ // type alias `ZoneDirectorState` we re-export below; the engine's
13
+ // public surface uses the disambiguated name.
14
+ //
15
+ // The Director and the consumer agree on key naming offline. The
16
+ // engine treats values as `unknown` and never inspects them - it just
17
+ // ferries deltas + snapshots between event stream and the resource.
18
+ export const RESOURCE_DIRECTOR_ZONE_STATE = 'director_zone_state';
19
+ export function createDirectorZoneStateResource() {
20
+ return { byZone: new Map() };
21
+ }
22
+ // Get or lazily create the per-zone Map. Used by ZoneEventSystem on
23
+ // the first state event for a zone.
24
+ export function getOrCreateZoneStateMap(res, zoneId) {
25
+ const existing = res.byZone.get(zoneId);
26
+ if (existing)
27
+ return existing;
28
+ const fresh = new Map();
29
+ res.byZone.set(zoneId, fresh);
30
+ return fresh;
31
+ }
32
+ // Apply a delta of (key, value) changes into the zone's map.
33
+ // Handler for zone.state. Iterates without allocations on the hot
34
+ // path beyond the underlying Map.set.
35
+ export function applyZoneStateChanges(res, zoneId, changes) {
36
+ if (changes.length === 0)
37
+ return;
38
+ const map = getOrCreateZoneStateMap(res, zoneId);
39
+ for (let i = 0; i < changes.length; i++) {
40
+ const c = changes[i];
41
+ if (!c)
42
+ continue;
43
+ map.set(c.key, c.value);
44
+ }
45
+ }
46
+ // Replace the zone's map wholesale with the snapshot's contents.
47
+ // Handler for zone.snapshot. Drops any local key not present in the
48
+ // snapshot (per spec §4.3 "Replace local ZoneStateResource for this
49
+ // zone wholesale").
50
+ export function replaceZoneStateFromSnapshot(res, zoneId, state) {
51
+ const fresh = new Map();
52
+ for (let i = 0; i < state.length; i++) {
53
+ const c = state[i];
54
+ if (!c)
55
+ continue;
56
+ fresh.set(c.key, c.value);
57
+ }
58
+ res.byZone.set(zoneId, fresh);
59
+ }
60
+ //# sourceMappingURL=zone-state-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zone-state-resource.js","sourceRoot":"","sources":["../../../src/director/zone/zone-state-resource.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,yDAAyD;AACzD,kDAAkD;AAClD,EAAE;AACF,yDAAyD;AACzD,iEAAiE;AACjE,oEAAoE;AACpE,mEAAmE;AACnE,qDAAqD;AACrD,4DAA4D;AAC5D,iEAAiE;AACjE,kEAAkE;AAClE,8CAA8C;AAC9C,EAAE;AACF,iEAAiE;AACjE,sEAAsE;AACtE,oEAAoE;AAQpE,MAAM,CAAC,MAAM,4BAA4B,GAAG,qBAAqB,CAAC;AAElE,MAAM,UAAU,+BAA+B;IAC7C,OAAO,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AAC/B,CAAC;AAED,oEAAoE;AACpE,oCAAoC;AACpC,MAAM,UAAU,uBAAuB,CACrC,GAA8B,EAC9B,MAAc;IAEd,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,KAAK,GAAyB,IAAI,GAAG,EAAE,CAAC;IAC9C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6DAA6D;AAC7D,kEAAkE;AAClE,sCAAsC;AACtC,MAAM,UAAU,qBAAqB,CACnC,GAA8B,EAC9B,MAAc,EACd,OAAuD;IAEvD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACjC,MAAM,GAAG,GAAG,uBAAuB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,oEAAoE;AACpE,oEAAoE;AACpE,oBAAoB;AACpB,MAAM,UAAU,4BAA4B,CAC1C,GAA8B,EAC9B,MAAc,EACd,KAAqD;IAErD,MAAM,KAAK,GAAyB,IAAI,GAAG,EAAE,CAAC;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const LOOM_ENGINE_VERSION = "0.12.0";
1
+ export declare const LOOM_ENGINE_VERSION = "0.13.0";
2
2
  export type { Vec2, Vec3, Rect } from './util/math.js';
3
3
  export { vec2, vec3, rect, clamp, lerp, smoothstep, approxEq, rectContains, rectIntersects, visibleInView, } from './util/math.js';
4
4
  export type { ColorRGBA } from './util/color.js';
@@ -63,6 +63,19 @@ export type { DirectorEventLog } from './director/director-system.js';
63
63
  export { DirectorSystem, RESOURCE_DIRECTOR_LOG, createDirectorEventLog, } from './director/director-system.js';
64
64
  export type { DirectorEncounterSystemOptions } from './director/director-encounter-system.js';
65
65
  export { DirectorEncounterSystem } from './director/director-encounter-system.js';
66
+ export type { ZoneEventEnvelope, ZoneEvent, ZoneEventType, ZoneEventDataMap, ZoneBossSpec, ZoneBossSpawnData, ZoneBossTickData, ZoneBossEndData, ZoneBossOutcome, ZoneBossHit, ZoneNarratorData, ZoneKnotData, ZoneStateData, ZoneSnapshotData, ZoneStateChange, } from './director/zone/zone-event-envelope.js';
67
+ export { parseZoneEnvelope, parseZoneEnvelopeJson, priorityFor as zonePriorityFor, ZoneEventEnvelopeParseError, } from './director/zone/zone-event-envelope.js';
68
+ export type { IZoneEventBridge, ZoneEventBridgeStatus, ZoneEventBridgeStats, } from './director/zone/zone-event-bridge.js';
69
+ export { RESOURCE_ZONE_EVENT_BRIDGE } from './director/zone/zone-event-bridge.js';
70
+ export { MockZoneBridge } from './director/zone/mock-zone-bridge.js';
71
+ export type { SSEZoneBridgeOptions, SSEZoneBridgeEventSource, } from './director/zone/sse-zone-bridge.js';
72
+ export { SSEZoneBridge } from './director/zone/sse-zone-bridge.js';
73
+ export type { ZoneEventLog, ZoneEventLogEntry, } from './director/zone/zone-event-log.js';
74
+ export { RESOURCE_ZONE_EVENT_LOG, ZONE_RING_SIZE, createZoneEventLog, getOrCreateZoneEntry, pushZoneEvent, } from './director/zone/zone-event-log.js';
75
+ export type { DirectorZoneStateResource } from './director/zone/zone-state-resource.js';
76
+ export { RESOURCE_DIRECTOR_ZONE_STATE, createDirectorZoneStateResource, getOrCreateZoneStateMap, applyZoneStateChanges, replaceZoneStateFromSnapshot, } from './director/zone/zone-state-resource.js';
77
+ export type { ZoneEventSystemOptions } from './director/zone/zone-event-system.js';
78
+ export { ZoneEventSystem } from './director/zone/zone-event-system.js';
66
79
  export { HealthPool, POOL_HEALTH, HEALTH_FLAG_ACTIVE, HEALTH_FLAG_DEAD, HEALTH_FLAG_INVULNERABLE, } from './components/health.js';
67
80
  export { PursuePool, POOL_PURSUE, PURSUE_FLAG_ACTIVE, } from './components/pursue.js';
68
81
  export type { KillEvent } from './systems/damage-system.js';
@@ -87,4 +100,15 @@ export type { InteractableKind, InteractableConfig, } from './components/interac
87
100
  export { InteractablePool, POOL_INTERACTABLE, INTERACTABLE_FLAG_ACTIVE, } from './components/interactable.js';
88
101
  export type { LastInteractionResource, InteractionSystemOptions, } from './systems/interaction-system.js';
89
102
  export { InteractionSystem, createLastInteraction, RESOURCE_LAST_INTERACTION, } from './systems/interaction-system.js';
103
+ export type { IMultiplayerBridge, MultiplayerBridgeStatus, MultiplayerBridgeStats, PresenceMessage, PresenceUpdate, PresenceDepart, PresenceSnapshot, } from './network/multiplayer-bridge.js';
104
+ export { RESOURCE_MULTIPLAYER_BRIDGE, RESOURCE_PEER_POOL, BROADCAST_HZ, BROADCAST_MIN_INTERVAL_MS, } from './network/multiplayer-bridge.js';
105
+ export type { PeerEntry, RenderedPeerView } from './network/peer-pool.js';
106
+ export { PeerPool } from './network/peer-pool.js';
107
+ export type { MockMultiplayerBridgeOptions } from './network/mock-multiplayer-bridge.js';
108
+ export { MockMultiplayerBridge } from './network/mock-multiplayer-bridge.js';
109
+ export type { SSEMultiplayerBridgeOptions } from './network/sse-multiplayer-bridge.js';
110
+ export { SSEMultiplayerBridge } from './network/sse-multiplayer-bridge.js';
111
+ export type { PeerSpriteEntry, PeerSpritePoolOptions } from './components/peer-sprite.js';
112
+ export { PeerSpritePool, POOL_PEER_SPRITE } from './components/peer-sprite.js';
113
+ export { PeerPresenceSystem, PeerRenderSystem, } from './systems/peer-presence-system.js';
90
114
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@
8
8
  // the previous suffix `-perf-9-1` lingered after package.json was
9
9
  // bumped to 0.10.0, surfacing as a drift bug in
10
10
  // engine.LOOM_ENGINE_VERSION-based diagnostics.
11
- export const LOOM_ENGINE_VERSION = '0.12.0';
11
+ export const LOOM_ENGINE_VERSION = '0.13.0';
12
12
  export { vec2, vec3, rect, clamp, lerp, smoothstep, approxEq, rectContains, rectIntersects, visibleInView, } from './util/math.js';
13
13
  export { rgba, hexToRgba, rgbaToHexString, rgbaToCssString, colorLerp, COLOR_WHITE, COLOR_BLACK, COLOR_TRANSPARENT, COLOR_KNOT_STR, COLOR_KNOT_DEX, COLOR_KNOT_INT, COLOR_KNOT_CENTER, } from './util/color.js';
14
14
  export { EntityAllocator, NULL_ENTITY, entityIndex, entityGeneration, makeEntity, } from './entity.js';
@@ -57,6 +57,13 @@ export { SnapshotRecoveryHelper, SnapshotFetchError, } from './director/snapshot
57
57
  export { KnotContextResource } from './director/knot-context-resource.js';
58
58
  export { DirectorSystem, RESOURCE_DIRECTOR_LOG, createDirectorEventLog, } from './director/director-system.js';
59
59
  export { DirectorEncounterSystem } from './director/director-encounter-system.js';
60
+ export { parseZoneEnvelope, parseZoneEnvelopeJson, priorityFor as zonePriorityFor, ZoneEventEnvelopeParseError, } from './director/zone/zone-event-envelope.js';
61
+ export { RESOURCE_ZONE_EVENT_BRIDGE } from './director/zone/zone-event-bridge.js';
62
+ export { MockZoneBridge } from './director/zone/mock-zone-bridge.js';
63
+ export { SSEZoneBridge } from './director/zone/sse-zone-bridge.js';
64
+ export { RESOURCE_ZONE_EVENT_LOG, ZONE_RING_SIZE, createZoneEventLog, getOrCreateZoneEntry, pushZoneEvent, } from './director/zone/zone-event-log.js';
65
+ export { RESOURCE_DIRECTOR_ZONE_STATE, createDirectorZoneStateResource, getOrCreateZoneStateMap, applyZoneStateChanges, replaceZoneStateFromSnapshot, } from './director/zone/zone-state-resource.js';
66
+ export { ZoneEventSystem } from './director/zone/zone-event-system.js';
60
67
  // Combat (Phase 7): health, damage, simple AI, attack. Engine-side
61
68
  // primitives that the actual Survivor port will use. The full
62
69
  // Survivor wave engine sits on top of these in subsequent sessions.
@@ -75,4 +82,10 @@ export { createZoneState, beginTransition, tickTransition, isTransitioning, RESO
75
82
  export { ZONE_CATALOG } from './zone/zone-catalog.js';
76
83
  export { InteractablePool, POOL_INTERACTABLE, INTERACTABLE_FLAG_ACTIVE, } from './components/interactable.js';
77
84
  export { InteractionSystem, createLastInteraction, RESOURCE_LAST_INTERACTION, } from './systems/interaction-system.js';
85
+ export { RESOURCE_MULTIPLAYER_BRIDGE, RESOURCE_PEER_POOL, BROADCAST_HZ, BROADCAST_MIN_INTERVAL_MS, } from './network/multiplayer-bridge.js';
86
+ export { PeerPool } from './network/peer-pool.js';
87
+ export { MockMultiplayerBridge } from './network/mock-multiplayer-bridge.js';
88
+ export { SSEMultiplayerBridge } from './network/sse-multiplayer-bridge.js';
89
+ export { PeerSpritePool, POOL_PEER_SPRITE } from './components/peer-sprite.js';
90
+ export { PeerPresenceSystem, PeerRenderSystem, } from './systems/peer-presence-system.js';
78
91
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type IMultiplayerBridge, type MultiplayerBridgeStatus, type MultiplayerBridgeStats, type PresenceMessage } from './multiplayer-bridge.js';
2
+ export interface MockMultiplayerBridgeOptions {
3
+ nowMs?: () => number;
4
+ }
5
+ interface SentBroadcast {
6
+ x: number;
7
+ y: number;
8
+ zone: string;
9
+ tsMs: number;
10
+ sentAtMs: number;
11
+ }
12
+ export declare class MockMultiplayerBridge implements IMultiplayerBridge {
13
+ private queue;
14
+ private statusValue;
15
+ private statsValue;
16
+ private readonly nowMs;
17
+ private lastBroadcastMs;
18
+ private sentBroadcasts;
19
+ constructor(opts?: MockMultiplayerBridgeOptions);
20
+ connect(): void;
21
+ disconnect(): void;
22
+ status(): MultiplayerBridgeStatus;
23
+ pollMessages(): PresenceMessage[];
24
+ broadcastPosition(x: number, y: number, zone: string, tsMs: number): void;
25
+ stats(): Readonly<MultiplayerBridgeStats>;
26
+ enqueueIncoming(msg: PresenceMessage): void;
27
+ enqueueIncomingAll(msgs: ReadonlyArray<PresenceMessage>): void;
28
+ getSentBroadcasts(): ReadonlyArray<Readonly<SentBroadcast>>;
29
+ pendingIncoming(): number;
30
+ resetRateLimit(): void;
31
+ getLastBroadcastMs(): number;
32
+ }
33
+ export {};
34
+ //# sourceMappingURL=mock-multiplayer-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-multiplayer-bridge.d.ts","sourceRoot":"","sources":["../../src/network/mock-multiplayer-bridge.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EAErB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,4BAA4B;IAI3C,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAED,UAAU,aAAa;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IAIb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,qBAAsB,YAAW,kBAAkB;IAC9D,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,UAAU,CAKhB;IACF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,cAAc,CAAuB;gBAEjC,IAAI,GAAE,4BAAiC;IAInD,OAAO,IAAI,IAAI;IAKf,UAAU,IAAI,IAAI;IAIlB,MAAM,IAAI,uBAAuB;IAIjC,YAAY,IAAI,eAAe,EAAE;IAOjC,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAWzE,KAAK,IAAI,QAAQ,CAAC,sBAAsB,CAAC;IAOzC,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAK3C,kBAAkB,CAAC,IAAI,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,IAAI;IAS9D,iBAAiB,IAAI,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAK3D,eAAe,IAAI,MAAM;IAMzB,cAAc,IAAI,IAAI;IAKtB,kBAAkB,IAAI,MAAM;CAG7B"}
@@ -0,0 +1,91 @@
1
+ // MockMultiplayerBridge - in-memory presence transport for tests +
2
+ // offline demos.
3
+ //
4
+ // Tests inject incoming presence frames via enqueueIncoming() and let
5
+ // PeerPresenceSystem drain them. broadcastPosition() captures local
6
+ // sends in a getSentBroadcasts() buffer so tests can assert on them.
7
+ // pollMessages() drains the inbound queue in FIFO order.
8
+ //
9
+ // Rate-limiting: shared with the SSE bridge via BROADCAST_MIN_INTERVAL_MS.
10
+ // A nowMs() injection point lets tests fast-forward time without
11
+ // touching the real clock.
12
+ import { BROADCAST_MIN_INTERVAL_MS, } from './multiplayer-bridge.js';
13
+ export class MockMultiplayerBridge {
14
+ queue = [];
15
+ statusValue = 'idle';
16
+ statsValue = {
17
+ messagesReceived: 0,
18
+ messagesSent: 0,
19
+ rateLimitedDrops: 0,
20
+ reconnects: 0,
21
+ };
22
+ nowMs;
23
+ lastBroadcastMs = -Infinity;
24
+ sentBroadcasts = [];
25
+ constructor(opts = {}) {
26
+ this.nowMs = opts.nowMs ?? (() => (typeof performance !== 'undefined' ? performance.now() : Date.now()));
27
+ }
28
+ connect() {
29
+ if (this.statusValue === 'connected')
30
+ return;
31
+ this.statusValue = 'connected';
32
+ }
33
+ disconnect() {
34
+ this.statusValue = 'closed';
35
+ }
36
+ status() {
37
+ return this.statusValue;
38
+ }
39
+ pollMessages() {
40
+ if (this.queue.length === 0)
41
+ return [];
42
+ const out = this.queue;
43
+ this.queue = [];
44
+ return out;
45
+ }
46
+ broadcastPosition(x, y, zone, tsMs) {
47
+ const now = this.nowMs();
48
+ if (now - this.lastBroadcastMs < BROADCAST_MIN_INTERVAL_MS) {
49
+ this.statsValue.rateLimitedDrops++;
50
+ return;
51
+ }
52
+ this.lastBroadcastMs = now;
53
+ this.sentBroadcasts.push({ x, y, zone, tsMs, sentAtMs: now });
54
+ this.statsValue.messagesSent++;
55
+ }
56
+ stats() {
57
+ return this.statsValue;
58
+ }
59
+ // ----- Mock-only injection helpers -----
60
+ // Enqueue an inbound presence message as if it came from the server.
61
+ enqueueIncoming(msg) {
62
+ this.queue.push(msg);
63
+ this.statsValue.messagesReceived++;
64
+ }
65
+ enqueueIncomingAll(msgs) {
66
+ for (let i = 0; i < msgs.length; i++) {
67
+ const m = msgs[i];
68
+ if (m)
69
+ this.enqueueIncoming(m);
70
+ }
71
+ }
72
+ // Tests inspect what broadcastPosition let through. Returns the
73
+ // backing array; the caller may copy if they need a snapshot.
74
+ getSentBroadcasts() {
75
+ return this.sentBroadcasts;
76
+ }
77
+ // Convenience: how many inbound messages are waiting for a poll.
78
+ pendingIncoming() {
79
+ return this.queue.length;
80
+ }
81
+ // Reset rate-limiter state. Useful in tests that simulate a
82
+ // reconnect or want a clean slate.
83
+ resetRateLimit() {
84
+ this.lastBroadcastMs = -Infinity;
85
+ }
86
+ // Inspect-only: when did broadcastPosition last send (in nowMs() units).
87
+ getLastBroadcastMs() {
88
+ return this.lastBroadcastMs;
89
+ }
90
+ }
91
+ //# sourceMappingURL=mock-multiplayer-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-multiplayer-bridge.js","sourceRoot":"","sources":["../../src/network/mock-multiplayer-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export type MultiplayerBridgeStatus = 'idle' | 'connecting' | 'connected' | 'reconnecting' | 'closed';
2
+ export interface MultiplayerBridgeStats {
3
+ messagesReceived: number;
4
+ messagesSent: number;
5
+ rateLimitedDrops: number;
6
+ reconnects: number;
7
+ }
8
+ export interface PresenceUpdate {
9
+ kind: 'update';
10
+ characterId: string;
11
+ x: number;
12
+ y: number;
13
+ zone: string;
14
+ tsMs: number;
15
+ name?: string;
16
+ }
17
+ export interface PresenceDepart {
18
+ kind: 'depart';
19
+ characterId: string;
20
+ }
21
+ export interface PresenceSnapshot {
22
+ kind: 'snapshot';
23
+ peers: ReadonlyArray<{
24
+ characterId: string;
25
+ x: number;
26
+ y: number;
27
+ zone: string;
28
+ tsMs: number;
29
+ name?: string;
30
+ }>;
31
+ }
32
+ export type PresenceMessage = PresenceUpdate | PresenceDepart | PresenceSnapshot;
33
+ export interface IMultiplayerBridge {
34
+ connect(): void;
35
+ disconnect(): void;
36
+ status(): MultiplayerBridgeStatus;
37
+ pollMessages(): PresenceMessage[];
38
+ broadcastPosition(x: number, y: number, zone: string, tsMs: number): void;
39
+ stats(): Readonly<MultiplayerBridgeStats>;
40
+ }
41
+ export declare const RESOURCE_MULTIPLAYER_BRIDGE = "multiplayer_bridge";
42
+ export declare const RESOURCE_PEER_POOL = "peer_pool";
43
+ export declare const BROADCAST_HZ = 10;
44
+ export declare const BROADCAST_MIN_INTERVAL_MS: number;
45
+ //# sourceMappingURL=multiplayer-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiplayer-bridge.d.ts","sourceRoot":"","sources":["../../src/network/multiplayer-bridge.ts"],"names":[],"mappings":"AAyBA,MAAM,MAAM,uBAAuB,GAC/B,MAAM,GACN,YAAY,GACZ,WAAW,GACX,cAAc,GACd,QAAQ,CAAC;AAEb,MAAM,WAAW,sBAAsB;IAErC,gBAAgB,EAAE,MAAM,CAAC;IAGzB,YAAY,EAAE,MAAM,CAAC;IAGrB,gBAAgB,EAAE,MAAM,CAAC;IAEzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAKD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAGD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACJ;AAED,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,cAAc,GAAG,gBAAgB,CAAC;AAEjF,MAAM,WAAW,kBAAkB;IAGjC,OAAO,IAAI,IAAI,CAAC;IAEhB,UAAU,IAAI,IAAI,CAAC;IACnB,MAAM,IAAI,uBAAuB,CAAC;IAGlC,YAAY,IAAI,eAAe,EAAE,CAAC;IAKlC,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1E,KAAK,IAAI,QAAQ,CAAC,sBAAsB,CAAC,CAAC;CAC3C;AAGD,eAAO,MAAM,2BAA2B,uBAAuB,CAAC;AAChE,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAM9C,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,yBAAyB,QAAsB,CAAC"}
@@ -0,0 +1,34 @@
1
+ // MultiplayerBridge - abstraction over the presence transport.
2
+ //
3
+ // Concrete implementations:
4
+ // MockMultiplayerBridge - in-process transport for tests + offline
5
+ // dev. enqueueIncoming() simulates server
6
+ // pushes; broadcastPosition() captures local
7
+ // sends so tests can assert on them.
8
+ // SSEMultiplayerBridge - SSE-based implementation parallel to
9
+ // SSEDirectorBridge. Browser-only; throws in
10
+ // Node test runs.
11
+ //
12
+ // The PeerPresenceSystem (PHASE_INPUT) calls pollMessages() once per
13
+ // tick to drain queued presence updates, applies them to the PeerPool,
14
+ // and advances per-peer interpolation. Bridges buffer messages between
15
+ // polls so the system's per-tick read is bounded.
16
+ //
17
+ // Wire protocol (shared with the server-side Track B implementation):
18
+ // - Server emits SSE 'presence.update' { character_id, x, y, zone, ts_ms, name? }
19
+ // - Server emits SSE 'presence.depart' { character_id }
20
+ // - Server emits SSE 'presence.snapshot' { peers: [{ character_id, x, y, zone, ts_ms, name? }, ...] }
21
+ // - Client POSTs /presence/move { character_id, x, y, zone, ts_ms }
22
+ //
23
+ // The bridge layer hides transport details. PeerPresenceSystem and
24
+ // PeerPool deal only with strongly-typed PresenceMessage values.
25
+ // Resource keys.
26
+ export const RESOURCE_MULTIPLAYER_BRIDGE = 'multiplayer_bridge';
27
+ export const RESOURCE_PEER_POOL = 'peer_pool';
28
+ // Engine-side rate limit on broadcastPosition. The wire protocol
29
+ // targets 10 Hz; bridges enforce this regardless of how often the
30
+ // caller invokes broadcastPosition. Documented in the Multiplayer
31
+ // section of README.md.
32
+ export const BROADCAST_HZ = 10;
33
+ export const BROADCAST_MIN_INTERVAL_MS = 1000 / BROADCAST_HZ;
34
+ //# sourceMappingURL=multiplayer-bridge.js.map