@relu-interactives/spatial-ecs 0.9.0 → 0.11.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 (39) hide show
  1. package/dist/{System-8D-XBDKZ.d.cts → System-BldSHxZV.d.cts} +214 -81
  2. package/dist/{System-DPMAW30g.d.ts → System-CADhPyQs.d.ts} +214 -81
  3. package/dist/{XRHandPose-CWSrsnYN.d.ts → XRHandPose-BNSwd1y9.d.ts} +1 -1
  4. package/dist/{XRHandPose-Dn2yiALk.d.cts → XRHandPose-D3Ab1Dfs.d.cts} +1 -1
  5. package/dist/{chunk-VYIWOXAY.js → chunk-TY3XCHOR.js} +18 -10
  6. package/dist/chunk-TY3XCHOR.js.map +1 -0
  7. package/dist/components/index.d.cts +3 -3
  8. package/dist/components/index.d.ts +3 -3
  9. package/dist/docs/guide/bone-attachments-and-ik.md +1 -1
  10. package/dist/docs/guide/multiplayer.md +65 -0
  11. package/dist/factories/index.d.cts +2 -2
  12. package/dist/factories/index.d.ts +2 -2
  13. package/dist/{index-D5MmJNyj.d.ts → index-6pZO_gV7.d.ts} +1 -1
  14. package/dist/{index-CAZHrh0q.d.cts → index-BXjwEdNq.d.cts} +2 -2
  15. package/dist/{index-DiIjV2lm.d.cts → index-BdghvXKE.d.cts} +1 -1
  16. package/dist/{index-CLtSMf2M.d.ts → index-CVG-hREM.d.ts} +2 -2
  17. package/dist/index.cjs +16 -8
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.cts +8 -30
  20. package/dist/index.d.ts +8 -30
  21. package/dist/index.js +2 -2
  22. package/dist/network/index.cjs +681 -4
  23. package/dist/network/index.cjs.map +1 -1
  24. package/dist/network/index.d.cts +126 -5
  25. package/dist/network/index.d.ts +126 -5
  26. package/dist/network/index.js +680 -5
  27. package/dist/network/index.js.map +1 -1
  28. package/dist/systems/index.cjs +16 -8
  29. package/dist/systems/index.cjs.map +1 -1
  30. package/dist/systems/index.d.cts +2 -2
  31. package/dist/systems/index.d.ts +2 -2
  32. package/dist/systems/index.js +1 -1
  33. package/dist/types.d.cts +1 -1
  34. package/dist/types.d.ts +1 -1
  35. package/dist/webgpu/index.d.ts +2 -2
  36. package/dist/worldSnapshotUtils.d.cts +1 -1
  37. package/dist/worldSnapshotUtils.d.ts +1 -1
  38. package/package.json +1 -1
  39. package/dist/chunk-VYIWOXAY.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../core/network/colyseus.ts","../../core/network/latency.ts","../../core/network/snapshotBuffer.ts","../../core/network/NetworkSystem.ts"],"names":["view"],"mappings":"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","file":"index.js","sourcesContent":["import { Callbacks, Client, type Room } from \"@colyseus/sdk\";\n\nimport type { NetEntityView, NetPose, NetworkTransport } from \"./types\";\n\ntype RemoteEntity = NetPose & {\n id: string;\n owner: string;\n prefab: string;\n props: Map<string, string>;\n};\ntype RemoteState = {\n host: string;\n entities: Map<string, RemoteEntity>;\n players: Map<string, unknown>;\n};\n\nconst view = (e: RemoteEntity): NetEntityView => ({\n id: e.id,\n owner: e.owner,\n prefab: e.prefab,\n x: e.x,\n y: e.y,\n z: e.z,\n qx: e.qx,\n qy: e.qy,\n qz: e.qz,\n qw: e.qw,\n props: Object.fromEntries(e.props.entries()),\n});\n\n/** A shared world in a Colyseus room running `ReluRoom`. */\nexport class ColyseusTransport implements NetworkTransport {\n private constructor(private readonly room: Room<unknown, RemoteState>) {}\n\n static async connect(options: {\n endpoint: string;\n room: string;\n join?: Record<string, unknown>;\n }): Promise<ColyseusTransport> {\n const client = new Client(options.endpoint);\n const room = await client.joinOrCreate<RemoteState>(options.room, options.join ?? {});\n return new ColyseusTransport(room as Room<unknown, RemoteState>);\n }\n\n get sessionId() {\n return this.room.sessionId;\n }\n\n get host() {\n return this.room.state.host;\n }\n\n get players() {\n return [...this.room.state.players.keys()];\n }\n\n private get $() {\n return Callbacks.get(this.room as never) as unknown as {\n onAdd: (...args: unknown[]) => () => void;\n onRemove: (...args: unknown[]) => () => void;\n onChange: (...args: unknown[]) => () => void;\n };\n }\n\n onEntityAdd(cb: (entity: NetEntityView) => void) {\n this.$.onAdd(\"entities\", (entity: RemoteEntity) => cb(view(entity)));\n }\n\n onEntityChange(cb: (entity: NetEntityView) => void) {\n const $ = this.$;\n $.onAdd(\"entities\", (entity: RemoteEntity) => {\n $.onChange(entity, () => cb(view(entity)));\n $.onChange(entity, \"props\", () => cb(view(entity)));\n });\n }\n\n onEntityRemove(cb: (id: string) => void) {\n this.$.onRemove(\"entities\", (_entity: RemoteEntity, id: string) => cb(id));\n }\n\n onPlayerJoin(cb: (id: string) => void) {\n this.$.onAdd(\"players\", (_player: unknown, id: string) => cb(id));\n }\n\n onPlayerLeave(cb: (id: string) => void) {\n this.$.onRemove(\"players\", (_player: unknown, id: string) => cb(id));\n }\n\n onMessage(cb: (name: string, payload: unknown, from: string) => void) {\n this.room.onMessage(\"m\", (m: { name: string; payload: unknown; from: string }) =>\n cb(m.name, m.payload, m.from),\n );\n }\n\n onCorrect(cb: (id: string, pose: NetPose) => void) {\n this.room.onMessage(\"correct\", (m: NetPose & { id: string }) => cb(m.id, m));\n }\n\n onClose(cb: () => void) {\n this.room.onLeave(() => cb());\n }\n\n registerScene(entities: Parameters<NetworkTransport[\"registerScene\"]>[0]) {\n this.room.send(\"scene\", entities);\n }\n\n spawn(request: Parameters<NetworkTransport[\"spawn\"]>[0]) {\n this.room.send(\"spawn\", request);\n }\n\n despawn(id: string) {\n this.room.send(\"despawn\", { id });\n }\n\n sendPose(id: string, pose: NetPose) {\n this.room.send(\"pose\", { id, ...pose });\n }\n\n setProp(id: string, key: string, json: string) {\n this.room.send(\"prop\", { id, key, json });\n }\n\n send(name: string, payload: unknown) {\n this.room.send(\"m\", { name, payload });\n }\n\n leave() {\n void this.room.leave();\n }\n}\n","import type { NetworkTransport } from \"./types\";\n\n/**\n * A transport with a bad connection: everything takes `ms` longer round trip.\n * For testing a game at a real player's latency on a local server.\n */\nexport function withLatency(transport: NetworkTransport, ms: number): NetworkTransport {\n if (ms <= 0) return transport;\n const oneWay = ms / 2;\n return new Proxy(transport, {\n get(target, key) {\n const value = Reflect.get(target, key);\n if (typeof value !== \"function\") return value;\n const name = String(key);\n const fn = value as (...args: unknown[]) => unknown;\n if (name === \"leave\") return fn.bind(target);\n if (name.startsWith(\"on\")) {\n return (cb: (...args: unknown[]) => void) =>\n fn.call(target, (...args: unknown[]) => {\n setTimeout(() => cb(...args), oneWay);\n });\n }\n return (...args: unknown[]) => {\n setTimeout(() => fn.apply(target, args), oneWay);\n };\n },\n });\n}\n","import type { NetPose } from \"./types\";\n\ntype Snapshot = { at: number; pose: NetPose };\n\nconst MAX_SNAPSHOTS = 32;\n\nfunction lerpPose(a: NetPose, b: NetPose, t: number): NetPose {\n // the short way round: q and -q are the same rotation\n const dot = a.qx * b.qx + a.qy * b.qy + a.qz * b.qz + a.qw * b.qw;\n const s = dot < 0 ? -1 : 1;\n const qx = a.qx + (s * b.qx - a.qx) * t;\n const qy = a.qy + (s * b.qy - a.qy) * t;\n const qz = a.qz + (s * b.qz - a.qz) * t;\n const qw = a.qw + (s * b.qw - a.qw) * t;\n const len = Math.hypot(qx, qy, qz, qw) || 1;\n return {\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n z: a.z + (b.z - a.z) * t,\n qx: qx / len,\n qy: qy / len,\n qz: qz / len,\n qw: qw / len,\n };\n}\n\n/**\n * Plays a remote entity back slightly in the past, between the two updates\n * around that moment. Packets arrive unevenly; a small delay turns that into\n * smooth motion.\n */\nexport class SnapshotBuffer {\n private snapshots: Snapshot[] = [];\n\n constructor(private readonly teleportDistance = Number.POSITIVE_INFINITY) {}\n\n push(at: number, pose: NetPose): void {\n this.snapshots.push({ at, pose });\n if (this.snapshots.length > MAX_SNAPSHOTS) this.snapshots.shift();\n }\n\n /** The pose at time `at`: holds the first and last, and never extrapolates. */\n sample(at: number): NetPose | null {\n const list = this.snapshots;\n if (list.length === 0) return null;\n if (at <= list[0].at) return list[0].pose;\n for (let i = list.length - 1; i > 0; i--) {\n const a = list[i - 1];\n const b = list[i];\n if (at < a.at) continue;\n // older ones will never be needed again\n if (i > 1) this.snapshots = list.slice(i - 1);\n if (at >= b.at) return b.pose;\n const jump = Math.hypot(b.pose.x - a.pose.x, b.pose.y - a.pose.y, b.pose.z - a.pose.z);\n if (jump > this.teleportDistance) return b.pose;\n return lerpPose(a.pose, b.pose, (at - a.at) / (b.at - a.at));\n }\n return list[list.length - 1].pose;\n }\n}\n","import * as THREE from \"three\";\n\nimport { Behaviour } from \"../Behaviour\";\nimport {\n type NetValue,\n NetworkedPropsComponent,\n NetworkIdentityComponent,\n NetworkSpawnerComponent,\n NetworkTransformComponent,\n} from \"../components/Network\";\nimport { ScriptComponent } from \"../components/ScriptComponent\";\nimport { TransformComponent } from \"../components/Transform\";\nimport { despawnPrefab, spawnPrefab } from \"../prefab/spawnPrefab\";\nimport type { EcsSystem } from \"../System\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\nimport { reportBehaviourHookError } from \"../systems/scriptShared\";\nimport { SnapshotBuffer } from \"./snapshotBuffer\";\nimport type {\n NetEntityView,\n NetPose,\n NetSpawnOptions,\n NetworkHandle,\n NetworkService,\n NetworkTransport,\n} from \"./types\";\n\ntype Tracked = {\n id: string;\n /** `null` while its prefab is loading. */\n entityId: EntityId | null;\n owner: string;\n buffer: SnapshotBuffer;\n /** When the owner last sent, in ms. */\n sentAt: number;\n sent: NetPose | null;\n props: Record<string, string>;\n};\n\nconst POSITION_EPSILON = 0.001;\nconst ROTATION_EPSILON = 0.0005;\n\nconst euler = new THREE.Euler();\nconst quat = new THREE.Quaternion();\n\nfunction poseOf(transform: TransformComponent): NetPose {\n const { position: p, rotation: r } = transform;\n quat.setFromEuler(euler.set(r.x, r.y, r.z));\n return { x: p.x, y: p.y, z: p.z, qx: quat.x, qy: quat.y, qz: quat.z, qw: quat.w };\n}\n\nfunction applyPose(transform: TransformComponent, pose: NetPose, rotation: boolean) {\n transform.position.x = pose.x;\n transform.position.y = pose.y;\n transform.position.z = pose.z;\n if (!rotation) return;\n euler.setFromQuaternion(quat.set(pose.qx, pose.qy, pose.qz, pose.qw));\n transform.rotation.x = euler.x;\n transform.rotation.y = euler.y;\n transform.rotation.z = euler.z;\n}\n\nconst moved = (a: NetPose, b: NetPose) =>\n Math.abs(a.x - b.x) > POSITION_EPSILON ||\n Math.abs(a.y - b.y) > POSITION_EPSILON ||\n Math.abs(a.z - b.z) > POSITION_EPSILON ||\n Math.abs(a.qx - b.qx) > ROTATION_EPSILON ||\n Math.abs(a.qy - b.qy) > ROTATION_EPSILON ||\n Math.abs(a.qz - b.qz) > ROTATION_EPSILON ||\n Math.abs(a.qw - b.qw) > ROTATION_EPSILON;\n\nfunction encodeProps(props?: Record<string, NetValue>) {\n return Object.fromEntries(\n Object.entries(props ?? {}).map(([k, v]) => [k, JSON.stringify(v)]),\n );\n}\n\n/**\n * Keeps a world in step with a shared room: spawns what others spawned, sends\n * what this client owns, and plays back what it doesn't. Add it to\n * `world.setup({ systems })` after the script systems, then call `connect`\n * once the scene is hydrated.\n *\n * @category Systems\n */\nexport class NetworkSystem implements EcsSystem, NetworkService {\n private world: World | null = null;\n private transport: NetworkTransport | null = null;\n private readonly tracked = new Map<string, Tracked>();\n private readonly byEntity = new Map<EntityId, Tracked>();\n private readonly listeners = new Map<string, Set<(p: unknown, from: string) => void>>();\n private readonly handles = new Map<EntityId, NetworkHandle>();\n private spawnedAvatar = false;\n\n constructor(private readonly now: () => number = () => performance.now()) {}\n\n /** Join the shared world. Call after hydrating, so scene objects exist. */\n connect(world: World, transport: NetworkTransport): void {\n this.world = world;\n this.transport = transport;\n world.setNetwork(this);\n transport.onEntityAdd((e) => this.entityAdded(e));\n transport.onEntityChange((e) => this.entityChanged(e));\n transport.onEntityRemove((id) => this.entityRemoved(id));\n transport.onPlayerJoin((id) => this.dispatch(\"onPlayerJoin\", id));\n transport.onPlayerLeave((id) => this.dispatch(\"onPlayerLeave\", id));\n transport.onMessage((name, payload, from) => {\n for (const fn of this.listeners.get(name) ?? []) fn(payload, from);\n });\n transport.onCorrect((id, pose) => this.corrected(id, pose));\n transport.onClose(() => this.disconnected());\n this.registerScene();\n this.spawnAvatar();\n }\n\n /** Scene objects: every client hydrates the same scene, so their ids already match. */\n private registerScene() {\n const world = this.world;\n const transport = this.transport;\n if (!world || !transport) return;\n const entities = [];\n for (const entityId of world.query(NetworkIdentityComponent)) {\n const identity = world.getComponent(entityId, NetworkIdentityComponent);\n if (!identity || identity.networkId) continue;\n identity.networkId = `scene-${entityId}`;\n const transform = world.getComponent(entityId, TransformComponent);\n const props = world.getComponent(entityId, NetworkedPropsComponent);\n const tracked = this.track(identity.networkId, entityId, \"\", null);\n tracked.props = encodeProps(props?.values);\n entities.push({\n id: identity.networkId,\n props: tracked.props,\n ...(transform ? poseOf(transform) : { x: 0, y: 0, z: 0, qx: 0, qy: 0, qz: 0, qw: 1 }),\n });\n }\n if (entities.length) transport.registerScene(entities);\n }\n\n private spawnAvatar() {\n const world = this.world;\n if (!world || this.spawnedAvatar) return;\n const [entityId] = world.query(NetworkSpawnerComponent);\n if (entityId === undefined) return;\n const spawner = world.getComponent(entityId, NetworkSpawnerComponent);\n if (!spawner?.playerPrefab) return;\n this.spawnedAvatar = true;\n const at = world.getComponent(entityId, TransformComponent)?.position;\n const angle = Math.random() * Math.PI * 2;\n this.spawn(spawner.playerPrefab, {\n position: {\n x: (at?.x ?? 0) + Math.cos(angle) * spawner.spawnRadius,\n y: at?.y ?? 0,\n z: (at?.z ?? 0) + Math.sin(angle) * spawner.spawnRadius,\n },\n });\n }\n\n private track(id: string, entityId: EntityId | null, owner: string, view: NetPose | null) {\n const entry: Tracked = {\n id,\n entityId,\n owner,\n buffer: new SnapshotBuffer(),\n sentAt: 0,\n sent: null,\n props: {},\n };\n if (view) entry.buffer.push(this.now(), view);\n this.tracked.set(id, entry);\n if (entityId !== null) this.byEntity.set(entityId, entry);\n return entry;\n }\n\n /** The buffer needs the entity's own teleport setting, known once the entity exists. */\n private bindEntity(entry: Tracked, entityId: EntityId) {\n const world = this.world;\n if (!world) return;\n entry.entityId = entityId;\n this.byEntity.set(entityId, entry);\n let identity = world.getComponent(entityId, NetworkIdentityComponent);\n if (!identity) {\n identity = new NetworkIdentityComponent();\n world.addComponent(entityId, identity);\n }\n identity.networkId = entry.id;\n identity.owner = entry.owner;\n const settings = world.getComponent(entityId, NetworkTransformComponent);\n entry.buffer = new SnapshotBuffer(settings?.teleportDistance);\n }\n\n private entityAdded(view: NetEntityView) {\n const existing = this.tracked.get(view.id);\n if (existing) {\n this.entityChanged(view);\n return;\n }\n const entry = this.track(view.id, null, view.owner, view);\n if (!view.prefab || !this.world) return;\n euler.setFromQuaternion(quat.set(view.qx, view.qy, view.qz, view.qw));\n void spawnPrefab(this.world, view.prefab, {\n position: { x: view.x, y: view.y, z: view.z },\n rotation: { x: euler.x, y: euler.y, z: euler.z },\n }).then((entityId) => {\n if (this.tracked.get(view.id) !== entry) {\n // removed while it loaded\n if (this.world) despawnPrefab(this.world, entityId);\n return;\n }\n this.bindEntity(entry, entityId);\n entry.buffer.push(this.now(), view);\n this.applyProps(entry, view.props);\n });\n }\n\n private entityChanged(view: NetEntityView) {\n const entry = this.tracked.get(view.id);\n if (!entry) return;\n entry.owner = view.owner;\n if (entry.entityId !== null && this.world) {\n const identity = this.world.getComponent(entry.entityId, NetworkIdentityComponent);\n if (identity) identity.owner = view.owner;\n }\n if (view.owner !== this.transport?.sessionId) entry.buffer.push(this.now(), view);\n this.applyProps(entry, view.props);\n }\n\n private entityRemoved(id: string) {\n const entry = this.tracked.get(id);\n if (!entry) return;\n this.tracked.delete(id);\n if (entry.entityId === null) return;\n this.byEntity.delete(entry.entityId);\n if (this.world) despawnPrefab(this.world, entry.entityId);\n }\n\n private applyProps(entry: Tracked, props: Record<string, string>) {\n if (entry.entityId === null || !this.world) return;\n for (const [key, json] of Object.entries(props)) {\n if (entry.props[key] === json) continue;\n entry.props[key] = json;\n const value = JSON.parse(json) as NetValue;\n let component = this.world.getComponent(entry.entityId, NetworkedPropsComponent);\n if (!component) {\n component = new NetworkedPropsComponent();\n this.world.addComponent(entry.entityId, component);\n }\n component.values[key] = value;\n this.dispatch(\"onNetworkProp\", key, value, entry.entityId);\n }\n }\n\n private corrected(id: string, pose: NetPose) {\n const entry = this.tracked.get(id);\n if (entry?.entityId == null || !this.world) return;\n const transform = this.world.getComponent(entry.entityId, TransformComponent);\n if (transform) applyPose(transform, pose, true);\n entry.sent = pose;\n }\n\n private disconnected() {\n this.transport = null;\n this.world?.setNetwork(null);\n }\n\n /** Call a Behaviour hook: on one entity's scripts, or every script. */\n private dispatch(hook: \"onPlayerJoin\" | \"onPlayerLeave\", id: string): void;\n private dispatch(hook: \"onNetworkProp\", key: string, value: NetValue, on: EntityId): void;\n private dispatch(hook: string, a: unknown, b?: unknown, on?: EntityId): void {\n const world = this.world;\n if (!world) return;\n const ids = on !== undefined ? [on] : world.query(ScriptComponent);\n for (const entityId of ids) {\n const instances = world.getComponent(entityId, ScriptComponent)?.scriptInstances;\n for (const instance of instances?.values() ?? []) {\n if (!(instance instanceof Behaviour)) continue;\n try {\n (instance as unknown as Record<string, (x: unknown, y: unknown) => void>)[hook]?.(a, b);\n } catch (error) {\n // one misbehaving script must never stop the rest hearing it\n reportBehaviourHookError(world, entityId, instance, hook, error);\n }\n }\n }\n }\n\n update(world: World): void {\n const transport = this.transport;\n if (!transport) return;\n const now = this.now();\n for (const entry of this.tracked.values()) {\n if (entry.entityId === null) continue;\n const settings = world.getComponent(entry.entityId, NetworkTransformComponent);\n if (!settings?.enabled) continue;\n const transform = world.getComponent(entry.entityId, TransformComponent);\n if (!transform) continue;\n if (entry.owner === transport.sessionId) {\n if (now - entry.sentAt < 1000 / settings.sendRate) continue;\n const pose = poseOf(transform);\n if (entry.sent && !moved(entry.sent, pose)) continue;\n entry.sentAt = now;\n entry.sent = pose;\n transport.sendPose(entry.id, pose);\n } else {\n const pose = entry.buffer.sample(now - settings.interpolationMs);\n if (pose) applyPose(transform, pose, settings.syncRotation);\n }\n }\n }\n\n dispose(): void {\n this.transport?.leave();\n this.transport = null;\n this.world?.setNetwork(null);\n this.tracked.clear();\n this.byEntity.clear();\n this.handles.clear();\n this.listeners.clear();\n }\n\n private spawn(prefab: string | { path: string }, options: NetSpawnOptions = {}) {\n const p = options.position;\n const r = options.rotation;\n quat.setFromEuler(euler.set(r?.x ?? 0, r?.y ?? 0, r?.z ?? 0));\n this.transport?.spawn({\n prefab: typeof prefab === \"string\" ? prefab : prefab.path,\n props: encodeProps(options.props),\n x: p?.x ?? 0,\n y: p?.y ?? 0,\n z: p?.z ?? 0,\n qx: quat.x,\n qy: quat.y,\n qz: quat.z,\n qw: quat.w,\n });\n }\n\n handleFor(entityId: EntityId): NetworkHandle {\n const known = this.handles.get(entityId);\n if (known) return known;\n const self = this;\n const entry = () => self.byEntity.get(entityId);\n const handle: NetworkHandle = {\n get connected() {\n return self.transport !== null;\n },\n get sessionId() {\n return self.transport?.sessionId ?? \"\";\n },\n get isHost() {\n const t = self.transport;\n return Boolean(t) && t?.host === t?.sessionId;\n },\n get isOwner() {\n return entry()?.owner === self.transport?.sessionId;\n },\n get players() {\n return self.transport?.players ?? [];\n },\n send: (name, payload) => self.transport?.send(name, payload ?? null),\n onMessage: (name, fn) => {\n const set = self.listeners.get(name) ?? new Set();\n self.listeners.set(name, set);\n set.add(fn);\n return () => set.delete(fn);\n },\n spawn: (prefab, options) => self.spawn(prefab, options),\n despawn: (id = entityId) => {\n const target = self.byEntity.get(id);\n if (target) self.transport?.despawn(target.id);\n },\n setProp: (key, value) => {\n const target = entry();\n if (!target || target.entityId === null || !self.world) return;\n const json = JSON.stringify(value);\n target.props[key] = json;\n let component = self.world.getComponent(target.entityId, NetworkedPropsComponent);\n if (!component) {\n component = new NetworkedPropsComponent();\n self.world.addComponent(target.entityId, component);\n }\n component.values[key] = value;\n self.transport?.setProp(target.id, key, json);\n },\n getProp: (key) =>\n self.world?.getComponent(entityId, NetworkedPropsComponent)?.values[key],\n };\n this.handles.set(entityId, handle);\n return handle;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../core/network/colyseus.ts","../../core/network/latency.ts","../../core/network/snapshotBuffer.ts","../../core/network/sdp.ts","../../core/network/voice.ts","../../core/network/voiceBrowser.ts","../../core/network/NetworkSystem.ts"],"names":["moved","view"],"mappings":"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","file":"index.js","sourcesContent":["import { Callbacks, Client, type Room } from \"@colyseus/sdk\";\n\nimport type {\n NetEntityView,\n NetPose,\n NetSound,\n NetworkTransport,\n VoiceFromRoom,\n VoiceToRoom,\n} from \"./types\";\n\ntype RemoteEntity = NetPose & {\n id: string;\n owner: string;\n prefab: string;\n props: Map<string, string>;\n};\ntype RemoteState = {\n host: string;\n entities: Map<string, RemoteEntity>;\n players: Map<string, unknown>;\n};\n\nconst view = (e: RemoteEntity): NetEntityView => ({\n id: e.id,\n owner: e.owner,\n prefab: e.prefab,\n x: e.x,\n y: e.y,\n z: e.z,\n qx: e.qx,\n qy: e.qy,\n qz: e.qz,\n qw: e.qw,\n props: Object.fromEntries(e.props.entries()),\n});\n\n/** A shared world in a Colyseus room running `ReluRoom`. */\nexport class ColyseusTransport implements NetworkTransport {\n private constructor(private readonly room: Room<unknown, RemoteState>) {}\n\n static async connect(options: {\n endpoint: string;\n room: string;\n join?: Record<string, unknown>;\n }): Promise<ColyseusTransport> {\n const client = new Client(options.endpoint);\n const room = await client.joinOrCreate<RemoteState>(options.room, options.join ?? {});\n return new ColyseusTransport(room as Room<unknown, RemoteState>);\n }\n\n get sessionId() {\n return this.room.sessionId;\n }\n\n get host() {\n return this.room.state.host;\n }\n\n get players() {\n return [...this.room.state.players.keys()];\n }\n\n private get $() {\n return Callbacks.get(this.room as never) as unknown as {\n onAdd: (...args: unknown[]) => () => void;\n onRemove: (...args: unknown[]) => () => void;\n onChange: (...args: unknown[]) => () => void;\n };\n }\n\n onEntityAdd(cb: (entity: NetEntityView) => void) {\n this.$.onAdd(\"entities\", (entity: RemoteEntity) => cb(view(entity)));\n }\n\n onEntityChange(cb: (entity: NetEntityView) => void) {\n const $ = this.$;\n $.onAdd(\"entities\", (entity: RemoteEntity) => {\n $.onChange(entity, () => cb(view(entity)));\n $.onChange(entity, \"props\", () => cb(view(entity)));\n });\n }\n\n onEntityRemove(cb: (id: string) => void) {\n this.$.onRemove(\"entities\", (_entity: RemoteEntity, id: string) => cb(id));\n }\n\n onPlayerJoin(cb: (id: string) => void) {\n this.$.onAdd(\"players\", (_player: unknown, id: string) => cb(id));\n }\n\n onPlayerLeave(cb: (id: string) => void) {\n this.$.onRemove(\"players\", (_player: unknown, id: string) => cb(id));\n }\n\n onMessage(cb: (name: string, payload: unknown, from: string) => void) {\n this.room.onMessage(\"m\", (m: { name: string; payload: unknown; from: string }) =>\n cb(m.name, m.payload, m.from),\n );\n }\n\n onCorrect(cb: (id: string, pose: NetPose) => void) {\n this.room.onMessage(\"correct\", (m: NetPose & { id: string }) => cb(m.id, m));\n }\n\n onSound(cb: (sound: NetSound, from: string) => void) {\n this.room.onMessage(\"sound\", (m: NetSound & { from: string }) => cb(m, m.from));\n }\n\n onVoice(cb: (message: VoiceFromRoom) => void) {\n this.room.onMessage(\"voice\", cb);\n }\n\n onClose(cb: () => void) {\n this.room.onLeave(() => cb());\n }\n\n registerScene(entities: Parameters<NetworkTransport[\"registerScene\"]>[0]) {\n this.room.send(\"scene\", entities);\n }\n\n spawn(request: Parameters<NetworkTransport[\"spawn\"]>[0]) {\n this.room.send(\"spawn\", request);\n }\n\n despawn(id: string) {\n this.room.send(\"despawn\", { id });\n }\n\n sendPose(id: string, pose: NetPose) {\n this.room.send(\"pose\", { id, ...pose });\n }\n\n setProp(id: string, key: string, json: string) {\n this.room.send(\"prop\", { id, key, json });\n }\n\n send(name: string, payload: unknown) {\n this.room.send(\"m\", { name, payload });\n }\n\n sendSound(sound: NetSound) {\n this.room.send(\"sound\", sound);\n }\n\n sendVoice(message: VoiceToRoom) {\n this.room.send(\"voice\", message);\n }\n\n leave() {\n void this.room.leave();\n }\n}\n","import type { NetworkTransport } from \"./types\";\n\n/**\n * A transport with a bad connection: everything takes `ms` longer round trip.\n * For testing a game at a real player's latency on a local server.\n */\nexport function withLatency(transport: NetworkTransport, ms: number): NetworkTransport {\n if (ms <= 0) return transport;\n const oneWay = ms / 2;\n return new Proxy(transport, {\n get(target, key) {\n const value = Reflect.get(target, key);\n if (typeof value !== \"function\") return value;\n const name = String(key);\n const fn = value as (...args: unknown[]) => unknown;\n if (name === \"leave\") return fn.bind(target);\n if (name.startsWith(\"on\")) {\n return (cb: (...args: unknown[]) => void) =>\n fn.call(target, (...args: unknown[]) => {\n setTimeout(() => cb(...args), oneWay);\n });\n }\n return (...args: unknown[]) => {\n setTimeout(() => fn.apply(target, args), oneWay);\n };\n },\n });\n}\n","import type { NetPose } from \"./types\";\n\ntype Snapshot = { at: number; pose: NetPose };\n\nconst MAX_SNAPSHOTS = 32;\n\nfunction lerpPose(a: NetPose, b: NetPose, t: number): NetPose {\n // the short way round: q and -q are the same rotation\n const dot = a.qx * b.qx + a.qy * b.qy + a.qz * b.qz + a.qw * b.qw;\n const s = dot < 0 ? -1 : 1;\n const qx = a.qx + (s * b.qx - a.qx) * t;\n const qy = a.qy + (s * b.qy - a.qy) * t;\n const qz = a.qz + (s * b.qz - a.qz) * t;\n const qw = a.qw + (s * b.qw - a.qw) * t;\n const len = Math.hypot(qx, qy, qz, qw) || 1;\n return {\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n z: a.z + (b.z - a.z) * t,\n qx: qx / len,\n qy: qy / len,\n qz: qz / len,\n qw: qw / len,\n };\n}\n\n/**\n * Plays a remote entity back slightly in the past, between the two updates\n * around that moment. Packets arrive unevenly; a small delay turns that into\n * smooth motion.\n */\nexport class SnapshotBuffer {\n private snapshots: Snapshot[] = [];\n\n constructor(private readonly teleportDistance = Number.POSITIVE_INFINITY) {}\n\n push(at: number, pose: NetPose): void {\n this.snapshots.push({ at, pose });\n if (this.snapshots.length > MAX_SNAPSHOTS) this.snapshots.shift();\n }\n\n /** The pose at time `at`: holds the first and last, and never extrapolates. */\n sample(at: number): NetPose | null {\n const list = this.snapshots;\n if (list.length === 0) return null;\n if (at <= list[0].at) return list[0].pose;\n for (let i = list.length - 1; i > 0; i--) {\n const a = list[i - 1];\n const b = list[i];\n if (at < a.at) continue;\n // older ones will never be needed again\n if (i > 1) this.snapshots = list.slice(i - 1);\n if (at >= b.at) return b.pose;\n const jump = Math.hypot(b.pose.x - a.pose.x, b.pose.y - a.pose.y, b.pose.z - a.pose.z);\n if (jump > this.teleportDistance) return b.pose;\n return lerpPose(a.pose, b.pose, (at - a.at) / (b.at - a.at));\n }\n return list[list.length - 1].pose;\n }\n}\n","/**\n * What Opus should carry for voice. These fmtp parameters say what the receiver\n * wants, so each side writes them into the description it received, and the\n * other side's encoder follows. The local description is never edited: browsers\n * increasingly refuse that. Mono speech, error correction, no packets in\n * silence, at most 20 kbps, and 40 ms packets: half the usual packet rate.\n */\nexport const OPUS_VOICE: Record<string, string> = {\n useinbandfec: \"1\",\n usedtx: \"1\",\n stereo: \"0\",\n \"sprop-stereo\": \"0\",\n maxaveragebitrate: \"20000\",\n maxplaybackrate: \"24000\",\n};\nexport const VOICE_PTIME = 40;\n\n/** \"a=1;b=2\" with these keys set: existing ones replaced in place, new ones added. */\nfunction mergeFmtp(fmtp: string, params: Record<string, string>): string {\n const pairs = fmtp\n .split(\";\")\n .map((part) => part.trim())\n .filter(Boolean)\n .map((part) => {\n const i = part.indexOf(\"=\");\n return i < 0 ? [part, \"\"] : [part.slice(0, i), part.slice(i + 1)];\n });\n for (const [key, value] of Object.entries(params)) {\n const found = pairs.find((pair) => pair[0].toLowerCase() === key.toLowerCase());\n if (found) found[1] = value;\n else pairs.push([key, value]);\n }\n return pairs.map(([k, v]) => (v === \"\" ? k : `${k}=${v}`)).join(\";\");\n}\n\n/** The description with the voice settings on every Opus payload of its audio sections. */\nexport function tuneOpus(\n sdp: string,\n params: Record<string, string> = OPUS_VOICE,\n ptime = VOICE_PTIME,\n): string {\n const eol = sdp.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n // the session part, then one section per m= line\n const sections: string[][] = [[]];\n for (const line of sdp.split(eol)) {\n if (line.startsWith(\"m=\")) sections.push([]);\n sections[sections.length - 1].push(line);\n }\n const out: string[] = [];\n for (const section of sections) {\n const opus = section.flatMap((line) => {\n const match = /^a=rtpmap:(\\d+) opus\\/48000/i.exec(line);\n return match ? [match[1]] : [];\n });\n if (!section[0]?.startsWith(\"m=audio\") || !opus.length) {\n out.push(...section);\n continue;\n }\n const tuned: string[] = [];\n for (const line of section) {\n const fmtp = /^a=fmtp:(\\d+) (.*)$/.exec(line);\n if (fmtp && opus.includes(fmtp[1])) {\n tuned.push(`a=fmtp:${fmtp[1]} ${mergeFmtp(fmtp[2], params)}`);\n continue;\n }\n tuned.push(line);\n const rtpmap = /^a=rtpmap:(\\d+) opus\\/48000/i.exec(line);\n if (rtpmap && !section.some((l) => l.startsWith(`a=fmtp:${rtpmap[1]} `))) {\n tuned.push(`a=fmtp:${rtpmap[1]} ${mergeFmtp(\"\", params)}`);\n }\n }\n if (ptime && !tuned.some((line) => line.startsWith(\"a=ptime:\"))) {\n // before the empty line that ends the last section\n const at = tuned[tuned.length - 1] === \"\" ? tuned.length - 1 : tuned.length;\n tuned.splice(at, 0, `a=ptime:${ptime}`);\n }\n out.push(...tuned);\n }\n return out.join(eol);\n}\n","import { tuneOpus } from \"./sdp\";\nimport type {\n NetworkTransport,\n VoiceFromRoom,\n VoiceHandle,\n VoicePeer,\n VoiceSignal,\n} from \"./types\";\n\nexport type VoiceLevel = 0 | 1 | 2;\n/** Each step's sending rate per connection. Everyone sends to everyone, so more people means less each. */\nexport const LEVEL_BPS = [24000, 16000, 10000] as const;\nconst WORST_LEVEL: VoiceLevel = 2;\nexport const TICK_MS = 2000;\nexport const POLL_MS = 100;\nexport const GOOD_TO_STEP_UP_MS = 10_000;\nexport const MAX_LOSS = 0.05;\nexport const MAX_RTT_MS = 400;\n/** How loud a stream reads before it counts as someone talking. */\nexport const TALKING_LEVEL = 0.06;\n/** Long enough that the gap between two words doesn't let the music jump back up. */\nconst DUCK_SECONDS = 0.6;\nconst MAX_RESTARTS = 3;\n\nexport interface VoiceMeter {\n level(): number;\n close(): void;\n}\n\n/** One person's voice coming out of the speakers. */\nexport interface RemoteVoice {\n setVolume(volume: number): void;\n /** Where they are, or `null` to hear them everywhere. */\n setPosition(position: { x: number; y: number; z: number } | null): void;\n stop(): void;\n}\n\n/** Everything voice needs from a browser, so the rest runs under test with fakes. */\nexport interface VoiceDeps {\n /** Whether this page can do voice at all: a mic needs https. */\n supported(): boolean;\n createConnection(config: RTCConfiguration): RTCPeerConnection;\n getMic(constraints: MediaStreamConstraints): Promise<MediaStream>;\n /** The mic is being taken or let go. iOS needs a different audio session while it's held. */\n setCapture(on: boolean): void;\n analyse(source: MediaStream | MediaStreamTrack): VoiceMeter | null;\n playRemote(track: MediaStreamTrack): RemoteVoice;\n /** Dip the music for this long. Called again while someone keeps talking. */\n duck(seconds: number): void;\n /** Where this player's character is, when they have one. */\n positionOf(peerId: string): { x: number; y: number; z: number } | null;\n /** Run `fn` on a timer, and return how to stop it. */\n every(ms: number, fn: () => void): () => void;\n}\n\n/** The step for this many other people, before the connection has a say. */\nexport function startingLevel(others: number): VoiceLevel {\n if (others <= 2) return 0;\n return others <= 4 ? 1 : 2;\n}\n\n/** One quality step: down at once on a bad reading, up after a stretch of good ones. */\nexport function adaptLevel(\n level: VoiceLevel,\n best: VoiceLevel,\n bad: boolean,\n goodMs: number,\n): { level: VoiceLevel; goodMs: number } {\n let next = Math.max(level, best);\n if (bad) {\n return { level: Math.min(WORST_LEVEL, next + 1) as VoiceLevel, goodMs: 0 };\n }\n let good = goodMs + TICK_MS;\n if (good >= GOOD_TO_STEP_UP_MS && next > best) {\n next -= 1;\n good = 0;\n }\n return { level: next as VoiceLevel, goodMs: good };\n}\n\nfunction micError(error: unknown) {\n const name = (error as { name?: string }).name;\n if (name === \"NotAllowedError\") return \"Microphone blocked: allow it in your browser settings\";\n if (name === \"NotFoundError\") return \"No microphone found\";\n return \"Could not start the microphone\";\n}\n\n/** Loss and round trip from a connection's own stats. */\nexport async function readLinkStats(pc: RTCPeerConnection) {\n const stats = await pc.getStats();\n let loss = 0;\n let rttMs = 0;\n stats.forEach((report) => {\n const r = report as Record<string, unknown> & { type: string; kind?: string };\n if (r.type === \"remote-inbound-rtp\" && r.kind === \"audio\") {\n if (typeof r.fractionLost === \"number\") loss = Math.max(loss, r.fractionLost);\n }\n if (r.type === \"candidate-pair\" && r.state === \"succeeded\" && r.nominated !== false) {\n if (typeof r.currentRoundTripTime === \"number\") {\n rttMs = Math.max(rttMs, r.currentRoundTripTime * 1000);\n }\n }\n });\n return { loss, rttMs };\n}\n\ntype Peer = {\n id: string;\n pc: RTCPeerConnection;\n /** The one who joined later sends the offer, so two sides never offer at once. */\n caller: boolean;\n audio: RTCRtpTransceiver | null;\n pendingIce: RTCIceCandidateInit[];\n player: RemoteVoice | null;\n meter: VoiceMeter | null;\n connected: boolean;\n micOn: boolean;\n muted: boolean;\n volume: number;\n talking: boolean;\n restarts: number;\n};\n\n/**\n * Voice chat between the players in a room: a direct connection to each other\n * player, so the game server never carries audio, only the messages that set\n * those connections up. Nothing is captured until the player turns it on, and\n * only others who turned it on can hear them. Direct connections cost everyone\n * upload per person, so rooms stop at the size the server says (8 by default).\n */\nexport class VoiceChat implements VoiceHandle {\n available = false;\n state: VoiceHandle[\"state\"] = \"off\";\n micMuted = false;\n talking = false;\n error = \"\";\n /** Hear each voice from its character, when there is one. Off, everyone's in your ear. */\n positional = true;\n\n private readonly peersById = new Map<string, Peer>();\n private readonly listeners = new Set<() => void>();\n private config: RTCConfiguration = {};\n private track: MediaStreamTrack | null = null;\n private meter: VoiceMeter | null = null;\n private level: VoiceLevel = 0;\n private goodMs = 0;\n private stopTimers: (() => void) | null = null;\n private disposed = false;\n\n constructor(\n private readonly transport: Pick<NetworkTransport, \"sendVoice\" | \"onVoice\">,\n private readonly deps: VoiceDeps,\n ) {\n transport.onVoice((message) => this.fromRoom(message));\n transport.sendVoice({ t: \"hello\" });\n }\n\n get peers(): VoicePeer[] {\n return [...this.peersById.values()].map((p) => ({\n id: p.id,\n connected: p.connected,\n talking: p.talking,\n micOn: p.micOn,\n muted: p.muted,\n volume: p.volume,\n }));\n }\n\n onChange(listener: () => void) {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private changed() {\n for (const listener of this.listeners) listener();\n }\n\n /** Turn voice on. Call from a tap or key: that's what lets the browser ask for the mic. */\n async enable(): Promise<boolean> {\n if (this.state !== \"off\") return true;\n if (!this.available) return false;\n this.error = \"\";\n this.state = \"connecting\";\n this.changed();\n this.deps.setCapture(true);\n try {\n await this.acquire();\n } catch (error) {\n this.deps.setCapture(false);\n this.state = \"off\";\n this.error = micError(error);\n this.changed();\n return false;\n }\n if (this.disposed || this.state !== \"connecting\") {\n this.release();\n return false;\n }\n this.micMuted = false;\n this.transport.sendVoice({ t: \"join\" });\n return true;\n }\n\n private async acquire() {\n const stream = await this.deps.getMic({\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n channelCount: 1,\n },\n video: false,\n });\n this.track = stream.getAudioTracks()[0] ?? null;\n if (this.track) this.track.onended = () => this.lost();\n this.meter?.close();\n this.meter = this.deps.analyse(stream);\n }\n\n private release() {\n try {\n this.track?.stop();\n } catch {\n // already gone\n }\n this.track = null;\n this.meter?.close();\n this.meter = null;\n this.talking = false;\n this.deps.setCapture(false);\n }\n\n /** The mic stopped by itself: the phone took it for a call, or the device went away. */\n private lost() {\n if (this.state === \"off\") return;\n this.track = null;\n this.micMuted = true;\n this.error = \"Your mic stopped: tap the mic to turn it back on\";\n this.transport.sendVoice({ t: \"mic\", on: false });\n this.sendMicToAll();\n this.changed();\n }\n\n /** Turn voice off. The mic stops at once. */\n disable() {\n if (this.state === \"off\") return;\n this.transport.sendVoice({ t: \"leave\" });\n this.shutDown();\n this.changed();\n }\n\n private shutDown() {\n this.state = \"off\";\n this.micMuted = false;\n this.stopTimers?.();\n this.stopTimers = null;\n for (const peer of [...this.peersById.values()]) this.closePeer(peer);\n this.release();\n }\n\n /** Mute or unmute this player's mic. Everyone in voice sees it. */\n async setMicMuted(muted: boolean) {\n if (this.state !== \"on\") return;\n if (!muted && !this.track) {\n try {\n this.deps.setCapture(true);\n await this.acquire();\n this.error = \"\";\n } catch (error) {\n this.error = micError(error);\n this.changed();\n return;\n }\n }\n this.micMuted = muted;\n this.transport.sendVoice({ t: \"mic\", on: !muted });\n this.sendMicToAll();\n this.changed();\n }\n\n /** Stop hearing someone. They aren't told. */\n setPeerMuted(id: string, muted: boolean) {\n const peer = this.peersById.get(id);\n if (!peer) return;\n peer.muted = muted;\n peer.player?.setVolume(muted ? 0 : peer.volume);\n this.changed();\n }\n\n setPeerVolume(id: string, volume: number) {\n const peer = this.peersById.get(id);\n if (!peer) return;\n peer.volume = volume;\n if (!peer.muted) peer.player?.setVolume(volume);\n this.changed();\n }\n\n private fromRoom(m: VoiceFromRoom) {\n if (m.t === \"caps\") {\n this.available = m.available && this.deps.supported();\n this.changed();\n } else if (m.t === \"refused\") {\n if (this.state === \"off\") return;\n this.shutDown();\n this.error =\n m.reason === \"full\"\n ? \"Voice is full in this room\"\n : \"Voice chat isn't available in this game\";\n this.changed();\n } else if (m.t === \"welcome\") {\n if (this.state !== \"connecting\") return;\n this.config = {\n iceServers: m.iceServers,\n iceTransportPolicy: m.relayOnly ? \"relay\" : \"all\",\n };\n this.state = \"on\";\n this.level = startingLevel(m.peers.length);\n this.startTimers();\n for (const other of m.peers) {\n void this.call(this.addPeer(other.id, true, other.mic));\n }\n this.changed();\n } else if (this.state !== \"on\") {\n // nothing else matters until this player is in\n } else if (m.t === \"joined\") {\n this.addPeer(m.id, false, true);\n this.retune();\n this.changed();\n } else if (m.t === \"left\") {\n const peer = this.peersById.get(m.id);\n if (peer) this.closePeer(peer);\n this.retune();\n this.changed();\n } else if (m.t === \"mic\") {\n const peer = this.peersById.get(m.id);\n if (peer) peer.micOn = m.on;\n this.changed();\n } else if (m.t === \"signal\") {\n void this.onSignal(m.from, m.signal);\n }\n }\n\n private addPeer(id: string, caller: boolean, micOn: boolean) {\n const existing = this.peersById.get(id);\n if (existing) return existing;\n const pc = this.deps.createConnection(this.config);\n const peer: Peer = {\n id,\n pc,\n caller,\n audio: null,\n pendingIce: [],\n player: null,\n meter: null,\n connected: false,\n micOn,\n muted: false,\n volume: 1,\n talking: false,\n restarts: 0,\n };\n this.peersById.set(id, peer);\n pc.ontrack = (event) => {\n if (event.track.kind === \"audio\") this.hear(peer, event.track);\n };\n pc.onicecandidate = (event) => {\n if (event.candidate) this.signal(id, { kind: \"ice\", candidate: event.candidate.toJSON() });\n };\n pc.onconnectionstatechange = () => this.connectionChanged(peer);\n return peer;\n }\n\n private signal(to: string, signal: VoiceSignal) {\n this.transport.sendVoice({ t: \"signal\", to, signal });\n }\n\n private hear(peer: Peer, track: MediaStreamTrack) {\n peer.player?.stop();\n peer.meter?.close();\n peer.player = this.deps.playRemote(track);\n peer.player.setVolume(peer.muted ? 0 : peer.volume);\n peer.meter = this.deps.analyse(track);\n }\n\n private connectionChanged(peer: Peer) {\n if (this.peersById.get(peer.id) !== peer) return;\n const state = peer.pc.connectionState;\n if (state === \"connected\") {\n peer.connected = true;\n peer.restarts = 0;\n void this.applyBitrate(peer);\n this.changed();\n } else if (state === \"failed\") {\n peer.connected = false;\n this.changed();\n // a phone moving between networks: only the caller offers, so only it retries\n if (peer.caller && peer.restarts < MAX_RESTARTS) {\n peer.restarts += 1;\n void this.offer(peer, true);\n }\n }\n }\n\n private async call(peer: Peer) {\n peer.audio = peer.pc.addTransceiver(\"audio\", { direction: \"sendrecv\" });\n await this.sendMic(peer);\n await this.offer(peer, false);\n }\n\n private async offer(peer: Peer, restart: boolean) {\n try {\n if (restart) peer.pc.restartIce();\n await peer.pc.setLocalDescription(await peer.pc.createOffer({ iceRestart: restart }));\n const sdp = peer.pc.localDescription?.sdp;\n if (sdp) this.signal(peer.id, { kind: \"offer\", sdp });\n } catch (error) {\n console.warn(\"[relu] Couldn't start a voice connection.\", error);\n }\n }\n\n private async onSignal(from: string, signal: VoiceSignal) {\n const peer = this.addPeer(from, false, true);\n try {\n if (signal.kind === \"ice\") {\n if (peer.pc.remoteDescription) await peer.pc.addIceCandidate(signal.candidate);\n else peer.pendingIce.push(signal.candidate);\n return;\n }\n await peer.pc.setRemoteDescription({ type: signal.kind, sdp: tuneOpus(signal.sdp) });\n for (const candidate of peer.pendingIce.splice(0)) {\n await peer.pc.addIceCandidate(candidate);\n }\n if (signal.kind === \"answer\") return;\n // the offer made a receive-only slot; this side sends too, before it answers,\n // so a mic can come and go later without another offer\n if (!peer.audio) {\n const slot = peer.pc\n .getTransceivers()\n .find((t) => t.receiver.track.kind === \"audio\");\n if (slot) {\n slot.direction = \"sendrecv\";\n peer.audio = slot;\n }\n }\n await this.sendMic(peer);\n await peer.pc.setLocalDescription(await peer.pc.createAnswer());\n const sdp = peer.pc.localDescription?.sdp;\n if (sdp) this.signal(from, { kind: \"answer\", sdp });\n } catch (error) {\n console.warn(\"[relu] A voice connection failed to set up.\", error);\n }\n }\n\n private async sendMic(peer: Peer) {\n const sender = peer.audio?.sender;\n if (!sender) return;\n await sender.replaceTrack(this.micMuted ? null : this.track).catch(() => undefined);\n await this.applyBitrate(peer);\n }\n\n private sendMicToAll() {\n for (const peer of this.peersById.values()) void this.sendMic(peer);\n }\n\n private async applyBitrate(peer: Peer) {\n const sender = peer.audio?.sender;\n if (!sender) return;\n try {\n const parameters = sender.getParameters();\n // Safari can hand back none before the first packet\n if (!parameters.encodings?.length) parameters.encodings = [{}];\n parameters.encodings[0].maxBitrate = LEVEL_BPS[this.level];\n await sender.setParameters(parameters);\n } catch {\n // not supported here: the cap in the description still holds\n }\n }\n\n private setLevel(level: VoiceLevel) {\n if (level === this.level) return;\n this.level = level;\n for (const peer of this.peersById.values()) void this.applyBitrate(peer);\n }\n\n /** Someone came or went: the rate each connection gets changes with it. */\n private retune() {\n this.setLevel(Math.max(this.level, startingLevel(this.peersById.size)) as VoiceLevel);\n }\n\n private closePeer(peer: Peer) {\n peer.player?.stop();\n peer.meter?.close();\n peer.pc.ontrack = null;\n peer.pc.onicecandidate = null;\n peer.pc.onconnectionstatechange = null;\n peer.pc.close();\n this.peersById.delete(peer.id);\n }\n\n private startTimers() {\n const stopPoll = this.deps.every(POLL_MS, () => this.poll());\n const stopTick = this.deps.every(TICK_MS, () => void this.tick());\n this.stopTimers = () => {\n stopPoll();\n stopTick();\n };\n }\n\n /** Who's talking, where they are, and the music under them. */\n private poll() {\n let anyone = false;\n let moved = false;\n for (const peer of this.peersById.values()) {\n const talking = !peer.muted && (peer.meter?.level() ?? 0) > TALKING_LEVEL;\n if (talking !== peer.talking) moved = true;\n peer.talking = talking;\n anyone ||= talking;\n peer.player?.setPosition(this.positional ? this.deps.positionOf(peer.id) : null);\n }\n const me = !this.micMuted && (this.meter?.level() ?? 0) > TALKING_LEVEL;\n if (me !== this.talking) moved = true;\n this.talking = me;\n if (anyone) this.deps.duck(DUCK_SECONDS);\n if (moved) this.changed();\n }\n\n /** Step quality to what the connections can carry. */\n private async tick() {\n let bad = false;\n for (const peer of this.peersById.values()) {\n if (!peer.connected) continue;\n const stats = await readLinkStats(peer.pc).catch(() => null);\n if (stats && (stats.loss > MAX_LOSS || stats.rttMs > MAX_RTT_MS)) bad = true;\n }\n if (this.state !== \"on\") return;\n const step = adaptLevel(this.level, startingLevel(this.peersById.size), bad, this.goodMs);\n this.goodMs = step.goodMs;\n this.setLevel(step.level);\n }\n\n /** The room is going: stop everything. There's no one left to tell. */\n dispose() {\n this.disposed = true;\n this.shutDown();\n this.available = false;\n this.changed(); // a mic button has to go with the room\n this.listeners.clear();\n }\n}\n","import type { AudioMixer } from \"../audio/AudioMixer\";\nimport type { World } from \"../World\";\nimport type { RemoteVoice, VoiceDeps, VoiceMeter } from \"./voice\";\n\ntype Position = { x: number; y: number; z: number };\n\n/** Close enough to be in the same conversation, then falling away with distance. */\nconst FULL_VOLUME_DISTANCE = 2;\nconst SILENT_DISTANCE = 60;\n/** Characters move in steps of the network's send rate; this hides the steps. */\nconst POSITION_SMOOTHING = 0.05;\n\n/** A remote voice through the game's voice bus, so its volume and ducking apply. */\nfunction voiceGraph(mixer: AudioMixer | null, stream: MediaStream) {\n const context = mixer?.listener.context;\n if (!mixer || !context || context.state !== \"running\") return null;\n const bus = mixer.input(\"voice\");\n const source = context.createMediaStreamSource(stream);\n const gain = context.createGain();\n const panner = context.createPanner();\n panner.panningModel = \"equalpower\"; // HRTF for up to 7 voices is real CPU on a phone\n panner.distanceModel = \"inverse\";\n panner.refDistance = FULL_VOLUME_DISTANCE;\n panner.maxDistance = SILENT_DISTANCE;\n source.connect(gain);\n gain.connect(bus);\n let placed = false;\n return {\n setVolume(volume: number) {\n gain.gain.setTargetAtTime(Math.max(0, Math.min(2, volume)), context.currentTime, 0.02);\n },\n setPosition(position: Position | null) {\n if (Boolean(position) !== placed) {\n placed = !placed;\n gain.disconnect();\n panner.disconnect();\n if (placed) {\n gain.connect(panner);\n panner.connect(bus);\n } else {\n gain.connect(bus);\n }\n }\n if (!position) return;\n const now = context.currentTime;\n panner.positionX.setTargetAtTime(position.x, now, POSITION_SMOOTHING);\n panner.positionY.setTargetAtTime(position.y, now, POSITION_SMOOTHING);\n panner.positionZ.setTargetAtTime(position.z, now, POSITION_SMOOTHING);\n },\n stop() {\n source.disconnect();\n gain.disconnect();\n panner.disconnect();\n },\n };\n}\n\nfunction playRemote(mixer: AudioMixer | null, track: MediaStreamTrack): RemoteVoice {\n const stream = new MediaStream([track]);\n const element = document.createElement(\"audio\");\n element.autoplay = true;\n element.setAttribute(\"playsinline\", \"\");\n element.srcObject = stream;\n element.style.display = \"none\";\n const graph = voiceGraph(mixer, stream);\n // Chrome only lets the graph hear a call while an element plays it too, so the\n // element stays on, muted. With no running audio yet, the element is the voice.\n element.muted = graph !== null;\n document.body.appendChild(element);\n void element.play().catch(() => undefined);\n return {\n setVolume(volume) {\n if (graph) graph.setVolume(volume);\n else element.volume = Math.max(0, Math.min(1, volume));\n },\n setPosition(position) {\n graph?.setPosition(position);\n },\n stop() {\n graph?.stop();\n element.pause();\n element.srcObject = null;\n element.remove();\n },\n };\n}\n\n/** How loud a stream is right now, from an analyser that plays nothing. */\nfunction analyse(\n mixer: AudioMixer | null,\n from: MediaStream | MediaStreamTrack,\n): VoiceMeter | null {\n const context = mixer?.listener.context;\n if (!context) return null;\n const stream = from instanceof MediaStream ? from : new MediaStream([from]);\n const source = context.createMediaStreamSource(stream);\n const analyser = context.createAnalyser();\n analyser.fftSize = 512;\n source.connect(analyser);\n const samples = new Float32Array(analyser.fftSize);\n return {\n level() {\n analyser.getFloatTimeDomainData(samples);\n let sum = 0;\n for (const sample of samples) sum += sample * sample;\n return Math.min(1, Math.sqrt(sum / samples.length) * 3);\n },\n close() {\n source.disconnect();\n analyser.disconnect();\n },\n };\n}\n\n/** Voice on a real page. */\nexport function browserVoiceDeps(\n world: World,\n positionOf: VoiceDeps[\"positionOf\"],\n): VoiceDeps {\n const mixer = () => world.getAudioSystem()?.getMixer() ?? null;\n return {\n supported: () =>\n typeof RTCPeerConnection !== \"undefined\" &&\n globalThis.isSecureContext &&\n Boolean(navigator.mediaDevices?.getUserMedia),\n createConnection: (config) => new RTCPeerConnection(config),\n getMic: (constraints) => navigator.mediaDevices.getUserMedia(constraints),\n setCapture(on) {\n // iOS plays through the earpiece at a whisper unless it's told what this is\n const session = (navigator as { audioSession?: { type: string } }).audioSession;\n if (session) session.type = on ? \"play-and-record\" : \"playback\";\n if (on) void mixer()?.listener.context.resume();\n },\n analyse: (from) => analyse(mixer(), from),\n playRemote: (track) => playRemote(mixer(), track),\n duck: (seconds) => mixer()?.duckMusic(seconds),\n positionOf,\n every(ms, fn) {\n const timer = setInterval(fn, ms);\n return () => clearInterval(timer);\n },\n };\n}\n","import * as THREE from \"three\";\n\nimport { Behaviour } from \"../Behaviour\";\nimport {\n type NetValue,\n NetworkedPropsComponent,\n NetworkIdentityComponent,\n NetworkSpawnerComponent,\n NetworkTransformComponent,\n} from \"../components/Network\";\nimport { ScriptComponent } from \"../components/ScriptComponent\";\nimport { TransformComponent } from \"../components/Transform\";\nimport { despawnPrefab, spawnPrefab } from \"../prefab/spawnPrefab\";\nimport type { EcsSystem } from \"../System\";\nimport type { EntityId } from \"../types\";\nimport type { World } from \"../World\";\nimport { reportBehaviourHookError } from \"../systems/scriptShared\";\nimport { SnapshotBuffer } from \"./snapshotBuffer\";\nimport type {\n NetEntityView,\n NetPose,\n NetSound,\n NetSpawnOptions,\n NetworkHandle,\n NetworkService,\n NetworkTransport,\n} from \"./types\";\nimport { VoiceChat, type VoiceDeps } from \"./voice\";\nimport { browserVoiceDeps } from \"./voiceBrowser\";\n\ntype Tracked = {\n id: string;\n /** `null` while its prefab is loading. */\n entityId: EntityId | null;\n owner: string;\n /** The prefab it was spawned from; empty for a scene object. */\n prefab: string;\n buffer: SnapshotBuffer;\n /** When the owner last sent, in ms. */\n sentAt: number;\n sent: NetPose | null;\n props: Record<string, string>;\n};\n\nconst POSITION_EPSILON = 0.001;\nconst ROTATION_EPSILON = 0.0005;\n\nconst euler = new THREE.Euler();\nconst quat = new THREE.Quaternion();\n\nfunction poseOf(transform: TransformComponent): NetPose {\n const { position: p, rotation: r } = transform;\n quat.setFromEuler(euler.set(r.x, r.y, r.z));\n return { x: p.x, y: p.y, z: p.z, qx: quat.x, qy: quat.y, qz: quat.z, qw: quat.w };\n}\n\nfunction applyPose(transform: TransformComponent, pose: NetPose, rotation: boolean) {\n transform.position.x = pose.x;\n transform.position.y = pose.y;\n transform.position.z = pose.z;\n if (!rotation) return;\n euler.setFromQuaternion(quat.set(pose.qx, pose.qy, pose.qz, pose.qw));\n transform.rotation.x = euler.x;\n transform.rotation.y = euler.y;\n transform.rotation.z = euler.z;\n}\n\nconst moved = (a: NetPose, b: NetPose) =>\n Math.abs(a.x - b.x) > POSITION_EPSILON ||\n Math.abs(a.y - b.y) > POSITION_EPSILON ||\n Math.abs(a.z - b.z) > POSITION_EPSILON ||\n Math.abs(a.qx - b.qx) > ROTATION_EPSILON ||\n Math.abs(a.qy - b.qy) > ROTATION_EPSILON ||\n Math.abs(a.qz - b.qz) > ROTATION_EPSILON ||\n Math.abs(a.qw - b.qw) > ROTATION_EPSILON;\n\nfunction encodeProps(props?: Record<string, NetValue>) {\n return Object.fromEntries(\n Object.entries(props ?? {}).map(([k, v]) => [k, JSON.stringify(v)]),\n );\n}\n\n/**\n * Keeps a world in step with a shared room: spawns what others spawned, sends\n * what this client owns, and plays back what it doesn't. Add it to\n * `world.setup({ systems })` after the script systems, then call `connect`\n * once the scene is hydrated.\n *\n * @category Systems\n */\nexport class NetworkSystem implements EcsSystem, NetworkService {\n private world: World | null = null;\n private transport: NetworkTransport | null = null;\n private readonly tracked = new Map<string, Tracked>();\n private readonly byEntity = new Map<EntityId, Tracked>();\n private readonly listeners = new Map<string, Set<(p: unknown, from: string) => void>>();\n private readonly handles = new Map<EntityId, NetworkHandle>();\n private spawnedAvatar = false;\n /** Voice chat, once connected with it on. */\n voice: VoiceChat | null = null;\n\n constructor(private readonly now: () => number = () => performance.now()) {}\n\n /**\n * Join the shared world. Call after hydrating, so scene objects exist.\n * `voice: true` adds voice chat; the room still decides whether it's offered.\n */\n connect(\n world: World,\n transport: NetworkTransport,\n options: { voice?: boolean | VoiceDeps } = {},\n ): void {\n this.world = world;\n this.transport = transport;\n world.setNetwork(this);\n transport.onEntityAdd((e) => this.entityAdded(e));\n transport.onEntityChange((e) => this.entityChanged(e));\n transport.onEntityRemove((id) => this.entityRemoved(id));\n transport.onPlayerJoin((id) => this.dispatch(\"onPlayerJoin\", id));\n transport.onPlayerLeave((id) => this.dispatch(\"onPlayerLeave\", id));\n transport.onMessage((name, payload, from) => {\n for (const fn of this.listeners.get(name) ?? []) fn(payload, from);\n });\n transport.onCorrect((id, pose) => this.corrected(id, pose));\n transport.onSound((sound) => this.heardSound(sound));\n transport.onClose(() => this.disconnected());\n if (options.voice) {\n this.voice = new VoiceChat(\n transport,\n options.voice === true\n ? browserVoiceDeps(world, (id) => this.positionOf(id))\n : options.voice,\n );\n }\n this.registerScene();\n this.spawnAvatar();\n }\n\n /** Scene objects: every client hydrates the same scene, so their ids already match. */\n private registerScene() {\n const world = this.world;\n const transport = this.transport;\n if (!world || !transport) return;\n const entities = [];\n for (const entityId of world.query(NetworkIdentityComponent)) {\n const identity = world.getComponent(entityId, NetworkIdentityComponent);\n if (!identity || identity.networkId) continue;\n identity.networkId = `scene-${entityId}`;\n const transform = world.getComponent(entityId, TransformComponent);\n const props = world.getComponent(entityId, NetworkedPropsComponent);\n const tracked = this.track(identity.networkId, entityId, \"\", null);\n tracked.props = encodeProps(props?.values);\n entities.push({\n id: identity.networkId,\n props: tracked.props,\n ...(transform ? poseOf(transform) : { x: 0, y: 0, z: 0, qx: 0, qy: 0, qz: 0, qw: 1 }),\n });\n }\n if (entities.length) transport.registerScene(entities);\n }\n\n private spawnAvatar() {\n const world = this.world;\n if (!world || this.spawnedAvatar) return;\n const [entityId] = world.query(NetworkSpawnerComponent);\n if (entityId === undefined) return;\n const spawner = world.getComponent(entityId, NetworkSpawnerComponent);\n if (!spawner?.playerPrefab) return;\n this.spawnedAvatar = true;\n const at = world.getComponent(entityId, TransformComponent)?.position;\n const angle = Math.random() * Math.PI * 2;\n this.spawn(spawner.playerPrefab, {\n position: {\n x: (at?.x ?? 0) + Math.cos(angle) * spawner.spawnRadius,\n y: at?.y ?? 0,\n z: (at?.z ?? 0) + Math.sin(angle) * spawner.spawnRadius,\n },\n });\n }\n\n private track(\n id: string,\n entityId: EntityId | null,\n owner: string,\n view: NetPose | null,\n prefab = \"\",\n ) {\n const entry: Tracked = {\n id,\n entityId,\n owner,\n prefab,\n buffer: new SnapshotBuffer(),\n sentAt: 0,\n sent: null,\n props: {},\n };\n if (view) entry.buffer.push(this.now(), view);\n this.tracked.set(id, entry);\n if (entityId !== null) this.byEntity.set(entityId, entry);\n return entry;\n }\n\n /** The buffer needs the entity's own teleport setting, known once the entity exists. */\n private bindEntity(entry: Tracked, entityId: EntityId) {\n const world = this.world;\n if (!world) return;\n entry.entityId = entityId;\n this.byEntity.set(entityId, entry);\n let identity = world.getComponent(entityId, NetworkIdentityComponent);\n if (!identity) {\n identity = new NetworkIdentityComponent();\n world.addComponent(entityId, identity);\n }\n identity.networkId = entry.id;\n identity.owner = entry.owner;\n const settings = world.getComponent(entityId, NetworkTransformComponent);\n entry.buffer = new SnapshotBuffer(settings?.teleportDistance);\n }\n\n private entityAdded(view: NetEntityView) {\n const existing = this.tracked.get(view.id);\n if (existing) {\n this.entityChanged(view);\n return;\n }\n const entry = this.track(view.id, null, view.owner, view, view.prefab);\n if (!view.prefab || !this.world) return;\n euler.setFromQuaternion(quat.set(view.qx, view.qy, view.qz, view.qw));\n void spawnPrefab(this.world, view.prefab, {\n position: { x: view.x, y: view.y, z: view.z },\n rotation: { x: euler.x, y: euler.y, z: euler.z },\n }).then((entityId) => {\n if (this.tracked.get(view.id) !== entry) {\n // removed while it loaded\n if (this.world) despawnPrefab(this.world, entityId);\n return;\n }\n this.bindEntity(entry, entityId);\n entry.buffer.push(this.now(), view);\n this.applyProps(entry, view.props);\n });\n }\n\n private entityChanged(view: NetEntityView) {\n const entry = this.tracked.get(view.id);\n if (!entry) return;\n entry.owner = view.owner;\n if (entry.entityId !== null && this.world) {\n const identity = this.world.getComponent(entry.entityId, NetworkIdentityComponent);\n if (identity) identity.owner = view.owner;\n }\n if (view.owner !== this.transport?.sessionId) entry.buffer.push(this.now(), view);\n this.applyProps(entry, view.props);\n }\n\n private entityRemoved(id: string) {\n const entry = this.tracked.get(id);\n if (!entry) return;\n this.tracked.delete(id);\n if (entry.entityId === null) return;\n this.byEntity.delete(entry.entityId);\n if (this.world) despawnPrefab(this.world, entry.entityId);\n }\n\n private applyProps(entry: Tracked, props: Record<string, string>) {\n if (entry.entityId === null || !this.world) return;\n for (const [key, json] of Object.entries(props)) {\n if (entry.props[key] === json) continue;\n entry.props[key] = json;\n const value = JSON.parse(json) as NetValue;\n let component = this.world.getComponent(entry.entityId, NetworkedPropsComponent);\n if (!component) {\n component = new NetworkedPropsComponent();\n this.world.addComponent(entry.entityId, component);\n }\n component.values[key] = value;\n this.dispatch(\"onNetworkProp\", key, value, entry.entityId);\n }\n }\n\n private corrected(id: string, pose: NetPose) {\n const entry = this.tracked.get(id);\n if (entry?.entityId == null || !this.world) return;\n const transform = this.world.getComponent(entry.entityId, TransformComponent);\n if (transform) applyPose(transform, pose, true);\n entry.sent = pose;\n }\n\n private heardSound(sound: NetSound) {\n const { id, volume, x, y, z } = sound;\n const placed = x !== undefined && y !== undefined && z !== undefined;\n this.world\n ?.getAudioSystem()\n ?.playSlot(id, { volume, position: placed ? { x, y, z } : undefined });\n }\n\n /** Where a player's character is: the first thing they spawned, which is their avatar. */\n private positionOf(peerId: string) {\n for (const entry of this.tracked.values()) {\n if (entry.owner !== peerId || !entry.prefab || entry.entityId === null) continue;\n const position = this.world?.getComponent(entry.entityId, TransformComponent)?.position;\n return position ? { x: position.x, y: position.y, z: position.z } : null;\n }\n return null;\n }\n\n private disconnected() {\n this.voice?.dispose();\n this.voice = null;\n this.transport = null;\n this.world?.setNetwork(null);\n }\n\n /** Call a Behaviour hook: on one entity's scripts, or every script. */\n private dispatch(hook: \"onPlayerJoin\" | \"onPlayerLeave\", id: string): void;\n private dispatch(hook: \"onNetworkProp\", key: string, value: NetValue, on: EntityId): void;\n private dispatch(hook: string, a: unknown, b?: unknown, on?: EntityId): void {\n const world = this.world;\n if (!world) return;\n const ids = on !== undefined ? [on] : world.query(ScriptComponent);\n for (const entityId of ids) {\n const instances = world.getComponent(entityId, ScriptComponent)?.scriptInstances;\n for (const instance of instances?.values() ?? []) {\n if (!(instance instanceof Behaviour)) continue;\n try {\n (instance as unknown as Record<string, (x: unknown, y: unknown) => void>)[hook]?.(a, b);\n } catch (error) {\n // one misbehaving script must never stop the rest hearing it\n reportBehaviourHookError(world, entityId, instance, hook, error);\n }\n }\n }\n }\n\n update(world: World): void {\n const transport = this.transport;\n if (!transport) return;\n const now = this.now();\n for (const entry of this.tracked.values()) {\n if (entry.entityId === null) continue;\n const settings = world.getComponent(entry.entityId, NetworkTransformComponent);\n if (!settings?.enabled) continue;\n const transform = world.getComponent(entry.entityId, TransformComponent);\n if (!transform) continue;\n if (entry.owner === transport.sessionId) {\n if (now - entry.sentAt < 1000 / settings.sendRate) continue;\n const pose = poseOf(transform);\n if (entry.sent && !moved(entry.sent, pose)) continue;\n entry.sentAt = now;\n entry.sent = pose;\n transport.sendPose(entry.id, pose);\n } else {\n const pose = entry.buffer.sample(now - settings.interpolationMs);\n if (pose) applyPose(transform, pose, settings.syncRotation);\n }\n }\n }\n\n dispose(): void {\n this.voice?.dispose();\n this.voice = null;\n this.transport?.leave();\n this.transport = null;\n this.world?.setNetwork(null);\n this.tracked.clear();\n this.byEntity.clear();\n this.handles.clear();\n this.listeners.clear();\n }\n\n private spawn(prefab: string | { path: string }, options: NetSpawnOptions = {}) {\n const p = options.position;\n const r = options.rotation;\n quat.setFromEuler(euler.set(r?.x ?? 0, r?.y ?? 0, r?.z ?? 0));\n this.transport?.spawn({\n prefab: typeof prefab === \"string\" ? prefab : prefab.path,\n props: encodeProps(options.props),\n x: p?.x ?? 0,\n y: p?.y ?? 0,\n z: p?.z ?? 0,\n qx: quat.x,\n qy: quat.y,\n qz: quat.z,\n qw: quat.w,\n });\n }\n\n handleFor(entityId: EntityId): NetworkHandle {\n const known = this.handles.get(entityId);\n if (known) return known;\n const self = this;\n const entry = () => self.byEntity.get(entityId);\n const handle: NetworkHandle = {\n get connected() {\n return self.transport !== null;\n },\n get sessionId() {\n return self.transport?.sessionId ?? \"\";\n },\n get isHost() {\n const t = self.transport;\n return Boolean(t) && t?.host === t?.sessionId;\n },\n get isOwner() {\n return entry()?.owner === self.transport?.sessionId;\n },\n get players() {\n return self.transport?.players ?? [];\n },\n get voice() {\n return self.voice;\n },\n send: (name, payload) => self.transport?.send(name, payload ?? null),\n playSlot: (id, options = {}) => {\n const played = self.world?.getAudioSystem()?.playSlot(id, options) ?? false;\n if (played) {\n const { volume, position } = options;\n self.transport?.sendSound({\n id,\n ...(volume === undefined ? {} : { volume }),\n ...(position ? { x: position.x, y: position.y, z: position.z } : {}),\n });\n }\n return played;\n },\n onMessage: (name, fn) => {\n const set = self.listeners.get(name) ?? new Set();\n self.listeners.set(name, set);\n set.add(fn);\n return () => set.delete(fn);\n },\n spawn: (prefab, options) => self.spawn(prefab, options),\n despawn: (id = entityId) => {\n const target = self.byEntity.get(id);\n if (target) self.transport?.despawn(target.id);\n },\n setProp: (key, value) => {\n const target = entry();\n if (!target || target.entityId === null || !self.world) return;\n const json = JSON.stringify(value);\n target.props[key] = json;\n let component = self.world.getComponent(target.entityId, NetworkedPropsComponent);\n if (!component) {\n component = new NetworkedPropsComponent();\n self.world.addComponent(target.entityId, component);\n }\n component.values[key] = value;\n self.transport?.setProp(target.id, key, json);\n },\n getProp: (key) =>\n self.world?.getComponent(entityId, NetworkedPropsComponent)?.values[key],\n };\n this.handles.set(entityId, handle);\n return handle;\n }\n}\n"]}
