@forgeax/engine-net 0.1.25 → 0.1.27

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.
package/dist/index.mjs CHANGED
@@ -1650,7 +1650,12 @@ function netPlugin(config) {
1650
1650
  name: "net-publish",
1651
1651
  queries: [],
1652
1652
  after: [FixedUpdate],
1653
- fn: (world2) => world2.getResource("net-session").publish()
1653
+ fn: (world2) => {
1654
+ const published = world2.getResource("net-session").publish();
1655
+ if (!published.ok && published.error.code === "recovery-rejected" && published.error.detail.reason === "ACK ledger bound reached")
1656
+ return;
1657
+ return published;
1658
+ }
1654
1659
  }).unwrap();
1655
1660
  return () => world.removeSystem(Update, "net-publish");
1656
1661
  }, "net/publish");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/endpoint/errors.ts","../src/endpoint/memory.ts","../src/replication/constants.ts","../src/replication/errors.ts","../src/replication/codec.ts","../src/replication/profile.ts","../src/replication/authority.ts","../src/replication/handshake.ts","../src/replication/replica.ts","../src/session/recovery.ts","../src/session/net-session.ts","../src/session/session-plugin.ts"],"names":["err","revived","ok","componentSchema","capacity","published","sent","sessionId","world"],"mappings":"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","file":"index.mjs","sourcesContent":["// @forgeax/engine-net -- endpoint structured errors.\n//\n// Closed union of transport-level failures. Each variant carries .code, .expected,\n// .hint, and per-code .detail. AI users exhaustively switch on .code without a\n// default branch (requirements AC-13).\n\nimport type { PeerId } from './endpoint';\n\n// ---------------------------------------------------------------------------\n// EndpointErrorCode -- closed 5-member union derived from endpointErrorPolicy\n// ---------------------------------------------------------------------------\n\n/** Transport-level endpoint error codes (requirements AC-02, AC-13). */\nexport type EndpointErrorCode = keyof typeof endpointErrorPolicy;\n\n// ---------------------------------------------------------------------------\n// Per-code detail payloads\n// ---------------------------------------------------------------------------\n\nexport interface EndpointDetailPeerNotFound {\n readonly peerId: PeerId;\n}\n\nexport interface EndpointDetailConnectionClosed {\n readonly peerId: PeerId;\n}\n\nexport interface EndpointDetailSendFailed {\n readonly peerId: PeerId;\n readonly cause: string;\n}\n\nexport interface EndpointDetailAlreadyClosed {\n readonly cause: string;\n}\n\nexport interface EndpointDetailConnectionFailed {\n readonly address: string;\n readonly cause: string;\n}\n\n// ---------------------------------------------------------------------------\n// Conditional resolver\n// ---------------------------------------------------------------------------\n\nexport type EndpointErrorDetailFor<C extends EndpointErrorCode> = C extends 'peer-not-found'\n ? EndpointDetailPeerNotFound\n : C extends 'connection-closed'\n ? EndpointDetailConnectionClosed\n : C extends 'send-failed'\n ? EndpointDetailSendFailed\n : C extends 'already-closed'\n ? EndpointDetailAlreadyClosed\n : C extends 'connection-failed'\n ? EndpointDetailConnectionFailed\n : never;\n\n/** Tagged union of all endpoint error detail variants. */\nexport type EndpointErrorDetail = EndpointErrorDetailFor<EndpointErrorCode>;\n\n// ---------------------------------------------------------------------------\n// Error class\n// ---------------------------------------------------------------------------\n\nclass EndpointErrorClass extends Error {\n readonly code: EndpointErrorCode;\n readonly expected: string;\n readonly hint: string;\n readonly detail: EndpointErrorDetail;\n\n constructor(args: {\n code: EndpointErrorCode;\n expected: string;\n hint: string;\n detail: EndpointErrorDetail;\n }) {\n let suffix = '';\n if (args.code === 'peer-not-found') {\n const d = args.detail as EndpointDetailPeerNotFound;\n suffix = ` (peerId=${d.peerId})`;\n } else if (args.code === 'connection-closed') {\n const d = args.detail as EndpointDetailConnectionClosed;\n suffix = ` (peerId=${d.peerId})`;\n } else if (args.code === 'send-failed') {\n const d = args.detail as EndpointDetailSendFailed;\n suffix = ` (peerId=${d.peerId}, cause=${d.cause})`;\n } else if (args.code === 'already-closed') {\n const d = args.detail as EndpointDetailAlreadyClosed;\n suffix = ` (cause=${d.cause})`;\n } else if (args.code === 'connection-failed') {\n const d = args.detail as EndpointDetailConnectionFailed;\n suffix = ` (address=${d.address}, cause=${d.cause})`;\n }\n super(`[EndpointError ${args.code}] expected: ${args.expected}; hint: ${args.hint}${suffix}`);\n this.name = 'EndpointError';\n this.code = args.code;\n this.expected = args.expected;\n this.hint = args.hint;\n this.detail = args.detail;\n }\n}\n\ntype EndpointErrorVariant<C extends EndpointErrorCode> = EndpointErrorClass & {\n readonly code: C;\n readonly detail: EndpointErrorDetailFor<C>;\n};\n\nexport type EndpointError = {\n [C in EndpointErrorCode]: EndpointErrorVariant<C>;\n}[EndpointErrorCode];\n\ninterface EndpointErrorConstructor {\n new <C extends EndpointErrorCode>(args: {\n code: C;\n expected: string;\n hint: string;\n detail: EndpointErrorDetailFor<C>;\n }): EndpointErrorVariant<C>;\n readonly prototype: EndpointErrorClass;\n}\n\nexport const EndpointError: EndpointErrorConstructor =\n EndpointErrorClass as unknown as EndpointErrorConstructor;\n\ntype EndpointErrorPolicy = { readonly expected: string; readonly hint: string };\n\nconst endpointErrorPolicy = {\n 'peer-not-found': {\n expected: 'the target peer must exist in the current connection set',\n hint: 'verify the PeerId is from a connect event; check that the peer has not disconnected',\n },\n 'connection-closed': {\n expected: 'the peer connection must be alive for the operation',\n hint: 'the peer disconnected; poll for a disconnect event and handle the lifecycle',\n },\n 'send-failed': {\n expected: 'message bytes must be delivered to the target peer or the connection must fail',\n hint: 'the memory connection is broken; the peer may have disconnected or the buffer is full',\n },\n 'already-closed': {\n expected: 'the endpoint must be open for any operation',\n hint: 'the endpoint is closed; create a new endpoint pair for further communication',\n },\n 'connection-failed': {\n expected:\n 'the endpoint factory must successfully establish a connection or bind to the listen address',\n hint: 'the initial connection or bind failed; verify the address is reachable and the port is not in use, then retry',\n },\n} satisfies Record<string, EndpointErrorPolicy>;\n\n/** Expected-invariant table per error code. */\nexport const ENDPOINT_EXPECTED: Readonly<Record<EndpointErrorCode, string>> = Object.fromEntries(\n Object.entries(endpointErrorPolicy).map(([code, policy]) => [code, policy.expected]),\n) as Readonly<Record<EndpointErrorCode, string>>;\n\n/** Actionable hint table per error code. */\nexport const ENDPOINT_ERROR_HINTS: Readonly<Record<EndpointErrorCode, string>> = Object.fromEntries(\n Object.entries(endpointErrorPolicy).map(([code, policy]) => [code, policy.hint]),\n) as Readonly<Record<EndpointErrorCode, string>>;\n\n/** Type guard for narrowing unknown to EndpointError. */\nexport function isEndpointError(err: unknown): err is EndpointError {\n return err instanceof EndpointErrorClass;\n}\n","// @forgeax/engine-net -- memory endpoint implementation.\n// Deterministic memory backend for the NetEndpoint contract.\n// (requirements AC-03, plan-strategy D-3)\n\nimport type { Result } from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\nimport type { EndpointEvent, NetEndpoint, NetEndpointConnector, PeerId } from './endpoint';\nimport type { EndpointError as EndpointErrorType } from './errors';\nimport { ENDPOINT_ERROR_HINTS, ENDPOINT_EXPECTED, EndpointError } from './errors';\n\ninterface InternalState {\n delayNext: boolean;\n duplicateNext: boolean;\n malformNext: boolean;\n}\n\nclass MemoryEndpoint implements NetEndpoint {\n readonly _peerId: PeerId;\n _remote: MemoryEndpoint | null = null;\n _closed = false;\n _remoteConnected = false;\n _incoming: EndpointEvent[] = [];\n _delayed: EndpointEvent[] = [];\n _state: InternalState = { delayNext: false, duplicateNext: false, malformNext: false };\n\n constructor(peerId: PeerId) {\n this._peerId = peerId;\n }\n\n poll(): EndpointEvent[] {\n if (this._closed) return [];\n const events = this._incoming.splice(0);\n this._incoming = this._delayed.splice(0);\n return events;\n }\n\n send(peerId: PeerId, data: Uint8Array): Result<void, EndpointErrorType> {\n if (this._closed) {\n return err(\n new EndpointError({\n code: 'already-closed',\n expected: ENDPOINT_EXPECTED['already-closed'],\n hint: ENDPOINT_ERROR_HINTS['already-closed'],\n detail: { cause: 'endpoint is closed' },\n }),\n );\n }\n if (!this._remote || this._remote._peerId !== peerId) {\n return err(\n new EndpointError({\n code: 'peer-not-found',\n expected: ENDPOINT_EXPECTED['peer-not-found'],\n hint: ENDPOINT_ERROR_HINTS['peer-not-found'],\n detail: { peerId },\n }),\n );\n }\n if (!this._remoteConnected) {\n return err(\n new EndpointError({\n code: 'connection-closed',\n expected: ENDPOINT_EXPECTED['connection-closed'],\n hint: ENDPOINT_ERROR_HINTS['connection-closed'],\n detail: { peerId },\n }),\n );\n }\n\n const deliver = (bytes: Uint8Array) => {\n if (this._state.delayNext) {\n this._remote?._delayed.push({ kind: 'message', peerId: this._peerId, data: bytes });\n this._state.delayNext = false;\n } else {\n this._remote?._incoming.push({ kind: 'message', peerId: this._peerId, data: bytes });\n }\n };\n\n if (this._state.malformNext) {\n const corrupted = new Uint8Array(data);\n if (corrupted.length > 0) {\n const firstByte = corrupted[0];\n if (firstByte !== undefined) corrupted[0] = firstByte ^ 0xff;\n }\n deliver(corrupted);\n this._state.malformNext = false;\n } else {\n deliver(data);\n if (this._state.duplicateNext) {\n this._state.duplicateNext = false;\n if (this._state.delayNext) {\n this._remote?._delayed.push({ kind: 'message', peerId: this._peerId, data });\n this._state.delayNext = false;\n } else {\n this._remote?._incoming.push({ kind: 'message', peerId: this._peerId, data });\n }\n }\n }\n\n return ok(undefined);\n }\n\n close(): Result<void, EndpointErrorType> {\n if (this._closed) {\n return err(\n new EndpointError({\n code: 'already-closed',\n expected: ENDPOINT_EXPECTED['already-closed'],\n hint: ENDPOINT_ERROR_HINTS['already-closed'],\n detail: { cause: 'endpoint is already closed' },\n }),\n );\n }\n this._closed = true;\n this._remoteConnected = false;\n if (this._remote && !this._remote._closed) {\n this._remote._remoteConnected = false;\n this._remote._incoming.push({ kind: 'peer-disconnected', peerId: this._peerId });\n }\n return ok(undefined);\n }\n\n _forceDisconnect(): void {\n if (this._remote && !this._remote._closed) {\n this._remote._remoteConnected = false;\n this._remote._incoming.push({ kind: 'peer-disconnected', peerId: this._peerId });\n }\n this._remoteConnected = false;\n }\n}\n\nexport function createMemoryEndpointPair(): [NetEndpoint, NetEndpoint] {\n const epA = new MemoryEndpoint(1 as PeerId);\n const epB = new MemoryEndpoint(2 as PeerId);\n epA._remote = epB;\n epB._remote = epA;\n epA._remoteConnected = true;\n epB._remoteConnected = true;\n epA._incoming.push({ kind: 'peer-connected', peerId: 2 as PeerId });\n epB._incoming.push({ kind: 'peer-connected', peerId: 1 as PeerId });\n return [epA, epB];\n}\n\nexport interface MemoryFaultController {\n delayNextDelivery(ms: number): void;\n duplicateNextDelivery(): void;\n malformNextDelivery(): void;\n disconnectPeer(endpoint: NetEndpoint): void;\n}\n\nexport function createMemoryEndpointPairWithController(): {\n readonly endpoints: [NetEndpoint, NetEndpoint];\n readonly controller: MemoryFaultController;\n} {\n const [epA, epB] = createMemoryEndpointPair();\n\n const controller: MemoryFaultController = {\n delayNextDelivery(_ms: number): void {\n (epA as MemoryEndpoint)._state.delayNext = true;\n },\n duplicateNextDelivery(): void {\n (epA as MemoryEndpoint)._state.duplicateNext = true;\n },\n malformNextDelivery(): void {\n (epA as MemoryEndpoint)._state.malformNext = true;\n },\n disconnectPeer(endpoint: NetEndpoint): void {\n (endpoint as MemoryEndpoint)._forceDisconnect();\n },\n };\n\n return { endpoints: [epA, epB], controller };\n}\n\n/** Create a replaceable, realm-neutral connector over a deterministic endpoint factory. */\nexport function createMemoryEndpointConnector(\n createEndpoint: () => NetEndpoint,\n): NetEndpointConnector {\n return {\n connect(signal) {\n if (signal.aborted)\n return Promise.resolve(\n err(\n new EndpointError({\n code: 'connection-failed',\n expected: ENDPOINT_EXPECTED['connection-failed'],\n hint: ENDPOINT_ERROR_HINTS['connection-failed'],\n detail: { address: 'memory', cause: 'connect aborted' },\n }),\n ),\n );\n return Promise.resolve(ok(createEndpoint()));\n },\n };\n}\n","/** The sole application replication protocol version published by net. */\nexport const REPLICATION_PROTOCOL_VERSION = 2;\n\n/** Fixed wire prefix used to reject non-v2 replication bytes before dispatch. */\nexport const REPLICATION_PROTOCOL_PREFIX = 'FXRP2';\n","export type NetErrorDetailByCode = {\n 'handshake-profile-mismatch': {\n readonly localFingerprint: string;\n readonly remoteFingerprint: string;\n };\n 'decode-invalid-payload': { readonly reason: string };\n 'decode-limit-exceeded': {\n readonly limit: string;\n readonly actual: number;\n readonly maximum: number;\n };\n 'ordering-invalid-tick': { readonly receivedTick: number; readonly lastTick: number };\n 'identity-invalid': { readonly id: number; readonly reason: string };\n 'schema-invalid': { readonly component: string; readonly reason: string };\n 'remap-unresolved-reference': { readonly id: number; readonly referencedId: number };\n 'apply-invariant-failed': { readonly reason: string };\n 'protocol-unsupported-version': {\n readonly receivedVersion: number;\n readonly supportedVersion: number;\n };\n 'session-illegal-transition': {\n readonly from: string;\n readonly to: string;\n };\n 'recovery-policy-invalid': {\n readonly field: string;\n readonly reason: string;\n };\n 'recovery-rejected': { readonly reason: string };\n 'recovery-exhausted': {\n readonly attempts: number;\n readonly maxAttempts: number;\n };\n};\n\nexport type NetErrorCode = keyof NetErrorDetailByCode;\nexport type NetErrorDetailFor<C extends NetErrorCode> = NetErrorDetailByCode[C];\nexport type NetErrorDetail = NetErrorDetailFor<NetErrorCode>;\n\nclass NetErrorClass extends Error {\n readonly code: NetErrorCode;\n readonly expected: string;\n readonly hint: string;\n readonly detail: NetErrorDetail;\n constructor(args: {\n code: NetErrorCode;\n expected: string;\n hint: string;\n detail: NetErrorDetail;\n }) {\n super(`[NetError ${args.code}] expected: ${args.expected}; hint: ${args.hint}`);\n this.name = 'NetError';\n this.code = args.code;\n this.expected = args.expected;\n this.hint = args.hint;\n this.detail = args.detail;\n }\n}\n\ntype Variant<C extends NetErrorCode> = NetErrorClass & {\n readonly code: C;\n readonly detail: NetErrorDetailFor<C>;\n};\n\nexport type NetError = {\n [C in NetErrorCode]: Variant<C>;\n}[NetErrorCode];\n\ninterface NetErrorConstructor {\n new <C extends NetErrorCode>(args: {\n code: C;\n expected: string;\n hint: string;\n detail: NetErrorDetailFor<C>;\n }): Variant<C>;\n readonly prototype: NetErrorClass;\n}\nexport const NetError: NetErrorConstructor = NetErrorClass as unknown as NetErrorConstructor;\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport { REPLICATION_PROTOCOL_PREFIX, REPLICATION_PROTOCOL_VERSION } from './constants';\nimport { NetError } from './errors';\nimport type { ReplicationLimits } from './profile';\nimport type { ReplicationDataPacket, ReplicationEntityRecord, ReplicationPacket } from './protocol';\n\nexport type { ReplicationComponentRecord, ReplicationEntityRecord } from './protocol';\n\ntype PortableTypedArray =\n | Float32Array\n | Float64Array\n | Int8Array\n | Int16Array\n | Int32Array\n | Uint8Array\n | Uint8ClampedArray\n | Uint16Array\n | Uint32Array;\n\nconst TYPED_ARRAYS = {\n Float32Array,\n Float64Array,\n Int8Array,\n Int16Array,\n Int32Array,\n Uint8Array,\n Uint8ClampedArray,\n Uint16Array,\n Uint32Array,\n} as const;\n\ntype TypedArrayName = keyof typeof TYPED_ARRAYS;\n\nconst PACKET_KINDS = [\n 'session-open',\n 'session-resume',\n 'baseline',\n 'delta',\n 'ack',\n 'rejection',\n] as const satisfies readonly ReplicationPacket['kind'][];\n\nconst REPLICATION_ENTITY_KINDS = [\n 'upsert',\n 'despawn',\n] as const satisfies readonly ReplicationEntityRecord['kind'][];\n\nfunction isPacketKind(value: unknown): value is ReplicationPacket['kind'] {\n return PACKET_KINDS.some((kind) => kind === value);\n}\n\nfunction isReplicationEntityKind(value: unknown): value is ReplicationEntityRecord['kind'] {\n return REPLICATION_ENTITY_KINDS.some((kind) => kind === value);\n}\n\nfunction isSafeNonNegativeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isSessionId(value: unknown): boolean {\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;\n}\n\nfunction typedArrayName(value: unknown): TypedArrayName | undefined {\n for (const [name, typedArrayConstructor] of Object.entries(TYPED_ARRAYS) as [\n TypedArrayName,\n (typeof TYPED_ARRAYS)[TypedArrayName],\n ][]) {\n if (value instanceof typedArrayConstructor) return name;\n }\n return undefined;\n}\n\nfunction canonicalize(value: unknown): unknown {\n const name = typedArrayName(value);\n if (name !== undefined)\n return { $typedArray: name, values: Array.from(value as PortableTypedArray) };\n if (Array.isArray(value)) return value.map(canonicalize);\n if (value !== null && typeof value === 'object')\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, canonicalize((value as Record<string, unknown>)[key])]),\n );\n return value;\n}\n\nfunction reviveTypedArrays(\n value: unknown,\n): { readonly value: unknown } | { readonly reason: string } {\n if (Array.isArray(value)) {\n const values: unknown[] = [];\n for (const item of value) {\n const revived = reviveTypedArrays(item);\n if ('reason' in revived) return revived;\n values.push(revived.value);\n }\n return { value: values };\n }\n if (value === null || typeof value !== 'object') return { value };\n const record = value as Record<string, unknown>;\n if ('$typedArray' in record) {\n if (\n Object.keys(record).length !== 2 ||\n typeof record.$typedArray !== 'string' ||\n !Array.isArray(record.values)\n )\n return { reason: 'typed-array tag must contain only an allowlisted name and values array' };\n const typedArrayConstructor = TYPED_ARRAYS[record.$typedArray as TypedArrayName];\n if (\n typedArrayConstructor === undefined ||\n record.values.some((item) => typeof item !== 'number')\n )\n return { reason: 'typed-array tag contains an unsupported type or non-numeric value' };\n return { value: new typedArrayConstructor(record.values) };\n }\n const revived: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(record)) {\n const nested = reviveTypedArrays(item);\n if ('reason' in nested) return nested;\n revived[key] = nested.value;\n }\n return { value: revived };\n}\n\nfunction limitError(limit: string, actual: number, maximum: number): NetError {\n return new NetError({\n code: 'decode-limit-exceeded',\n expected: `${limit} must not exceed ${maximum}`,\n hint: 'reduce the replicated payload or configure matching declared limits',\n detail: { limit, actual, maximum },\n });\n}\n\nfunction invalid(reason: string): NetError {\n return new NetError({\n code: 'decode-invalid-payload',\n expected: `a version ${REPLICATION_PROTOCOL_VERSION} ${REPLICATION_PROTOCOL_PREFIX} packet`,\n hint: 'send bytes produced by the protocol-v2 replication codec',\n detail: { reason },\n });\n}\n\nfunction validateEntities(entities: readonly ReplicationEntityRecord[]): string | undefined {\n const ids = new Set<number>();\n for (const [entityIndex, entity] of entities.entries()) {\n if (\n entity === null ||\n typeof entity !== 'object' ||\n !isSafeNonNegativeInteger(entity.id) ||\n !isReplicationEntityKind(entity.kind) ||\n !Array.isArray(entity.components) ||\n ids.has(entity.id)\n )\n return `entity record ${entityIndex} has an invalid or duplicate identity`;\n ids.add(entity.id);\n for (const [componentIndex, component] of entity.components.entries()) {\n if (\n component === null ||\n typeof component !== 'object' ||\n typeof component.name !== 'string' ||\n component.name.length === 0 ||\n (component.operation !== undefined &&\n component.operation !== 'replace' &&\n component.operation !== 'remove') ||\n component.data === null ||\n typeof component.data !== 'object' ||\n Array.isArray(component.data) ||\n (component.operation === 'remove' && Object.keys(component.data).length !== 0)\n )\n return `component record ${entityIndex}:${componentIndex} has invalid fields`;\n }\n }\n return undefined;\n}\n\nfunction validatePacket(packet: ReplicationPacket): string | undefined {\n if (packet.version !== REPLICATION_PROTOCOL_VERSION)\n return 'packet protocol version is unsupported';\n if (!isPacketKind(packet.kind)) return 'packet kind is unsupported';\n if (!isSessionId(packet.sessionId)) return 'sessionId must be a positive safe integer';\n if (!isSafeNonNegativeInteger(packet.epoch)) return 'epoch must be a non-negative safe integer';\n if (packet.kind === 'session-open' || packet.kind === 'session-resume')\n return packet.sequence === 0 ? undefined : 'session control sequence must be zero';\n if (packet.kind === 'ack')\n return isSafeNonNegativeInteger(packet.acknowledgedSequence)\n ? undefined\n : 'acknowledgedSequence must be a non-negative safe integer';\n if (!isSafeNonNegativeInteger(packet.sequence) || packet.sequence === 0)\n return 'sequence must be a positive safe integer';\n if (packet.kind === 'baseline' && packet.sequence !== 1) return 'baseline sequence must be one';\n if (packet.kind === 'rejection') {\n if (!isPacketKind(packet.rejectedKind) || typeof packet.reason !== 'string')\n return 'rejection details are invalid';\n return undefined;\n }\n if (packet.kind !== 'baseline' && packet.kind !== 'delta')\n return 'packet kind does not carry a data payload';\n if (typeof packet.tick !== 'number' || !Number.isSafeInteger(packet.tick))\n return 'tick must be a safe integer';\n if (typeof packet.fingerprint !== 'string') return 'fingerprint must be a string';\n return validateEntities(packet.entities);\n}\n\nfunction validateLimits(\n packet: ReplicationDataPacket,\n bytes: Uint8Array | undefined,\n limits: ReplicationLimits,\n): NetError | null {\n if (bytes !== undefined && bytes.byteLength > limits.maxMessageBytes)\n return limitError('maxMessageBytes', bytes.byteLength, limits.maxMessageBytes);\n if (packet.entities.length > limits.maxEntities)\n return limitError('maxEntities', packet.entities.length, limits.maxEntities);\n let operations = 0;\n const visit = (value: unknown): NetError | null => {\n if (\n typeof value === 'string' &&\n new TextEncoder().encode(value).byteLength > limits.maxStringBytes\n )\n return limitError(\n 'maxStringBytes',\n new TextEncoder().encode(value).byteLength,\n limits.maxStringBytes,\n );\n const typedArray = typedArrayName(value);\n if (typedArray !== undefined) {\n const contents = value as PortableTypedArray;\n if (contents.byteLength > limits.maxBufferBytes)\n return limitError('maxBufferBytes', contents.byteLength, limits.maxBufferBytes);\n if (contents.length > limits.maxArrayElements)\n return limitError('maxArrayElements', contents.length, limits.maxArrayElements);\n return null;\n }\n if (Array.isArray(value)) {\n if (value.length > limits.maxArrayElements)\n return limitError('maxArrayElements', value.length, limits.maxArrayElements);\n for (const item of value) {\n const problem = visit(item);\n if (problem) return problem;\n }\n }\n if (value !== null && typeof value === 'object' && !(value instanceof Uint8Array))\n for (const item of Object.values(value as Record<string, unknown>)) {\n const problem = visit(item);\n if (problem) return problem;\n }\n return null;\n };\n for (const entity of packet.entities) {\n operations += entity.components.length;\n for (const component of entity.components) {\n const problem = visit(component.data);\n if (problem) return problem;\n }\n }\n return operations > limits.maxComponentOperations\n ? limitError('maxComponentOperations', operations, limits.maxComponentOperations)\n : null;\n}\n\nfunction parse(\n bytes: Uint8Array,\n): { readonly packet: ReplicationPacket } | { readonly error: NetError } {\n const text = new TextDecoder().decode(bytes);\n const separator = text.indexOf('\\n');\n if (separator < 0 || text.slice(0, separator) !== REPLICATION_PROTOCOL_PREFIX)\n return { error: invalid('packet prefix does not match protocol-v2') };\n try {\n const decoded: unknown = JSON.parse(text.slice(separator + 1));\n const revived = reviveTypedArrays(decoded);\n if ('reason' in revived) return { error: invalid(revived.reason) };\n if (revived.value === null || typeof revived.value !== 'object')\n return { error: invalid('packet must be an object') };\n const packet = revived.value as ReplicationPacket;\n const reason = validatePacket(packet);\n if (reason !== undefined) {\n if (typeof packet.version === 'number' && packet.version !== REPLICATION_PROTOCOL_VERSION)\n return {\n error: new NetError({\n code: 'protocol-unsupported-version',\n expected: `protocol version ${REPLICATION_PROTOCOL_VERSION}`,\n hint: 'upgrade the peer before sending replicated bytes',\n detail: {\n receivedVersion: packet.version,\n supportedVersion: REPLICATION_PROTOCOL_VERSION,\n },\n }),\n };\n return { error: invalid(reason) };\n }\n return { packet };\n } catch {\n return { error: invalid('payload is not valid JSON') };\n }\n}\n\nfunction isDataPacket(packet: ReplicationPacket): packet is ReplicationDataPacket {\n return packet.kind === 'baseline' || packet.kind === 'delta';\n}\n\nexport function encodeReplicationPacket(\n packet: ReplicationPacket,\n limits: ReplicationLimits,\n): Result<Uint8Array, NetError> {\n const reason = validatePacket(packet);\n if (reason !== undefined) return err(invalid(reason));\n const body = JSON.stringify(canonicalize(packet));\n const bytes = new TextEncoder().encode(`${REPLICATION_PROTOCOL_PREFIX}\\n${body}`);\n const failure = isDataPacket(packet) ? validateLimits(packet, bytes, limits) : null;\n return failure ? err(failure) : ok(bytes);\n}\n\nexport function decodeReplicationPacket(\n bytes: Uint8Array,\n limits: ReplicationLimits,\n): Result<ReplicationPacket, NetError> {\n if (bytes.byteLength > limits.maxMessageBytes)\n return err(limitError('maxMessageBytes', bytes.byteLength, limits.maxMessageBytes));\n const parsed = parse(bytes);\n if ('error' in parsed) return err(parsed.error);\n const failure = isDataPacket(parsed.packet) ? validateLimits(parsed.packet, bytes, limits) : null;\n return failure ? err(failure) : ok(parsed.packet);\n}\n","import type { Component } from '@forgeax/engine-ecs';\nimport { validateProfileComponents } from '@forgeax/engine-ecs/externalization';\nimport { componentSchema } from '@forgeax/engine-ecs/internal';\nimport { err, ok, type Result } from '@forgeax/engine-types';\nexport interface ReplicationLimits {\n readonly maxMessageBytes: number;\n readonly maxEntities: number;\n readonly maxComponentOperations: number;\n readonly maxStringBytes: number;\n readonly maxBufferBytes: number;\n readonly maxArrayElements: number;\n}\nexport const DEFAULT_REPLICATION_LIMITS: ReplicationLimits = {\n maxMessageBytes: 64 * 1024,\n maxEntities: 1024,\n maxComponentOperations: 4096,\n maxStringBytes: 4096,\n maxBufferBytes: 16 * 1024,\n maxArrayElements: 1024,\n};\n\nimport { NetError } from './errors';\n\nexport interface ReplicationProfile {\n readonly name: string;\n readonly entities: ReplicationEntityFilter;\n readonly components: readonly Component[];\n readonly limits: ReplicationLimits;\n readonly fingerprint: string;\n}\nexport interface ReplicationEntityFilter {\n readonly with: readonly Component[];\n readonly without?: readonly Component[];\n}\nexport interface DefineReplicationOptions {\n readonly name: string;\n readonly entities: ReplicationEntityFilter;\n readonly components: readonly Component[];\n readonly limits?: Partial<ReplicationLimits>;\n}\nfunction hash(text: string): string {\n let value = 2166136261;\n for (const char of text) {\n value ^= char.charCodeAt(0);\n value = Math.imul(value, 16777619);\n }\n return (value >>> 0).toString(16).padStart(8, '0');\n}\n\nfunction immutableProfile(\n options: DefineReplicationOptions,\n limits: ReplicationLimits,\n fingerprint: string,\n): ReplicationProfile {\n const entities: ReplicationEntityFilter = Object.freeze({\n with: Object.freeze([...options.entities.with]),\n ...(options.entities.without === undefined\n ? {}\n : { without: Object.freeze([...options.entities.without]) }),\n });\n return Object.freeze({\n name: options.name,\n entities,\n components: Object.freeze([...options.components]),\n limits: Object.freeze({ ...limits }),\n fingerprint,\n });\n}\n\nexport function defineReplication(\n options: DefineReplicationOptions,\n): Result<ReplicationProfile, NetError> {\n const portable = validateProfileComponents(options.components);\n if (!portable.valid) {\n const first = portable.errors[0];\n if (first === undefined) {\n return err(\n new NetError({\n code: 'schema-invalid',\n expected: 'portable replication components',\n hint: 'select only components accepted by the ECS externalization kernel',\n detail: { component: '', reason: 'portable validation failed without a diagnostic' },\n }),\n );\n }\n return err(\n new NetError({\n code: 'schema-invalid',\n expected: first.expected,\n hint: first.hint,\n detail: { component: first.component, reason: first.code },\n }),\n );\n }\n const limits: ReplicationLimits = { ...DEFAULT_REPLICATION_LIMITS, ...options.limits };\n const signature = JSON.stringify({\n name: options.name,\n query: {\n with: options.entities.with.map((component) => component.name),\n ...(options.entities.without === undefined\n ? {}\n : { without: options.entities.without.map((component) => component.name) }),\n },\n components: options.components.map((component) => ({\n name: component.name,\n schema: componentSchema(component),\n })),\n limits,\n });\n return ok(immutableProfile(options, limits, hash(signature)));\n}\n","import type { EntityHandle, World } from '@forgeax/engine-ecs';\nimport { projectComponentData } from '@forgeax/engine-ecs/externalization';\nimport { err, ok, type Result } from '@forgeax/engine-types';\nimport type { SessionId } from '../session/recovery';\nimport { encodeReplicationPacket } from './codec';\nimport { REPLICATION_PROTOCOL_VERSION } from './constants';\nimport type { NetError } from './errors';\nimport { DEFAULT_REPLICATION_LIMITS, type ReplicationProfile } from './profile';\nimport type {\n ReplicationComponentRecord,\n ReplicationDataPacket,\n ReplicationEntityRecord,\n} from './protocol';\n\nexport type PublishedPacket = ReplicationDataPacket & {\n readonly bytes: Uint8Array;\n};\ninterface KnownEntity {\n readonly id: number;\n readonly components: Map<string, string>;\n}\nfunction stable(value: unknown): string {\n return JSON.stringify(value);\n}\n\nexport class AuthorityCoordinator {\n readonly #world: World;\n readonly #profile: ReplicationProfile;\n readonly #ids = new Map<EntityHandle, number>();\n readonly #known = new Map<EntityHandle, KnownEntity>();\n #nextId = 1;\n #tick = 0;\n #epoch = 0;\n #sequence = 0;\n readonly #sessionId: SessionId;\n constructor(world: World, profile: ReplicationProfile, sessionId: SessionId = 1 as SessionId) {\n this.#world = world;\n this.#profile = profile;\n this.#sessionId = sessionId;\n }\n idFor(entity: EntityHandle): number {\n return this.#ids.get(entity) ?? 0;\n }\n publish(): Result<PublishedPacket, NetError> {\n return this.#publish(false);\n }\n publishFull(): Result<PublishedPacket, NetError> {\n return this.#publish(true);\n }\n nextPublicationEpoch(forceFull = false): number {\n return forceFull && this.#tick > 0 ? this.#epoch + 1 : this.#epoch;\n }\n #publish(forceFull: boolean): Result<PublishedPacket, NetError> {\n const candidateIds = new Map(this.#ids);\n let candidateNextId = this.#nextId;\n const current = new Map<\n EntityHandle,\n { id: number; components: ReplicationComponentRecord[] }\n >();\n const query = this.#world.query(this.#profile.entities).unwrap();\n // Allocate every visible entity id before projecting any component data.\n // Query iteration visits storage groups independently, so projecting while\n // discovering ids can encode references to a later chunk as zero.\n for (const row of query) {\n if (!candidateIds.has(row.entity)) candidateIds.set(row.entity, candidateNextId++);\n }\n for (const row of query) {\n const entity = row.entity;\n const components: ReplicationComponentRecord[] = [];\n for (const component of this.#profile.components) {\n const raw = this.#world.get(entity, component);\n if (raw.ok) {\n components.push({\n name: component.name,\n data: projectComponentData(\n component,\n raw.value as Record<string, unknown>,\n (reference) => candidateIds.get(reference as EntityHandle) ?? 0,\n ),\n });\n }\n }\n const id = candidateIds.get(entity);\n if (id !== undefined) current.set(entity, { id, components });\n }\n\n const full = forceFull || this.#tick === 0;\n let nextEpoch = this.#epoch;\n let nextSequence = this.#sequence;\n if (forceFull && this.#tick > 0) {\n nextEpoch += 1;\n nextSequence = 0;\n }\n if (full && nextSequence === 0) nextSequence = 1;\n else nextSequence += 1;\n const entities: ReplicationEntityRecord[] = [];\n for (const [entity, entry] of current) {\n const prior = this.#known.get(entity);\n const components =\n full || prior === undefined\n ? entry.components\n : [\n ...entry.components.filter(\n (component) => prior.components.get(component.name) !== stable(component.data),\n ),\n ...[...prior.components.keys()]\n .filter((name) => !entry.components.some((component) => component.name === name))\n .map((name) => ({ name, operation: 'remove' as const, data: {} })),\n ];\n if (full || prior === undefined || components.length > 0)\n entities.push({ id: entry.id, kind: 'upsert', components });\n }\n // A full baseline is consumed by a fresh replica, so it must describe\n // only live entities. Despawn records refer to the previous authority\n // baseline and would be unknown identities on a late-joining replica.\n if (!full)\n for (const [entity, prior] of this.#known) {\n if (!current.has(entity)) entities.push({ id: prior.id, kind: 'despawn', components: [] });\n }\n\n const candidateKnown = new Map<EntityHandle, KnownEntity>();\n for (const [entity, entry] of current) {\n candidateKnown.set(entity, {\n id: entry.id,\n components: new Map(\n entry.components.map((component) => [component.name, stable(component.data)]),\n ),\n });\n }\n for (const [entity] of candidateIds) {\n if (!current.has(entity)) candidateIds.delete(entity);\n }\n\n const packet: ReplicationDataPacket = full\n ? {\n version: REPLICATION_PROTOCOL_VERSION,\n kind: 'baseline',\n sessionId: this.#sessionId,\n epoch: nextEpoch,\n sequence: nextSequence as 1,\n fingerprint: this.#profile.fingerprint,\n tick: this.#tick + 1,\n entities,\n }\n : {\n version: REPLICATION_PROTOCOL_VERSION,\n kind: 'delta',\n sessionId: this.#sessionId,\n epoch: nextEpoch,\n sequence: nextSequence,\n fingerprint: this.#profile.fingerprint,\n tick: this.#tick + 1,\n entities,\n };\n const encoded = encodeReplicationPacket(\n packet,\n this.#profile.limits ?? DEFAULT_REPLICATION_LIMITS,\n );\n if (!encoded.ok) return err(encoded.error);\n\n this.#ids.clear();\n for (const [entity, id] of candidateIds) this.#ids.set(entity, id);\n this.#known.clear();\n for (const [entity, known] of candidateKnown) this.#known.set(entity, known);\n this.#nextId = candidateNextId;\n this.#tick = packet.tick;\n this.#epoch = nextEpoch;\n this.#sequence = nextSequence;\n return ok({ ...packet, bytes: encoded.value });\n }\n}\nexport function createAuthorityCoordinator(\n world: World,\n profile: ReplicationProfile,\n): AuthorityCoordinator {\n return new AuthorityCoordinator(world, profile);\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport { NetError } from './errors';\nimport type { ReplicationProfile } from './profile';\nexport function validateHandshake(\n local: ReplicationProfile,\n remote: ReplicationProfile,\n): Result<void, NetError> {\n if (local.fingerprint !== remote.fingerprint)\n return err(\n new NetError({\n code: 'handshake-profile-mismatch',\n expected: 'matching protocol, profile, and declared limits',\n hint: 'use identical ordered replication components and limits on both peers',\n detail: { localFingerprint: local.fingerprint, remoteFingerprint: remote.fingerprint },\n }),\n );\n return ok(undefined);\n}\n","import type { Component, EntityHandle, World } from '@forgeax/engine-ecs';\nimport { classifyEntityField } from '@forgeax/engine-ecs/externalization';\nimport { componentSchema } from '@forgeax/engine-ecs/internal';\nimport { err, ok, type Result } from '@forgeax/engine-types';\nimport type { NetEndpoint } from '../endpoint/endpoint';\nimport { decodeReplicationPacket } from './codec';\nimport { NetError } from './errors';\nimport type { ReplicationLimits, ReplicationProfile } from './profile';\nimport type { ReplicationDataPacket } from './protocol';\n\nexport class ReplicaCoordinator {\n readonly #world: World;\n readonly #profile: ReplicationProfile;\n readonly #entities = new Map<number, EntityHandle>();\n #lastTick = 0;\n #epoch = -1;\n #lastSequence = 0;\n #lastPacketOutcome: 'accepted' | 'duplicate' | 'ignored-old-epoch' = 'accepted';\n #stopped = false;\n constructor(world: World, profile: ReplicationProfile, _endpoint?: unknown) {\n this.#world = world;\n this.#profile = profile;\n }\n entityFor(id: number): EntityHandle | undefined {\n return this.#entities.get(id);\n }\n readComponent(id: number, component: Component): Record<string, unknown> | undefined {\n const entity = this.#entities.get(id);\n if (entity === undefined) return undefined;\n const read = this.#world.get(entity, component);\n return read.ok ? (read.value as Record<string, unknown>) : undefined;\n }\n snapshot(): readonly { id: number; components: readonly string[] }[] {\n return [...this.#entities]\n .map(([id, entity]) => ({\n id,\n components: this.#profile.components\n .filter((component) => this.#world.get(entity, component).ok)\n .map((component) => component.name),\n }))\n .sort((a, b) => a.id - b.id);\n }\n disconnect(): void {}\n /** Remove the last replica baseline when the authority connection closes. */\n clear(): void {\n for (const entity of this.#entities.values()) this.#world.despawn(entity).unwrap();\n this.#entities.clear();\n }\n get stopped(): boolean {\n return this.#stopped;\n }\n get tick(): number {\n return this.#lastTick;\n }\n /** Report the last accepted, duplicate, or stale-epoch packet decision. */\n get lastPacketOutcome(): 'accepted' | 'duplicate' | 'ignored-old-epoch' {\n return this.#lastPacketOutcome;\n }\n getPendingUnresolvedReferences(): number {\n return 0;\n }\n #entityReferences(value: unknown): readonly unknown[] {\n if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n return Array.from(value as ArrayLike<unknown>);\n }\n return [];\n }\n validate(packet: ReplicationDataPacket): NetError | null {\n this.#lastPacketOutcome = 'accepted';\n if (this.#stopped)\n return new NetError({\n code: 'apply-invariant-failed',\n expected: 'an active replica coordinator',\n hint: 'create a new session after a fatal apply failure',\n detail: { reason: 'replication stopped' },\n });\n if (packet.fingerprint !== this.#profile.fingerprint)\n return new NetError({\n code: 'schema-invalid',\n expected: 'a batch for the negotiated replication profile',\n hint: 'complete handshake before applying replication bytes',\n detail: { component: '', reason: 'fingerprint mismatch' },\n });\n const newEpoch = packet.epoch > this.#epoch;\n if (this.#epoch < 0 && packet.kind !== 'baseline')\n return new NetError({\n code: 'session-illegal-transition',\n expected: 'a baseline before any delta in a session epoch',\n hint: 'accept a complete authoritative baseline before applying deltas',\n detail: { from: 'connecting', to: packet.kind },\n });\n if (packet.epoch > this.#epoch && (packet.kind !== 'baseline' || packet.sequence !== 1))\n return new NetError({\n code: 'session-illegal-transition',\n expected: 'a sequence-one baseline at the start of a new epoch',\n hint: 'request a fresh baseline before applying the next delta',\n detail: { from: 'resyncing', to: packet.kind },\n });\n if (packet.epoch < this.#epoch) return null;\n if (packet.kind === 'baseline' && !newEpoch && this.#lastSequence >= 1) {\n this.#lastPacketOutcome = 'duplicate';\n return null;\n }\n if (packet.kind === 'delta' && packet.sequence <= this.#lastSequence) {\n this.#lastPacketOutcome = 'duplicate';\n return null;\n }\n if (packet.kind === 'delta' && packet.sequence !== this.#lastSequence + 1)\n return new NetError({\n code: 'ordering-invalid-tick',\n expected: 'the next contiguous replication sequence',\n hint: 'request a fresh baseline when a sequence gap is detected',\n detail: { receivedTick: packet.sequence, lastTick: this.#lastSequence },\n });\n if (!newEpoch && packet.tick <= this.#lastTick)\n return new NetError({\n code: 'ordering-invalid-tick',\n expected: 'a strictly monotonic authority tick',\n hint: 'discard duplicate, stale, and out-of-order batches',\n detail: { receivedTick: packet.tick, lastTick: this.#lastTick },\n });\n const batchIds = new Set<number>();\n const knownIds = newEpoch ? new Set<number>() : new Set(this.#entities.keys());\n for (const record of packet.entities) {\n if (!Number.isSafeInteger(record.id) || record.id <= 0 || batchIds.has(record.id))\n return new NetError({\n code: 'identity-invalid',\n expected: 'unique non-zero NetEntityId values',\n hint: 'use session-issued identity values exactly once per batch',\n detail: { id: record.id, reason: 'zero, invalid, or duplicate identity' },\n });\n batchIds.add(record.id);\n }\n for (const record of packet.entities) {\n if (record.kind === 'despawn' && !knownIds.has(record.id))\n return new NetError({\n code: 'identity-invalid',\n expected: 'a known identity for despawn',\n hint: 'do not reuse or despawn unknown network identities',\n detail: { id: record.id, reason: 'unknown identity' },\n });\n for (const entry of record.components) {\n const component = this.#profile.components.find(\n (candidate) => candidate.name === entry.name,\n );\n if (component === undefined)\n return new NetError({\n code: 'schema-invalid',\n expected: 'a component selected by the negotiated profile',\n hint: 'send only components from the ordered replication profile',\n detail: { component: entry.name, reason: 'unselected component' },\n });\n if (entry.operation === 'remove') continue;\n for (const [field, value] of Object.entries(entry.data)) {\n if (!(field in componentSchema(component)))\n return new NetError({\n code: 'schema-invalid',\n expected: 'component fields declared by the negotiated ECS schema',\n hint: 'send only fields declared by the replicated component token',\n detail: { component: entry.name, reason: `unknown field ${field}` },\n });\n const kind = classifyEntityField(component, field);\n const refs = kind?.isArray ? this.#entityReferences(value) : kind ? [value] : [];\n for (const reference of refs)\n if (\n reference !== null &&\n (typeof reference !== 'number' ||\n reference === 0 ||\n (!knownIds.has(reference) && !batchIds.has(reference)))\n )\n return new NetError({\n code: 'remap-unresolved-reference',\n expected: 'every entity reference to resolve in the current or same batch',\n hint: 'include the referenced spawn in this batch; cross-batch pending references are unsupported',\n detail: { id: record.id, referencedId: Number(reference) },\n });\n }\n }\n }\n return null;\n }\n apply(packet: ReplicationDataPacket): Result<void, NetError> {\n const failure = this.validate(packet);\n if (failure) {\n return err(failure);\n }\n if (packet.epoch < this.#epoch) {\n this.#lastPacketOutcome = 'ignored-old-epoch';\n return ok(undefined);\n }\n if (this.#lastPacketOutcome === 'duplicate') return ok(undefined);\n const replacingEpoch = packet.epoch > this.#epoch;\n try {\n if (replacingEpoch) {\n for (const entity of this.#entities.values()) this.#world.despawn(entity).unwrap();\n this.#entities.clear();\n }\n for (const record of packet.entities)\n if (record.kind === 'upsert' && !this.#entities.has(record.id))\n this.#entities.set(record.id, this.#world.spawn().unwrap());\n for (const record of packet.entities)\n if (record.kind === 'upsert') {\n const entity = this.#entities.get(record.id);\n if (entity === undefined) throw new Error(`missing allocated entity ${record.id}`);\n for (const entry of record.components) {\n const component = this.#profile.components.find(\n (candidate) => candidate.name === entry.name,\n );\n if (component === undefined) throw new Error(`missing profile component ${entry.name}`);\n if (entry.operation === 'remove') {\n const removal = this.#world.removeComponent(entity, component);\n if (!removal.ok) throw removal.error;\n continue;\n }\n const data = Object.fromEntries(\n Object.entries(entry.data).map(([field, value]) => {\n const kind = classifyEntityField(component, field);\n if (kind === null) return [field, value];\n const mapped = kind.isArray\n ? this.#entityReferences(value).map((id) => {\n if (id === null) return null;\n const reference = this.#entities.get(id as number);\n if (reference === undefined)\n throw new Error(`missing entity reference ${id}`);\n return reference;\n })\n : value === null\n ? null\n : this.#entities.get(value as number);\n if (mapped === undefined) throw new Error(`missing entity reference ${value}`);\n return [field, mapped];\n }),\n );\n const typedData = data as never;\n const exists = this.#world.get(entity, component);\n const write = exists.ok\n ? this.#world.set(entity, component, typedData)\n : this.#world.addComponent(entity, { component, data: typedData });\n if (!write.ok) throw write.error;\n }\n }\n for (const record of packet.entities)\n if (record.kind === 'despawn') {\n const entity = this.#entities.get(record.id);\n if (entity === undefined) throw new Error(`missing despawn entity ${record.id}`);\n this.#world.despawn(entity).unwrap();\n this.#entities.delete(record.id);\n }\n this.#epoch = packet.epoch;\n this.#lastSequence = packet.sequence;\n this.#lastTick = packet.tick;\n this.#lastPacketOutcome = 'accepted';\n return ok(undefined);\n } catch (cause) {\n this.#stopped = true;\n return err(\n new NetError({\n code: 'apply-invariant-failed',\n expected: 'ECS apply invariants to accept a validated batch',\n hint: 'stop this replication session and inspect the ECS error',\n detail: { reason: cause instanceof Error ? cause.message : String(cause) },\n }),\n );\n }\n }\n}\nexport function createReplicaCoordinator(\n world: World,\n profile: ReplicationProfile,\n endpoint?: NetEndpoint,\n): ReplicaCoordinator {\n return new ReplicaCoordinator(world, profile, endpoint);\n}\nexport function applyReplicationPacket(\n replica: ReplicaCoordinator,\n packet: ReplicationDataPacket,\n): Result<void, NetError> {\n return replica.apply(packet);\n}\n\nexport function decodeAndApplyReplicationPacket(\n replica: ReplicaCoordinator,\n bytes: Uint8Array,\n limits: ReplicationLimits,\n): Result<void, NetError> {\n const decoded = decodeReplicationPacket(bytes, limits);\n if (!decoded.ok) {\n return err(decoded.error);\n }\n if (decoded.value.kind !== 'baseline' && decoded.value.kind !== 'delta') {\n return err(\n new NetError({\n code: 'decode-invalid-payload',\n expected: 'a baseline or delta replication packet',\n hint: 'apply only data packets through the replica coordinator',\n detail: { reason: 'control packet cannot be applied as ECS data' },\n }),\n );\n }\n return replica.apply(decoded.value);\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport type { NetEndpointConnector } from '../endpoint/endpoint';\nimport type { EndpointError } from '../endpoint/errors';\nimport { NetError, type NetErrorCode } from '../replication/errors';\n\ndeclare const sessionIdBrand: unique symbol;\n\n/** Authority-issued application identity; it is distinct from transport PeerId. */\nexport type SessionId = number & { readonly [sessionIdBrand]: true };\n\nexport type NetSessionStateKind =\n | 'connecting'\n | 'resyncing'\n | 'active'\n | 'recovering'\n | 'failed'\n | 'retired';\n\nexport type NetSessionFailure = NetError | EndpointError;\n\n/** Public lifecycle state owned by one logical session. */\nexport type NetSessionState =\n | { readonly kind: 'connecting'; readonly sessionId: SessionId }\n | { readonly kind: 'resyncing'; readonly sessionId: SessionId; readonly epoch: number }\n | {\n readonly kind: 'active';\n readonly sessionId: SessionId;\n readonly epoch: number;\n readonly sequence: number;\n }\n | {\n readonly kind: 'recovering';\n readonly sessionId: SessionId;\n readonly epoch: number;\n readonly attempt: number;\n }\n | {\n readonly kind: 'failed';\n readonly sessionId: SessionId;\n readonly error: NetSessionFailure;\n }\n | {\n readonly kind: 'retired';\n readonly sessionId: SessionId;\n readonly reason: 'disposed' | 'terminal-failure';\n };\n\nexport interface NetRecoveryPolicy {\n readonly maxSessions: number;\n readonly maxPendingPackets: number;\n readonly ackTimeoutMs: number;\n readonly maxPacketRetries: number;\n readonly maxReconnectAttempts: number;\n readonly reconnectDeadlineMs: number;\n readonly reconnectDelaysMs: readonly number[];\n}\n\n/** Finite, deterministic recovery bounds shared by every transport adapter. */\nexport const DEFAULT_NET_RECOVERY_POLICY: NetRecoveryPolicy = Object.freeze({\n maxSessions: 64,\n maxPendingPackets: 32,\n ackTimeoutMs: 250,\n maxPacketRetries: 3,\n maxReconnectAttempts: 5,\n reconnectDeadlineMs: 10_000,\n reconnectDelaysMs: Object.freeze([0, 100, 200, 400, 800]),\n});\n\nfunction policyError(field: string, reason: string): NetError {\n return new NetError({\n code: 'recovery-policy-invalid',\n expected: 'finite positive recovery policy bounds',\n hint: 'provide positive safe integers and a finite non-negative delay sequence',\n detail: { field, reason },\n });\n}\n\nfunction isPositiveSafeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;\n}\n\n/** Validate a complete policy without mutating it. */\nexport function validateNetRecoveryPolicy(policy: NetRecoveryPolicy): Result<void, NetError> {\n const positiveFields: readonly (keyof Omit<NetRecoveryPolicy, 'reconnectDelaysMs'>)[] = [\n 'maxSessions',\n 'maxPendingPackets',\n 'ackTimeoutMs',\n 'maxPacketRetries',\n 'maxReconnectAttempts',\n 'reconnectDeadlineMs',\n ];\n for (const field of positiveFields) {\n if (!isPositiveSafeInteger(policy[field]))\n return err(policyError(field, 'value must be a positive safe integer'));\n }\n if (\n !Array.isArray(policy.reconnectDelaysMs) ||\n policy.reconnectDelaysMs.length === 0 ||\n policy.reconnectDelaysMs.some((delay) => !Number.isSafeInteger(delay) || delay < 0)\n )\n return err(\n policyError('reconnectDelaysMs', 'values must be a non-empty finite delay sequence'),\n );\n return ok(undefined);\n}\n\n/** Merge caller overrides with the bounded defaults and validate the result. */\nexport function resolveNetRecoveryPolicy(\n overrides: Partial<NetRecoveryPolicy> = {},\n): Result<NetRecoveryPolicy, NetError> {\n const policy: NetRecoveryPolicy = {\n ...DEFAULT_NET_RECOVERY_POLICY,\n ...overrides,\n reconnectDelaysMs:\n overrides.reconnectDelaysMs === undefined\n ? DEFAULT_NET_RECOVERY_POLICY.reconnectDelaysMs\n : [...overrides.reconnectDelaysMs],\n };\n const valid = validateNetRecoveryPolicy(policy);\n return valid.ok ? ok(Object.freeze(policy)) : err(valid.error);\n}\n\n/** Create a positive application identity without allowing plain numbers to cross the seam. */\nexport function createSessionId(value: number): Result<SessionId, NetError> {\n if (!isPositiveSafeInteger(value))\n return err(\n new NetError({\n code: 'recovery-policy-invalid',\n expected: 'a positive safe integer SessionId',\n hint: 'use the authority-issued application session identity',\n detail: { field: 'sessionId', reason: 'SessionId must be a positive safe integer' },\n }),\n );\n return ok(value as SessionId);\n}\n\n/** Observable bounded accounting for one logical recovery session. */\nexport interface NetRecoverySnapshot {\n readonly sessionId: SessionId;\n readonly state: NetSessionState;\n readonly pendingPackets: number;\n readonly maxPendingPackets: number;\n readonly acknowledgedSequence: number;\n readonly reconnectAttempts: number;\n readonly epoch: number;\n readonly sequence: number;\n readonly ownedResources: {\n readonly pendingConnects: number;\n readonly timers: number;\n readonly ledgers: number;\n readonly callbacks: number;\n };\n readonly lastError?: NetSessionFailure;\n}\n\n/** Stable result kinds for repeated recovery requests. */\nexport type NetRecoveryOutcome =\n | { readonly kind: 'started'; readonly sessionId: SessionId }\n | { readonly kind: 'already-recovering'; readonly sessionId: SessionId }\n | { readonly kind: 'already-active'; readonly sessionId: SessionId }\n | { readonly kind: 'retired'; readonly sessionId: SessionId };\n\nconst LEGAL_TRANSITIONS: Readonly<Record<NetSessionStateKind, readonly NetSessionStateKind[]>> = {\n connecting: ['recovering', 'resyncing', 'failed', 'retired'],\n resyncing: ['active', 'recovering', 'failed', 'retired'],\n active: ['active', 'recovering', 'failed', 'retired'],\n recovering: ['recovering', 'resyncing', 'failed', 'retired'],\n failed: ['retired'],\n retired: ['retired'],\n};\n\nexport function isLegalNetSessionTransition(\n from: NetSessionStateKind,\n to: NetSessionStateKind,\n): boolean {\n return LEGAL_TRANSITIONS[from].includes(to);\n}\n\n/** Validate an immutable state replacement before a session publishes it. */\nexport function transitionNetSessionState(\n from: NetSessionState,\n to: NetSessionState,\n): Result<NetSessionState, NetError> {\n if (from.sessionId !== to.sessionId || !isLegalNetSessionTransition(from.kind, to.kind))\n return err(\n new NetError({\n code: 'session-illegal-transition',\n expected: 'a legal transition for the same SessionId',\n hint: 'wait for the current session state or retire the session before replacing it',\n detail: { from: from.kind, to: to.kind },\n }),\n );\n return ok(to);\n}\n\nexport type { NetEndpointConnector };\n\nexport const RECOVERY_ERROR_CODES: readonly NetErrorCode[] = [\n 'protocol-unsupported-version',\n 'session-illegal-transition',\n 'recovery-policy-invalid',\n 'recovery-rejected',\n 'recovery-exhausted',\n];\n","// @forgeax/engine-net -- NetSession host-neutral World integration.\n\nimport { err, ok, type Result } from '@forgeax/engine-types';\nimport type {\n EndpointEvent,\n NetEndpoint,\n NetEndpointConnector,\n PeerId,\n} from '../endpoint/endpoint';\nimport { type EndpointError, isEndpointError } from '../endpoint/errors';\nimport type { AuthorityCoordinator, PublishedPacket } from '../replication/authority';\nimport { decodeReplicationPacket, encodeReplicationPacket } from '../replication/codec';\nimport { NetError, type NetError as NetErrorType } from '../replication/errors';\nimport { DEFAULT_REPLICATION_LIMITS, type ReplicationLimits } from '../replication/profile';\nimport type {\n ReplicationAckPacket,\n ReplicationDataPacket,\n ReplicationSessionPacket,\n} from '../replication/protocol';\nimport { decodeAndApplyReplicationPacket, type ReplicaCoordinator } from '../replication/replica';\nimport {\n createSessionId,\n DEFAULT_NET_RECOVERY_POLICY,\n type NetRecoveryOutcome,\n type NetRecoveryPolicy,\n type NetRecoverySnapshot,\n type NetSessionFailure,\n type NetSessionState,\n resolveNetRecoveryPolicy,\n type SessionId,\n transitionNetSessionState,\n} from './recovery';\n\nexport interface PeerSnapshot {\n readonly peerIds: ReadonlyArray<PeerId>;\n readonly connected: boolean;\n}\n\nexport interface SessionSnapshot {\n readonly sessionIds: ReadonlyArray<SessionId>;\n readonly connected: boolean;\n}\n\nexport interface NetSessionClock {\n readonly now: () => number;\n readonly schedule: (delayMs: number, callback: () => void) => { cancel(): void };\n}\n\nexport interface NetSessionResourceCounts {\n readonly pendingConnects: number;\n readonly timers: number;\n readonly ledgers: number;\n readonly callbacks: number;\n}\n\nexport interface NetSessionConfig {\n readonly endpoint?: NetEndpoint;\n readonly connector?: NetEndpointConnector;\n readonly sessionId?: SessionId | number;\n readonly recovery?: Partial<NetRecoveryPolicy>;\n readonly clock?: NetSessionClock;\n readonly maxRawMessages: number;\n}\n\nexport interface RawMessage {\n readonly peerId: PeerId;\n readonly sessionId: SessionId;\n readonly data: Uint8Array;\n}\n\nconst defaultClock: NetSessionClock = {\n now: () => Date.now(),\n schedule: (delayMs, callback) => {\n const id = globalThis.setTimeout(callback, delayMs);\n return { cancel: () => globalThis.clearTimeout(id) };\n },\n};\n\nfunction recoveryFailure(reason: string): NetErrorType {\n return new NetError({\n code: 'recovery-rejected',\n expected: 'a recoverable NetSession lifecycle operation',\n hint: 'inspect the current snapshot and retire the session after terminal failure',\n detail: { reason },\n });\n}\n\nfunction initialState(sessionId: SessionId, endpoint: NetEndpoint | undefined): NetSessionState {\n return endpoint === undefined\n ? { kind: 'connecting', sessionId }\n : { kind: 'resyncing', sessionId, epoch: 0 };\n}\n\nexport class NetSession {\n #endpoint: NetEndpoint | undefined;\n readonly #connector: NetEndpointConnector | undefined;\n readonly #clock: NetSessionClock;\n readonly #policy: NetRecoveryPolicy;\n readonly #sessionId: SessionId;\n readonly #peerIds = new Set<PeerId>();\n readonly #sessionPeers = new Map<SessionId, PeerId>();\n readonly #announcedPeers = new Set<PeerId>();\n #sessionAnnounced = false;\n #rawMessages: RawMessage[] = [];\n readonly #maxRawMessages: number;\n #authority: AuthorityCoordinator | undefined;\n readonly #pendingFullPeers = new Set<PeerId>();\n #replica:\n | { readonly coordinator: ReplicaCoordinator; readonly limits: ReplicationLimits }\n | undefined;\n #state: NetSessionState;\n #lastError: NetSessionFailure | undefined;\n #epoch = 0;\n #sequence = 0;\n #acknowledgedSequence = 0;\n #reconnectAttempts = 0;\n #pendingConnect: { readonly abort: () => void } | undefined;\n #retryTimer: { cancel(): void } | undefined;\n readonly #ledger = new Map<number, Uint8Array>();\n #deferredEvents: EndpointEvent[] = [];\n #deferReplicaMessages = false;\n #disposed = false;\n\n constructor(config: NetSessionConfig) {\n this.#endpoint = config.endpoint;\n this.#connector = config.connector;\n this.#clock = config.clock ?? defaultClock;\n this.#maxRawMessages = config.maxRawMessages;\n const resolvedSessionId = this.#resolveSessionId(config.sessionId);\n this.#sessionId = resolvedSessionId.ok ? resolvedSessionId.value : (1 as SessionId);\n const policy = resolveNetRecoveryPolicy(config.recovery);\n this.#policy = policy.ok ? policy.value : DEFAULT_NET_RECOVERY_POLICY;\n this.#state = initialState(this.#sessionId, this.#endpoint);\n if (!resolvedSessionId.ok) this.#setFailure(resolvedSessionId.error);\n else if (!policy.ok) this.#setFailure(policy.error);\n }\n\n #resolveSessionId(value: SessionId | number | undefined): Result<SessionId, NetErrorType> {\n return createSessionId(value ?? 1);\n }\n\n #setState(next: NetSessionState): void {\n const transition = transitionNetSessionState(this.#state, next);\n if (transition.ok) {\n this.#state = transition.value;\n return;\n }\n this.#setFailure(transition.error);\n }\n\n #setFailure(failure: NetSessionFailure): void {\n this.#lastError = failure;\n if (this.#state.kind !== 'failed' && this.#state.kind !== 'retired')\n this.#setState({ kind: 'failed', sessionId: this.#sessionId, error: failure });\n this.#authority = undefined;\n this.#peerIds.clear();\n this.#sessionPeers.clear();\n this.#announcedPeers.clear();\n this.#sessionAnnounced = false;\n this.#pendingFullPeers.clear();\n this.#rawMessages = [];\n this.#deferredEvents = [];\n this.#deferReplicaMessages = false;\n this.#clearRecoveryWork();\n this.#endpoint?.close();\n }\n\n #clearRecoveryWork(): void {\n this.#retryTimer?.cancel();\n this.#retryTimer = undefined;\n this.#pendingConnect?.abort();\n this.#pendingConnect = undefined;\n this.#ledger.clear();\n }\n\n #beginRecovery(): void {\n const previousEndpoint = this.#endpoint;\n this.#endpoint = undefined;\n previousEndpoint?.close();\n if (\n this.#state.kind === 'connecting' ||\n this.#state.kind === 'active' ||\n this.#state.kind === 'resyncing'\n )\n this.#setState({\n kind: 'recovering',\n sessionId: this.#sessionId,\n epoch: this.#epoch,\n attempt: 0,\n });\n this.#ledger.clear();\n this.#sequence = 0;\n this.#acknowledgedSequence = 0;\n this.#peerIds.clear();\n this.#sessionPeers.clear();\n this.#announcedPeers.clear();\n this.#sessionAnnounced = false;\n this.#pendingFullPeers.clear();\n this.#rawMessages = [];\n this.#deferredEvents = [];\n this.#deferReplicaMessages = false;\n }\n\n #attemptRecovery(): void {\n if (this.#disposed || this.#state.kind !== 'recovering' || this.#pendingConnect) return;\n if (this.#reconnectAttempts >= this.#policy.maxReconnectAttempts) {\n this.#setFailure(\n new NetError({\n code: 'recovery-exhausted',\n expected: 'reconnect attempts within the configured finite bound',\n hint: 'inspect the failure and create a new session after exhaustion',\n detail: {\n attempts: this.#reconnectAttempts,\n maxAttempts: this.#policy.maxReconnectAttempts,\n },\n }),\n );\n return;\n }\n this.#reconnectAttempts += 1;\n this.#setState({\n kind: 'recovering',\n sessionId: this.#sessionId,\n epoch: this.#epoch,\n attempt: this.#reconnectAttempts,\n });\n if (this.#connector === undefined) {\n if (this.#reconnectAttempts >= this.#policy.maxReconnectAttempts) this.#attemptRecovery();\n return;\n }\n const controller = new AbortController();\n this.#pendingConnect = { abort: () => controller.abort() };\n void this.#connector.connect(controller.signal).then(\n (result) => this.#connected(result),\n (cause: unknown) => this.#connectFailed(cause),\n );\n }\n\n #connected(result: Result<NetEndpoint, EndpointError>): void {\n this.#pendingConnect = undefined;\n if (this.#disposed || this.#state.kind !== 'recovering') {\n if (result.ok) result.value.close();\n return;\n }\n if (!result.ok) {\n this.#connectFailed(result.error);\n return;\n }\n this.#endpoint?.close();\n this.#endpoint = result.value;\n this.#lastError = undefined;\n this.#epoch += 1;\n this.#sequence = 0;\n this.#acknowledgedSequence = 0;\n this.#ledger.clear();\n // Keep the replacement endpoint's first message behind one receive tick.\n // A connector may deliver peer-connected and the fresh baseline in the\n // same poll; exposing resyncing for one frame makes the lifecycle state\n // observable and prevents a baseline from being consumed in the connect\n // callback's first update.\n this.#deferReplicaMessages = this.#replica !== undefined;\n this.#setState({ kind: 'resyncing', sessionId: this.#sessionId, epoch: this.#epoch });\n }\n\n #connectFailed(cause: unknown): void {\n this.#pendingConnect = undefined;\n if (this.#disposed || this.#state.kind !== 'recovering') return;\n const failure: NetSessionFailure =\n cause instanceof NetError\n ? (cause as unknown as NetErrorType)\n : isEndpointError(cause)\n ? cause\n : recoveryFailure('connector attempt failed');\n if (this.#reconnectAttempts >= this.#policy.maxReconnectAttempts) {\n this.#setFailure(\n new NetError({\n code: 'recovery-exhausted',\n expected: 'reconnect attempts within the configured finite bound',\n hint: 'inspect the endpoint failure and create a new session after exhaustion',\n detail: {\n attempts: this.#reconnectAttempts,\n maxAttempts: this.#policy.maxReconnectAttempts,\n },\n }),\n );\n return;\n }\n this.#lastError = failure;\n this.advanceRecovery();\n }\n\n #handleAck(packet: ReplicationAckPacket): Result<void, NetError> {\n if (packet.sessionId !== this.#sessionId && !this.#sessionPeers.has(packet.sessionId))\n return err(\n new NetError({\n code: 'recovery-rejected',\n expected: 'an ACK for the current SessionId',\n hint: 'discard ACKs from another logical session',\n detail: { reason: 'ACK SessionId does not match the current session' },\n }),\n );\n if (packet.epoch !== this.#epoch || packet.acknowledgedSequence > this.#sequence)\n return ok(undefined);\n if (packet.acknowledgedSequence <= this.#acknowledgedSequence) return ok(undefined);\n this.#acknowledgedSequence = packet.acknowledgedSequence;\n for (const sequence of this.#ledger.keys())\n if (sequence <= packet.acknowledgedSequence) this.#ledger.delete(sequence);\n return ok(undefined);\n }\n\n #receiveMessage(peerId: PeerId, data: Uint8Array, errors: NetError[]): void {\n if (\n this.#state.kind === 'recovering' ||\n this.#state.kind === 'failed' ||\n this.#state.kind === 'retired'\n )\n return;\n const limits = this.#replica?.limits ?? DEFAULT_REPLICATION_LIMITS;\n const decoded = decodeReplicationPacket(data, limits);\n if (!decoded.ok) {\n if (this.#replica === undefined) {\n this.#queueRawMessage(peerId, data);\n return;\n }\n errors.push(decoded.error);\n this.#setFailure(decoded.error as NetErrorType);\n return;\n }\n if (decoded.value.kind === 'session-open' || decoded.value.kind === 'session-resume') {\n this.#bindSession(decoded.value.sessionId, peerId);\n return;\n }\n if (decoded.value.kind === 'ack') {\n const handled = this.#handleAck(decoded.value);\n if (!handled.ok) {\n errors.push(handled.error);\n this.#setFailure(handled.error);\n }\n return;\n }\n if (decoded.value.kind !== 'baseline' && decoded.value.kind !== 'delta') {\n if (decoded.value.kind === 'rejection') {\n const failure = recoveryFailure(\n `peer rejected ${decoded.value.rejectedKind}: ${decoded.value.reason}`,\n );\n errors.push(failure);\n this.#setFailure(failure);\n }\n return;\n }\n if (this.#replica === undefined) {\n this.#queueRawMessage(peerId, data);\n return;\n }\n const applied = decodeAndApplyReplicationPacket(\n this.#replica.coordinator,\n data,\n this.#replica.limits,\n );\n if (!applied.ok) {\n errors.push(applied.error);\n this.#setFailure(applied.error);\n return;\n }\n const packetOutcome = this.#replica.coordinator.lastPacketOutcome;\n if (packetOutcome === 'accepted') {\n this.#epoch = decoded.value.epoch;\n this.#sequence = decoded.value.sequence;\n this.#acknowledgedSequence = decoded.value.sequence;\n this.#setState({\n kind: 'active',\n sessionId: this.#sessionId,\n epoch: this.#epoch,\n sequence: this.#sequence,\n });\n }\n if (packetOutcome === 'accepted' || packetOutcome === 'duplicate')\n this.#sendReplicationAck(peerId, decoded.value);\n }\n\n receiveEvents(): readonly NetError[] {\n const errors: NetError[] = [];\n if (this.#disposed || this.#state.kind === 'failed' || this.#state.kind === 'retired')\n return errors;\n const events = [...this.#deferredEvents, ...(this.#endpoint?.poll() ?? [])];\n this.#deferredEvents = [];\n const deferMessages = this.#deferReplicaMessages;\n this.#deferReplicaMessages = false;\n for (const event of events) {\n if (event.kind === 'peer-connected') {\n this.#peerIds.add(event.peerId);\n if (this.#replica !== undefined) this.#bindSession(this.#sessionId, event.peerId);\n else this.#bindSession(this.#sessionForPeer(event.peerId), event.peerId);\n this.#pendingFullPeers.add(event.peerId);\n } else if (event.kind === 'peer-disconnected') {\n this.#forgetPeer(event.peerId);\n if (this.#replica !== undefined) {\n this.#replica.coordinator.clear();\n this.#beginRecovery();\n this.advanceRecovery();\n }\n } else if (deferMessages) {\n this.#deferredEvents.push(event);\n } else this.#receiveMessage(event.peerId, event.data, errors);\n }\n return errors;\n }\n\n drainRawMessages(): RawMessage[] {\n return this.#rawMessages.splice(0);\n }\n\n getPeerSnapshot(): PeerSnapshot {\n const peerIds = [...this.#peerIds].sort((left, right) => left - right);\n return { peerIds, connected: peerIds.length > 0 };\n }\n\n getSessionSnapshot(): SessionSnapshot {\n const sessionIds = [...this.#sessionPeers.keys()].sort((left, right) => left - right);\n return { sessionIds, connected: sessionIds.length > 0 };\n }\n\n /** Return lifecycle, epoch, sequence, ledger, and owned-resource evidence. */\n getRecoverySnapshot(): NetRecoverySnapshot {\n return {\n sessionId: this.#sessionId,\n state: this.#state,\n pendingPackets: this.#ledger.size,\n maxPendingPackets: this.#policy.maxPendingPackets,\n acknowledgedSequence: this.#acknowledgedSequence,\n reconnectAttempts: this.#reconnectAttempts,\n epoch: this.#epoch,\n sequence: this.#sequence,\n ...(this.#lastError === undefined ? {} : { lastError: this.#lastError }),\n ownedResources: {\n pendingConnects: this.#pendingConnect === undefined ? 0 : 1,\n timers: this.#retryTimer === undefined ? 0 : 1,\n ledgers: this.#ledger.size === 0 ? 0 : 1,\n callbacks: 0,\n },\n };\n }\n\n getResourceSnapshot(): NetSessionResourceCounts {\n return this.getRecoverySnapshot().ownedResources;\n }\n\n recover(): NetRecoveryOutcome {\n if (this.#state.kind === 'retired' || this.#state.kind === 'failed')\n return { kind: 'retired', sessionId: this.#sessionId };\n if (this.#state.kind === 'recovering')\n return { kind: 'already-recovering', sessionId: this.#sessionId };\n this.#beginRecovery();\n return { kind: 'started', sessionId: this.#sessionId };\n }\n\n advanceRecovery(): void {\n if (this.#state.kind !== 'recovering') return;\n const delay =\n this.#policy.reconnectDelaysMs[\n Math.min(this.#reconnectAttempts, this.#policy.reconnectDelaysMs.length - 1)\n ];\n if (delay === undefined || delay === 0) this.#attemptRecovery();\n else {\n this.#retryTimer?.cancel();\n this.#retryTimer = this.#clock.schedule(delay, () => {\n this.#retryTimer = undefined;\n this.#attemptRecovery();\n });\n }\n }\n\n sendRaw(peerId: PeerId, data: Uint8Array): Result<void, EndpointError | NetError> {\n if (this.#state.kind !== 'active') return err(recoveryFailure('session is not active'));\n return this.#sendToPeer(peerId, data);\n }\n\n /** Send one application command through the current replica attachment. */\n sendToAuthority(sessionId: SessionId, data: Uint8Array): Result<void, EndpointError | NetError> {\n if (sessionId !== this.#sessionId)\n return err(recoveryFailure('session id does not belong to this NetSession'));\n if (\n this.#state.kind === 'recovering' ||\n this.#state.kind === 'failed' ||\n this.#state.kind === 'retired'\n )\n return err(recoveryFailure('session is not connected to the authority'));\n const peerId = this.#peerForSession(sessionId);\n if (peerId === undefined) return err(recoveryFailure('authority peer is not connected'));\n if (this.#replica !== undefined) {\n const announced = this.#announceSession(peerId);\n if (!announced.ok) return announced;\n }\n return this.#sendToPeer(peerId, data);\n }\n\n /** Send one application message to an authority-owned logical session. */\n sendToSession(sessionId: SessionId, data: Uint8Array): Result<void, EndpointError | NetError> {\n if (this.#state.kind === 'failed' || this.#state.kind === 'retired')\n return err(recoveryFailure('session is not connected to the authority'));\n const peerId = this.#peerForSession(sessionId);\n if (peerId === undefined) return err(recoveryFailure('logical session is not connected'));\n return this.#sendToPeer(peerId, data);\n }\n\n attachAuthority(authority: AuthorityCoordinator): void {\n this.#authority = authority;\n }\n\n requestFullBaseline(peerId: PeerId): void {\n if (this.#peerIds.has(peerId)) this.#pendingFullPeers.add(peerId);\n }\n\n requestFullBaselineForSession(sessionId: SessionId): void {\n const peerId = this.#sessionPeers.get(sessionId);\n if (peerId !== undefined) this.requestFullBaseline(peerId);\n }\n\n attachReplica(coordinator: ReplicaCoordinator, limits: ReplicationLimits): void {\n this.#replica = { coordinator, limits };\n }\n\n #ledgerBoundError(): NetError {\n return new NetError({\n code: 'recovery-rejected',\n expected: 'published packets within the configured finite ACK bound',\n hint: 'wait for a cumulative ACK before publishing more packets',\n detail: { reason: 'ACK ledger bound reached' },\n });\n }\n\n #ensurePublicationCapacity(expectedEpoch: number): Result<void, NetError> {\n if (expectedEpoch === this.#epoch && this.#ledger.size >= this.#policy.maxPendingPackets)\n return err(this.#ledgerBoundError());\n return ok(undefined);\n }\n\n #reservePublished(packet: PublishedPacket): Result<void, NetError> {\n if (packet.epoch !== this.#epoch) {\n this.#ledger.clear();\n this.#acknowledgedSequence = 0;\n this.#epoch = packet.epoch;\n }\n if (this.#ledger.size >= this.#policy.maxPendingPackets && !this.#ledger.has(packet.sequence))\n return err(this.#ledgerBoundError());\n this.#sequence = packet.sequence;\n this.#ledger.set(packet.sequence, packet.bytes);\n return ok(undefined);\n }\n\n #sendPublished(\n packet: PublishedPacket,\n peerIds: readonly PeerId[],\n ): Result<void, EndpointError | NetError> {\n const reserved = this.#reservePublished(packet);\n if (!reserved.ok) return reserved;\n if (this.#endpoint === undefined) return err(recoveryFailure('session has no endpoint'));\n let delivered = false;\n for (const peerId of peerIds) {\n const sent = this.#endpoint.send(peerId, packet.bytes);\n if (!sent.ok) {\n if (sent.error.code === 'connection-closed') {\n // A socket can close before its endpoint emits the corresponding\n // disconnect event. Treat that transport race as the lifecycle\n // event it represents so one stale peer cannot poison the World or\n // prevent the same publication reaching live peers.\n this.#forgetPeer(peerId);\n continue;\n }\n this.#ledger.delete(packet.sequence);\n return err(sent.error);\n }\n delivered = true;\n }\n if (!delivered) this.#ledger.delete(packet.sequence);\n return ok(undefined);\n }\n\n publish(): Result<void, NetError | EndpointError> {\n // Do not advance the authority ledger before a peer exists. A host can\n // start its fixed loop before the first socket handshake; reserving that\n // empty publication would make the first connected peer wait behind an\n // ACK for bytes it could never receive.\n if (this.#authority === undefined || this.#endpoint === undefined || this.#peerIds.size === 0)\n return ok(undefined);\n if (this.#pendingFullPeers.size > 0) {\n const capacity = this.#ensurePublicationCapacity(this.#authority.nextPublicationEpoch(true));\n if (!capacity.ok) return capacity;\n const published = this.#authority.publishFull();\n if (!published.ok) return err(published.error);\n const sent = this.#sendPublished(published.value, [...this.#peerIds]);\n if (!sent.ok) return err(sent.error);\n this.#pendingFullPeers.clear();\n // A fresh baseline is the first packet of the new epoch for every\n // replica. Do not append the same-tick delta: a receiver must be able\n // to observe and apply sequence 1 before any incremental publication.\n return ok(undefined);\n }\n const capacity = this.#ensurePublicationCapacity(this.#authority.nextPublicationEpoch());\n if (!capacity.ok) return capacity;\n const published = this.#authority.publish();\n if (!published.ok) return err(published.error);\n const sent = this.#sendPublished(published.value, [...this.#peerIds]);\n if (!sent.ok) return err(sent.error);\n return ok(undefined);\n }\n\n dispose(): void {\n if (this.#disposed) return;\n this.#disposed = true;\n this.#clearRecoveryWork();\n this.#endpoint?.close();\n this.#endpoint = undefined;\n this.#replica?.coordinator.clear();\n this.#replica = undefined;\n this.#authority = undefined;\n this.#peerIds.clear();\n this.#sessionPeers.clear();\n this.#announcedPeers.clear();\n this.#sessionAnnounced = false;\n this.#pendingFullPeers.clear();\n this.#rawMessages = [];\n this.#deferredEvents = [];\n this.#deferReplicaMessages = false;\n if (this.#state.kind !== 'retired')\n this.#setState({ kind: 'retired', sessionId: this.#sessionId, reason: 'disposed' });\n }\n\n #queueRawMessage(peerId: PeerId, data: Uint8Array): void {\n if (this.#rawMessages.length >= this.#maxRawMessages) return;\n this.#rawMessages.push({\n peerId,\n sessionId: this.#sessionForPeer(peerId),\n data: new Uint8Array(data),\n });\n }\n\n #sessionForPeer(peerId: PeerId): SessionId {\n for (const [sessionId, mappedPeerId] of this.#sessionPeers)\n if (mappedPeerId === peerId) return sessionId;\n if (this.#replica !== undefined) {\n this.#bindSession(this.#sessionId, peerId);\n return this.#sessionId;\n }\n const created = createSessionId(peerId);\n const sessionId = created.ok ? created.value : this.#sessionId;\n this.#bindSession(sessionId, peerId);\n return sessionId;\n }\n\n #bindSession(sessionId: SessionId, peerId: PeerId): void {\n for (const [mappedSessionId, mappedPeerId] of this.#sessionPeers)\n if (mappedSessionId === sessionId || mappedPeerId === peerId)\n this.#sessionPeers.delete(mappedSessionId);\n this.#sessionPeers.set(sessionId, peerId);\n }\n\n #forgetPeer(peerId: PeerId): void {\n this.#peerIds.delete(peerId);\n for (const [sessionId, mappedPeerId] of this.#sessionPeers)\n if (mappedPeerId === peerId) this.#sessionPeers.delete(sessionId);\n this.#announcedPeers.delete(peerId);\n this.#pendingFullPeers.delete(peerId);\n }\n\n #peerForSession(sessionId: SessionId): PeerId | undefined {\n const mapped = this.#sessionPeers.get(sessionId);\n if (mapped !== undefined && this.#peerIds.has(mapped)) return mapped;\n if (this.#replica !== undefined && this.#peerIds.size === 1) {\n const peerId = [...this.#peerIds][0];\n if (peerId !== undefined) {\n this.#bindSession(sessionId, peerId);\n return peerId;\n }\n }\n return undefined;\n }\n\n #announceSession(peerId: PeerId): Result<void, EndpointError | NetError> {\n if (this.#announcedPeers.has(peerId)) return ok(undefined);\n const packet: ReplicationSessionPacket = {\n version: 2,\n kind: this.#sessionAnnounced ? 'session-resume' : 'session-open',\n sessionId: this.#sessionId,\n epoch: this.#epoch,\n sequence: 0,\n };\n const encoded = encodeReplicationPacket(packet, DEFAULT_REPLICATION_LIMITS);\n if (!encoded.ok) return err(encoded.error);\n const sent = this.#sendToPeer(peerId, encoded.value);\n if (!sent.ok) return sent;\n this.#announcedPeers.add(peerId);\n this.#sessionAnnounced = true;\n return ok(undefined);\n }\n\n #sendToPeer(peerId: PeerId, data: Uint8Array): Result<void, EndpointError | NetError> {\n const result = this.#endpoint?.send(peerId, data);\n if (result === undefined) return err(recoveryFailure('session has no endpoint'));\n return result.ok ? ok(undefined) : err(result.error);\n }\n\n /** ACK accepted data at the session boundary; consumers should not reimplement this wire step. */\n #sendReplicationAck(peerId: PeerId, packet: ReplicationDataPacket): void {\n const encoded = encodeReplicationPacket(\n {\n version: 2,\n kind: 'ack',\n sessionId: packet.sessionId,\n epoch: packet.epoch,\n acknowledgedSequence: packet.sequence,\n },\n DEFAULT_REPLICATION_LIMITS,\n );\n if (!encoded.ok) {\n this.#setFailure(encoded.error);\n return;\n }\n const sent = this.#sendToPeer(peerId, encoded.value);\n if (!sent.ok) this.#lastError = sent.error;\n }\n}\n","// @forgeax/engine-net -- session plugin (host-neutral World integration).\n// (requirements AC-04, plan-strategy D-1/D-3)\n\nimport { FixedUpdate, Update } from '@forgeax/engine-ecs';\nimport type { Plugin } from '@forgeax/engine-plugin';\nimport type { NetEndpoint, NetEndpointConnector } from '../endpoint/endpoint';\nimport { NetSession, type NetSessionClock } from './net-session';\nimport type { NetRecoveryPolicy } from './recovery';\n\nexport interface NetPluginConfig {\n readonly endpoint?: NetEndpoint;\n readonly connector?: NetEndpointConnector;\n readonly sessionId?: number;\n readonly recovery?: Partial<NetRecoveryPolicy>;\n readonly clock?: NetSessionClock;\n readonly maxRawMessages?: number;\n}\n\nexport function netPlugin(config: NetPluginConfig): Plugin {\n return {\n name: 'net-session',\n inject: ['world'],\n apply(ctx) {\n const world = ctx.world;\n const session = new NetSession({\n ...(config.endpoint === undefined ? {} : { endpoint: config.endpoint }),\n ...(config.connector === undefined ? {} : { connector: config.connector }),\n ...(config.sessionId === undefined ? {} : { sessionId: config.sessionId }),\n ...(config.recovery === undefined ? {} : { recovery: config.recovery }),\n ...(config.clock === undefined ? {} : { clock: config.clock }),\n maxRawMessages: config.maxRawMessages ?? 256,\n });\n ctx.effect(() => {\n world.insertResource('net-session', session);\n if (config.connector !== undefined && config.endpoint === undefined) {\n session.recover();\n session.advanceRecovery();\n }\n return () => {\n session.dispose();\n world.removeResource('net-session');\n };\n }, 'net/session-resource');\n ctx.effect(() => {\n world\n .addSystem(Update, {\n name: 'net-receive',\n queries: [],\n before: [FixedUpdate],\n fn: (world) => world.getResource<NetSession>('net-session').receiveEvents(),\n })\n .unwrap();\n return () => world.removeSystem(Update, 'net-receive');\n }, 'net/receive');\n ctx.effect(() => {\n world\n .addSystem(Update, {\n name: 'net-publish',\n queries: [],\n after: [FixedUpdate],\n fn: (world) => world.getResource<NetSession>('net-session').publish(),\n })\n .unwrap();\n return () => world.removeSystem(Update, 'net-publish');\n }, 'net/publish');\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/endpoint/errors.ts","../src/endpoint/memory.ts","../src/replication/constants.ts","../src/replication/errors.ts","../src/replication/codec.ts","../src/replication/profile.ts","../src/replication/authority.ts","../src/replication/handshake.ts","../src/replication/replica.ts","../src/session/recovery.ts","../src/session/net-session.ts","../src/session/session-plugin.ts"],"names":["err","revived","ok","componentSchema","capacity","published","sent","sessionId","world"],"mappings":"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","file":"index.mjs","sourcesContent":["// @forgeax/engine-net -- endpoint structured errors.\n//\n// Closed union of transport-level failures. Each variant carries .code, .expected,\n// .hint, and per-code .detail. AI users exhaustively switch on .code without a\n// default branch (requirements AC-13).\n\nimport type { PeerId } from './endpoint';\n\n// ---------------------------------------------------------------------------\n// EndpointErrorCode -- closed 5-member union derived from endpointErrorPolicy\n// ---------------------------------------------------------------------------\n\n/** Transport-level endpoint error codes (requirements AC-02, AC-13). */\nexport type EndpointErrorCode = keyof typeof endpointErrorPolicy;\n\n// ---------------------------------------------------------------------------\n// Per-code detail payloads\n// ---------------------------------------------------------------------------\n\nexport interface EndpointDetailPeerNotFound {\n readonly peerId: PeerId;\n}\n\nexport interface EndpointDetailConnectionClosed {\n readonly peerId: PeerId;\n}\n\nexport interface EndpointDetailSendFailed {\n readonly peerId: PeerId;\n readonly cause: string;\n}\n\nexport interface EndpointDetailAlreadyClosed {\n readonly cause: string;\n}\n\nexport interface EndpointDetailConnectionFailed {\n readonly address: string;\n readonly cause: string;\n}\n\n// ---------------------------------------------------------------------------\n// Conditional resolver\n// ---------------------------------------------------------------------------\n\nexport type EndpointErrorDetailFor<C extends EndpointErrorCode> = C extends 'peer-not-found'\n ? EndpointDetailPeerNotFound\n : C extends 'connection-closed'\n ? EndpointDetailConnectionClosed\n : C extends 'send-failed'\n ? EndpointDetailSendFailed\n : C extends 'already-closed'\n ? EndpointDetailAlreadyClosed\n : C extends 'connection-failed'\n ? EndpointDetailConnectionFailed\n : never;\n\n/** Tagged union of all endpoint error detail variants. */\nexport type EndpointErrorDetail = EndpointErrorDetailFor<EndpointErrorCode>;\n\n// ---------------------------------------------------------------------------\n// Error class\n// ---------------------------------------------------------------------------\n\nclass EndpointErrorClass extends Error {\n readonly code: EndpointErrorCode;\n readonly expected: string;\n readonly hint: string;\n readonly detail: EndpointErrorDetail;\n\n constructor(args: {\n code: EndpointErrorCode;\n expected: string;\n hint: string;\n detail: EndpointErrorDetail;\n }) {\n let suffix = '';\n if (args.code === 'peer-not-found') {\n const d = args.detail as EndpointDetailPeerNotFound;\n suffix = ` (peerId=${d.peerId})`;\n } else if (args.code === 'connection-closed') {\n const d = args.detail as EndpointDetailConnectionClosed;\n suffix = ` (peerId=${d.peerId})`;\n } else if (args.code === 'send-failed') {\n const d = args.detail as EndpointDetailSendFailed;\n suffix = ` (peerId=${d.peerId}, cause=${d.cause})`;\n } else if (args.code === 'already-closed') {\n const d = args.detail as EndpointDetailAlreadyClosed;\n suffix = ` (cause=${d.cause})`;\n } else if (args.code === 'connection-failed') {\n const d = args.detail as EndpointDetailConnectionFailed;\n suffix = ` (address=${d.address}, cause=${d.cause})`;\n }\n super(`[EndpointError ${args.code}] expected: ${args.expected}; hint: ${args.hint}${suffix}`);\n this.name = 'EndpointError';\n this.code = args.code;\n this.expected = args.expected;\n this.hint = args.hint;\n this.detail = args.detail;\n }\n}\n\ntype EndpointErrorVariant<C extends EndpointErrorCode> = EndpointErrorClass & {\n readonly code: C;\n readonly detail: EndpointErrorDetailFor<C>;\n};\n\nexport type EndpointError = {\n [C in EndpointErrorCode]: EndpointErrorVariant<C>;\n}[EndpointErrorCode];\n\ninterface EndpointErrorConstructor {\n new <C extends EndpointErrorCode>(args: {\n code: C;\n expected: string;\n hint: string;\n detail: EndpointErrorDetailFor<C>;\n }): EndpointErrorVariant<C>;\n readonly prototype: EndpointErrorClass;\n}\n\nexport const EndpointError: EndpointErrorConstructor =\n EndpointErrorClass as unknown as EndpointErrorConstructor;\n\ntype EndpointErrorPolicy = { readonly expected: string; readonly hint: string };\n\nconst endpointErrorPolicy = {\n 'peer-not-found': {\n expected: 'the target peer must exist in the current connection set',\n hint: 'verify the PeerId is from a connect event; check that the peer has not disconnected',\n },\n 'connection-closed': {\n expected: 'the peer connection must be alive for the operation',\n hint: 'the peer disconnected; poll for a disconnect event and handle the lifecycle',\n },\n 'send-failed': {\n expected: 'message bytes must be delivered to the target peer or the connection must fail',\n hint: 'the memory connection is broken; the peer may have disconnected or the buffer is full',\n },\n 'already-closed': {\n expected: 'the endpoint must be open for any operation',\n hint: 'the endpoint is closed; create a new endpoint pair for further communication',\n },\n 'connection-failed': {\n expected:\n 'the endpoint factory must successfully establish a connection or bind to the listen address',\n hint: 'the initial connection or bind failed; verify the address is reachable and the port is not in use, then retry',\n },\n} satisfies Record<string, EndpointErrorPolicy>;\n\n/** Expected-invariant table per error code. */\nexport const ENDPOINT_EXPECTED: Readonly<Record<EndpointErrorCode, string>> = Object.fromEntries(\n Object.entries(endpointErrorPolicy).map(([code, policy]) => [code, policy.expected]),\n) as Readonly<Record<EndpointErrorCode, string>>;\n\n/** Actionable hint table per error code. */\nexport const ENDPOINT_ERROR_HINTS: Readonly<Record<EndpointErrorCode, string>> = Object.fromEntries(\n Object.entries(endpointErrorPolicy).map(([code, policy]) => [code, policy.hint]),\n) as Readonly<Record<EndpointErrorCode, string>>;\n\n/** Type guard for narrowing unknown to EndpointError. */\nexport function isEndpointError(err: unknown): err is EndpointError {\n return err instanceof EndpointErrorClass;\n}\n","// @forgeax/engine-net -- memory endpoint implementation.\n// Deterministic memory backend for the NetEndpoint contract.\n// (requirements AC-03, plan-strategy D-3)\n\nimport type { Result } from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\nimport type { EndpointEvent, NetEndpoint, NetEndpointConnector, PeerId } from './endpoint';\nimport type { EndpointError as EndpointErrorType } from './errors';\nimport { ENDPOINT_ERROR_HINTS, ENDPOINT_EXPECTED, EndpointError } from './errors';\n\ninterface InternalState {\n delayNext: boolean;\n duplicateNext: boolean;\n malformNext: boolean;\n}\n\nclass MemoryEndpoint implements NetEndpoint {\n readonly _peerId: PeerId;\n _remote: MemoryEndpoint | null = null;\n _closed = false;\n _remoteConnected = false;\n _incoming: EndpointEvent[] = [];\n _delayed: EndpointEvent[] = [];\n _state: InternalState = { delayNext: false, duplicateNext: false, malformNext: false };\n\n constructor(peerId: PeerId) {\n this._peerId = peerId;\n }\n\n poll(): EndpointEvent[] {\n if (this._closed) return [];\n const events = this._incoming.splice(0);\n this._incoming = this._delayed.splice(0);\n return events;\n }\n\n send(peerId: PeerId, data: Uint8Array): Result<void, EndpointErrorType> {\n if (this._closed) {\n return err(\n new EndpointError({\n code: 'already-closed',\n expected: ENDPOINT_EXPECTED['already-closed'],\n hint: ENDPOINT_ERROR_HINTS['already-closed'],\n detail: { cause: 'endpoint is closed' },\n }),\n );\n }\n if (!this._remote || this._remote._peerId !== peerId) {\n return err(\n new EndpointError({\n code: 'peer-not-found',\n expected: ENDPOINT_EXPECTED['peer-not-found'],\n hint: ENDPOINT_ERROR_HINTS['peer-not-found'],\n detail: { peerId },\n }),\n );\n }\n if (!this._remoteConnected) {\n return err(\n new EndpointError({\n code: 'connection-closed',\n expected: ENDPOINT_EXPECTED['connection-closed'],\n hint: ENDPOINT_ERROR_HINTS['connection-closed'],\n detail: { peerId },\n }),\n );\n }\n\n const deliver = (bytes: Uint8Array) => {\n if (this._state.delayNext) {\n this._remote?._delayed.push({ kind: 'message', peerId: this._peerId, data: bytes });\n this._state.delayNext = false;\n } else {\n this._remote?._incoming.push({ kind: 'message', peerId: this._peerId, data: bytes });\n }\n };\n\n if (this._state.malformNext) {\n const corrupted = new Uint8Array(data);\n if (corrupted.length > 0) {\n const firstByte = corrupted[0];\n if (firstByte !== undefined) corrupted[0] = firstByte ^ 0xff;\n }\n deliver(corrupted);\n this._state.malformNext = false;\n } else {\n deliver(data);\n if (this._state.duplicateNext) {\n this._state.duplicateNext = false;\n if (this._state.delayNext) {\n this._remote?._delayed.push({ kind: 'message', peerId: this._peerId, data });\n this._state.delayNext = false;\n } else {\n this._remote?._incoming.push({ kind: 'message', peerId: this._peerId, data });\n }\n }\n }\n\n return ok(undefined);\n }\n\n close(): Result<void, EndpointErrorType> {\n if (this._closed) {\n return err(\n new EndpointError({\n code: 'already-closed',\n expected: ENDPOINT_EXPECTED['already-closed'],\n hint: ENDPOINT_ERROR_HINTS['already-closed'],\n detail: { cause: 'endpoint is already closed' },\n }),\n );\n }\n this._closed = true;\n this._remoteConnected = false;\n if (this._remote && !this._remote._closed) {\n this._remote._remoteConnected = false;\n this._remote._incoming.push({ kind: 'peer-disconnected', peerId: this._peerId });\n }\n return ok(undefined);\n }\n\n _forceDisconnect(): void {\n if (this._remote && !this._remote._closed) {\n this._remote._remoteConnected = false;\n this._remote._incoming.push({ kind: 'peer-disconnected', peerId: this._peerId });\n }\n this._remoteConnected = false;\n }\n}\n\nexport function createMemoryEndpointPair(): [NetEndpoint, NetEndpoint] {\n const epA = new MemoryEndpoint(1 as PeerId);\n const epB = new MemoryEndpoint(2 as PeerId);\n epA._remote = epB;\n epB._remote = epA;\n epA._remoteConnected = true;\n epB._remoteConnected = true;\n epA._incoming.push({ kind: 'peer-connected', peerId: 2 as PeerId });\n epB._incoming.push({ kind: 'peer-connected', peerId: 1 as PeerId });\n return [epA, epB];\n}\n\nexport interface MemoryFaultController {\n delayNextDelivery(ms: number): void;\n duplicateNextDelivery(): void;\n malformNextDelivery(): void;\n disconnectPeer(endpoint: NetEndpoint): void;\n}\n\nexport function createMemoryEndpointPairWithController(): {\n readonly endpoints: [NetEndpoint, NetEndpoint];\n readonly controller: MemoryFaultController;\n} {\n const [epA, epB] = createMemoryEndpointPair();\n\n const controller: MemoryFaultController = {\n delayNextDelivery(_ms: number): void {\n (epA as MemoryEndpoint)._state.delayNext = true;\n },\n duplicateNextDelivery(): void {\n (epA as MemoryEndpoint)._state.duplicateNext = true;\n },\n malformNextDelivery(): void {\n (epA as MemoryEndpoint)._state.malformNext = true;\n },\n disconnectPeer(endpoint: NetEndpoint): void {\n (endpoint as MemoryEndpoint)._forceDisconnect();\n },\n };\n\n return { endpoints: [epA, epB], controller };\n}\n\n/** Create a replaceable, realm-neutral connector over a deterministic endpoint factory. */\nexport function createMemoryEndpointConnector(\n createEndpoint: () => NetEndpoint,\n): NetEndpointConnector {\n return {\n connect(signal) {\n if (signal.aborted)\n return Promise.resolve(\n err(\n new EndpointError({\n code: 'connection-failed',\n expected: ENDPOINT_EXPECTED['connection-failed'],\n hint: ENDPOINT_ERROR_HINTS['connection-failed'],\n detail: { address: 'memory', cause: 'connect aborted' },\n }),\n ),\n );\n return Promise.resolve(ok(createEndpoint()));\n },\n };\n}\n","/** The sole application replication protocol version published by net. */\nexport const REPLICATION_PROTOCOL_VERSION = 2;\n\n/** Fixed wire prefix used to reject non-v2 replication bytes before dispatch. */\nexport const REPLICATION_PROTOCOL_PREFIX = 'FXRP2';\n","export type NetErrorDetailByCode = {\n 'handshake-profile-mismatch': {\n readonly localFingerprint: string;\n readonly remoteFingerprint: string;\n };\n 'decode-invalid-payload': { readonly reason: string };\n 'decode-limit-exceeded': {\n readonly limit: string;\n readonly actual: number;\n readonly maximum: number;\n };\n 'ordering-invalid-tick': { readonly receivedTick: number; readonly lastTick: number };\n 'identity-invalid': { readonly id: number; readonly reason: string };\n 'schema-invalid': { readonly component: string; readonly reason: string };\n 'remap-unresolved-reference': { readonly id: number; readonly referencedId: number };\n 'apply-invariant-failed': { readonly reason: string };\n 'protocol-unsupported-version': {\n readonly receivedVersion: number;\n readonly supportedVersion: number;\n };\n 'session-illegal-transition': {\n readonly from: string;\n readonly to: string;\n };\n 'recovery-policy-invalid': {\n readonly field: string;\n readonly reason: string;\n };\n 'recovery-rejected': { readonly reason: string };\n 'recovery-exhausted': {\n readonly attempts: number;\n readonly maxAttempts: number;\n };\n};\n\nexport type NetErrorCode = keyof NetErrorDetailByCode;\nexport type NetErrorDetailFor<C extends NetErrorCode> = NetErrorDetailByCode[C];\nexport type NetErrorDetail = NetErrorDetailFor<NetErrorCode>;\n\nclass NetErrorClass extends Error {\n readonly code: NetErrorCode;\n readonly expected: string;\n readonly hint: string;\n readonly detail: NetErrorDetail;\n constructor(args: {\n code: NetErrorCode;\n expected: string;\n hint: string;\n detail: NetErrorDetail;\n }) {\n super(`[NetError ${args.code}] expected: ${args.expected}; hint: ${args.hint}`);\n this.name = 'NetError';\n this.code = args.code;\n this.expected = args.expected;\n this.hint = args.hint;\n this.detail = args.detail;\n }\n}\n\ntype Variant<C extends NetErrorCode> = NetErrorClass & {\n readonly code: C;\n readonly detail: NetErrorDetailFor<C>;\n};\n\nexport type NetError = {\n [C in NetErrorCode]: Variant<C>;\n}[NetErrorCode];\n\ninterface NetErrorConstructor {\n new <C extends NetErrorCode>(args: {\n code: C;\n expected: string;\n hint: string;\n detail: NetErrorDetailFor<C>;\n }): Variant<C>;\n readonly prototype: NetErrorClass;\n}\nexport const NetError: NetErrorConstructor = NetErrorClass as unknown as NetErrorConstructor;\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport { REPLICATION_PROTOCOL_PREFIX, REPLICATION_PROTOCOL_VERSION } from './constants';\nimport { NetError } from './errors';\nimport type { ReplicationLimits } from './profile';\nimport type { ReplicationDataPacket, ReplicationEntityRecord, ReplicationPacket } from './protocol';\n\nexport type { ReplicationComponentRecord, ReplicationEntityRecord } from './protocol';\n\ntype PortableTypedArray =\n | Float32Array\n | Float64Array\n | Int8Array\n | Int16Array\n | Int32Array\n | Uint8Array\n | Uint8ClampedArray\n | Uint16Array\n | Uint32Array;\n\nconst TYPED_ARRAYS = {\n Float32Array,\n Float64Array,\n Int8Array,\n Int16Array,\n Int32Array,\n Uint8Array,\n Uint8ClampedArray,\n Uint16Array,\n Uint32Array,\n} as const;\n\ntype TypedArrayName = keyof typeof TYPED_ARRAYS;\n\nconst PACKET_KINDS = [\n 'session-open',\n 'session-resume',\n 'baseline',\n 'delta',\n 'ack',\n 'rejection',\n] as const satisfies readonly ReplicationPacket['kind'][];\n\nconst REPLICATION_ENTITY_KINDS = [\n 'upsert',\n 'despawn',\n] as const satisfies readonly ReplicationEntityRecord['kind'][];\n\nfunction isPacketKind(value: unknown): value is ReplicationPacket['kind'] {\n return PACKET_KINDS.some((kind) => kind === value);\n}\n\nfunction isReplicationEntityKind(value: unknown): value is ReplicationEntityRecord['kind'] {\n return REPLICATION_ENTITY_KINDS.some((kind) => kind === value);\n}\n\nfunction isSafeNonNegativeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction isSessionId(value: unknown): boolean {\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;\n}\n\nfunction typedArrayName(value: unknown): TypedArrayName | undefined {\n for (const [name, typedArrayConstructor] of Object.entries(TYPED_ARRAYS) as [\n TypedArrayName,\n (typeof TYPED_ARRAYS)[TypedArrayName],\n ][]) {\n if (value instanceof typedArrayConstructor) return name;\n }\n return undefined;\n}\n\nfunction canonicalize(value: unknown): unknown {\n const name = typedArrayName(value);\n if (name !== undefined)\n return { $typedArray: name, values: Array.from(value as PortableTypedArray) };\n if (Array.isArray(value)) return value.map(canonicalize);\n if (value !== null && typeof value === 'object')\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .map((key) => [key, canonicalize((value as Record<string, unknown>)[key])]),\n );\n return value;\n}\n\nfunction reviveTypedArrays(\n value: unknown,\n): { readonly value: unknown } | { readonly reason: string } {\n if (Array.isArray(value)) {\n const values: unknown[] = [];\n for (const item of value) {\n const revived = reviveTypedArrays(item);\n if ('reason' in revived) return revived;\n values.push(revived.value);\n }\n return { value: values };\n }\n if (value === null || typeof value !== 'object') return { value };\n const record = value as Record<string, unknown>;\n if ('$typedArray' in record) {\n if (\n Object.keys(record).length !== 2 ||\n typeof record.$typedArray !== 'string' ||\n !Array.isArray(record.values)\n )\n return { reason: 'typed-array tag must contain only an allowlisted name and values array' };\n const typedArrayConstructor = TYPED_ARRAYS[record.$typedArray as TypedArrayName];\n if (\n typedArrayConstructor === undefined ||\n record.values.some((item) => typeof item !== 'number')\n )\n return { reason: 'typed-array tag contains an unsupported type or non-numeric value' };\n return { value: new typedArrayConstructor(record.values) };\n }\n const revived: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(record)) {\n const nested = reviveTypedArrays(item);\n if ('reason' in nested) return nested;\n revived[key] = nested.value;\n }\n return { value: revived };\n}\n\nfunction limitError(limit: string, actual: number, maximum: number): NetError {\n return new NetError({\n code: 'decode-limit-exceeded',\n expected: `${limit} must not exceed ${maximum}`,\n hint: 'reduce the replicated payload or configure matching declared limits',\n detail: { limit, actual, maximum },\n });\n}\n\nfunction invalid(reason: string): NetError {\n return new NetError({\n code: 'decode-invalid-payload',\n expected: `a version ${REPLICATION_PROTOCOL_VERSION} ${REPLICATION_PROTOCOL_PREFIX} packet`,\n hint: 'send bytes produced by the protocol-v2 replication codec',\n detail: { reason },\n });\n}\n\nfunction validateEntities(entities: readonly ReplicationEntityRecord[]): string | undefined {\n const ids = new Set<number>();\n for (const [entityIndex, entity] of entities.entries()) {\n if (\n entity === null ||\n typeof entity !== 'object' ||\n !isSafeNonNegativeInteger(entity.id) ||\n !isReplicationEntityKind(entity.kind) ||\n !Array.isArray(entity.components) ||\n ids.has(entity.id)\n )\n return `entity record ${entityIndex} has an invalid or duplicate identity`;\n ids.add(entity.id);\n for (const [componentIndex, component] of entity.components.entries()) {\n if (\n component === null ||\n typeof component !== 'object' ||\n typeof component.name !== 'string' ||\n component.name.length === 0 ||\n (component.operation !== undefined &&\n component.operation !== 'replace' &&\n component.operation !== 'remove') ||\n component.data === null ||\n typeof component.data !== 'object' ||\n Array.isArray(component.data) ||\n (component.operation === 'remove' && Object.keys(component.data).length !== 0)\n )\n return `component record ${entityIndex}:${componentIndex} has invalid fields`;\n }\n }\n return undefined;\n}\n\nfunction validatePacket(packet: ReplicationPacket): string | undefined {\n if (packet.version !== REPLICATION_PROTOCOL_VERSION)\n return 'packet protocol version is unsupported';\n if (!isPacketKind(packet.kind)) return 'packet kind is unsupported';\n if (!isSessionId(packet.sessionId)) return 'sessionId must be a positive safe integer';\n if (!isSafeNonNegativeInteger(packet.epoch)) return 'epoch must be a non-negative safe integer';\n if (packet.kind === 'session-open' || packet.kind === 'session-resume')\n return packet.sequence === 0 ? undefined : 'session control sequence must be zero';\n if (packet.kind === 'ack')\n return isSafeNonNegativeInteger(packet.acknowledgedSequence)\n ? undefined\n : 'acknowledgedSequence must be a non-negative safe integer';\n if (!isSafeNonNegativeInteger(packet.sequence) || packet.sequence === 0)\n return 'sequence must be a positive safe integer';\n if (packet.kind === 'baseline' && packet.sequence !== 1) return 'baseline sequence must be one';\n if (packet.kind === 'rejection') {\n if (!isPacketKind(packet.rejectedKind) || typeof packet.reason !== 'string')\n return 'rejection details are invalid';\n return undefined;\n }\n if (packet.kind !== 'baseline' && packet.kind !== 'delta')\n return 'packet kind does not carry a data payload';\n if (typeof packet.tick !== 'number' || !Number.isSafeInteger(packet.tick))\n return 'tick must be a safe integer';\n if (typeof packet.fingerprint !== 'string') return 'fingerprint must be a string';\n return validateEntities(packet.entities);\n}\n\nfunction validateLimits(\n packet: ReplicationDataPacket,\n bytes: Uint8Array | undefined,\n limits: ReplicationLimits,\n): NetError | null {\n if (bytes !== undefined && bytes.byteLength > limits.maxMessageBytes)\n return limitError('maxMessageBytes', bytes.byteLength, limits.maxMessageBytes);\n if (packet.entities.length > limits.maxEntities)\n return limitError('maxEntities', packet.entities.length, limits.maxEntities);\n let operations = 0;\n const visit = (value: unknown): NetError | null => {\n if (\n typeof value === 'string' &&\n new TextEncoder().encode(value).byteLength > limits.maxStringBytes\n )\n return limitError(\n 'maxStringBytes',\n new TextEncoder().encode(value).byteLength,\n limits.maxStringBytes,\n );\n const typedArray = typedArrayName(value);\n if (typedArray !== undefined) {\n const contents = value as PortableTypedArray;\n if (contents.byteLength > limits.maxBufferBytes)\n return limitError('maxBufferBytes', contents.byteLength, limits.maxBufferBytes);\n if (contents.length > limits.maxArrayElements)\n return limitError('maxArrayElements', contents.length, limits.maxArrayElements);\n return null;\n }\n if (Array.isArray(value)) {\n if (value.length > limits.maxArrayElements)\n return limitError('maxArrayElements', value.length, limits.maxArrayElements);\n for (const item of value) {\n const problem = visit(item);\n if (problem) return problem;\n }\n }\n if (value !== null && typeof value === 'object' && !(value instanceof Uint8Array))\n for (const item of Object.values(value as Record<string, unknown>)) {\n const problem = visit(item);\n if (problem) return problem;\n }\n return null;\n };\n for (const entity of packet.entities) {\n operations += entity.components.length;\n for (const component of entity.components) {\n const problem = visit(component.data);\n if (problem) return problem;\n }\n }\n return operations > limits.maxComponentOperations\n ? limitError('maxComponentOperations', operations, limits.maxComponentOperations)\n : null;\n}\n\nfunction parse(\n bytes: Uint8Array,\n): { readonly packet: ReplicationPacket } | { readonly error: NetError } {\n const text = new TextDecoder().decode(bytes);\n const separator = text.indexOf('\\n');\n if (separator < 0 || text.slice(0, separator) !== REPLICATION_PROTOCOL_PREFIX)\n return { error: invalid('packet prefix does not match protocol-v2') };\n try {\n const decoded: unknown = JSON.parse(text.slice(separator + 1));\n const revived = reviveTypedArrays(decoded);\n if ('reason' in revived) return { error: invalid(revived.reason) };\n if (revived.value === null || typeof revived.value !== 'object')\n return { error: invalid('packet must be an object') };\n const packet = revived.value as ReplicationPacket;\n const reason = validatePacket(packet);\n if (reason !== undefined) {\n if (typeof packet.version === 'number' && packet.version !== REPLICATION_PROTOCOL_VERSION)\n return {\n error: new NetError({\n code: 'protocol-unsupported-version',\n expected: `protocol version ${REPLICATION_PROTOCOL_VERSION}`,\n hint: 'upgrade the peer before sending replicated bytes',\n detail: {\n receivedVersion: packet.version,\n supportedVersion: REPLICATION_PROTOCOL_VERSION,\n },\n }),\n };\n return { error: invalid(reason) };\n }\n return { packet };\n } catch {\n return { error: invalid('payload is not valid JSON') };\n }\n}\n\nfunction isDataPacket(packet: ReplicationPacket): packet is ReplicationDataPacket {\n return packet.kind === 'baseline' || packet.kind === 'delta';\n}\n\nexport function encodeReplicationPacket(\n packet: ReplicationPacket,\n limits: ReplicationLimits,\n): Result<Uint8Array, NetError> {\n const reason = validatePacket(packet);\n if (reason !== undefined) return err(invalid(reason));\n const body = JSON.stringify(canonicalize(packet));\n const bytes = new TextEncoder().encode(`${REPLICATION_PROTOCOL_PREFIX}\\n${body}`);\n const failure = isDataPacket(packet) ? validateLimits(packet, bytes, limits) : null;\n return failure ? err(failure) : ok(bytes);\n}\n\nexport function decodeReplicationPacket(\n bytes: Uint8Array,\n limits: ReplicationLimits,\n): Result<ReplicationPacket, NetError> {\n if (bytes.byteLength > limits.maxMessageBytes)\n return err(limitError('maxMessageBytes', bytes.byteLength, limits.maxMessageBytes));\n const parsed = parse(bytes);\n if ('error' in parsed) return err(parsed.error);\n const failure = isDataPacket(parsed.packet) ? validateLimits(parsed.packet, bytes, limits) : null;\n return failure ? err(failure) : ok(parsed.packet);\n}\n","import type { Component } from '@forgeax/engine-ecs';\nimport { validateProfileComponents } from '@forgeax/engine-ecs/externalization';\nimport { componentSchema } from '@forgeax/engine-ecs/internal';\nimport { err, ok, type Result } from '@forgeax/engine-types';\nexport interface ReplicationLimits {\n readonly maxMessageBytes: number;\n readonly maxEntities: number;\n readonly maxComponentOperations: number;\n readonly maxStringBytes: number;\n readonly maxBufferBytes: number;\n readonly maxArrayElements: number;\n}\nexport const DEFAULT_REPLICATION_LIMITS: ReplicationLimits = {\n maxMessageBytes: 64 * 1024,\n maxEntities: 1024,\n maxComponentOperations: 4096,\n maxStringBytes: 4096,\n maxBufferBytes: 16 * 1024,\n maxArrayElements: 1024,\n};\n\nimport { NetError } from './errors';\n\nexport interface ReplicationProfile {\n readonly name: string;\n readonly entities: ReplicationEntityFilter;\n readonly components: readonly Component[];\n readonly limits: ReplicationLimits;\n readonly fingerprint: string;\n}\nexport interface ReplicationEntityFilter {\n readonly with: readonly Component[];\n readonly without?: readonly Component[];\n}\nexport interface DefineReplicationOptions {\n readonly name: string;\n readonly entities: ReplicationEntityFilter;\n readonly components: readonly Component[];\n readonly limits?: Partial<ReplicationLimits>;\n}\nfunction hash(text: string): string {\n let value = 2166136261;\n for (const char of text) {\n value ^= char.charCodeAt(0);\n value = Math.imul(value, 16777619);\n }\n return (value >>> 0).toString(16).padStart(8, '0');\n}\n\nfunction immutableProfile(\n options: DefineReplicationOptions,\n limits: ReplicationLimits,\n fingerprint: string,\n): ReplicationProfile {\n const entities: ReplicationEntityFilter = Object.freeze({\n with: Object.freeze([...options.entities.with]),\n ...(options.entities.without === undefined\n ? {}\n : { without: Object.freeze([...options.entities.without]) }),\n });\n return Object.freeze({\n name: options.name,\n entities,\n components: Object.freeze([...options.components]),\n limits: Object.freeze({ ...limits }),\n fingerprint,\n });\n}\n\nexport function defineReplication(\n options: DefineReplicationOptions,\n): Result<ReplicationProfile, NetError> {\n const portable = validateProfileComponents(options.components);\n if (!portable.valid) {\n const first = portable.errors[0];\n if (first === undefined) {\n return err(\n new NetError({\n code: 'schema-invalid',\n expected: 'portable replication components',\n hint: 'select only components accepted by the ECS externalization kernel',\n detail: { component: '', reason: 'portable validation failed without a diagnostic' },\n }),\n );\n }\n return err(\n new NetError({\n code: 'schema-invalid',\n expected: first.expected,\n hint: first.hint,\n detail: { component: first.component, reason: first.code },\n }),\n );\n }\n const limits: ReplicationLimits = { ...DEFAULT_REPLICATION_LIMITS, ...options.limits };\n const signature = JSON.stringify({\n name: options.name,\n query: {\n with: options.entities.with.map((component) => component.name),\n ...(options.entities.without === undefined\n ? {}\n : { without: options.entities.without.map((component) => component.name) }),\n },\n components: options.components.map((component) => ({\n name: component.name,\n schema: componentSchema(component),\n })),\n limits,\n });\n return ok(immutableProfile(options, limits, hash(signature)));\n}\n","import type { EntityHandle, World } from '@forgeax/engine-ecs';\nimport { projectComponentData } from '@forgeax/engine-ecs/externalization';\nimport { err, ok, type Result } from '@forgeax/engine-types';\nimport type { SessionId } from '../session/recovery';\nimport { encodeReplicationPacket } from './codec';\nimport { REPLICATION_PROTOCOL_VERSION } from './constants';\nimport type { NetError } from './errors';\nimport { DEFAULT_REPLICATION_LIMITS, type ReplicationProfile } from './profile';\nimport type {\n ReplicationComponentRecord,\n ReplicationDataPacket,\n ReplicationEntityRecord,\n} from './protocol';\n\nexport type PublishedPacket = ReplicationDataPacket & {\n readonly bytes: Uint8Array;\n};\ninterface KnownEntity {\n readonly id: number;\n readonly components: Map<string, string>;\n}\nfunction stable(value: unknown): string {\n return JSON.stringify(value);\n}\n\nexport class AuthorityCoordinator {\n readonly #world: World;\n readonly #profile: ReplicationProfile;\n readonly #ids = new Map<EntityHandle, number>();\n readonly #known = new Map<EntityHandle, KnownEntity>();\n #nextId = 1;\n #tick = 0;\n #epoch = 0;\n #sequence = 0;\n readonly #sessionId: SessionId;\n constructor(world: World, profile: ReplicationProfile, sessionId: SessionId = 1 as SessionId) {\n this.#world = world;\n this.#profile = profile;\n this.#sessionId = sessionId;\n }\n idFor(entity: EntityHandle): number {\n return this.#ids.get(entity) ?? 0;\n }\n publish(): Result<PublishedPacket, NetError> {\n return this.#publish(false);\n }\n publishFull(): Result<PublishedPacket, NetError> {\n return this.#publish(true);\n }\n nextPublicationEpoch(forceFull = false): number {\n return forceFull && this.#tick > 0 ? this.#epoch + 1 : this.#epoch;\n }\n #publish(forceFull: boolean): Result<PublishedPacket, NetError> {\n const candidateIds = new Map(this.#ids);\n let candidateNextId = this.#nextId;\n const current = new Map<\n EntityHandle,\n { id: number; components: ReplicationComponentRecord[] }\n >();\n const query = this.#world.query(this.#profile.entities).unwrap();\n // Allocate every visible entity id before projecting any component data.\n // Query iteration visits storage groups independently, so projecting while\n // discovering ids can encode references to a later chunk as zero.\n for (const row of query) {\n if (!candidateIds.has(row.entity)) candidateIds.set(row.entity, candidateNextId++);\n }\n for (const row of query) {\n const entity = row.entity;\n const components: ReplicationComponentRecord[] = [];\n for (const component of this.#profile.components) {\n const raw = this.#world.get(entity, component);\n if (raw.ok) {\n components.push({\n name: component.name,\n data: projectComponentData(\n component,\n raw.value as Record<string, unknown>,\n (reference) => candidateIds.get(reference as EntityHandle) ?? 0,\n ),\n });\n }\n }\n const id = candidateIds.get(entity);\n if (id !== undefined) current.set(entity, { id, components });\n }\n\n const full = forceFull || this.#tick === 0;\n let nextEpoch = this.#epoch;\n let nextSequence = this.#sequence;\n if (forceFull && this.#tick > 0) {\n nextEpoch += 1;\n nextSequence = 0;\n }\n if (full && nextSequence === 0) nextSequence = 1;\n else nextSequence += 1;\n const entities: ReplicationEntityRecord[] = [];\n for (const [entity, entry] of current) {\n const prior = this.#known.get(entity);\n const components =\n full || prior === undefined\n ? entry.components\n : [\n ...entry.components.filter(\n (component) => prior.components.get(component.name) !== stable(component.data),\n ),\n ...[...prior.components.keys()]\n .filter((name) => !entry.components.some((component) => component.name === name))\n .map((name) => ({ name, operation: 'remove' as const, data: {} })),\n ];\n if (full || prior === undefined || components.length > 0)\n entities.push({ id: entry.id, kind: 'upsert', components });\n }\n // A full baseline is consumed by a fresh replica, so it must describe\n // only live entities. Despawn records refer to the previous authority\n // baseline and would be unknown identities on a late-joining replica.\n if (!full)\n for (const [entity, prior] of this.#known) {\n if (!current.has(entity)) entities.push({ id: prior.id, kind: 'despawn', components: [] });\n }\n\n const candidateKnown = new Map<EntityHandle, KnownEntity>();\n for (const [entity, entry] of current) {\n candidateKnown.set(entity, {\n id: entry.id,\n components: new Map(\n entry.components.map((component) => [component.name, stable(component.data)]),\n ),\n });\n }\n for (const [entity] of candidateIds) {\n if (!current.has(entity)) candidateIds.delete(entity);\n }\n\n const packet: ReplicationDataPacket = full\n ? {\n version: REPLICATION_PROTOCOL_VERSION,\n kind: 'baseline',\n sessionId: this.#sessionId,\n epoch: nextEpoch,\n sequence: nextSequence as 1,\n fingerprint: this.#profile.fingerprint,\n tick: this.#tick + 1,\n entities,\n }\n : {\n version: REPLICATION_PROTOCOL_VERSION,\n kind: 'delta',\n sessionId: this.#sessionId,\n epoch: nextEpoch,\n sequence: nextSequence,\n fingerprint: this.#profile.fingerprint,\n tick: this.#tick + 1,\n entities,\n };\n const encoded = encodeReplicationPacket(\n packet,\n this.#profile.limits ?? DEFAULT_REPLICATION_LIMITS,\n );\n if (!encoded.ok) return err(encoded.error);\n\n this.#ids.clear();\n for (const [entity, id] of candidateIds) this.#ids.set(entity, id);\n this.#known.clear();\n for (const [entity, known] of candidateKnown) this.#known.set(entity, known);\n this.#nextId = candidateNextId;\n this.#tick = packet.tick;\n this.#epoch = nextEpoch;\n this.#sequence = nextSequence;\n return ok({ ...packet, bytes: encoded.value });\n }\n}\nexport function createAuthorityCoordinator(\n world: World,\n profile: ReplicationProfile,\n): AuthorityCoordinator {\n return new AuthorityCoordinator(world, profile);\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport { NetError } from './errors';\nimport type { ReplicationProfile } from './profile';\nexport function validateHandshake(\n local: ReplicationProfile,\n remote: ReplicationProfile,\n): Result<void, NetError> {\n if (local.fingerprint !== remote.fingerprint)\n return err(\n new NetError({\n code: 'handshake-profile-mismatch',\n expected: 'matching protocol, profile, and declared limits',\n hint: 'use identical ordered replication components and limits on both peers',\n detail: { localFingerprint: local.fingerprint, remoteFingerprint: remote.fingerprint },\n }),\n );\n return ok(undefined);\n}\n","import type { Component, EntityHandle, World } from '@forgeax/engine-ecs';\nimport { classifyEntityField } from '@forgeax/engine-ecs/externalization';\nimport { componentSchema } from '@forgeax/engine-ecs/internal';\nimport { err, ok, type Result } from '@forgeax/engine-types';\nimport type { NetEndpoint } from '../endpoint/endpoint';\nimport { decodeReplicationPacket } from './codec';\nimport { NetError } from './errors';\nimport type { ReplicationLimits, ReplicationProfile } from './profile';\nimport type { ReplicationDataPacket } from './protocol';\n\nexport class ReplicaCoordinator {\n readonly #world: World;\n readonly #profile: ReplicationProfile;\n readonly #entities = new Map<number, EntityHandle>();\n #lastTick = 0;\n #epoch = -1;\n #lastSequence = 0;\n #lastPacketOutcome: 'accepted' | 'duplicate' | 'ignored-old-epoch' = 'accepted';\n #stopped = false;\n constructor(world: World, profile: ReplicationProfile, _endpoint?: unknown) {\n this.#world = world;\n this.#profile = profile;\n }\n entityFor(id: number): EntityHandle | undefined {\n return this.#entities.get(id);\n }\n readComponent(id: number, component: Component): Record<string, unknown> | undefined {\n const entity = this.#entities.get(id);\n if (entity === undefined) return undefined;\n const read = this.#world.get(entity, component);\n return read.ok ? (read.value as Record<string, unknown>) : undefined;\n }\n snapshot(): readonly { id: number; components: readonly string[] }[] {\n return [...this.#entities]\n .map(([id, entity]) => ({\n id,\n components: this.#profile.components\n .filter((component) => this.#world.get(entity, component).ok)\n .map((component) => component.name),\n }))\n .sort((a, b) => a.id - b.id);\n }\n disconnect(): void {}\n /** Remove the last replica baseline when the authority connection closes. */\n clear(): void {\n for (const entity of this.#entities.values()) this.#world.despawn(entity).unwrap();\n this.#entities.clear();\n }\n get stopped(): boolean {\n return this.#stopped;\n }\n get tick(): number {\n return this.#lastTick;\n }\n /** Report the last accepted, duplicate, or stale-epoch packet decision. */\n get lastPacketOutcome(): 'accepted' | 'duplicate' | 'ignored-old-epoch' {\n return this.#lastPacketOutcome;\n }\n getPendingUnresolvedReferences(): number {\n return 0;\n }\n #entityReferences(value: unknown): readonly unknown[] {\n if (Array.isArray(value) || ArrayBuffer.isView(value)) {\n return Array.from(value as ArrayLike<unknown>);\n }\n return [];\n }\n validate(packet: ReplicationDataPacket): NetError | null {\n this.#lastPacketOutcome = 'accepted';\n if (this.#stopped)\n return new NetError({\n code: 'apply-invariant-failed',\n expected: 'an active replica coordinator',\n hint: 'create a new session after a fatal apply failure',\n detail: { reason: 'replication stopped' },\n });\n if (packet.fingerprint !== this.#profile.fingerprint)\n return new NetError({\n code: 'schema-invalid',\n expected: 'a batch for the negotiated replication profile',\n hint: 'complete handshake before applying replication bytes',\n detail: { component: '', reason: 'fingerprint mismatch' },\n });\n const newEpoch = packet.epoch > this.#epoch;\n if (this.#epoch < 0 && packet.kind !== 'baseline')\n return new NetError({\n code: 'session-illegal-transition',\n expected: 'a baseline before any delta in a session epoch',\n hint: 'accept a complete authoritative baseline before applying deltas',\n detail: { from: 'connecting', to: packet.kind },\n });\n if (packet.epoch > this.#epoch && (packet.kind !== 'baseline' || packet.sequence !== 1))\n return new NetError({\n code: 'session-illegal-transition',\n expected: 'a sequence-one baseline at the start of a new epoch',\n hint: 'request a fresh baseline before applying the next delta',\n detail: { from: 'resyncing', to: packet.kind },\n });\n if (packet.epoch < this.#epoch) return null;\n if (packet.kind === 'baseline' && !newEpoch && this.#lastSequence >= 1) {\n this.#lastPacketOutcome = 'duplicate';\n return null;\n }\n if (packet.kind === 'delta' && packet.sequence <= this.#lastSequence) {\n this.#lastPacketOutcome = 'duplicate';\n return null;\n }\n if (packet.kind === 'delta' && packet.sequence !== this.#lastSequence + 1)\n return new NetError({\n code: 'ordering-invalid-tick',\n expected: 'the next contiguous replication sequence',\n hint: 'request a fresh baseline when a sequence gap is detected',\n detail: { receivedTick: packet.sequence, lastTick: this.#lastSequence },\n });\n if (!newEpoch && packet.tick <= this.#lastTick)\n return new NetError({\n code: 'ordering-invalid-tick',\n expected: 'a strictly monotonic authority tick',\n hint: 'discard duplicate, stale, and out-of-order batches',\n detail: { receivedTick: packet.tick, lastTick: this.#lastTick },\n });\n const batchIds = new Set<number>();\n const knownIds = newEpoch ? new Set<number>() : new Set(this.#entities.keys());\n for (const record of packet.entities) {\n if (!Number.isSafeInteger(record.id) || record.id <= 0 || batchIds.has(record.id))\n return new NetError({\n code: 'identity-invalid',\n expected: 'unique non-zero NetEntityId values',\n hint: 'use session-issued identity values exactly once per batch',\n detail: { id: record.id, reason: 'zero, invalid, or duplicate identity' },\n });\n batchIds.add(record.id);\n }\n for (const record of packet.entities) {\n if (record.kind === 'despawn' && !knownIds.has(record.id))\n return new NetError({\n code: 'identity-invalid',\n expected: 'a known identity for despawn',\n hint: 'do not reuse or despawn unknown network identities',\n detail: { id: record.id, reason: 'unknown identity' },\n });\n for (const entry of record.components) {\n const component = this.#profile.components.find(\n (candidate) => candidate.name === entry.name,\n );\n if (component === undefined)\n return new NetError({\n code: 'schema-invalid',\n expected: 'a component selected by the negotiated profile',\n hint: 'send only components from the ordered replication profile',\n detail: { component: entry.name, reason: 'unselected component' },\n });\n if (entry.operation === 'remove') continue;\n for (const [field, value] of Object.entries(entry.data)) {\n if (!(field in componentSchema(component)))\n return new NetError({\n code: 'schema-invalid',\n expected: 'component fields declared by the negotiated ECS schema',\n hint: 'send only fields declared by the replicated component token',\n detail: { component: entry.name, reason: `unknown field ${field}` },\n });\n const kind = classifyEntityField(component, field);\n const refs = kind?.isArray ? this.#entityReferences(value) : kind ? [value] : [];\n for (const reference of refs)\n if (\n reference !== null &&\n (typeof reference !== 'number' ||\n reference === 0 ||\n (!knownIds.has(reference) && !batchIds.has(reference)))\n )\n return new NetError({\n code: 'remap-unresolved-reference',\n expected: 'every entity reference to resolve in the current or same batch',\n hint: 'include the referenced spawn in this batch; cross-batch pending references are unsupported',\n detail: { id: record.id, referencedId: Number(reference) },\n });\n }\n }\n }\n return null;\n }\n apply(packet: ReplicationDataPacket): Result<void, NetError> {\n const failure = this.validate(packet);\n if (failure) {\n return err(failure);\n }\n if (packet.epoch < this.#epoch) {\n this.#lastPacketOutcome = 'ignored-old-epoch';\n return ok(undefined);\n }\n if (this.#lastPacketOutcome === 'duplicate') return ok(undefined);\n const replacingEpoch = packet.epoch > this.#epoch;\n try {\n if (replacingEpoch) {\n for (const entity of this.#entities.values()) this.#world.despawn(entity).unwrap();\n this.#entities.clear();\n }\n for (const record of packet.entities)\n if (record.kind === 'upsert' && !this.#entities.has(record.id))\n this.#entities.set(record.id, this.#world.spawn().unwrap());\n for (const record of packet.entities)\n if (record.kind === 'upsert') {\n const entity = this.#entities.get(record.id);\n if (entity === undefined) throw new Error(`missing allocated entity ${record.id}`);\n for (const entry of record.components) {\n const component = this.#profile.components.find(\n (candidate) => candidate.name === entry.name,\n );\n if (component === undefined) throw new Error(`missing profile component ${entry.name}`);\n if (entry.operation === 'remove') {\n const removal = this.#world.removeComponent(entity, component);\n if (!removal.ok) throw removal.error;\n continue;\n }\n const data = Object.fromEntries(\n Object.entries(entry.data).map(([field, value]) => {\n const kind = classifyEntityField(component, field);\n if (kind === null) return [field, value];\n const mapped = kind.isArray\n ? this.#entityReferences(value).map((id) => {\n if (id === null) return null;\n const reference = this.#entities.get(id as number);\n if (reference === undefined)\n throw new Error(`missing entity reference ${id}`);\n return reference;\n })\n : value === null\n ? null\n : this.#entities.get(value as number);\n if (mapped === undefined) throw new Error(`missing entity reference ${value}`);\n return [field, mapped];\n }),\n );\n const typedData = data as never;\n const exists = this.#world.get(entity, component);\n const write = exists.ok\n ? this.#world.set(entity, component, typedData)\n : this.#world.addComponent(entity, { component, data: typedData });\n if (!write.ok) throw write.error;\n }\n }\n for (const record of packet.entities)\n if (record.kind === 'despawn') {\n const entity = this.#entities.get(record.id);\n if (entity === undefined) throw new Error(`missing despawn entity ${record.id}`);\n this.#world.despawn(entity).unwrap();\n this.#entities.delete(record.id);\n }\n this.#epoch = packet.epoch;\n this.#lastSequence = packet.sequence;\n this.#lastTick = packet.tick;\n this.#lastPacketOutcome = 'accepted';\n return ok(undefined);\n } catch (cause) {\n this.#stopped = true;\n return err(\n new NetError({\n code: 'apply-invariant-failed',\n expected: 'ECS apply invariants to accept a validated batch',\n hint: 'stop this replication session and inspect the ECS error',\n detail: { reason: cause instanceof Error ? cause.message : String(cause) },\n }),\n );\n }\n }\n}\nexport function createReplicaCoordinator(\n world: World,\n profile: ReplicationProfile,\n endpoint?: NetEndpoint,\n): ReplicaCoordinator {\n return new ReplicaCoordinator(world, profile, endpoint);\n}\nexport function applyReplicationPacket(\n replica: ReplicaCoordinator,\n packet: ReplicationDataPacket,\n): Result<void, NetError> {\n return replica.apply(packet);\n}\n\nexport function decodeAndApplyReplicationPacket(\n replica: ReplicaCoordinator,\n bytes: Uint8Array,\n limits: ReplicationLimits,\n): Result<void, NetError> {\n const decoded = decodeReplicationPacket(bytes, limits);\n if (!decoded.ok) {\n return err(decoded.error);\n }\n if (decoded.value.kind !== 'baseline' && decoded.value.kind !== 'delta') {\n return err(\n new NetError({\n code: 'decode-invalid-payload',\n expected: 'a baseline or delta replication packet',\n hint: 'apply only data packets through the replica coordinator',\n detail: { reason: 'control packet cannot be applied as ECS data' },\n }),\n );\n }\n return replica.apply(decoded.value);\n}\n","import { err, ok, type Result } from '@forgeax/engine-types';\nimport type { NetEndpointConnector } from '../endpoint/endpoint';\nimport type { EndpointError } from '../endpoint/errors';\nimport { NetError, type NetErrorCode } from '../replication/errors';\n\ndeclare const sessionIdBrand: unique symbol;\n\n/** Authority-issued application identity; it is distinct from transport PeerId. */\nexport type SessionId = number & { readonly [sessionIdBrand]: true };\n\nexport type NetSessionStateKind =\n | 'connecting'\n | 'resyncing'\n | 'active'\n | 'recovering'\n | 'failed'\n | 'retired';\n\nexport type NetSessionFailure = NetError | EndpointError;\n\n/** Public lifecycle state owned by one logical session. */\nexport type NetSessionState =\n | { readonly kind: 'connecting'; readonly sessionId: SessionId }\n | { readonly kind: 'resyncing'; readonly sessionId: SessionId; readonly epoch: number }\n | {\n readonly kind: 'active';\n readonly sessionId: SessionId;\n readonly epoch: number;\n readonly sequence: number;\n }\n | {\n readonly kind: 'recovering';\n readonly sessionId: SessionId;\n readonly epoch: number;\n readonly attempt: number;\n }\n | {\n readonly kind: 'failed';\n readonly sessionId: SessionId;\n readonly error: NetSessionFailure;\n }\n | {\n readonly kind: 'retired';\n readonly sessionId: SessionId;\n readonly reason: 'disposed' | 'terminal-failure';\n };\n\nexport interface NetRecoveryPolicy {\n readonly maxSessions: number;\n readonly maxPendingPackets: number;\n readonly ackTimeoutMs: number;\n readonly maxPacketRetries: number;\n readonly maxReconnectAttempts: number;\n readonly reconnectDeadlineMs: number;\n readonly reconnectDelaysMs: readonly number[];\n}\n\n/** Finite, deterministic recovery bounds shared by every transport adapter. */\nexport const DEFAULT_NET_RECOVERY_POLICY: NetRecoveryPolicy = Object.freeze({\n maxSessions: 64,\n maxPendingPackets: 32,\n ackTimeoutMs: 250,\n maxPacketRetries: 3,\n maxReconnectAttempts: 5,\n reconnectDeadlineMs: 10_000,\n reconnectDelaysMs: Object.freeze([0, 100, 200, 400, 800]),\n});\n\nfunction policyError(field: string, reason: string): NetError {\n return new NetError({\n code: 'recovery-policy-invalid',\n expected: 'finite positive recovery policy bounds',\n hint: 'provide positive safe integers and a finite non-negative delay sequence',\n detail: { field, reason },\n });\n}\n\nfunction isPositiveSafeInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;\n}\n\n/** Validate a complete policy without mutating it. */\nexport function validateNetRecoveryPolicy(policy: NetRecoveryPolicy): Result<void, NetError> {\n const positiveFields: readonly (keyof Omit<NetRecoveryPolicy, 'reconnectDelaysMs'>)[] = [\n 'maxSessions',\n 'maxPendingPackets',\n 'ackTimeoutMs',\n 'maxPacketRetries',\n 'maxReconnectAttempts',\n 'reconnectDeadlineMs',\n ];\n for (const field of positiveFields) {\n if (!isPositiveSafeInteger(policy[field]))\n return err(policyError(field, 'value must be a positive safe integer'));\n }\n if (\n !Array.isArray(policy.reconnectDelaysMs) ||\n policy.reconnectDelaysMs.length === 0 ||\n policy.reconnectDelaysMs.some((delay) => !Number.isSafeInteger(delay) || delay < 0)\n )\n return err(\n policyError('reconnectDelaysMs', 'values must be a non-empty finite delay sequence'),\n );\n return ok(undefined);\n}\n\n/** Merge caller overrides with the bounded defaults and validate the result. */\nexport function resolveNetRecoveryPolicy(\n overrides: Partial<NetRecoveryPolicy> = {},\n): Result<NetRecoveryPolicy, NetError> {\n const policy: NetRecoveryPolicy = {\n ...DEFAULT_NET_RECOVERY_POLICY,\n ...overrides,\n reconnectDelaysMs:\n overrides.reconnectDelaysMs === undefined\n ? DEFAULT_NET_RECOVERY_POLICY.reconnectDelaysMs\n : [...overrides.reconnectDelaysMs],\n };\n const valid = validateNetRecoveryPolicy(policy);\n return valid.ok ? ok(Object.freeze(policy)) : err(valid.error);\n}\n\n/** Create a positive application identity without allowing plain numbers to cross the seam. */\nexport function createSessionId(value: number): Result<SessionId, NetError> {\n if (!isPositiveSafeInteger(value))\n return err(\n new NetError({\n code: 'recovery-policy-invalid',\n expected: 'a positive safe integer SessionId',\n hint: 'use the authority-issued application session identity',\n detail: { field: 'sessionId', reason: 'SessionId must be a positive safe integer' },\n }),\n );\n return ok(value as SessionId);\n}\n\n/** Observable bounded accounting for one logical recovery session. */\nexport interface NetRecoverySnapshot {\n readonly sessionId: SessionId;\n readonly state: NetSessionState;\n readonly pendingPackets: number;\n readonly maxPendingPackets: number;\n readonly acknowledgedSequence: number;\n readonly reconnectAttempts: number;\n readonly epoch: number;\n readonly sequence: number;\n readonly ownedResources: {\n readonly pendingConnects: number;\n readonly timers: number;\n readonly ledgers: number;\n readonly callbacks: number;\n };\n readonly lastError?: NetSessionFailure;\n}\n\n/** Stable result kinds for repeated recovery requests. */\nexport type NetRecoveryOutcome =\n | { readonly kind: 'started'; readonly sessionId: SessionId }\n | { readonly kind: 'already-recovering'; readonly sessionId: SessionId }\n | { readonly kind: 'already-active'; readonly sessionId: SessionId }\n | { readonly kind: 'retired'; readonly sessionId: SessionId };\n\nconst LEGAL_TRANSITIONS: Readonly<Record<NetSessionStateKind, readonly NetSessionStateKind[]>> = {\n connecting: ['recovering', 'resyncing', 'failed', 'retired'],\n resyncing: ['active', 'recovering', 'failed', 'retired'],\n active: ['active', 'recovering', 'failed', 'retired'],\n recovering: ['recovering', 'resyncing', 'failed', 'retired'],\n failed: ['retired'],\n retired: ['retired'],\n};\n\nexport function isLegalNetSessionTransition(\n from: NetSessionStateKind,\n to: NetSessionStateKind,\n): boolean {\n return LEGAL_TRANSITIONS[from].includes(to);\n}\n\n/** Validate an immutable state replacement before a session publishes it. */\nexport function transitionNetSessionState(\n from: NetSessionState,\n to: NetSessionState,\n): Result<NetSessionState, NetError> {\n if (from.sessionId !== to.sessionId || !isLegalNetSessionTransition(from.kind, to.kind))\n return err(\n new NetError({\n code: 'session-illegal-transition',\n expected: 'a legal transition for the same SessionId',\n hint: 'wait for the current session state or retire the session before replacing it',\n detail: { from: from.kind, to: to.kind },\n }),\n );\n return ok(to);\n}\n\nexport type { NetEndpointConnector };\n\nexport const RECOVERY_ERROR_CODES: readonly NetErrorCode[] = [\n 'protocol-unsupported-version',\n 'session-illegal-transition',\n 'recovery-policy-invalid',\n 'recovery-rejected',\n 'recovery-exhausted',\n];\n","// @forgeax/engine-net -- NetSession host-neutral World integration.\n\nimport { err, ok, type Result } from '@forgeax/engine-types';\nimport type {\n EndpointEvent,\n NetEndpoint,\n NetEndpointConnector,\n PeerId,\n} from '../endpoint/endpoint';\nimport { type EndpointError, isEndpointError } from '../endpoint/errors';\nimport type { AuthorityCoordinator, PublishedPacket } from '../replication/authority';\nimport { decodeReplicationPacket, encodeReplicationPacket } from '../replication/codec';\nimport { NetError, type NetError as NetErrorType } from '../replication/errors';\nimport { DEFAULT_REPLICATION_LIMITS, type ReplicationLimits } from '../replication/profile';\nimport type {\n ReplicationAckPacket,\n ReplicationDataPacket,\n ReplicationSessionPacket,\n} from '../replication/protocol';\nimport { decodeAndApplyReplicationPacket, type ReplicaCoordinator } from '../replication/replica';\nimport {\n createSessionId,\n DEFAULT_NET_RECOVERY_POLICY,\n type NetRecoveryOutcome,\n type NetRecoveryPolicy,\n type NetRecoverySnapshot,\n type NetSessionFailure,\n type NetSessionState,\n resolveNetRecoveryPolicy,\n type SessionId,\n transitionNetSessionState,\n} from './recovery';\n\nexport interface PeerSnapshot {\n readonly peerIds: ReadonlyArray<PeerId>;\n readonly connected: boolean;\n}\n\nexport interface SessionSnapshot {\n readonly sessionIds: ReadonlyArray<SessionId>;\n readonly connected: boolean;\n}\n\nexport interface NetSessionClock {\n readonly now: () => number;\n readonly schedule: (delayMs: number, callback: () => void) => { cancel(): void };\n}\n\nexport interface NetSessionResourceCounts {\n readonly pendingConnects: number;\n readonly timers: number;\n readonly ledgers: number;\n readonly callbacks: number;\n}\n\nexport interface NetSessionConfig {\n readonly endpoint?: NetEndpoint;\n readonly connector?: NetEndpointConnector;\n readonly sessionId?: SessionId | number;\n readonly recovery?: Partial<NetRecoveryPolicy>;\n readonly clock?: NetSessionClock;\n readonly maxRawMessages: number;\n}\n\nexport interface RawMessage {\n readonly peerId: PeerId;\n readonly sessionId: SessionId;\n readonly data: Uint8Array;\n}\n\nconst defaultClock: NetSessionClock = {\n now: () => Date.now(),\n schedule: (delayMs, callback) => {\n const id = globalThis.setTimeout(callback, delayMs);\n return { cancel: () => globalThis.clearTimeout(id) };\n },\n};\n\nfunction recoveryFailure(reason: string): NetErrorType {\n return new NetError({\n code: 'recovery-rejected',\n expected: 'a recoverable NetSession lifecycle operation',\n hint: 'inspect the current snapshot and retire the session after terminal failure',\n detail: { reason },\n });\n}\n\nfunction initialState(sessionId: SessionId, endpoint: NetEndpoint | undefined): NetSessionState {\n return endpoint === undefined\n ? { kind: 'connecting', sessionId }\n : { kind: 'resyncing', sessionId, epoch: 0 };\n}\n\nexport class NetSession {\n #endpoint: NetEndpoint | undefined;\n readonly #connector: NetEndpointConnector | undefined;\n readonly #clock: NetSessionClock;\n readonly #policy: NetRecoveryPolicy;\n readonly #sessionId: SessionId;\n readonly #peerIds = new Set<PeerId>();\n readonly #sessionPeers = new Map<SessionId, PeerId>();\n readonly #announcedPeers = new Set<PeerId>();\n #sessionAnnounced = false;\n #rawMessages: RawMessage[] = [];\n readonly #maxRawMessages: number;\n #authority: AuthorityCoordinator | undefined;\n readonly #pendingFullPeers = new Set<PeerId>();\n #replica:\n | { readonly coordinator: ReplicaCoordinator; readonly limits: ReplicationLimits }\n | undefined;\n #state: NetSessionState;\n #lastError: NetSessionFailure | undefined;\n #epoch = 0;\n #sequence = 0;\n #acknowledgedSequence = 0;\n #reconnectAttempts = 0;\n #pendingConnect: { readonly abort: () => void } | undefined;\n #retryTimer: { cancel(): void } | undefined;\n readonly #ledger = new Map<number, Uint8Array>();\n #deferredEvents: EndpointEvent[] = [];\n #deferReplicaMessages = false;\n #disposed = false;\n\n constructor(config: NetSessionConfig) {\n this.#endpoint = config.endpoint;\n this.#connector = config.connector;\n this.#clock = config.clock ?? defaultClock;\n this.#maxRawMessages = config.maxRawMessages;\n const resolvedSessionId = this.#resolveSessionId(config.sessionId);\n this.#sessionId = resolvedSessionId.ok ? resolvedSessionId.value : (1 as SessionId);\n const policy = resolveNetRecoveryPolicy(config.recovery);\n this.#policy = policy.ok ? policy.value : DEFAULT_NET_RECOVERY_POLICY;\n this.#state = initialState(this.#sessionId, this.#endpoint);\n if (!resolvedSessionId.ok) this.#setFailure(resolvedSessionId.error);\n else if (!policy.ok) this.#setFailure(policy.error);\n }\n\n #resolveSessionId(value: SessionId | number | undefined): Result<SessionId, NetErrorType> {\n return createSessionId(value ?? 1);\n }\n\n #setState(next: NetSessionState): void {\n const transition = transitionNetSessionState(this.#state, next);\n if (transition.ok) {\n this.#state = transition.value;\n return;\n }\n this.#setFailure(transition.error);\n }\n\n #setFailure(failure: NetSessionFailure): void {\n this.#lastError = failure;\n if (this.#state.kind !== 'failed' && this.#state.kind !== 'retired')\n this.#setState({ kind: 'failed', sessionId: this.#sessionId, error: failure });\n this.#authority = undefined;\n this.#peerIds.clear();\n this.#sessionPeers.clear();\n this.#announcedPeers.clear();\n this.#sessionAnnounced = false;\n this.#pendingFullPeers.clear();\n this.#rawMessages = [];\n this.#deferredEvents = [];\n this.#deferReplicaMessages = false;\n this.#clearRecoveryWork();\n this.#endpoint?.close();\n }\n\n #clearRecoveryWork(): void {\n this.#retryTimer?.cancel();\n this.#retryTimer = undefined;\n this.#pendingConnect?.abort();\n this.#pendingConnect = undefined;\n this.#ledger.clear();\n }\n\n #beginRecovery(): void {\n const previousEndpoint = this.#endpoint;\n this.#endpoint = undefined;\n previousEndpoint?.close();\n if (\n this.#state.kind === 'connecting' ||\n this.#state.kind === 'active' ||\n this.#state.kind === 'resyncing'\n )\n this.#setState({\n kind: 'recovering',\n sessionId: this.#sessionId,\n epoch: this.#epoch,\n attempt: 0,\n });\n this.#ledger.clear();\n this.#sequence = 0;\n this.#acknowledgedSequence = 0;\n this.#peerIds.clear();\n this.#sessionPeers.clear();\n this.#announcedPeers.clear();\n this.#sessionAnnounced = false;\n this.#pendingFullPeers.clear();\n this.#rawMessages = [];\n this.#deferredEvents = [];\n this.#deferReplicaMessages = false;\n }\n\n #attemptRecovery(): void {\n if (this.#disposed || this.#state.kind !== 'recovering' || this.#pendingConnect) return;\n if (this.#reconnectAttempts >= this.#policy.maxReconnectAttempts) {\n this.#setFailure(\n new NetError({\n code: 'recovery-exhausted',\n expected: 'reconnect attempts within the configured finite bound',\n hint: 'inspect the failure and create a new session after exhaustion',\n detail: {\n attempts: this.#reconnectAttempts,\n maxAttempts: this.#policy.maxReconnectAttempts,\n },\n }),\n );\n return;\n }\n this.#reconnectAttempts += 1;\n this.#setState({\n kind: 'recovering',\n sessionId: this.#sessionId,\n epoch: this.#epoch,\n attempt: this.#reconnectAttempts,\n });\n if (this.#connector === undefined) {\n if (this.#reconnectAttempts >= this.#policy.maxReconnectAttempts) this.#attemptRecovery();\n return;\n }\n const controller = new AbortController();\n this.#pendingConnect = { abort: () => controller.abort() };\n void this.#connector.connect(controller.signal).then(\n (result) => this.#connected(result),\n (cause: unknown) => this.#connectFailed(cause),\n );\n }\n\n #connected(result: Result<NetEndpoint, EndpointError>): void {\n this.#pendingConnect = undefined;\n if (this.#disposed || this.#state.kind !== 'recovering') {\n if (result.ok) result.value.close();\n return;\n }\n if (!result.ok) {\n this.#connectFailed(result.error);\n return;\n }\n this.#endpoint?.close();\n this.#endpoint = result.value;\n this.#lastError = undefined;\n this.#epoch += 1;\n this.#sequence = 0;\n this.#acknowledgedSequence = 0;\n this.#ledger.clear();\n // Keep the replacement endpoint's first message behind one receive tick.\n // A connector may deliver peer-connected and the fresh baseline in the\n // same poll; exposing resyncing for one frame makes the lifecycle state\n // observable and prevents a baseline from being consumed in the connect\n // callback's first update.\n this.#deferReplicaMessages = this.#replica !== undefined;\n this.#setState({ kind: 'resyncing', sessionId: this.#sessionId, epoch: this.#epoch });\n }\n\n #connectFailed(cause: unknown): void {\n this.#pendingConnect = undefined;\n if (this.#disposed || this.#state.kind !== 'recovering') return;\n const failure: NetSessionFailure =\n cause instanceof NetError\n ? (cause as unknown as NetErrorType)\n : isEndpointError(cause)\n ? cause\n : recoveryFailure('connector attempt failed');\n if (this.#reconnectAttempts >= this.#policy.maxReconnectAttempts) {\n this.#setFailure(\n new NetError({\n code: 'recovery-exhausted',\n expected: 'reconnect attempts within the configured finite bound',\n hint: 'inspect the endpoint failure and create a new session after exhaustion',\n detail: {\n attempts: this.#reconnectAttempts,\n maxAttempts: this.#policy.maxReconnectAttempts,\n },\n }),\n );\n return;\n }\n this.#lastError = failure;\n this.advanceRecovery();\n }\n\n #handleAck(packet: ReplicationAckPacket): Result<void, NetError> {\n if (packet.sessionId !== this.#sessionId && !this.#sessionPeers.has(packet.sessionId))\n return err(\n new NetError({\n code: 'recovery-rejected',\n expected: 'an ACK for the current SessionId',\n hint: 'discard ACKs from another logical session',\n detail: { reason: 'ACK SessionId does not match the current session' },\n }),\n );\n if (packet.epoch !== this.#epoch || packet.acknowledgedSequence > this.#sequence)\n return ok(undefined);\n if (packet.acknowledgedSequence <= this.#acknowledgedSequence) return ok(undefined);\n this.#acknowledgedSequence = packet.acknowledgedSequence;\n for (const sequence of this.#ledger.keys())\n if (sequence <= packet.acknowledgedSequence) this.#ledger.delete(sequence);\n return ok(undefined);\n }\n\n #receiveMessage(peerId: PeerId, data: Uint8Array, errors: NetError[]): void {\n if (\n this.#state.kind === 'recovering' ||\n this.#state.kind === 'failed' ||\n this.#state.kind === 'retired'\n )\n return;\n const limits = this.#replica?.limits ?? DEFAULT_REPLICATION_LIMITS;\n const decoded = decodeReplicationPacket(data, limits);\n if (!decoded.ok) {\n if (this.#replica === undefined) {\n this.#queueRawMessage(peerId, data);\n return;\n }\n errors.push(decoded.error);\n this.#setFailure(decoded.error as NetErrorType);\n return;\n }\n if (decoded.value.kind === 'session-open' || decoded.value.kind === 'session-resume') {\n this.#bindSession(decoded.value.sessionId, peerId);\n return;\n }\n if (decoded.value.kind === 'ack') {\n const handled = this.#handleAck(decoded.value);\n if (!handled.ok) {\n errors.push(handled.error);\n this.#setFailure(handled.error);\n }\n return;\n }\n if (decoded.value.kind !== 'baseline' && decoded.value.kind !== 'delta') {\n if (decoded.value.kind === 'rejection') {\n const failure = recoveryFailure(\n `peer rejected ${decoded.value.rejectedKind}: ${decoded.value.reason}`,\n );\n errors.push(failure);\n this.#setFailure(failure);\n }\n return;\n }\n if (this.#replica === undefined) {\n this.#queueRawMessage(peerId, data);\n return;\n }\n const applied = decodeAndApplyReplicationPacket(\n this.#replica.coordinator,\n data,\n this.#replica.limits,\n );\n if (!applied.ok) {\n errors.push(applied.error);\n this.#setFailure(applied.error);\n return;\n }\n const packetOutcome = this.#replica.coordinator.lastPacketOutcome;\n if (packetOutcome === 'accepted') {\n this.#epoch = decoded.value.epoch;\n this.#sequence = decoded.value.sequence;\n this.#acknowledgedSequence = decoded.value.sequence;\n this.#setState({\n kind: 'active',\n sessionId: this.#sessionId,\n epoch: this.#epoch,\n sequence: this.#sequence,\n });\n }\n if (packetOutcome === 'accepted' || packetOutcome === 'duplicate')\n this.#sendReplicationAck(peerId, decoded.value);\n }\n\n receiveEvents(): readonly NetError[] {\n const errors: NetError[] = [];\n if (this.#disposed || this.#state.kind === 'failed' || this.#state.kind === 'retired')\n return errors;\n const events = [...this.#deferredEvents, ...(this.#endpoint?.poll() ?? [])];\n this.#deferredEvents = [];\n const deferMessages = this.#deferReplicaMessages;\n this.#deferReplicaMessages = false;\n for (const event of events) {\n if (event.kind === 'peer-connected') {\n this.#peerIds.add(event.peerId);\n if (this.#replica !== undefined) this.#bindSession(this.#sessionId, event.peerId);\n else this.#bindSession(this.#sessionForPeer(event.peerId), event.peerId);\n this.#pendingFullPeers.add(event.peerId);\n } else if (event.kind === 'peer-disconnected') {\n this.#forgetPeer(event.peerId);\n if (this.#replica !== undefined) {\n this.#replica.coordinator.clear();\n this.#beginRecovery();\n this.advanceRecovery();\n }\n } else if (deferMessages) {\n this.#deferredEvents.push(event);\n } else this.#receiveMessage(event.peerId, event.data, errors);\n }\n return errors;\n }\n\n drainRawMessages(): RawMessage[] {\n return this.#rawMessages.splice(0);\n }\n\n getPeerSnapshot(): PeerSnapshot {\n const peerIds = [...this.#peerIds].sort((left, right) => left - right);\n return { peerIds, connected: peerIds.length > 0 };\n }\n\n getSessionSnapshot(): SessionSnapshot {\n const sessionIds = [...this.#sessionPeers.keys()].sort((left, right) => left - right);\n return { sessionIds, connected: sessionIds.length > 0 };\n }\n\n /** Return lifecycle, epoch, sequence, ledger, and owned-resource evidence. */\n getRecoverySnapshot(): NetRecoverySnapshot {\n return {\n sessionId: this.#sessionId,\n state: this.#state,\n pendingPackets: this.#ledger.size,\n maxPendingPackets: this.#policy.maxPendingPackets,\n acknowledgedSequence: this.#acknowledgedSequence,\n reconnectAttempts: this.#reconnectAttempts,\n epoch: this.#epoch,\n sequence: this.#sequence,\n ...(this.#lastError === undefined ? {} : { lastError: this.#lastError }),\n ownedResources: {\n pendingConnects: this.#pendingConnect === undefined ? 0 : 1,\n timers: this.#retryTimer === undefined ? 0 : 1,\n ledgers: this.#ledger.size === 0 ? 0 : 1,\n callbacks: 0,\n },\n };\n }\n\n getResourceSnapshot(): NetSessionResourceCounts {\n return this.getRecoverySnapshot().ownedResources;\n }\n\n recover(): NetRecoveryOutcome {\n if (this.#state.kind === 'retired' || this.#state.kind === 'failed')\n return { kind: 'retired', sessionId: this.#sessionId };\n if (this.#state.kind === 'recovering')\n return { kind: 'already-recovering', sessionId: this.#sessionId };\n this.#beginRecovery();\n return { kind: 'started', sessionId: this.#sessionId };\n }\n\n advanceRecovery(): void {\n if (this.#state.kind !== 'recovering') return;\n const delay =\n this.#policy.reconnectDelaysMs[\n Math.min(this.#reconnectAttempts, this.#policy.reconnectDelaysMs.length - 1)\n ];\n if (delay === undefined || delay === 0) this.#attemptRecovery();\n else {\n this.#retryTimer?.cancel();\n this.#retryTimer = this.#clock.schedule(delay, () => {\n this.#retryTimer = undefined;\n this.#attemptRecovery();\n });\n }\n }\n\n sendRaw(peerId: PeerId, data: Uint8Array): Result<void, EndpointError | NetError> {\n if (this.#state.kind !== 'active') return err(recoveryFailure('session is not active'));\n return this.#sendToPeer(peerId, data);\n }\n\n /** Send one application command through the current replica attachment. */\n sendToAuthority(sessionId: SessionId, data: Uint8Array): Result<void, EndpointError | NetError> {\n if (sessionId !== this.#sessionId)\n return err(recoveryFailure('session id does not belong to this NetSession'));\n if (\n this.#state.kind === 'recovering' ||\n this.#state.kind === 'failed' ||\n this.#state.kind === 'retired'\n )\n return err(recoveryFailure('session is not connected to the authority'));\n const peerId = this.#peerForSession(sessionId);\n if (peerId === undefined) return err(recoveryFailure('authority peer is not connected'));\n if (this.#replica !== undefined) {\n const announced = this.#announceSession(peerId);\n if (!announced.ok) return announced;\n }\n return this.#sendToPeer(peerId, data);\n }\n\n /** Send one application message to an authority-owned logical session. */\n sendToSession(sessionId: SessionId, data: Uint8Array): Result<void, EndpointError | NetError> {\n if (this.#state.kind === 'failed' || this.#state.kind === 'retired')\n return err(recoveryFailure('session is not connected to the authority'));\n const peerId = this.#peerForSession(sessionId);\n if (peerId === undefined) return err(recoveryFailure('logical session is not connected'));\n return this.#sendToPeer(peerId, data);\n }\n\n attachAuthority(authority: AuthorityCoordinator): void {\n this.#authority = authority;\n }\n\n requestFullBaseline(peerId: PeerId): void {\n if (this.#peerIds.has(peerId)) this.#pendingFullPeers.add(peerId);\n }\n\n requestFullBaselineForSession(sessionId: SessionId): void {\n const peerId = this.#sessionPeers.get(sessionId);\n if (peerId !== undefined) this.requestFullBaseline(peerId);\n }\n\n attachReplica(coordinator: ReplicaCoordinator, limits: ReplicationLimits): void {\n this.#replica = { coordinator, limits };\n }\n\n #ledgerBoundError(): NetError {\n return new NetError({\n code: 'recovery-rejected',\n expected: 'published packets within the configured finite ACK bound',\n hint: 'wait for a cumulative ACK before publishing more packets',\n detail: { reason: 'ACK ledger bound reached' },\n });\n }\n\n #ensurePublicationCapacity(expectedEpoch: number): Result<void, NetError> {\n if (expectedEpoch === this.#epoch && this.#ledger.size >= this.#policy.maxPendingPackets)\n return err(this.#ledgerBoundError());\n return ok(undefined);\n }\n\n #reservePublished(packet: PublishedPacket): Result<void, NetError> {\n if (packet.epoch !== this.#epoch) {\n this.#ledger.clear();\n this.#acknowledgedSequence = 0;\n this.#epoch = packet.epoch;\n }\n if (this.#ledger.size >= this.#policy.maxPendingPackets && !this.#ledger.has(packet.sequence))\n return err(this.#ledgerBoundError());\n this.#sequence = packet.sequence;\n this.#ledger.set(packet.sequence, packet.bytes);\n return ok(undefined);\n }\n\n #sendPublished(\n packet: PublishedPacket,\n peerIds: readonly PeerId[],\n ): Result<void, EndpointError | NetError> {\n const reserved = this.#reservePublished(packet);\n if (!reserved.ok) return reserved;\n if (this.#endpoint === undefined) return err(recoveryFailure('session has no endpoint'));\n let delivered = false;\n for (const peerId of peerIds) {\n const sent = this.#endpoint.send(peerId, packet.bytes);\n if (!sent.ok) {\n if (sent.error.code === 'connection-closed') {\n // A socket can close before its endpoint emits the corresponding\n // disconnect event. Treat that transport race as the lifecycle\n // event it represents so one stale peer cannot poison the World or\n // prevent the same publication reaching live peers.\n this.#forgetPeer(peerId);\n continue;\n }\n this.#ledger.delete(packet.sequence);\n return err(sent.error);\n }\n delivered = true;\n }\n if (!delivered) this.#ledger.delete(packet.sequence);\n return ok(undefined);\n }\n\n publish(): Result<void, NetError | EndpointError> {\n // Do not advance the authority ledger before a peer exists. A host can\n // start its fixed loop before the first socket handshake; reserving that\n // empty publication would make the first connected peer wait behind an\n // ACK for bytes it could never receive.\n if (this.#authority === undefined || this.#endpoint === undefined || this.#peerIds.size === 0)\n return ok(undefined);\n if (this.#pendingFullPeers.size > 0) {\n const capacity = this.#ensurePublicationCapacity(this.#authority.nextPublicationEpoch(true));\n if (!capacity.ok) return capacity;\n const published = this.#authority.publishFull();\n if (!published.ok) return err(published.error);\n const sent = this.#sendPublished(published.value, [...this.#peerIds]);\n if (!sent.ok) return err(sent.error);\n this.#pendingFullPeers.clear();\n // A fresh baseline is the first packet of the new epoch for every\n // replica. Do not append the same-tick delta: a receiver must be able\n // to observe and apply sequence 1 before any incremental publication.\n return ok(undefined);\n }\n const capacity = this.#ensurePublicationCapacity(this.#authority.nextPublicationEpoch());\n if (!capacity.ok) return capacity;\n const published = this.#authority.publish();\n if (!published.ok) return err(published.error);\n const sent = this.#sendPublished(published.value, [...this.#peerIds]);\n if (!sent.ok) return err(sent.error);\n return ok(undefined);\n }\n\n dispose(): void {\n if (this.#disposed) return;\n this.#disposed = true;\n this.#clearRecoveryWork();\n this.#endpoint?.close();\n this.#endpoint = undefined;\n this.#replica?.coordinator.clear();\n this.#replica = undefined;\n this.#authority = undefined;\n this.#peerIds.clear();\n this.#sessionPeers.clear();\n this.#announcedPeers.clear();\n this.#sessionAnnounced = false;\n this.#pendingFullPeers.clear();\n this.#rawMessages = [];\n this.#deferredEvents = [];\n this.#deferReplicaMessages = false;\n if (this.#state.kind !== 'retired')\n this.#setState({ kind: 'retired', sessionId: this.#sessionId, reason: 'disposed' });\n }\n\n #queueRawMessage(peerId: PeerId, data: Uint8Array): void {\n if (this.#rawMessages.length >= this.#maxRawMessages) return;\n this.#rawMessages.push({\n peerId,\n sessionId: this.#sessionForPeer(peerId),\n data: new Uint8Array(data),\n });\n }\n\n #sessionForPeer(peerId: PeerId): SessionId {\n for (const [sessionId, mappedPeerId] of this.#sessionPeers)\n if (mappedPeerId === peerId) return sessionId;\n if (this.#replica !== undefined) {\n this.#bindSession(this.#sessionId, peerId);\n return this.#sessionId;\n }\n const created = createSessionId(peerId);\n const sessionId = created.ok ? created.value : this.#sessionId;\n this.#bindSession(sessionId, peerId);\n return sessionId;\n }\n\n #bindSession(sessionId: SessionId, peerId: PeerId): void {\n for (const [mappedSessionId, mappedPeerId] of this.#sessionPeers)\n if (mappedSessionId === sessionId || mappedPeerId === peerId)\n this.#sessionPeers.delete(mappedSessionId);\n this.#sessionPeers.set(sessionId, peerId);\n }\n\n #forgetPeer(peerId: PeerId): void {\n this.#peerIds.delete(peerId);\n for (const [sessionId, mappedPeerId] of this.#sessionPeers)\n if (mappedPeerId === peerId) this.#sessionPeers.delete(sessionId);\n this.#announcedPeers.delete(peerId);\n this.#pendingFullPeers.delete(peerId);\n }\n\n #peerForSession(sessionId: SessionId): PeerId | undefined {\n const mapped = this.#sessionPeers.get(sessionId);\n if (mapped !== undefined && this.#peerIds.has(mapped)) return mapped;\n if (this.#replica !== undefined && this.#peerIds.size === 1) {\n const peerId = [...this.#peerIds][0];\n if (peerId !== undefined) {\n this.#bindSession(sessionId, peerId);\n return peerId;\n }\n }\n return undefined;\n }\n\n #announceSession(peerId: PeerId): Result<void, EndpointError | NetError> {\n if (this.#announcedPeers.has(peerId)) return ok(undefined);\n const packet: ReplicationSessionPacket = {\n version: 2,\n kind: this.#sessionAnnounced ? 'session-resume' : 'session-open',\n sessionId: this.#sessionId,\n epoch: this.#epoch,\n sequence: 0,\n };\n const encoded = encodeReplicationPacket(packet, DEFAULT_REPLICATION_LIMITS);\n if (!encoded.ok) return err(encoded.error);\n const sent = this.#sendToPeer(peerId, encoded.value);\n if (!sent.ok) return sent;\n this.#announcedPeers.add(peerId);\n this.#sessionAnnounced = true;\n return ok(undefined);\n }\n\n #sendToPeer(peerId: PeerId, data: Uint8Array): Result<void, EndpointError | NetError> {\n const result = this.#endpoint?.send(peerId, data);\n if (result === undefined) return err(recoveryFailure('session has no endpoint'));\n return result.ok ? ok(undefined) : err(result.error);\n }\n\n /** ACK accepted data at the session boundary; consumers should not reimplement this wire step. */\n #sendReplicationAck(peerId: PeerId, packet: ReplicationDataPacket): void {\n const encoded = encodeReplicationPacket(\n {\n version: 2,\n kind: 'ack',\n sessionId: packet.sessionId,\n epoch: packet.epoch,\n acknowledgedSequence: packet.sequence,\n },\n DEFAULT_REPLICATION_LIMITS,\n );\n if (!encoded.ok) {\n this.#setFailure(encoded.error);\n return;\n }\n const sent = this.#sendToPeer(peerId, encoded.value);\n if (!sent.ok) this.#lastError = sent.error;\n }\n}\n","// @forgeax/engine-net -- session plugin (host-neutral World integration).\n// (requirements AC-04, plan-strategy D-1/D-3)\n\nimport { FixedUpdate, Update } from '@forgeax/engine-ecs';\nimport type { Plugin } from '@forgeax/engine-plugin';\nimport type { NetEndpoint, NetEndpointConnector } from '../endpoint/endpoint';\nimport { NetSession, type NetSessionClock } from './net-session';\nimport type { NetRecoveryPolicy } from './recovery';\n\nexport interface NetPluginConfig {\n readonly endpoint?: NetEndpoint;\n readonly connector?: NetEndpointConnector;\n readonly sessionId?: number;\n readonly recovery?: Partial<NetRecoveryPolicy>;\n readonly clock?: NetSessionClock;\n readonly maxRawMessages?: number;\n}\n\nexport function netPlugin(config: NetPluginConfig): Plugin {\n return {\n name: 'net-session',\n inject: ['world'],\n apply(ctx) {\n const world = ctx.world;\n const session = new NetSession({\n ...(config.endpoint === undefined ? {} : { endpoint: config.endpoint }),\n ...(config.connector === undefined ? {} : { connector: config.connector }),\n ...(config.sessionId === undefined ? {} : { sessionId: config.sessionId }),\n ...(config.recovery === undefined ? {} : { recovery: config.recovery }),\n ...(config.clock === undefined ? {} : { clock: config.clock }),\n maxRawMessages: config.maxRawMessages ?? 256,\n });\n ctx.effect(() => {\n world.insertResource('net-session', session);\n if (config.connector !== undefined && config.endpoint === undefined) {\n session.recover();\n session.advanceRecovery();\n }\n return () => {\n session.dispose();\n world.removeResource('net-session');\n };\n }, 'net/session-resource');\n ctx.effect(() => {\n world\n .addSystem(Update, {\n name: 'net-receive',\n queries: [],\n before: [FixedUpdate],\n fn: (world) => world.getResource<NetSession>('net-session').receiveEvents(),\n })\n .unwrap();\n return () => world.removeSystem(Update, 'net-receive');\n }, 'net/receive');\n ctx.effect(() => {\n world\n .addSystem(Update, {\n name: 'net-publish',\n queries: [],\n after: [FixedUpdate],\n fn: (world) => {\n const published = world.getResource<NetSession>('net-session').publish();\n // An authority can temporarily outrun a replica while its\n // bounded ACK ledger is full. That is transport backpressure,\n // not a World fault: keep the simulation healthy and retry on\n // the next frame after the replica acknowledges a packet.\n if (\n !published.ok &&\n published.error.code === 'recovery-rejected' &&\n published.error.detail.reason === 'ACK ledger bound reached'\n )\n return;\n return published;\n },\n })\n .unwrap();\n return () => world.removeSystem(Update, 'net-publish');\n }, 'net/publish');\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"session-plugin.d.ts","sourceRoot":"","sources":["../../src/session/session-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAiDzD"}
