{
  "version": 3,
  "sources": ["../../src/legacy/index.ts", "../../src/serialization/ObserverSerializer.ts", "../../src/serialization/SoASerializer.ts", "../../src/legacy/serialization.ts"],
  "sourcesContent": ["import {\n  ComponentRef,\n  observe,\n  onAdd,\n  onRemove,\n  query,\n  EntityId,\n  addComponent as ecsAddComponent,\n  hasComponent as ecsHasComponent,\n  removeComponent as ecsRemoveComponent\n} from 'bitecs'\n\nexport interface IWorld { }\n\nexport type ComponentProp = TypedArray | Array<TypedArray>\n\nexport interface IComponentProp {\n}\n\nexport interface IComponent {\n}\n\nexport type Component = IComponent | ComponentType<ISchema>\n\nexport type QueryModifier = (c: IComponent[]) => IComponent | QueryModifier\n\nexport type Query<W extends IWorld = IWorld> = (world: W, clearDiff?: Boolean) => number[]\n\nexport const $modifier = Symbol(\"$modifier\")\n\nfunction modifier(c, mod) {\n  const inner = () => [c, mod]\n  inner[$modifier] = true\n  return inner\n}\n\nexport const Not = (c: Component | ISchema): QueryModifier => modifier(c, 'not')\nexport const Or = (c: Component | ISchema): QueryModifier => modifier(c, 'or')\nexport const Changed = (c: Component | ISchema): QueryModifier => modifier(c, 'changed')\n\nexport function defineQuery<W extends IWorld = IWorld>(components: (Component | QueryModifier)[]): Query<W> {\n  const queryFn = (world: IWorld) => query(world, components)\n  queryFn.components = components\n  return queryFn as unknown as Query<W>\n}\n\nexport function enterQuery<W extends IWorld = IWorld>(queryFn: Query<W>): Query<W> {\n  let queue: number[] = []\n  const initSet = new WeakSet<IWorld>()\n  return (world: W) => {\n    if (!initSet.has(world)) {\n      observe(world, onAdd(...(queryFn as any).components), (eid: EntityId) => queue.push(eid))\n      initSet.add(world)\n    }\n    const results = queue.slice()\n    queue.length = 0\n    return results\n  }\n}\n\nexport function exitQuery<W extends IWorld = IWorld>(queryFn: Query<W>): Query<W> {\n  let queue: number[] = []\n  const initSet = new WeakSet<IWorld>()\n  return (world: W) => {\n    if (!initSet.has(world)) {\n      observe(world, onRemove(...(queryFn as any).components), (eid: EntityId) => queue.push(eid))\n      initSet.add(world)\n    }\n    const results = queue.slice()\n    queue.length = 0\n    return results\n  }\n}\n\nexport const addComponent = (world: IWorld, component: ComponentRef, eid: EntityId) =>\n  ecsAddComponent(world, eid, component)\n\nexport const hasComponent = (world: IWorld, component: ComponentRef, eid: EntityId) =>\n  ecsHasComponent(world, eid, component)\n\nexport const removeComponent = (world: IWorld, component: ComponentRef, eid: EntityId) =>\n  ecsRemoveComponent(world, eid, component)\n\nexport interface ISchema {\n  [key: string]: Type | ListType | ISchema\n}\n\nexport type Type =\n  | 'i8'\n  | 'ui8'\n  | 'ui8c'\n  | 'i16'\n  | 'ui16'\n  | 'i32'\n  | 'ui32'\n  | 'f32'\n  | 'f64'\n  | 'eid'\n\nexport type ListType = readonly [Type, number];\n\nexport const Types = {\n  i8: 'i8' as Type,\n  ui8: 'ui8' as Type,\n  ui8c: 'ui8c' as Type,\n  i16: 'i16' as Type,\n  ui16: 'ui16' as Type,\n  i32: 'i32' as Type,\n  ui32: 'ui32' as Type,\n  f32: 'f32' as Type,\n  f64: 'f64' as Type,\n  eid: 'eid' as Type\n};\n\nexport type TypedArray =\n  | Uint8Array\n  | Int8Array\n  | Uint8ClampedArray\n  | Int16Array\n  | Uint16Array\n  | Int32Array\n  | Uint32Array\n  | Float32Array\n  | Float64Array\n\nexport type ArrayByType = {\n  'i8': Int8Array;\n  'ui8': Uint8Array;\n  'ui8c': Uint8ClampedArray;\n  'i16': Int16Array;\n  'ui16': Uint16Array;\n  'i32': Int32Array;\n  'ui32': Uint32Array;\n  'f32': Float32Array;\n  'f64': Float64Array;\n  'eid': Uint32Array;\n}\n\n// ... existing code ...\n\nconst arrayByTypeMap: { [key in Type]: any } = {\n  'i8': Int8Array,\n  'ui8': Uint8Array,\n  'ui8c': Uint8ClampedArray,\n  'i16': Int16Array,\n  'ui16': Uint16Array,\n  'i32': Int32Array,\n  'ui32': Uint32Array,\n  'f32': Float32Array,\n  'f64': Float64Array,\n  'eid': Uint32Array,\n};\n\nexport type ComponentType<T extends ISchema> = {\n  [key in keyof T]:\n  T[key] extends Type\n  ? ArrayByType[T[key]]\n  : T[key] extends [infer RT, number]\n  ? RT extends Type\n  ? Array<ArrayByType[RT]>\n  : unknown\n  : T[key] extends ISchema\n  ? ComponentType<T[key]>\n  : unknown;\n};\n\nexport const defineComponent = <T extends ISchema>(schema: T, max: number = 1e5): ComponentType<T> => {\n  const createSoA = <U extends ISchema>(schema: U, max: number): ComponentType<U> => {\n    const component = {} as ComponentType<U>\n    for (const key in schema) {\n      if (Array.isArray(schema[key])) {\n        const [type, length] = schema[key] as [Type, number]\n        component[key] = Array.from({ length }, () => new arrayByTypeMap[type](max)) as any\n      } else if (typeof schema[key] === 'object') {\n        component[key] = createSoA(schema[key] as ISchema, max) as any\n      } else {\n        const type = schema[key] as Type;\n        const TypeConstructor = arrayByTypeMap[type];\n        if (TypeConstructor) {\n          component[key] = new TypeConstructor(max) as any;\n        } else {\n          throw new Error(`Unsupported type: ${schema[key]}`);\n        }\n      }\n    }\n    return component\n  }\n  return createSoA(schema, max)\n}\n\nexport * from './serialization'", "import {\n    addComponent,\n    removeComponent,\n    addEntity,\n    removeEntity,\n    observe,\n    onAdd,\n    onRemove,\n    World,\n    ComponentRef,\n    entityExists,\n    isRelation,\n    getRelationTargets,\n    Wildcard,\n    EntityId\n} from 'bitecs'\n\nenum OperationType {\n    AddEntity = 0,\n    RemoveEntity = 1,\n    AddComponent = 2,\n    RemoveComponent = 3,\n    AddRelation = 4,\n    RemoveRelation = 5,\n}\nimport { $u8, $i8, $u16, $i16, $u32, $i32, $f32, $ref } from './SoASerializer'\n\n/**\n * Serializes relation data for a specific entity\n */\nfunction serializeRelationData(data: any, eid: number, dataView: DataView, offset: number) {\n    if (!data) return offset\n    \n    // Handle array data (AoS) - defaults to f64\n    if (Array.isArray(data)) {\n        const value = data[eid]\n        if (value !== undefined) {\n            if ($ref in data) {\n                dataView.setUint32(offset, value)\n                return offset + 4\n            } else {\n                dataView.setFloat64(offset, value)\n                return offset + 8\n            }\n        }\n        return offset\n    }\n    \n    // Handle object data (SoA)\n    if (typeof data === 'object') {\n        const keys = Object.keys(data).sort()\n        for (const key of keys) {\n            const arr = data[key]\n            const value = arr[eid]\n            \n            if (value !== undefined) {\n                if (arr instanceof Int8Array || $i8 in arr) {\n                    dataView.setInt8(offset, value)\n                    offset += 1\n                } else if (arr instanceof Uint8Array || $u8 in arr) {\n                    dataView.setUint8(offset, value)\n                    offset += 1\n                } else if (arr instanceof Int16Array || $i16 in arr) {\n                    dataView.setInt16(offset, value)\n                    offset += 2\n                } else if (arr instanceof Uint16Array || $u16 in arr) {\n                    dataView.setUint16(offset, value)\n                    offset += 2\n                } else if (arr instanceof Int32Array || $i32 in arr) {\n                    dataView.setInt32(offset, value)\n                    offset += 4\n                } else if (arr instanceof Uint32Array || $u32 in arr || $ref in arr) {\n                    dataView.setUint32(offset, value)\n                    offset += 4\n                } else if (arr instanceof Float32Array || $f32 in arr) {\n                    dataView.setFloat32(offset, value)\n                    offset += 4\n                } else {\n                    // Default to f64\n                    dataView.setFloat64(offset, value)\n                    offset += 8\n                }\n            }\n        }\n    }\n    \n    return offset\n}\n\n/**\n * Deserializes relation data for a specific entity\n */\nfunction deserializeRelationData(data: any, eid: number, dataView: DataView, offset: number, entityIdMapping?: Map<number, number>) {\n    if (!data) return offset\n    \n    // Handle array data (AoS) - defaults to f64\n    if (Array.isArray(data)) {\n        if ($ref in data) {\n            const value = dataView.getUint32(offset)\n            const mapped = entityIdMapping ? entityIdMapping.get(value) ?? value : value\n            data[eid] = mapped\n            return offset + 4\n        }\n        data[eid] = dataView.getFloat64(offset)\n        return offset + 8\n    }\n    \n    // Handle object data (SoA)\n    if (typeof data === 'object') {\n        const keys = Object.keys(data).sort()\n        for (const key of keys) {\n            const arr = data[key]\n            \n            if (arr instanceof Int8Array || $i8 in arr) {\n                arr[eid] = dataView.getInt8(offset)\n                offset += 1\n            } else if (arr instanceof Uint8Array || $u8 in arr) {\n                arr[eid] = dataView.getUint8(offset)\n                offset += 1\n            } else if (arr instanceof Int16Array || $i16 in arr) {\n                arr[eid] = dataView.getInt16(offset)\n                offset += 2\n            } else if (arr instanceof Uint16Array || $u16 in arr) {\n                arr[eid] = dataView.getUint16(offset)\n                offset += 2\n            } else if (arr instanceof Int32Array || $i32 in arr) {\n                arr[eid] = dataView.getInt32(offset)\n                offset += 4\n            } else if (arr instanceof Uint32Array || $u32 in arr || $ref in arr) {\n                const value = dataView.getUint32(offset)\n                if ($ref in arr) {\n                    const mapped = entityIdMapping ? entityIdMapping.get(value) ?? value : value\n                    arr[eid] = mapped\n                } else {\n                    arr[eid] = value\n                }\n                offset += 4\n            } else if (arr instanceof Float32Array || $f32 in arr) {\n                arr[eid] = dataView.getFloat32(offset)\n                offset += 4\n            } else {\n                // Default to f64\n                arr[eid] = dataView.getFloat64(offset)\n                offset += 8\n            }\n        }\n    }\n    \n    return offset\n}\n\nexport type ObserverSerializerOptions = {\n    buffer?: ArrayBuffer\n}\n\n/**\n * Creates a serializer for observing and serializing changes in networked entities.\n */\nexport const createObserverSerializer = (world: World, networkedTag: ComponentRef, components: ComponentRef[], options: ObserverSerializerOptions = {}) => {\n    const backingBuffer = options.buffer ?? new ArrayBuffer(1024 * 1024 * 100)\n    const dataView = new DataView(backingBuffer)\n    let offset = 0\n    const queue: [number, OperationType, number, number?, any?][] = []\n    const relationTargets = new Map<number, Map<number, number>>()\n    \n    observe(world, onAdd(networkedTag), (eid: EntityId) => {\n        queue.push([eid, OperationType.AddEntity, -1])\n    })\n\n    observe(world, onRemove(networkedTag), (eid: EntityId) => {\n        queue.push([eid, OperationType.RemoveEntity, -1])\n        relationTargets.delete(eid)\n    })\n\n    components.forEach((component, i) => {\n        if (isRelation(component)) {\n            observe(world, onAdd(networkedTag, component(Wildcard)), (eid: EntityId) => {\n                const targets = getRelationTargets(world, eid, component)\n                for (const target of targets) {\n                    if (!relationTargets.has(eid)) {\n                        relationTargets.set(eid, new Map())\n                    }\n                    relationTargets.get(eid).set(i, target)\n                    const relationData = component(target)\n                    queue.push([eid, OperationType.AddRelation, i, target, relationData])\n                }\n            })\n\n            observe(world, onRemove(networkedTag, component(Wildcard)), (eid: EntityId) => {\n                const targetMap = relationTargets.get(eid)\n                if (targetMap) {\n                    const target = targetMap.get(i)\n                    if (target !== undefined) {\n                        queue.push([eid, OperationType.RemoveRelation, i, target])\n                        targetMap.delete(i)\n                        if (targetMap.size === 0) {\n                            relationTargets.delete(eid)\n                        }\n                    }\n                }\n            })\n        } else {\n            observe(world, onAdd(networkedTag, component), (eid: EntityId) => {\n                queue.push([eid, OperationType.AddComponent, i])\n            })\n\n            observe(world, onRemove(networkedTag, component), (eid: EntityId) => {\n                queue.push([eid, OperationType.RemoveComponent, i])\n            })\n        }\n    })\n    \n    return () => {\n        offset = 0\n        \n        for (let i = 0; i < queue.length; i++) {\n            const [entityId, type, componentId, targetId, relationData] = queue[i]\n            dataView.setUint32(offset, entityId)\n            offset += 4\n            dataView.setUint8(offset, type)\n            offset += 1\n            if (type === OperationType.AddComponent || \n                type === OperationType.RemoveComponent || \n                type === OperationType.AddRelation ||\n                type === OperationType.RemoveRelation) {\n                dataView.setUint8(offset, componentId)\n                offset += 1\n                \n                if (type === OperationType.AddRelation || type === OperationType.RemoveRelation) {\n                    dataView.setUint32(offset, targetId)\n                    offset += 4\n                    \n                    if (type === OperationType.AddRelation && relationData) {\n                        offset = serializeRelationData(relationData, entityId, dataView, offset)\n                    }\n                }\n            }\n        }\n        queue.length = 0\n\n        return backingBuffer.slice(0, offset)\n    }\n}\n\nexport type ObserverDeserializerOptions = {\n    idMap?: Map<number, number>\n}\n\n/**\n * Creates a deserializer for applying serialized changes to a world.\n */\nexport const createObserverDeserializer = (world: World, networkedTag: ComponentRef, components: ComponentRef[], options: ObserverDeserializerOptions = {}) => {\n    let entityIdMapping = options.idMap || new Map<number, number>()\n    \n    return (packet: ArrayBuffer, idMap?: Map<number, number>) => {\n        // Allow overriding the mapping for this call\n        const currentMapping = idMap || entityIdMapping\n        const dataView = new DataView(packet)\n        let offset = 0\n\n        while (offset < packet.byteLength) {\n            const packetEntityId = dataView.getUint32(offset)\n            offset += 4\n            const operationType = dataView.getUint8(offset)\n            offset += 1\n            let componentId = -1\n            let targetId = -1\n            \n            if (operationType === OperationType.AddComponent || \n                operationType === OperationType.RemoveComponent ||\n                operationType === OperationType.AddRelation ||\n                operationType === OperationType.RemoveRelation) {\n                componentId = dataView.getUint8(offset)\n                offset += 1\n                \n                if (operationType === OperationType.AddRelation || operationType === OperationType.RemoveRelation) {\n                    targetId = dataView.getUint32(offset)\n                    offset += 4\n                }\n            }\n\n            const component = components[componentId]\n            let worldEntityId = currentMapping.get(packetEntityId)\n\n            if (operationType === OperationType.AddEntity) {\n                if (worldEntityId === undefined) {\n                    worldEntityId = addEntity(world)\n                    currentMapping.set(packetEntityId, worldEntityId)\n                    addComponent(world, worldEntityId, networkedTag)\n                } else {\n                    // TODO: figure out if this should ignore, throw, warn, or if the observer serializer should maybe do a snapshot on first call?\n                    // throw new Error(`Entity with ID ${packetEntityId} already exists in the mapping.`)\n                    console.warn(`Attempted to deserialize addEntity with ID ${packetEntityId}, but it has already been deserialzied and exists in the mapping.`)\n                }\n            } else if (worldEntityId !== undefined && entityExists(world, worldEntityId)) {\n                if (operationType === OperationType.RemoveEntity) {\n                    removeEntity(world, worldEntityId)\n                    currentMapping.delete(packetEntityId)\n                } else if (operationType === OperationType.AddComponent) {\n                    addComponent(world, worldEntityId, component)\n                } else if (operationType === OperationType.RemoveComponent) {\n                    removeComponent(world, worldEntityId, component)\n                } else if (operationType === OperationType.AddRelation) {\n                    const worldTargetId = currentMapping.get(targetId)\n                    if (worldTargetId !== undefined) {\n                        const relationComponent = component(worldTargetId)\n                        addComponent(world, worldEntityId, relationComponent)\n                        offset = deserializeRelationData(relationComponent, worldEntityId, dataView, offset, currentMapping)\n                    }\n                } else if (operationType === OperationType.RemoveRelation) {\n                    const worldTargetId = currentMapping.get(targetId)\n                    if (worldTargetId !== undefined) {\n                        removeComponent(world, worldEntityId, component(worldTargetId))\n                    }\n                }\n            }\n        }\n\n        return currentMapping\n    }\n}\n", "\n/**\n * Symbols representing different data types for serialization.\n */\nexport const $u8 = Symbol.for('bitecs-u8'), $i8 = Symbol.for('bitecs-i8'), $u16 = Symbol.for('bitecs-u16'), $i16 = Symbol.for('bitecs-i16'),\n    $u32 = Symbol.for('bitecs-u32'), $i32 = Symbol.for('bitecs-i32'), $f32 = Symbol.for('bitecs-f32'), $f64 = Symbol.for('bitecs-f64'),\n    $ref = Symbol.for('bitecs-ref'),\n    $str = Symbol.for('bitecs-str'),\n    $arr = Symbol.for('bitecs-arr')\n\n/**\n * Union type of all possible TypedArray types.\n */\nexport type TypedArray = \n    | Int8Array\n    | Uint8Array\n    | Int16Array\n    | Uint16Array\n    | Int32Array\n    | Uint32Array\n    | Float32Array\n    | Float64Array\n\n/**\n * Union type of all possible type symbols.\n */\nexport type TypeSymbol = typeof $u8 | typeof $i8 | typeof $u16 | typeof $i16 | typeof $u32 | typeof $i32 | typeof $f32 | typeof $f64 | typeof $str | typeof $ref\n\n/**\n * Type representing a primitive brand, which is either a number array with a symbol property or a TypedArray.\n */\nexport type PrimitiveBrand = ((number[] | string[]) & { [key: symbol]: true }) | TypedArray\n\n/**\n * Type representing a component reference, which is a record mapping string keys to either\n * a PrimitiveBrand (number array with type symbol), TypedArray, or ArrayType values.\n * Used to define the structure of components that can be serialized.\n */\nexport type ComponentRef = Record<string, any>\n\nexport type ArrayType<T> = T[] & { [$arr]: TypeSymbol | TypeFunction | ArrayType<any> }\n\n/**\n * Creates a function that tags an array with a type symbol for serialization.\n * @param {TypeSymbol} symbol - The type symbol to tag the array with.\n * @returns {Function} A function that tags an array with the given type symbol.\n */\nconst typeTagForSerialization = <T extends any[] = number[]>(symbol: TypeSymbol) => (a: T = [] as T): T & { [key: symbol]: true } =>\n    Object.defineProperty(a, symbol, { value: true, enumerable: false, writable: false, configurable: false }) as T & { [key: symbol]: true }\n\n/**\n * Functions to create arrays tagged with specific type symbols.\n */\nexport const u8 = (a: number[] = []): number[] => typeTagForSerialization($u8)(a) as number[],\n            i8 = (a: number[] = []): number[] => typeTagForSerialization($i8)(a) as number[],\n            u16 = (a: number[] = []): number[] => typeTagForSerialization($u16)(a) as number[],\n            i16 = (a: number[] = []): number[] => typeTagForSerialization($i16)(a) as number[],\n            u32 = (a: number[] = []): number[] => typeTagForSerialization($u32)(a) as number[],\n            i32 = (a: number[] = []): number[] => typeTagForSerialization($i32)(a) as number[],\n            f32 = (a: number[] = []): number[] => typeTagForSerialization($f32)(a) as number[],\n            f64 = (a: number[] = []): number[] => typeTagForSerialization($f64)(a) as number[],\n            ref = (a: number[] = []): number[] => typeTagForSerialization($ref)(a) as number[],\n            str = (a: string[] = []): string[] => typeTagForSerialization<string[]>($str)(a) as string[]\n\n/**\n * Type representing a type function.\n */\ntype TypeFunction = typeof u8 | typeof i8 | typeof u16 | typeof i16 | typeof u32 | typeof i32 | typeof f32 | typeof f64 | typeof str | typeof ref\n\n/**\n * Mapping from type functions to their corresponding symbols.\n */\nconst functionToSymbolMap = new Map<TypeFunction, TypeSymbol>([\n    [u8, $u8], [i8, $i8], [u16, $u16], [i16, $i16],\n    [u32, $u32], [i32, $i32], [f32, $f32], [f64, $f64],\n    [ref, $ref],\n    [str, $str]\n])\n\n/**\n * Object containing setter functions for each data type.\n */\nexport const typeSetters: Record<TypeSymbol, (view: DataView, offset: number, value: any) => number> = {\n    [$u8]: (view: DataView, offset: number, value: number) => { view.setUint8(offset, value); return 1; },\n    [$i8]: (view: DataView, offset: number, value: number) => { view.setInt8(offset, value); return 1; },\n    [$u16]: (view: DataView, offset: number, value: number) => { view.setUint16(offset, value); return 2; },\n    [$i16]: (view: DataView, offset: number, value: number) => { view.setInt16(offset, value); return 2; },\n    [$u32]: (view: DataView, offset: number, value: number) => { view.setUint32(offset, value); return 4; },\n    [$i32]: (view: DataView, offset: number, value: number) => { view.setInt32(offset, value); return 4; },\n    [$f32]: (view: DataView, offset: number, value: number) => { view.setFloat32(offset, value); return 4; },\n    [$f64]: (view: DataView, offset: number, value: number) => { view.setFloat64(offset, value); return 8; },\n    [$ref]: (view: DataView, offset: number, value: number) => { view.setUint32(offset, value); return 4; },\n    [$str]: (view: DataView, offset: number, value: string) => {\n        const enc = textEncoder\n        const bytes = enc.encode(value)\n        let written = 0\n        written += typeSetters[$u32](view, offset + written, bytes.length)\n        new Uint8Array(view.buffer, view.byteOffset + offset + written, bytes.length).set(bytes)\n        written += bytes.length\n        return written\n    }\n} as Record<TypeSymbol, (view: DataView, offset: number, value: any) => number>\n\n/**\n * Object containing getter functions for each data type.\n */\nexport const typeGetters: Record<TypeSymbol, (view: DataView, offset: number) => { value: any, size: number }> = {\n    [$u8]: (view: DataView, offset: number) => ({ value: view.getUint8(offset), size: 1 }),\n    [$i8]: (view: DataView, offset: number) => ({ value: view.getInt8(offset), size: 1 }),\n    [$u16]: (view: DataView, offset: number) => ({ value: view.getUint16(offset), size: 2 }),\n    [$i16]: (view: DataView, offset: number) => ({ value: view.getInt16(offset), size: 2 }),\n    [$u32]: (view: DataView, offset: number) => ({ value: view.getUint32(offset), size: 4 }),\n    [$i32]: (view: DataView, offset: number) => ({ value: view.getInt32(offset), size: 4 }),\n    [$f32]: (view: DataView, offset: number) => ({ value: view.getFloat32(offset), size: 4 }),\n    [$f64]: (view: DataView, offset: number) => ({ value: view.getFloat64(offset), size: 8 }),\n    [$ref]: (view: DataView, offset: number) => ({ value: view.getUint32(offset), size: 4 }),\n    [$str]: (view: DataView, offset: number) => {\n        const { value: len, size: lenSize } = typeGetters[$u32](view, offset)\n        const bytes = new Uint8Array(view.buffer, view.byteOffset + offset + lenSize, len)\n        const dec = textDecoder\n        const strValue = dec.decode(bytes)\n        return { value: strValue, size: lenSize + len }\n    }\n} as Record<TypeSymbol, (view: DataView, offset: number) => { value: any, size: number }>\n\n/**\n * Resolves a type (symbol, function, or array type) to its corresponding symbol.\n */\nfunction resolveTypeToSymbol(type: TypeSymbol | TypeFunction | ArrayType<any>): TypeSymbol {\n    if (typeof type === 'symbol') {\n        return type\n    }\n    if (typeof type === 'function') {\n        const symbol = functionToSymbolMap.get(type)\n        if (symbol) return symbol\n        throw new Error(`Unknown type function: ${type}`)\n    }\n    if (isArrayType(type)) {\n        return resolveTypeToSymbol(type[$arr])\n    }\n    // Default fallback\n    return $f32\n}\nconst textEncoder = new TextEncoder()\nconst textDecoder = new TextDecoder()\n\nexport function array(type: typeof $str | typeof str): ArrayType<string[]>\nexport function array(type?: TypeSymbol | TypeFunction): ArrayType<number[]>\nexport function array<T>(type: ArrayType<T>): ArrayType<T[]>\nexport function array(type: TypeSymbol | TypeFunction | ArrayType<any> = f64): ArrayType<any> {\n\tconst arr = [] as any[]\n\tObject.defineProperty(arr, $arr, { value: type, enumerable: false, writable: false, configurable: false })\n\treturn arr as ArrayType<any>\n}\n\n/**\n * Checks if a value is a TypedArray, branded array, or ArrayType\n */\nfunction isTypedArrayOrBranded(arr: any): arr is PrimitiveBrand | TypedArray | ArrayType<any> {\n    return arr && (\n        ArrayBuffer.isView(arr) || \n        (Array.isArray(arr) && typeof arr === 'object')\n    )\n}\n\n/**\n * Gets the type symbol for an array\n */\nexport function getTypeForArray(arr: PrimitiveBrand | TypedArray | ArrayType<any>): TypeSymbol {\n    // Check for ArrayType first\n    if (isArrayType(arr)) {\n        return resolveTypeToSymbol(arr[$arr])\n    }\n    // Check for branded arrays\n    for (const symbol of [$u8, $i8, $u16, $i16, $u32, $i32, $f32, $f64, $str, $ref] as TypeSymbol[]) {\n        if (symbol in arr) return symbol\n    }\n    // Then check TypedArrays\n    if (arr instanceof Int8Array) return $i8\n    if (arr instanceof Uint8Array) return $u8\n    if (arr instanceof Int16Array) return $i16\n    if (arr instanceof Uint16Array) return $u16\n    if (arr instanceof Int32Array) return $i32\n    if (arr instanceof Uint32Array) return $u32\n    if (arr instanceof Float32Array) return $f32\n    return $f64\n}\n\n/**\n * Checks if a value is an array type\n */\nexport function isArrayType(value: any): value is ArrayType<any> {\n    return Array.isArray(value) && $arr in value\n}\n\n/**\n * Gets the element type information for an array type\n */\nexport function getArrayElementType(arrayType: ArrayType<any>): TypeSymbol | TypeFunction | ArrayType<any> {\n    return arrayType[$arr]\n}\n\n/**\n * Serializes an array value to a DataView\n */\nexport function serializeArrayValue(\n    elementType: ArrayType<any> | TypeSymbol | TypeFunction,\n    value: any[],\n    view: DataView,\n    offset: number\n): number {\n    let bytesWritten = 0\n\n    const isArrayDefined = Array.isArray(value) ? 1 : 0\n    bytesWritten += typeSetters[$u8](view, offset, isArrayDefined)\n\n    if (!isArrayDefined) {\n        return bytesWritten\n    }\n\n    bytesWritten += typeSetters[$u32](view, offset + bytesWritten, value.length)\n\n    // Write each element\n    for (let i = 0; i < value.length; i++) {\n        const element = value[i]\n        if (isArrayType(elementType)) {\n            bytesWritten += serializeArrayValue(getArrayElementType(elementType), element, view, offset + bytesWritten)\n        } else {\n            // Primitive type - resolve to symbol\n            const symbol = resolveTypeToSymbol(elementType)\n            bytesWritten += typeSetters[symbol](view, offset + bytesWritten, element)\n        }\n    }\n\n    return bytesWritten\n}\n\n\nexport function deserializeArrayValue(\n    elementType: ArrayType<any> | TypeSymbol | TypeFunction,\n    view: DataView,\n    offset: number,\n    entityIdMapping?: Map<number, number>\n) {\n    let bytesRead = 0\n\n    const isArrayResult = typeGetters[$u8](view, offset + bytesRead)\n    bytesRead += isArrayResult.size\n    if (!isArrayResult.value) {\n        return { size: bytesRead }\n    }\n\n    const arrayLengthResult = typeGetters[$u32](view, offset + bytesRead)\n    bytesRead += arrayLengthResult.size;\n\n    const arr = new Array(arrayLengthResult.value) as any;\n    for (let i = 0; i < arr.length; i++) {\n        if (isArrayType(elementType)) {\n            const { value, size } = deserializeArrayValue(getArrayElementType(elementType), view, offset + bytesRead, entityIdMapping)\n            bytesRead += size\n            if (Array.isArray(value)) {\n                arr[i] = value\n            }\n        } else {\n            // Primitive type - resolve to symbol\n            const symbol = resolveTypeToSymbol(elementType)\n            const { value, size } = typeGetters[symbol](view, offset + bytesRead)\n            bytesRead += size\n            if (symbol === $ref) {\n                const mapped = entityIdMapping ? entityIdMapping.get(value) ?? value : value\n                arr[i] = mapped\n            } else {\n                arr[i] = value\n            }\n        }\n    }\n\n    return { value: arr, size: bytesRead }\n}\n\n/**\n * Checks if an array type is a float type\n */\nconst isFloatType = (array: any) => {\n    const arrayType = getTypeForArray(array)\n    return arrayType === $f32 || arrayType === $f64\n}\n\n/**\n * Gets epsilon value for an array type (0 for non-floats)\n */\nconst getEpsilonForType = (array: any, epsilon: number) => \n    isFloatType(array) ? epsilon : 0\n\n/**\n * Gets or creates a shadow array for change detection\n */\nconst getShadow = (shadowMap: Map<any, any>, array: any) => {\n    let shadow = shadowMap.get(array)\n    if (!shadow) {\n        // Create shadow array with proper initialization\n        if (ArrayBuffer.isView(array)) {\n            // TypedArray\n            shadow = new (array.constructor as any)((array as any).length)\n        } else {\n            // Regular array (like f32([]) arrays) - initialize with zeros\n            shadow = new Array(array.length).fill(0)\n        }\n        shadowMap.set(array, shadow)\n    }\n    return shadow\n}\n\n/**\n * Checks if a value has changed and updates the shadow\n */\nconst hasChanged = (shadowMap: Map<any, any>, array: any, index: number, epsilon = 0.0001) => {\n    const shadow = getShadow(shadowMap, array)\n    const currentValue = array[index]\n    const actualEpsilon = getEpsilonForType(array, epsilon)\n    \n    const changed = actualEpsilon > 0\n        ? Math.abs(shadow[index] - currentValue) > actualEpsilon\n        : shadow[index] !== currentValue\n    \n    shadow[index] = currentValue\n    return changed\n}\n\n/**\n * Creates a serializer function for a component.\n * @param {ComponentRef} component - The component to create a serializer for.\n * @param {boolean} diff - Whether to use diff mode (only serialize changed values).\n * @param {Map} shadowMap - Map to store shadow copies for diff mode.\n * @param {number} epsilon - Epsilon for float comparison in diff mode.\n * @returns {Function} A function that serializes the component.\n */\nexport const createComponentSerializer = (component: ComponentRef | PrimitiveBrand | TypedArray | ArrayType<any>, diff = false, shadowMap?: Map<any, any>, epsilon = 0.0001) => {\n    // Handle direct array case\n    if (isTypedArrayOrBranded(component)) {\n        const type = getTypeForArray(component)\n        const setter = typeSetters[type]\n        return (view: DataView, offset: number, index: number, componentId: number) => {\n            if (diff && shadowMap) {\n                if (!hasChanged(shadowMap, component, index, epsilon)) return 0 // No change\n                \n                let bytesWritten = 0\n                bytesWritten += typeSetters[$u32](view, offset + bytesWritten, index) // eid\n                bytesWritten += typeSetters[$u32](view, offset + bytesWritten, componentId) // cid\n                bytesWritten += setter(view, offset + bytesWritten, component[index])\n                return bytesWritten\n            } else {\n                let bytesWritten = 0\n                bytesWritten += typeSetters[$u32](view, offset + bytesWritten, index) // eid\n                bytesWritten += setter(view, offset + bytesWritten, component[index])\n                return bytesWritten\n            }\n        }\n    }\n\n    // Handle component case\n    const props = Object.keys(component)\n    const types = props.map(prop => {\n        const arr = component[prop]\n        if (!isTypedArrayOrBranded(arr)) {\n            throw new Error(`Invalid array type for property ${prop}`)\n        }\n        return getTypeForArray(arr)\n    })\n    const setters = types.map(type => typeSetters[type as keyof typeof typeSetters] || (() => { throw new Error(`Unsupported or unannotated type`); }))\n    return (view: DataView, offset: number, index: number, componentId: number) => {\n        if (diff && shadowMap) {\n            let changeMask = 0\n            // First pass: check what changed and build mask\n            for (let i = 0; i < props.length; i++) {\n                const componentProperty = component[props[i]]\n                \n                if (hasChanged(shadowMap, componentProperty, index, epsilon)) {\n                    changeMask |= 1 << i\n                }\n            }\n            \n            if (changeMask === 0) return 0 // No changes for this component\n            \n            let bytesWritten = 0\n            bytesWritten += typeSetters[$u32](view, offset + bytesWritten, index) // eid\n            bytesWritten += typeSetters[$u32](view, offset + bytesWritten, componentId) // cid\n            \n            // Write mask\n            const maskSetter = props.length <= 8 ? typeSetters[$u8] : props.length <= 16 ? typeSetters[$u16] : typeSetters[$u32]\n            bytesWritten += maskSetter(view, offset + bytesWritten, changeMask)\n            \n            // Write only changed values (shadows already updated by hasChanged)\n            for (let i = 0; i < props.length; i++) {\n                if (changeMask & (1 << i)) {\n                    const componentProperty = component[props[i]]\n                    \n                    if (isArrayType(componentProperty)) {\n                        bytesWritten += serializeArrayValue(getArrayElementType(componentProperty), componentProperty[index], view, offset + bytesWritten)\n                    } else {\n                        bytesWritten += setters[i](view, offset + bytesWritten, componentProperty[index])\n                    }\n                }\n            }\n            return bytesWritten\n        } else {\n            let bytesWritten = 0\n            bytesWritten += typeSetters[$u32](view, offset + bytesWritten, index) // eid\n            for (let i = 0; i < props.length; i++) {\n                const componentProperty = component[props[i]]\n                if (isArrayType(componentProperty)) {\n                    bytesWritten += serializeArrayValue(getArrayElementType(componentProperty), componentProperty[index], view, offset + bytesWritten)\n                } else {\n                    bytesWritten += setters[i](view, offset + bytesWritten, componentProperty[index])\n                }\n            }\n            return bytesWritten\n        }\n    }\n}\n\n/**\n * Creates a deserializer function for a component.\n * @param {ComponentRef} component - The component to create a deserializer for.\n * @param {boolean} diff - Whether to expect diff mode data with change masks.\n * @returns {Function} A function that deserializes the component.\n */\nexport const createComponentDeserializer = (component: ComponentRef | PrimitiveBrand | TypedArray | ArrayType<any>, diff = false) => {\n    // Handle direct array case\n    if (isTypedArrayOrBranded(component)) {\n        const type = getTypeForArray(component)\n        const getter = typeGetters[type]\n        return (view: DataView, offset: number, entityIdMapping?: Map<number, number>) => {\n            let bytesRead = 0\n            const { value: originalIndex, size: indexSize } = typeGetters[$u32](view, offset)\n            bytesRead += indexSize\n            const index = entityIdMapping ? entityIdMapping.get(originalIndex) ?? originalIndex : originalIndex\n            \n            if (diff) {\n                // Skip cid (component ID)\n                const { size: cidSize } = typeGetters[$u32](view, offset + bytesRead)\n                bytesRead += cidSize\n            }\n            \n            const { value, size } = getter(view, offset + bytesRead)\n            if (type === $ref) {\n                const mapped = entityIdMapping ? entityIdMapping.get(value) ?? value : value\n                ;(component as any)[index] = mapped\n            } else {\n                ;(component as any)[index] = value\n            }\n            return bytesRead + size\n        }\n    }\n\n    // Handle component case\n    const props = Object.keys(component)\n    const types = props.map(prop => {\n        const arr = component[prop]\n        if (!isTypedArrayOrBranded(arr)) {\n            throw new Error(`Invalid array type for property ${prop}`)\n        }\n        return getTypeForArray(arr)\n    })\n    const getters = types.map(type => typeGetters[type as keyof typeof typeGetters] || (() => { throw new Error(`Unsupported or unannotated type`); }))\n    return (view: DataView, offset: number, entityIdMapping?: Map<number, number>) => {\n        let bytesRead = 0\n\n        const { value: originalIndex, size: indexSize } = typeGetters[$u32](view, offset + bytesRead)\n        bytesRead += indexSize\n        \n        const index = entityIdMapping ? entityIdMapping.get(originalIndex) ?? originalIndex : originalIndex\n        \n        if (diff) {\n            // Skip cid (component ID)\n            const { size: cidSize } = typeGetters[$u32](view, offset + bytesRead)\n            bytesRead += cidSize\n            \n            const maskGetter = props.length <= 8 ? typeGetters[$u8] : props.length <= 16 ? typeGetters[$u16] : typeGetters[$u32]\n            const { value: changeMask, size: maskSize } = maskGetter(view, offset + bytesRead)\n            bytesRead += maskSize\n            \n            for (let i = 0; i < props.length; i++) {\n                if (changeMask & (1 << i)) {\n                    const componentProperty = component[props[i]]\n                    if (isArrayType(componentProperty)) {\n                        const { value, size } = deserializeArrayValue(getArrayElementType(componentProperty), view, offset + bytesRead, entityIdMapping)\n                        if (Array.isArray(value)){\n                            componentProperty[index] = value\n                        }\n                        bytesRead += size\n                    } else {\n                        const { value, size } = getters[i](view, offset + bytesRead)\n                        if (types[i] === $ref) {\n                            const mapped = entityIdMapping ? entityIdMapping.get(value) ?? value : value\n                            component[props[i]][index] = mapped\n                        } else {\n                            component[props[i]][index] = value\n                        }\n                        bytesRead += size\n                    }\n                }\n            }\n        } else {\n            for (let i = 0; i < props.length; i++) {\n                const componentProperty = component[props[i]]\n                if (isArrayType(componentProperty)) {\n                    const { value, size } = deserializeArrayValue(getArrayElementType(componentProperty), view, offset + bytesRead, entityIdMapping)\n                    if (Array.isArray(value)){\n                        componentProperty[index] = value\n                    }\n                    bytesRead += size\n                } else {\n                    const { value, size } = getters[i](view, offset + bytesRead)\n                    if (types[i] === $ref) {\n                        const mapped = entityIdMapping ? entityIdMapping.get(value) ?? value : value\n                        component[props[i]][index] = mapped\n                    } else {\n                        component[props[i]][index] = value\n                    }\n                    bytesRead += size\n                }\n            }\n        }\n        return bytesRead\n    }\n}\n\n/**\n * Options for SoA serializer\n */\nexport type SoASerializerOptions = {\n    diff?: boolean\n    buffer?: ArrayBuffer\n    epsilon?: number\n}\n\n/**\n * Creates a serializer function for Structure of Arrays (SoA) data.\n * @param {ComponentRef[]} components - The components to serialize.\n * @param {SoASerializerOptions} [options] - Serializer options.\n * @returns {Function} A function that serializes the SoA data.\n */\nexport const createSoASerializer = (components: (ComponentRef | PrimitiveBrand | TypedArray | ArrayType<any>)[], options: SoASerializerOptions = {}) => {\n    const { \n        diff = false, \n        buffer = new ArrayBuffer(1024 * 1024 * 100), \n        epsilon = 0.0001 \n    } = options\n    const view = new DataView(buffer)\n    const shadowMap = diff ? new Map() : undefined\n    const componentSerializers = components.map(component => createComponentSerializer(component, diff, shadowMap, epsilon))\n    return (indices: number[] | readonly number[]): ArrayBuffer => {\n        let offset = 0\n        for (let i = 0; i < indices.length; i++) {\n            const index = indices[i]\n            for (let j = 0; j < componentSerializers.length; j++) {\n                offset += componentSerializers[j](view, offset, index, j) // Pass component ID\n            }\n        }\n        return buffer.slice(0, offset)\n    }\n}\n\n/**\n * Options for SoA deserializer\n */\nexport type SoADeserializerOptions = {\n    diff?: boolean\n}\n\n/**\n * Creates a deserializer function for Structure of Arrays (SoA) data.\n * @param {ComponentRef[]} components - The components to deserialize.\n * @param {SoADeserializerOptions} [options] - Deserializer options.\n * @returns {Function} A function that deserializes the SoA data.\n */\nexport const createSoADeserializer = (components: (ComponentRef | PrimitiveBrand | TypedArray | ArrayType<any>)[], options: SoADeserializerOptions = {}) => {\n    const { diff = false } = options\n    const componentDeserializers = components.map(component => createComponentDeserializer(component, diff))\n    return (packet: ArrayBuffer, entityIdMapping?: Map<number, number>): void => {\n        const view = new DataView(packet)\n        let offset = 0\n        while (offset < packet.byteLength) {\n            if (diff) {\n                // Read eid, cid\n                const { value: originalEid, size: eidSize } = typeGetters[$u32](view, offset)\n                const { value: componentId, size: cidSize } = typeGetters[$u32](view, offset + eidSize)\n                \n                // Call component deserializer starting from eid position\n                offset += componentDeserializers[componentId](view, offset, entityIdMapping)\n            } else {\n                for (let i = 0; i < componentDeserializers.length; i++) {\n                    offset += componentDeserializers[i](view, offset, entityIdMapping)\n                }\n            }\n        }\n    }\n}\n", "\nimport { createObserverSerializer, createObserverDeserializer } from '../serialization/ObserverSerializer'\nimport { createSoASerializer, createSoADeserializer } from '../serialization/SoASerializer'\nimport { IWorld, Component, IComponentProp } from './index'\n\nexport type Serializer<W extends IWorld = IWorld> = (world: W, ents: number[]) => ArrayBuffer\nexport type Deserializer<W extends IWorld = IWorld> = (world: W, packet: ArrayBuffer, mode?: DESERIALIZE_MODE) => number[]\n\nexport function defineSerializer<W extends IWorld = IWorld>(components: Component[] | IComponentProp[], maxBytes?: number): Serializer<W> {\n  const initSet = new WeakSet<W>();\n  let serializeObservations: () => ArrayBuffer, serializeData: (indices: number[]) => ArrayBuffer;\n  return (world: W, ents: number[]) => {\n    if (!initSet.has(world)) {\n      initSet.add(world);\n      serializeObservations = createObserverSerializer(world, components[0], components);\n      serializeData = createSoASerializer(components as Component[]);\n    }\n    const observerData = serializeObservations();\n    const soaData = serializeData(ents);\n    // Combine observer and soa data into a single ArrayBuffer\n    const combinedData = new ArrayBuffer(observerData.byteLength + soaData.byteLength);\n    const combinedView = new Uint8Array(combinedData);\n    combinedView.set(new Uint8Array(observerData), 0);\n    combinedView.set(new Uint8Array(soaData), observerData.byteLength);\n    return combinedData;\n  }\n}\n\nexport function defineDeserializer<W extends IWorld = IWorld>(components: Component[] | IComponentProp[]): Deserializer<W> {\n  const initSet = new WeakSet<W>();\n  let deserializeObservations: any, deserializeData: any\n  return (world: W, packet: ArrayBuffer, mode: any): number[] => {\n    if (!initSet.has(world)) {\n      initSet.add(world);\n      deserializeObservations = createObserverDeserializer(world, components[0], components);\n      deserializeData = createSoADeserializer(components);\n    }\n    const observerDataLength = deserializeObservations(packet, mode);\n    const soaData = packet.slice(observerDataLength);\n    return deserializeData(soaData, mode);\n  }\n}\n\nexport enum DESERIALIZE_MODE {\n    REPLACE,\n    APPEND,\n    MAP\n}"],
  "mappings": "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",
  "names": ["observe", "onAdd", "onRemove", "query", "ecsAddComponent", "ecsHasComponent", "ecsRemoveComponent", "addComponent", "removeComponent", "addEntity", "removeEntity", "observe", "onAdd", "onRemove", "entityExists", "isRelation", "getRelationTargets", "Wildcard", "$u8", "$i8", "$u16", "$i16", "$u32", "$i32", "$f32", "$f64", "$ref", "$str", "$arr", "typeTagForSerialization", "symbol", "a", "u8", "i8", "u16", "i16", "u32", "i32", "f32", "f64", "ref", "str", "functionToSymbolMap", "typeSetters", "view", "offset", "value", "bytes", "textEncoder", "written", "typeGetters", "len", "lenSize", "textDecoder", "resolveTypeToSymbol", "type", "isArrayType", "isTypedArrayOrBranded", "arr", "getTypeForArray", "isArrayType", "resolveTypeToSymbol", "$arr", "symbol", "$u8", "$i8", "$u16", "$i16", "$u32", "$i32", "$f32", "$f64", "$str", "$ref", "value", "getArrayElementType", "arrayType", "serializeArrayValue", "elementType", "view", "offset", "bytesWritten", "isArrayDefined", "typeSetters", "element", "deserializeArrayValue", "entityIdMapping", "bytesRead", "isArrayResult", "typeGetters", "arrayLengthResult", "i", "size", "mapped", "isFloatType", "array", "getEpsilonForType", "epsilon", "getShadow", "shadowMap", "shadow", "hasChanged", "index", "currentValue", "actualEpsilon", "changed", "createComponentSerializer", "component", "diff", "type", "setter", "componentId", "props", "setters", "prop", "changeMask", "componentProperty", "maskSetter", "createComponentDeserializer", "getter", "originalIndex", "indexSize", "cidSize", "types", "getters", "maskGetter", "maskSize", "createSoASerializer", "components", "options", "buffer", "componentSerializers", "indices", "j", "createSoADeserializer", "componentDeserializers", "packet", "originalEid", "eidSize", "serializeRelationData", "data", "eid", "dataView", "offset", "value", "$ref", "keys", "key", "arr", "$i8", "$u8", "$i16", "$u16", "$i32", "$u32", "$f32", "deserializeRelationData", "entityIdMapping", "mapped", "createObserverSerializer", "world", "networkedTag", "components", "options", "backingBuffer", "queue", "relationTargets", "observe", "onAdd", "onRemove", "component", "i", "isRelation", "Wildcard", "targets", "getRelationTargets", "target", "relationData", "targetMap", "entityId", "type", "componentId", "targetId", "createObserverDeserializer", "packet", "idMap", "currentMapping", "packetEntityId", "operationType", "worldEntityId", "addEntity", "addComponent", "entityExists", "removeEntity", "removeComponent", "worldTargetId", "relationComponent", "defineSerializer", "components", "maxBytes", "initSet", "serializeObservations", "serializeData", "world", "ents", "createObserverSerializer", "createSoASerializer", "observerData", "soaData", "combinedData", "combinedView", "defineDeserializer", "deserializeObservations", "deserializeData", "packet", "mode", "createObserverDeserializer", "createSoADeserializer", "observerDataLength", "DESERIALIZE_MODE", "$modifier", "modifier", "c", "mod", "inner", "Not", "Or", "Changed", "defineQuery", "components", "queryFn", "world", "query", "enterQuery", "queue", "initSet", "observe", "onAdd", "eid", "results", "exitQuery", "onRemove", "addComponent", "component", "ecsAddComponent", "hasComponent", "ecsHasComponent", "removeComponent", "ecsRemoveComponent", "Types", "arrayByTypeMap", "defineComponent", "schema", "max", "createSoA", "key", "type", "length", "TypeConstructor"]
}