@@ -13436,9 +13436,14 @@ function uiImage(src) {
13436
13436
  const blob = await response.blob();
13437
13437
  const typed = /\.svg(\?|#|$)/i.test(url) ? new Blob([blob], { type: "image/svg+xml" }) : blob;
13438
13438
  const image = new Image();
13439
- image.src = URL.createObjectURL(typed);
13440
- await image.decode();
13441
- return image;
13439
+ const objectUrl = URL.createObjectURL(typed);
13440
+ try {
13441
+ image.src = objectUrl;
13442
+ await image.decode();
13443
+ return image;
13444
+ } finally {
13445
+ URL.revokeObjectURL(objectUrl);
13446
+ }
13442
13447
  })()
13443
13448
  ).then((image) => {
13444
13449
  entry.value = image;
@@ -15060,11 +15065,13 @@ var _pq = new THREE37__namespace.Quaternion();
15060
15065
  var _IKSystem = class _IKSystem {
15061
15066
  constructor() {
15062
15067
  this.runtimes = /* @__PURE__ */ new Map();
15063
- this.reach = /* @__PURE__ */ new Map();
15064
15068
  }
15065
- /** How far a limb's end stayed from its target last frame, in metres (0 = reached). */
15069
+ /**
15070
+ * How far a limb's end stayed from its target last frame, in metres
15071
+ * (0 = reached), or null if the limb's chain didn't run.
15072
+ */
15066
15073
  getReachError(entityId, limb) {
15067
- return this.reach.get(`${entityId}:${limb}`) ?? null;
15074
+ return this.runtimes.get(entityId)?.reach.get(limb) ?? null;
15068
15075
  }
15069
15076
  restore(runtime) {
15070
15077
  for (const [bone, w] of runtime.written) {
@@ -15090,13 +15097,14 @@ var _IKSystem = class _IKSystem {
15090
15097
  let runtime = this.runtimes.get(id);
15091
15098
  if (!runtime || runtime.rootUuid !== root.uuid) {
15092
15099
  if (runtime) this.restore(runtime);
15093
- runtime = { rootUuid: root.uuid, limbs: /* @__PURE__ */ new Map(), written: /* @__PURE__ */ new Map() };
15100
+ runtime = { rootUuid: root.uuid, limbs: /* @__PURE__ */ new Map(), written: /* @__PURE__ */ new Map(), reach: /* @__PURE__ */ new Map() };
15094
15101
  this.runtimes.set(id, runtime);
15095
15102
  }
15096
15103
  for (const [bone, w] of runtime.written) {
15097
15104
  if (bone.quaternion.equals(w.written)) bone.quaternion.copy(w.before);
15098
15105
  }
15099
15106
  runtime.written.clear();
15107
+ runtime.reach.clear();
15100
15108
  if (!ik.enabled) continue;
15101
15109
  const active = ik.chains.filter((c) => c.enabled && c.weight > 0 && typeof c.target === "number");
15102
15110
  if (active.length === 0) continue;
@@ -15126,7 +15134,7 @@ var _IKSystem = class _IKSystem {
15126
15134
  if (poleObject) poleObject.getWorldPosition(_p2);
15127
15135
  else lower.getWorldPosition(_p2);
15128
15136
  const miss = twoBoneIK(upper, lower, end, _t, _p2);
15129
- this.reach.set(`${id}:${chain.limb}`, Math.max(0, miss));
15137
+ runtime.reach.set(chain.limb, Math.max(0, miss));
15130
15138
  if (chain.matchRotation) {
15131
15139
  target.getWorldQuaternion(_q3);
15132
15140
  end.parent?.getWorldQuaternion(_pq);