1
+ {"version":3,"file":"session-plugin.d.ts","sourceRoot":"","sources":["../../src/session/session-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CA8DzD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forgeax/engine-net",
3
- "version": "0.1.25",
3
+ "version": "0.1.27",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -22,9 +22,9 @@
22
22
  "LICENSE"
23
23
  ],
24
24
  "dependencies": {
25
- "@forgeax/engine-ecs": "0.1.25",
26
- "@forgeax/engine-plugin": "0.1.25",
27
- "@forgeax/engine-types": "0.1.25"
25
+ "@forgeax/engine-ecs": "0.1.27",
26
+ "@forgeax/engine-plugin": "0.1.27",
27
+ "@forgeax/engine-types": "0.1.27"
28
28
  },
29
29
  "forgeax": {
30
30
  "metrics": {
@@ -58,7 +58,20 @@ export function netPlugin(config: NetPluginConfig): Plugin {
58
58
  name: 'net-publish',
59
59
  queries: [],
60
60
  after: [FixedUpdate],
61
- fn: (world) => world.getResource<NetSession>('net-session').publish(),
61
+ fn: (world) => {
62
+ const published = world.getResource<NetSession>('net-session').publish();
63
+ // An authority can temporarily outrun a replica while its
64
+ // bounded ACK ledger is full. That is transport backpressure,
65
+ // not a World fault: keep the simulation healthy and retry on
66
+ // the next frame after the replica acknowledges a packet.
67
+ if (
68
+ !published.ok &&
69
+ published.error.code === 'recovery-rejected' &&
70
+ published.error.detail.reason === 'ACK ledger bound reached'
71
+ )
72
+ return;
73
+ return published;
74
+ },
62
75
  })
63
76
  .unwrap();
64
77
  return () => world.removeSystem(Update, 'net-publish');